Repository navigation
Qualify Claude Code headless and response-only through 2.1.312 - #531
Conversation
Research 459. Both claims stay separate and extend on their existing behavior revisions. 2.1.313 stays UnverifiedNewer. Co-authored-by: Tom Wright <tom@inflatablecookie.com>
inflatable-tester
left a comment
There was a problem hiding this comment.
Independent review of PR #531 at exact head b09219a (planning base 72620fa), branch cursor/claude-code-2-1-312-currentness-0cf1, reviewed in the exact-head worktree. Tree left clean; no tracked file, commit, push or branch change by the reviewer.
VERDICT: approve. Both Claude Code route families extend from 2.1.310 to 2.1.312 as compatible extensions on their existing behaviour revisions; 2.1.313 stays UnverifiedNewer; the Research 226 maximum-turn set, the Claude Agent SDK/Node windows and every public default stay untouched. No blocking defect found. Two non-blocking follow-ups and one integration note are listed below.
WHAT I RE-DERIVED MYSELF (public metadata/artifact retrieval only; no downloaded binary executed, no provider prompt, no login, no install)
- npm dist-tags for @anthropic-ai/claude-code: stable 2.1.308, next 2.1.312, latest 2.1.312 - matches both identity fixtures.
- GitHub latest non-prerelease v2.1.312 published 2026-10-27T20:24:20Z; tag commit ids b70dc411 (2.1.310), 08c6a4f5 (2.1.311) and 0e1f4789 (2.1.312) match both fixtures exactly.
- First unpublished later stable: npm 2.1.313 -> 404, GitHub ref/tag v2.1.313 -> 404. So 2.1.313 UnverifiedNewer is correct and no hop is missing.
- Re-downloaded wrapper + darwin-arm64 + linux-x64 tarballs for 2.1.310/2.1.311/2.1.312. Wrapper SHA-256 d69631 / d97fea / 7bbcaf match the fixture and Research 445's 2.1.310 record. Per-file SHA-256 for every file of all three packages at all three versions matches dist-inventory.json exactly (7/4/4 files). 2.1.310 darwin ffb64331 and linux b7367643 match the Research 445 fixture, so the re-downloaded-ceiling claim is true.
- Re-derived per-hop deltas independently: wrapper changes only package.json + sdk-tools.d.ts, both platform packages only claude + package.json, no files added or removed, launchers (bin/claude.exe, cli-wrapper.cjs, install.cjs, LICENSE.md, README.md) byte-identical to 2.1.310. Package.json diffs are version metadata only. sdk-tools.d.ts deltas are exactly toolsUsed/local_file (2.1.310 to 2.1.311) and unanswered (2.1.311 to 2.1.312) - SDK declarations neither CLI route imports.
- Bound the fixtures to shipped bytes: all 10 selected-JS snippets in selected-control-flow.json, all 31 marker-ledger markers and both stream-json help lines are byte-present in the actual shipped claude binary for 2.1.310, 2.1.311 and 2.1.312 on both darwin-arm64 and linux-x64. Every 2.1.310 snippet is absent from the 2.1.312 binary, so identifier remangling is real and the ledger is mutation-sensitive rather than self-authored.
- Response-only isolation strings likewise verified in the binaries: --safe-mode option text (byte-identical across the six binaries), the builtin-only plugin filter, init fields, registration tail, the platform module and the --disable-slash-commands help. cc-plugin-claude-platform is absent at 2.1.310 and present from 2.1.311; cc_plugin_ids differ by exactly claude-platform; research_378_nine_remain lists the nine @Builtin ids that safe mode keeps.
SELECTED BEHAVIOUR / DISPATCH ORDER
- Measured v2 effects (prompt ok:false blocking with continueOnBlock, PreToolUse deny before dispatch, hookRewrites.push plus the ask-to-deny recheck on hookUpdatedInput, Stop/SubagentStop stop_hook_active reentry, CLAUDE_CODE_STOP_HOOK_BLOCK_CAP default 8) hold at both new hops on both platforms. Release notes are used as discovery: the compact-and-continue and stream-json escape notes are correctly treated as non-mapped (serde_json decode, unchanged help lines, embedded changelog string lag called out).
- Headless command is unchanged (still plan mode, --tools Read,Glob,Grep, --setting-sources user,project,local, empty --mcp-config plus --strict-mcp-config, no session persistence); no command-construction file changed in this diff.
- Response-only keeps its hard guards in source, which I read: init requires empty tools, empty mcp_servers, permissionMode default, exact model and executable version (claude_code_response_events.rs parse_init); unknown event types still return a malformed-stream failure (same file, parse_line catch-all). Headless init still requires permissionMode plan (claude_code_events.rs). So retain-strict-empty-tools/MCP and unknown-event fail-closed are satisfied by production code, not only by fixtures.
- cc-plugin-claude-platform: registration is unconditional on the existing local builtin path from 2.1.311, while isAvailable requires tengu_peppy_crescent (gate argument default false), a tst predicate, no --agent-id and no mcpAutoDiscovered, and the docs MCP URL sits behind mayConnectMcpServer. The PR does not claim permanent unavailability: it classifies gated-builtin-unselected and rests unselection on headless's strict empty MCP plus fixed tool list and on response-only's fail-closed init. Residual checked: the same plugin-declared-MCP shape already exists at 2.1.310 (7 mayConnectMcpServer occurrences in the 2.1.310 binary), so this hop adds no new mapped surface; if the flag ever resolved true in an approved environment, headless could at most reach one extra plugin MCP server through the pre-existing already-qualified boundary while response-only would fail closed. Classification is honest and bounded; keep the wording gated/unselected, never unavailable.
PREPARED BOUNDARY
- Claim ids, baselines, unpublished gap lists, AllowUnverified posture and behaviour-revision ids are preserved; only the maintained ceilings move (headless v2 2.1.287..=2.1.312, response-only v3 2.1.282..=2.1.312) and the synthetic later-stable assertion moves to 2.1.313. Denied versions unchanged.
- The SDK identity-test edit only observes the independent Claude Code ceiling (2.1.312, message: the Claude Code window is observed separately and does not transfer); the SDK package 0.3.295, native 2.1.295 and Node window checks are untouched, and no Cargo/Node/install/settings input changed.
- Maximum turns: admits() is unchanged; the exact Research 226 set is only extended negatively (2.1.311 and 2.1.312 now asserted rejected). No public operation, permission, resource, lifecycle or packaging authority is added; no Cargo.toml, Cargo.lock or packaging file changed.
- Docs truth updated in the owning surfaces: prepared-integration guide, route matrix (route and lifecycle rows), feature-matrix CSV, CHANGELOG Unreleased, research index, Research 459. Historical research and other families untouched; no process residue.
COVERING CHECKS (once, through installed Effigy v0.14.1+local.973d70f, Oxide-backed; never raw cargo/nextest)
- effigy validate:current-claude-code-headless -> 124 passed, 0 failed (285 skipped)
- effigy validate:current-claude-code-response-only -> 87 passed, 0 failed (279 skipped)
- supplement for the module neither selector lists: effigy test nextest -p swallowtail-adapter-claude-agent --lib --test integration --profile sdk-usage -E 'test(/claude_code_2_1_312_identity::/)' -> 5 tests run, 5 passed. The new module executes (registered via tests/integration/main.rs path attribute), not merely compiles.
- effigy check:current-claude-code-headless -> ok (touched all-target compile)
- effigy format:package swallowtail-adapter-claude-agent -> passed; working tree unchanged afterwards, so formatted source is genuinely formatted
- effigy qa:docs -> passed (links, research index, research number uniqueness, forbidden/path/contains, guides, consumer front door, version-parse expects)
- effigy qa:routes -> passed (feature matrix cross classification, activity matrix, route/lifecycle/immutable-boundary checks)
- effigy skill run northstar/retired-concepts -> exit 0
- Not run and not required: effigy validate:oxide-routing (this diff changes no selector or guard - effigy.toml is untouched), full effigy qa/ci, package archive, API/MSRV (no packaging, API or pin change).
- Hosted CI on this exact head (run 40670202988): all checks pass; Pinned MSRV floor tests is skipped as usual, so it is not release proof.
FINDINGS
- Non-blocking, coverage follow-up (planner/selector owner, not an author defect). The new identity module is missing from both route selectors: effigy.toml:323 validate:current-claude-code-headless and effigy.toml:333 validate:current-claude-code-response-only list every prior hop module (claude_code_2_1_252 through _294, _310) but not claude_code_2_1_312_identity. Concrete failure case: mutate any 2.1.312 fixture (for example change a hop hash or drop a marker) and run either listed selector - the run stays green because the 5 new tests are skipped (285/279 skipped in my runs). I supplied the exact-filter run above, so this head's covering proof is complete. Suggested fix, in a selector-only change that also runs effigy validate:oxide-routing: add test(/claude_code_2_1_312_identity::/) to both filters.
- Non-blocking observation. Research 459, the fixture reason and the guide all keep cc-plugin-claude-platform at gated-builtin-unselected and never assert it is unavailable, which is the honest reading of a dynamic feature flag whose default argument is false. The load-bearing argument is selection, not the flag: keep that framing if a later hop revisits the flag, and if a real-environment observation ever shows tengu_peppy_crescent true, spend it as a separate identity observation rather than widening this classification silently.
- Integration note (owner-serialized, not a defect). The PR is mergeable=CONFLICTING because main moved 9 commits (Claude Agent ACP 0.98.0, Ollama 0.40.12 currentness) touching the same shared files: CHANGELOG.md, docs/guides/claude-agent-prepared-integration.md, provider-route-matrix.md, provider-solution-feature-matrix.csv and tests/integration/main.rs. My approval covers exact head b09219a only. When the owner serializes the merge, re-check exactly those conflict resolutions (docs rows and the integration module list) and re-run qa:docs, qa:routes and the two route validate selectors on the integrated tree before disposition.
Reviewed inputs (bounded): the brief, AGENTS.md, Contract 029, the version-currentness checkpoint and the repo version-currentness skill/reference, Research 459 and the research index, both selection sources, the maximum-turns source, both event decoders, the SDK ceiling source, the full new identity test module, every changed test file, all nine 2.1.312 fixtures and the 2.1.310 inventory ceiling, effigy.toml, the prepared-integration guide, route matrix, feature-matrix CSV, CHANGELOG and the format selector script.
Review verdicts
| ID | Subject | Verdict | Evidence | Note |
|---|---|---|---|---|
artifact-provenance |
Published artifacts, hops and fixture hashes bind to real shipped trees | pass |
Re-probed npm dist-tags (stable 2.1.308, next/latest 2.1.312) and GitHub (latest v2.1.312, tag commits b70dc41/08c6a4f/0e1f478; v2.1.313 absent in both). Re-downloaded wrapper+darwin-arm64+linux-x64 tarballs for 2.1.310/311/312: wrapper and every per-file SHA-256 match dist-inventory.json exactly (7/4/4 files), 2.1.310 matches Research 445. Independently re-derived hop deltas and confirmed 2.1.310 snippets/markers are byte-present in the real binaries while absent from the 2.1.312 binary. | |
selected-behaviour |
Selected dispatch/permission effect order and response-only isolation unchanged at both hops | pass |
All 10 selected-JS snippets, 31 markers and 2 help lines verified byte-present in the shipped claude binary for 2.1.310/311/312 on darwin-arm64 and linux-x64; headless command bytes unchanged; response-only safe-mode option/filter/init/registration/platform module strings verified in the same binaries; response-only init still fail-closes on non-empty tools/mcp_servers and non-default permissionMode, unknown events still fail closed, headless init still requires plan mode (sources read). cc-plugin-claude-platform classified gated-unselected on selection, with the pre-existing plugin-MCP shape at 2.1.310 noted. | |
prepared-boundary |
Claims, segments, gaps, pins and public authority preserved; ceilings raised honestly | pass |
Claim ids, baselines (2.1.220 / 2.1.227), gap lists, denied versions and AllowUnverified posture preserved; maintained ceilings raised to 2.1.312 on v2/v3 with 2.1.313 UnverifiedNewer; maximum-turns admits() unchanged and 2.1.311/312 asserted rejected; SDK test edit only observes the independent Code ceiling while SDK 0.3.295/native 2.1.295/Node checks stay; no Cargo/packaging/API/lifecycle change; docs owners (guide, route matrix, feature matrix, CHANGELOG, research index, Research 459) updated. | |
covering-checks |
Covering Effigy selectors, new-module execution and hosted CI green at this head | pass |
validate:current-claude-code-headless 124/124; validate:current-claude-code-response-only 87/87; supplement exact filter for claude_code_2_1_312_identity 5/5 executed; check:current-claude-code-headless ok; format:package clean with tree unchanged; qa:docs, qa:routes and northstar/retired-concepts pass; hosted CI run 40670202988 green on this head (MSRV floor tests skipped). Selector omission of the new module reported as a non-blocking planner follow-up, covered personally by the exact-filter run. |
inflatable-tester
left a comment
There was a problem hiding this comment.
Independent review at head b09219a (PR #531). Re-review superseding review 5689953475 where noted, focused on the two gaps the owner named: maintained identity-selector coverage and the new builtin MCP connection reachability/effect order.
VERDICTS
- artifact-provenance: pass
- selected-behaviour: fail
- prepared-boundary: pass
- covering-checks: fail
ARTIFACT EVIDENCE (fresh at this head; temp dir only, nothing executed)
Downloaded npm tarballs. Wrapper @anthropic-ai/claude-code 2.1.311 sha256 d97fea08695f32b13b3dec072687f2acc550484caecaf5005d4ebad86c5bf199 and 2.1.312 7bbcaf79930440d62daa309ae4fea63ba3df998dd6736b8d1c9a5767bf0bc7c1 match dist-inventory.json; every wrapper file (7 files) matches its inventory SHA-256 for both versions. Platform claude SHA-256: 2.1.310 darwin-arm64 ffb64331bc0ee1b69efb7c2c428bd3ab516bc31b75bf60886b356c97c1c25ffd / linux-x64 b73676430af12f97316a798b8371f81d640f90a58bdcb8f3ce56a835bb47df56 (match the ledger); 2.1.311 darwin 85d8c08707fcfd1e78ffa0204eefbc6ec9e4fe22f375fb2767ef85d957ed3161 / linux 86dc1fcc69498159eaf15f446613e847010f9036bfbbdffd4c49350be8489ada; 2.1.312 darwin 6b5ec691195e551b02c41df9f7d723f4ea61eaa03c2df90acefe3736f1aeb620 / linux 4f4178ce41d83e23341ebfbaecdbcf8ea6bf7baea0690025abe49eeec3a5d01d. tengu_peppy_crescent is absent from both 2.1.310 binaries and present in both 2.1.311 and 2.1.312 binaries. The six selected-JS fragments the 2.1.312 module asserts (prompt ok:false blocking, PreToolUse deny, hookRewrites.push, ask->deny recheck, stopHookActive:!0, STOP_HOOK_BLOCK_CAP??8) are byte-present in the 2.1.312 darwin binary.
COVERING CHECKS (Effigy, run once)
- validate:current-claude-code-headless: 124/124 passed, 3 binaries, 285 skipped.
- validate:current-claude-code-response-only: 87/87 passed, 2 binaries, 279 skipped.
- Supplement effigy test nextest -p swallowtail-adapter-claude-agent --test integration --profile sdk-usage -E 'test(/claude_code_2_1_312_identity::/)': 5/5 passed.
- check:current-claude-code-headless: pass.
- format:package swallowtail-adapter-claude-agent: pass; git status clean afterwards (tree unchanged).
- qa:docs: pass. qa:routes: pass (42 solution rows, 740 unavailable cells, 51 routes). skill run northstar/retired-concepts: pass.
- Hosted CI at this head, run 40670202988: all required jobs green; "Pinned MSRV floor tests" SKIPPED on the PR. That skip is not release proof.
- validate:oxide-routing not run: this head changes no selector or guard. The required repair does change selectors, so rerun it with the repair.
FINDINGS
-
[blocking, covering-checks] Maintained identity selectors never execute the new 2.1.312 module.
effigy.toml:323 (validate:current-claude-code-headless) and effigy.toml:333 (validate:current-claude-code-response-only) enumerate the earlier claude_code_*_identity:: filters but not claude_code_2_1_312_identity::. The module is wired into the integration binary at crates/swallowtail-adapter-claude-agent/tests/integration/main.rs:84-85 via #[path = "../claude_code_2_1_312_identity.rs"], and this crate declares explicit [[test]] targets, so there is no standalone target: effigy test nextest ... --test claude_code_2_1_312_identity fails and prints the available target list (integration, claude_code_structured_run, ...).
Failure: both selector runs compile the module through integration but skip its five tests; only the reviewer supplement ran them. Neither 124/124 nor 87/87 includes the new five.
Fix: add test(/claude_code_2_1_312_identity::/) to both selector expressions, rerun both, and report counts that include the five new tests. -
[blocking, selected-behaviour] The new builtin's availability and effect order is not established as required; the recorded reason rests on the flag default and on a non sequitur.
docs/research/459-claude-code-headless-and-response-only-2-1-312-identity.md:76-86, docs/guides/claude-agent-prepared-integration.md:283-290 and 487-494, CHANGELOG.md:58-60, and the fixture/protocol reasons at tests/fixtures/claude-code-2.1.312/response-only-isolation.json:91-101, headless-protocol.json:103-105 and response-only-protocol.json:76-78 (asserted at tests/claude_code_2_1_312_identity.rs:358-362) say the plugin stays unselected because tengu_peppy_crescent defaults off, and the headless reason infers unselection from "strict empty MCP". The brief rules out the default-off argument, and --mcp-config/--strict-mcp-config govern configured MCP entries, not a builtin plugin's declared mcpServers, so that inference does not hold.
Actual gate, read from the exact hashed binaries: isAvailable() begins Xd() && !Ft() && ... && An("tengu_peppy_crescent", !1) === true; Xd() resolves to t().host.launchOptions.isInteractive() (chunk-t7c1wwef.js), initialized false and set by J5e(!h) where h = kind === "non-interactive" || Alt(argv) and Alt includes -p. Both routes pass -p (crates/swallowtail-adapter-claude-agent/src/claude_code_command.rs:12 and claude_code_response_command.rs:5), so isInteractive() is false and isAvailable() is false whatever the server flag is. Response-only also passes --safe-mode, where or("mcpAutoDiscovered") returns true from the safe-mode table: a second independent false conjunct.
Effect order: Aot(name) evaluates isAvailable; mz() skips an unavailable builtin with if(!Aot(r))continue; before it builds the plugin record; AFt returns early when the plugin is not enabled; mayConnectMcpServer is consulted only for a registered plugin and itself requires isAvailable plus a trusted flag source. So the plugin contributes no skill and no mcpServers, https://platform.claude.com/docs/mcp is never connected, init mcp_servers stays empty, and no endpoint/audience/auth/resource effect reaches either route. Easel's added || Og() === "remote_cowork" branch is not taken here and the e path is unchanged.
Failure: route behaviour is safe, but the owning evidence lacks the required classification and would not catch a later hop that drops the interactive or safe-mode gate while the flag becomes true.
Fix: in Research 459 and the guide/CHANGELOG/fixtures/tests, record the non-interactive print-mode gate and the safe-mode mcpAutoDiscovered gate with the Aot -> mz() -> mayConnectMcpServer -> init effect order, bound to the exact hashes (darwin 6b5ec691..., linux 4f4178ce...); drop the "strict empty MCP therefore unselected" inference; assert those gate strings byte-present in both platform artifacts. Note also that dse() defaults to "tst", so the recorded tst gate is normally satisfied and proves nothing about unavailability.
Non-blocking: none beyond the above.
PREPARED BOUNDARY
Claim ids, baselines (headless 2.1.220, response-only 2.1.227), gap lists, denied versions and AllowUnverified posture are preserved; ceilings are 2.1.312 on headless v2 and response-only v3 with 2.1.313 UnverifiedNewer; the maximum-turns admits() set is unchanged and 2.1.311/2.1.312 are asserted rejected; the SDK identity test change only observes the independent Code ceiling (SDK 0.3.295 / native 2.1.295 / Node checks untouched); no Cargo, packaging, API or lifecycle change; docs owners (guide, route matrix, feature matrix, CHANGELOG, research index, Research 459) updated.
Review verdicts
| ID | Subject | Verdict | Evidence | Note |
|---|---|---|---|---|
artifact-provenance |
Published artifacts, hops and fixture hashes bind to real shipped trees | pass |
Fresh npm downloads: wrapper 2.1.311/2.1.312 tarball SHA-256 and all 7 wrapper file hashes match dist-inventory.json; platform claude hashes match the ledger for 2.1.310 (darwin ffb64331, linux b7367643), 2.1.311 (85d8c087, 86dc1fcc) and 2.1.312 (6b5ec691, 4f4178ce). tengu_peppy_crescent absent at 2.1.310, present at 2.1.311/2.1.312 on both platforms; six selected-JS fragments byte-present in the 2.1.312 darwin binary. Nothing was executed. | Supersedes the earlier artifact-provenance verdict by review ID 5689953475 on fresh evidence. |
selected-behaviour |
Selected dispatch/permission effect order and response-only isolation unchanged at both hops | fail |
v2 dispatch/permission snippets and safe-mode isolation are byte-present and unchanged, but the required critical classification of cc-plugin-claude-platform is not established in the proposal: Research 459:76-86, guide:283-290/487-494, CHANGELOG:58-60, fixtures and test assertions all use the flag default or strict empty MCP. Independent read: isAvailable requires isInteractive(), false with -p in both routes (claude_code_command.rs:12, claude_code_response_command.rs:5); response-only also fails or("mcpAutoDiscovered") under --safe-mode; mz() skips unavailable builtins before MCP registration and mayConnectMcpServer requires isAvailable. Behaviour is safe but the owning evidence is wrong/incomplete and would not catch a later hop dropping those gates. | Supersedes the earlier selected-behaviour pass by review ID 5689953475: the same head supports a different judgment after the required reachability trace. |
prepared-boundary |
Claims, segments, gaps, pins and public authority preserved; ceilings raised honestly | pass |
Claim ids, baselines 2.1.220/2.1.227, gap lists, denied versions and AllowUnverified preserved; ceilings 2.1.312 on headless v2 and response-only v3; 2.1.313 UnverifiedNewer; maximum-turns Research 226 set unchanged with 2.1.311/2.1.312 rejected; SDK identity edit only observes the Code ceiling while SDK/native/Node checks stay; no Cargo/packaging/API/lifecycle change; docs owners updated. | Supersedes the earlier prepared-boundary verdict by review ID 5689953475 on current-head evidence. |
covering-checks |
Covering Effigy selectors, new-module execution and hosted CI green at this head | fail |
validate:current-claude-code-headless 124/124 (3 binaries) and validate:current-claude-code-response-only 87/87 (2 binaries) both omit claude_code_2_1_312_identity::; the module is registered only inside the integration binary (tests/integration/main.rs:84-85) and there is no standalone target, so the maintained selectors never run its five tests. Supplement --test integration -E 'test(/claude_code_2_1_312_identity::/)' 5/5 passed. check, format:package (tree clean), qa:docs, qa:routes and retired-concepts passed; hosted CI run 40670202988 green except PR-skipped MSRV floor tests. | Supersedes the earlier covering-checks pass by review ID 5689953475; selector omission is now treated as the required author repair, not a planner follow-up. |
inflatable-tester
left a comment
There was a problem hiding this comment.
Independent final-delta review of PR #531 at exact head 5026b6e (merge commit of cb9e25f with current origin/main f14e058), branch cursor/claude-code-2-1-312-currentness-0cf1. Owner-selected final additive integration; merge hold remains for owner disposition.
VERDICT: approve (ready_to_merge). Every pass-gate subject is pass at this head; the previous blocked/environment report was about missing CI at a conflicting head and is now resolved.
- INTEGRATION INTEGRITY
- The head is a two-parent merge (cb9e25f, f14e058). git diff f14e058 5026b6e is exactly the 34-file Claude Code proposal set (same shape as the reviewed proposal), so the merge added this proposal on top of current main and reverted or altered nothing else.
- Published conflicts were resolved additively. diff f14e058 5026b6e -- CHANGELOG.md contains only this proposal's entry (real add, no deletion of main's lines); diff f14e058 5026b6e -- docs/research/README.md adds only the 459 line below main's existing 463/462/460 records. Main's CHANGELOG and research-index entries are preserved verbatim.
- No code or fixture conflict occurred. The merge brought main's Claude Agent ACP 0.98.0 currentness into the crate; this proposal's Claude Code source, tests and fixtures are byte-identical to the head I reviewed (sha256 equality proven below). No competing semantic input was displaced.
- The requested Research459 index correction is present: the 459 line now reads "cc-plugin-claude-platform registers from 2.1.311 but print mode fails its required interactive availability gate, so it stays unselected", replacing the false-default flag framing. The remaining Research459 record, the guide's Claude Code sections and the CHANGELOG print-mode wording are unchanged; the only guide delta in cb9e25f..5026b6e is main's ACP 0.96.0 -> 0.98.0 text.
- Both accepted maintained selector filters survive byte-identically: effigy.toml contains claude_code_2_1_312_identity in validate:current-claude-code-headless and validate:current-claude-code-response-only exactly as at cb9e25f (2 occurrences both sides); tests/integration/main.rs keeps mod claude_code_2_1_312_identity (line 86-87) alongside main's new mod claude_agent_acp_0_98_0_identity (line 52-53).
-
UNCHANGED SEMANTIC/FIXTURE BYTES (sha256, equal to cb9e25f)
claude_code_2_1_312_identity.rs a1a4611525b0dce412ad8f4becf31113b25c8f55100f00f57293cd67f9e21708; dist-inventory.json 360f424dff8129896a24f1ce394c80c65b024429156e6c849312a776bfb2e279; response-only-isolation.json ddb3330b05ba2f70be10ceb69a2d9be630fe52333427d7e0ca8fc4f619cf8d47; headless-protocol.json 330590db9d87b88a44f20b687069548a7123b51939fc29435b28b233f86c754c; response-only-protocol.json 5f38ee04d861b363f84451f95f5aafbfe5d325bfaa97657e49230cd9de377b21; selected-control-flow.json 9f7924bbd32bf75cb0b971404163fea6e6271a0582ac9870a5f59570ebd0c71c; marker-ledger.json fc1392ef65a34b56d885b3da9480e28fe7fc33b2c3ed47d163a4b89551d8cfac; headless-identity.json a9b4efbb227a0245b9a6f00882fb4e760962bb2362a37b49e4fd610b98ed5a21; response-only-identity.json a7124a36c6555033d085cdb0e9cca9cf627f018a524512d7f99d74f3ebc86e3e; fixture README 4ca82c167fa43c66d8c08373455d5635bae130e7e67592ddeeeee0cece21c8de; claude_code_selection.rs 87fa7cc44d2211557009e0e7518119e028587bb4e4acdca5da9e49c85dff78f5; claude_code_response_selection.rs fb3e2446a3682a9c4a431949e59388508ebe84ae666625df6e8a5e515f221417; claude_code_maximum_turns.rs 52d17a33e9179b5e69e060c7c63449094512ba0de7e9373a2e304694df0a16d5; claude_code_command.rs afe5f3dfe4007fc258436ab865b4a3941b84225c11a86e29bea125b97067939a; claude_code_response_command.rs 7ca94868587def6d470ba7516901bd473c0b9b50f14d026eef3e051ae88d51c5; claude_agent_sdk_identity.rs ff48daebf1cb8c47abd7d2715fd59200db5a9f4e22b91aa1407ae99f46a3e298.
Per the brief I did not repeat the vendor artifact downloads: the inventory and every frozen fixture are byte-identical to the tree where I verified all six tarballs, every per-file hash and all nine new isolation snippets against the shipped 2.1.311/2.1.312 binaries on both platforms, so that immutable evidence continues to bind this head. The 12 other proposal sources (claims.rs and identity-test assertion bumps) are likewise unchanged. -
COVERING CHECKS AT THIS HEAD (changed inputs only, Effigy, once each)
- effigy check:current-claude-code-headless: exit 0 (merged crate all-target compile, including main's ACP code).
- effigy format:package swallowtail-adapter-claude-agent: exit 0; tracked tree stayed clean.
- effigy qa:docs: exit 0.
- effigy qa:routes: exit 0 (89 operations / 51 production routes / 740 unavailable cells checks passed).
- effigy skill run northstar/retired-concepts: exit 0.
- effigy validate:oxide-routing (selector inputs changed by main's concurrent selector edits): exit 0, 233 selectors / 160 switched / 0 cargo escapes.
The Claude Code validate selectors were not re-run: their filters and every input file are byte-identical to the head where they passed 129/129 (3 binaries) and 92/92 (2 binaries), which is the brief's "do not repeat unchanged semantic proof" instruction.
-
HOSTED CI AT EXACT HEAD
Workflow run 40779535606 (event pull_request, head 5026b6e) is completed with conclusion success. Jobs: Stable format and lint, Stable nextest shard 1/2, Stable nextest shard 2/2, Stable process-spawning nextest, Stable examples/metadata/route contracts, Documentation and semantic API, Research number uniqueness, Pinned MSRV floor, Dependency security/licenses/sources and External Git-source consumer all pass. "Pinned MSRV floor tests" is skipped, which is the repository's standing PR behaviour and is not claimed as release proof. The PR now reports mergeable: MERGEABLE at this head. -
PERSONAL RE-REVIEW OF THE JUDGMENTS
The earlier verdicts (review 5690186970: artifact-provenance pass, selected-behaviour fail, prepared-boundary pass, covering-checks fail) were superseded by review at cb9e25f (artifact-provenance pass, selected-behaviour pass, prepared-boundary pass, covering-checks fail on missing selector coverage). This head keeps every byte of that accepted evidence and adds the owner-integration deltas reviewed above, so all four subjects are re-judged pass on current-head evidence. No worker-published value citing an earlier review ID was found to differ from that cited record; the second re-review equality check finds nothing to fail.
Residual non-blocking note only: the "Pinned MSRV floor tests" skip remains, as documented repo policy, and must not be read as MSRV release proof. No other observation.
Reviewed tree left untouched and clean at 5026b6e.
Review verdicts
| ID | Subject | Verdict | Evidence | Note |
|---|---|---|---|---|
artifact-provenance |
Published artifacts, hops and frozen fixtures still bind real shipped trees at the integrated head | pass |
The 2.1.312 inventory and every frozen Claude Code fixture are sha256-identical to the head where I verified all six npm tarball hashes, every per-file hash (claude 85d8c087/86dc1fcc at 2.1.311, 6b5ec691/4f4178ce at 2.1.312, wrapper bin/claude.exe) and byte-presence of all nine new isolation snippets in the shipped darwin-arm64 and linux-x64 binaries. git diff f14e058 5026b6e is exactly the 34-file proposal, so the integration added no artifact-affecting change. Per brief, unchanged downloads were not repeated. | Supersedes the earlier artifact-provenance pass by review ID 5690186970 on integrated-head byte-equality evidence. |
selected-behaviour |
Print-mode availability isolation and v2 dispatch/permission order still hold; index summary corrected | pass |
Every Claude Code source, test and fixture is byte-identical to cb9e25f, where I proved: both routes pass -p (claude_code_command.rs, claude_code_response_command.rs); the entry setter clears launchOptions.isInteractive before plugin enumeration; availability begins with that getter; mz() skips the unavailable builtin before mcpServers:n.mcpServers; mayConnectMcpServer re-checks availability; --safe-mode blocks mcpAutoDiscovered. The requested correction landed only where asked: docs/research/README.md 459 now cites print mode failing the required interactive availability gate instead of the flag default; Research459, the guide's Claude Code sections and the CHANGELOG wording are unchanged. | Supersedes the earlier selected-behaviour pass by review ID 5690186970; the earlier fail by 5690186970 was already resolved at cb9e25f. |
prepared-boundary |
Claims, segments, gaps, pins and public authority preserved through additive main integration | pass |
Claude Code claim ids, baselines 2.1.220/2.1.227, gap/deny lists and AllowUnverified are unchanged; headless v2 and response-only v3 ceilings 2.1.312 with 2.1.313 UnverifiedNewer; maximum-turns stays the Research 226 set with 2.1.311/2.1.312 rejected; SDK identity edit observes only the Code ceiling. The merge preserved main's own entries verbatim (CHANGELOG and research index diff versus main contains only this proposal's additions), kept SDK/ACP/Node axes separate, and introduced no API, packaging, permission, lifecycle or release authority change. | Supersedes the earlier prepared-boundary pass by review ID 5690186970. |
covering-checks |
Changed-input covering Effigy checks and hosted CI green at the integrated head | pass |
At 5026b6e: check:current-claude-code-headless exit 0, format:package swallowtail-adapter-claude-agent exit 0 with a clean tree, qa:docs exit 0, qa:routes exit 0, northstar/retired-concepts exit 0, validate:oxide-routing exit 0 (233 selectors, 0 cargo escapes). Claude Code validate selectors were not re-run because their filters and all inputs are byte-identical to cb9e25f where they passed 129/129 and 92/92, and both selector filters plus the integration module registration survive the merge. Hosted CI run 40779535606 (pull_request) completed success at this exact head; only the repo-policy PR-skipped MSRV floor tests are skipped; PR mergeable MERGEABLE. | Supersedes the earlier covering-checks fail by review ID 5690186970 and the blocked environment assessment at cb9e25f: selector coverage now executes and CI exists at a conflict-free head. |
Extend the separate Claude Code headless and response-only qualification windows from 2.1.310 to 2.1.312 on their existing behavior revisions (Research 459). Both published hops, 2.1.311 and 2.1.312, are covered; 2.1.313 remains UnverifiedNewer. Claim IDs, baselines, gaps and AllowUnverified remain unchanged. Claude Agent ACP/SDK/Node axes and the exact Research 226 maximum-turn set stay separate and unchanged.
The shipped-binary trace binds the new
cc-plugin-claude-platformisolation to print mode: both selected commands pass-p, which sets launch interactivity false before builtin availability is evaluated. The unavailable plugin is skipped before its MCP server enters the enabled set; the connection predicate also rechecks availability. This proof does not rely on a dynamic flag default or rejection after init. Response-only retains its additional safe-mode and strict init checks.Both maintained selectors now include the five new identity tests. Source-head independent proof passed 129/129 headless and 92/92 response-only, plus compile, formatting, docs/routes, retired-concepts and Oxide routing. The final main integration preserves the reviewed Claude Code semantic and fixture bytes and all canonical shared records.
Final-head independent review 5690524865 passes all four subjects at
5026b6ed60c4e96d08e4cfd397a5d9e583d3ed43. Changed-input compile, format, docs/routes, retired-concepts and routing checks passed; hosted CI 40779535606 passed ten jobs. The PR-skipped MSRV tests are not release proof. No unchanged artifact downloads or semantic suites were repeated for the integration.No downloaded vendor executable, provider turn, credentials, installation, release, tag or consumer change is included.