v0.6.0
Added
- Claim tiering + model-diversity judge slots (
@prd-gen/verification).
A claim whose own text names a deterministically executable verification
method (grep/diff/time/kcov/exit-status/named gate) skips the judge panel
and gets a synthesized rule-tier verdict instead
({kind:"rule",name:"rule-tier"}); architecture-typed claims get one
judge per model inVerifyBudgetConfig.diversity_models(default
["haiku","sonnet"]) instead of N persona-prompted judges on one
underlying model.JudgeVerdict.modelrecords which model judged each
claim;10-verification-report.mdrenders a cross-model-agreement
summary. Measured on the calibration fixture: 30 → 23 judge invocations
(-23%). - Explicit verification acceptance policy at
implementation_gate.
VerificationPolicyConfig(block_on,min_subjective_sampled_ratio,
on_unsampled_below_ratio,on_cross_model_disagreement—
composition-root-injectable, default null uses
DEFAULT_VERIFICATION_POLICY) andevaluatePolicy(), a pure function
turning verification results intopass/needs_attention/blocked.
implementation_gatenow shapes its "Implement / PRD only" question from
that verdict — a bare "Implement" is never offered while blocked — and
records any human derogation onpost_specs.policy_derogation. - Host-side external-judge executor (
scripts/external-judge/). A
zero-dependency Node CLI (judge.mjs) that posts a judge prompt to an
OpenAI-compatible endpoint (Gemini via AI Studio, Mistral via La
Plateforme) when aspawn_subagentsinvocation names a non-Anthropic
model, plus a calibration harness (calibrate.mjs) gated on agreement
≥ 0.7. No API key configured produces an explicit skipped result, never
a fabricated verdict. - Bilingual (FR/EN) hard-output-rule detection: opt-out markers and
per-rule topic/keyword signal lists now recognize French phrasing via a
shared lexicon (rules/lexicon.ts); 12 previously English-only rule
checks (crypto, input validation, output encoding, structured logging,
alerting thresholds, API contract docs, deprecation strategy, etc.) gain
an explicit opt-out path, audited by
packages/validation/src/__tests__/opt-out-coverage.test.ts. - Budget-gated haiku judge panel for
self_checkverification
(PipelineState.verify_budget, composition-root-injected): default
panel reduced to 1 judge/claim (2 for architecture claims); a budget
gate asks the user (reduced sample / full fleet / skip verification)
when the invocation count exceeds a configurable cap (default 20). submit_action_result/start_pipelineresponse-size bound
(boundEnvelopeResponse): an oversizedspawn_subagentsaction has
every invocation's prompt replaced by an observableOmittedStub; the
full unbounded action is recoverable via
get_pipeline_state(run_id, format:"action").10-verification-report.mdnow written byimplementation_gatebefore
the implementation decision is asked, carrying per-claim judge verdicts
when available.- Root
pnpm linttypechecks every workspace package viatsc --noEmit
(lintscript added to all 9 TS packages) and runs in CI.
Fixed
- Root
lintscript was structurally broken:tsc --noEmitat the repo
root found notsconfig.json(onlytsconfig.base.jsonexists), so it
printed CLI help and exited non-zero — invisible because CI never ran
it. Fixed by delegating to each package's ownlintscript via
pnpm -r run lint; CI now runs the step so it cannot rot silently again. - Hard-output-rule false positives on French-language PRD sections
(technical_specification, cryptographic_standards, rate_limiting,
secure_communication, GDPR consent, distributed_tracing) that had
explicit, justified "non applicable" prose the English-only detector
could not recognize. test_traceability_integrity's test-function pattern only matched
Swift-stylefunc test_xxx(, so bash-defined tests (test_xxx() { },
function test_xxx() { }) were reported missing even when present.claim-extractor.ts's evidence-snippet window used a fixed ±N-line
radius that ignored claim boundaries, letting an adjacent claim's
wording bleed into the current claim's evidence and mis-tier it;
snippet()now stops at the neighboring claim's own start line.file-export.tswrote placeholder text for companion files whose
source section(s) produced no content; such files are now omitted
entirely, with the omission and its reason recorded in
00-run-notes.md(numbering stays stable).renderJudgeVerdictsstringified the structuredAgentIdentityjudge
field as"[object Object]"instead of"kind:name".
Fixed (release workflow)
release.ymlnever wrote the real.mcpbSHA-256 back into
server.json#/packages/0/file_sha256, leaving a permanent
000...000placeholder in every published release's manifest. The
workflow now patches the checksum after packing the.mcpband
pushes the single-file update back tomainas part of the same
release job, so this fix is already in effect for the v0.6.0 tag
itself. Fixes #23.
.mcpb bundle
SHA-256: c4897edab70e8a4db79dfc22167087891e3b62131dce1fe40280e9ed0f95d5e3