let a graph row assert the handoff target (ADR-0032) - #135
Conversation
ADR-0025's defect class, closed on the last surface that had it: an edit reaching only escalation.target.name left every disposition byte identical, and a graph suite stayed green over it. - Under graphMatrixVersion "2", expectedHandoffTarget asserts the composite's reported target (the result node's own) and expectedNodeHandoffTargets asserts named nodes' — each such node also named in expectedNodes, as a pack row asserts beside its own disposition. - ADR-0025's semantics whole: decoded-value comparison by the one comparator (SameHandoffTarget, exported so two surfaces cannot disagree), null as an assertion, capped renderings as expectedHandoffTarget/actualHandoffTarget pairs set before the comparisons run, "unavailable" exactly where a run was refused under an expected composite. - The version machinery is the pack matrix's, built for this surface: silence reads as version 1, and a version-2 member under version 1 is refused with the version it would take. ADR-0025's load-time rot-pin on this surface inverts into exactly that refusal. - Not ported, deliberately: the render-once pass, the digest-binding guard, and the dedicated 4 MiB counter — both renderings are minted at the comparison from values this run reported, and rows are already charged whole by the report budget. - ADR-0025's graph-surface deferral is discharged via the index annotation; its text is untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Brian Jin <35789537+kikashy@users.noreply.github.com>
…round tests (review round 1) - Mismatch details say reported, not configured: on a non-escalating disposition the configured target can match while the reported target is correctly null (round-1 finding 7). - The version gate's strictness is explicit and pinned: wrong-typed graphMatrixVersion stays a shape refusal, null and empty are refused rather than silently read as the default, the supported list is literal and cumulative with a fail-closed rank guard, and a hygiene test holds every introduction-map version to a place in the list (findings 2, 4). - An explicit-null expectedNodeHandoffTargets is refused as the shape defect it is, instead of silently erasing the assertion (finding 3). - The pair invariant is narrowed honestly and pinned: well-formed assertions about runs this walk performed; row-defect mismatches report the defect and no pair; a classless graph-layer refusal degrades to unavailable told by the detail, not by an error class (findings 5, 6). - New tests: version-gate contract (code/exit/message), all assertions coexisting with ADR-0031 traces on one comparison, disposition mismatch retaining its pair, classless refusal, no-pair defect paths, and the rendering budget differential. - ADR: the per-assertion rendering cost is analyzed rather than waved at — the graph walk re-reads and re-admits every node's pack per row by design, so one canonicalization of one member of those bytes per asserted row is a constant factor on existing work, not the amplification class ADR-0025's render-once pass exists to prevent (finding 1, partially declined: the proposed render-once port would reintroduce the cross-row handle whose only honest form needs the digest guard this surface has no use for). - Changelog and ADR narrow the compatibility claim to what is true and declare the three gate changes; the 0025 annotation uses the partial-supersession phrasing; the comparator doc names both carriers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Brian Jin <35789537+kikashy@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Brian Jin <35789537+kikashy@users.noreply.github.com>
Review round 1 — dispositionReviewer: Codex (codex-cli 0.145.0, OpenAI) · Reviewed SHA:
From the surviving-mutations list, also added: all-assertions-coexist (headline + node + ADR-0031 traces on one comparison), disposition-mismatch-retains-pair, executed node-null match, and the rendering budget differential (bare-exact boundary, ADR-0031's argument applied to this member; mutation-verified). Not added: a pre-PR byte golden (the no-member substring assertions on unasserted rows pin the same fact) and a render-count test (per finding 1's disposition, the property to hold is cost class, which the ADR now states and source structure enforces — there is no separate render pass to count). Reviewer's sandbox could not run ADR-0032 flipped to accepted. |
|
🎉 Thank you for your contribution to Judgment Pack! If you’d like another task, choose a path that interests you: |
Closes #128.
ADR-0032 discharges ADR-0025's graph-surface deferral, both carriers under one semantics:
expectedHandoffTargetasserts the composite's reported target (the result node's own — the value a target-only pack edit reaches while every disposition byte stays identical) andexpectedNodeHandoffTargetsasserts named nodes' (each such node also named inexpectedNodes). Version-gated bygraphMatrixVersion "2"with the pack matrix's machinery built for this surface: silence reads as version 1, a version-2 member under version 1 is refused with the version it would take, and ADR-0025's load-time rot-pin inverts into exactly that refusal.ADR-0025's semantics extended whole: decoded-value comparison by the one comparator (
SameHandoffTarget, exported so two surfaces cannot disagree), null as an assertion, capped renderings as pairs set before the comparisons run, "unavailable" exactly where a run was refused under an expected composite. Deliberately not ported: the render-once pass, the digest-binding guard, and the dedicated 4 MiB counter — both renderings are minted at the comparison from values this run reported, and rows are charged whole by the existing report budget.Tests: the defect-class differential (a target-only pack edit invisible without the assertion, caught with it — composite and node both), reported-target semantics (null/named on escalating and non-escalating rows), unavailable on refusal, loader refusals (version gate, case-fold, beside-error, unnamed node, wrong shapes), CLI and MCP passthrough with exit-code movement. Six mutations each fail a test (comparator neutered, version gate removed, unnamed-node check removed, pair dropped, node comparison skipped, unavailable dropped).
Material-decision impact: public-surface; review: round to be posted on this PR
🤖 Generated with Claude Code