opencode-swarm 7.184.5 → 7.184.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/.opencode/skills/issue-tracer/SKILL.md +3 -3
  2. package/.opencode/skills/issue-tracer/assets/pr-template.md +7 -0
  3. package/.opencode/skills/issue-tracer/references/acceptance-checks.md +30 -6
  4. package/.opencode/skills/issue-tracer/references/critic-gate.md +5 -0
  5. package/.opencode/skills/issue-tracer/references/evidence-artifacts.md +18 -2
  6. package/.opencode/skills/issue-tracer/scripts/repro-check.sh +604 -77
  7. package/.opencode/skills/issue-tracer/scripts/trace-check.sh +486 -60
  8. package/.opencode/skills/issue-tracer/scripts/trace-init.sh +30 -0
  9. package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
  10. package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
  11. package/dist/cli/{coder-settlement-m3r1kmzx.js → coder-settlement-2759zt77.js} +11 -11
  12. package/dist/cli/{config-doctor-1qgq2s96.js → config-doctor-g48tz4kt.js} +3 -3
  13. package/dist/cli/{core-h7pp6xzs.js → core-1jfgxw72.js} +4 -4
  14. package/dist/cli/{curation-policy-49f8jx48.js → curation-policy-k43q6b91.js} +4 -4
  15. package/dist/cli/{curator-drift-epvr1y5j.js → curator-drift-5wc9jfmy.js} +9 -9
  16. package/dist/cli/curator-llm-factory-jjd0cxb2.js +75 -0
  17. package/dist/cli/{curator-48mky2w8.js → curator-m7sja3jp.js} +38 -38
  18. package/dist/cli/{evidence-summary-service-akzas6he.js → evidence-summary-service-sx8x12w0.js} +17 -17
  19. package/dist/cli/{gate-evidence-gmq1th1b.js → gate-evidence-znfffz94.js} +8 -6
  20. package/dist/cli/guardrail-explain-x81m4s8q.js +76 -0
  21. package/dist/cli/{guardrail-log-n2cgvbh1.js → guardrail-log-mcv4ad3t.js} +7 -7
  22. package/dist/cli/{guardrail-reset-3br6fs4n.js → guardrail-reset-ksrr2r0n.js} +38 -38
  23. package/dist/cli/{hive-promoter-a1yw6evd.js → hive-promoter-06dzq5ms.js} +38 -38
  24. package/dist/cli/{index-fnbcd9ve.js → index-0prgjynb.js} +5 -5
  25. package/dist/cli/{index-ar2gsn6b.js → index-14j1jkyy.js} +6 -6
  26. package/dist/cli/{index-2zzmthnv.js → index-16smfppa.js} +4 -4
  27. package/dist/cli/{index-k1cxzdbd.js → index-1kz2repk.js} +4 -4
  28. package/dist/cli/{index-7ge1gcd3.js → index-1npynszx.js} +12 -12
  29. package/dist/cli/{index-82hy3v8f.js → index-1nwkzj24.js} +2 -2
  30. package/dist/cli/{index-ya32wfkp.js → index-1t2ctwkd.js} +1 -1
  31. package/dist/cli/{index-8pfcj7tz.js → index-2s0gy81b.js} +3 -3
  32. package/dist/cli/{index-k53a69vb.js → index-2t4zv1ag.js} +7 -14
  33. package/dist/cli/{index-3ny2d85s.js → index-3h0f07e9.js} +2 -2
  34. package/dist/cli/{index-qf75z3xz.js → index-42pchr9f.js} +1 -1
  35. package/dist/cli/{index-6jqxstq4.js → index-4qmeshfa.js} +5 -5
  36. package/dist/cli/{index-3n5zsp31.js → index-7xv2hvr6.js} +2 -2
  37. package/dist/cli/{index-10rsjhfy.js → index-82j1een1.js} +46 -19
  38. package/dist/cli/{index-h9hvszf7.js → index-8bvpcbk8.js} +40 -40
  39. package/dist/cli/{index-wy3zpwjy.js → index-98a0rxby.js} +1 -1
  40. package/dist/cli/{index-vyjped9g.js → index-b1v0zxnh.js} +2 -2
  41. package/dist/cli/{index-cdvb33mn.js → index-bf055zyw.js} +2 -2
  42. package/dist/cli/{index-2adz24wr.js → index-c5c7hrz1.js} +3 -3
  43. package/dist/cli/{index-6bn74qs9.js → index-dyddcx8h.js} +168 -105
  44. package/dist/cli/{index-xf69xty9.js → index-e1zrgvqg.js} +1 -1
  45. package/dist/cli/{index-yqcaf6r3.js → index-eecz2kna.js} +7 -7
  46. package/dist/cli/{index-1511m10x.js → index-enjsn68b.js} +7 -7
  47. package/dist/cli/{index-wzec3c4g.js → index-ezagem2g.js} +4 -0
  48. package/dist/cli/{index-zzvxj02e.js → index-fr6x6vn2.js} +1 -1
  49. package/dist/cli/{index-475bkab8.js → index-g2r6t7by.js} +1 -1
  50. package/dist/cli/{index-tzejdtyx.js → index-kbd6apth.js} +38 -38
  51. package/dist/cli/{index-e602am4j.js → index-m8rt7a3g.js} +4 -4
  52. package/dist/cli/{index-xf6j4ypk.js → index-mp60wy1f.js} +4 -4
  53. package/dist/cli/{index-6g664sy8.js → index-q39ecyaq.js} +1 -1
  54. package/dist/cli/{index-tajh3egk.js → index-q4a0j3nh.js} +5 -5
  55. package/dist/cli/{index-earq3mda.js → index-qeqn241m.js} +1 -1
  56. package/dist/cli/{index-ae2jf510.js → index-raj6y6d3.js} +2 -2
  57. package/dist/cli/{index-f0nj3d8z.js → index-rmspt7xm.js} +1 -1
  58. package/dist/cli/{index-ezpzd88b.js → index-rwzrbcm9.js} +2 -2
  59. package/dist/cli/{index-jvk95e6y.js → index-s95ghsy1.js} +1 -1
  60. package/dist/cli/{index-f4z1ez09.js → index-sxxj47cy.js} +6 -6
  61. package/dist/cli/{index-w9hxzcz4.js → index-t0mb5a9p.js} +1 -1
  62. package/dist/cli/{index-wehwbv89.js → index-x16a0c6b.js} +7 -7
  63. package/dist/cli/{index-456awy1p.js → index-xqxqepsy.js} +2 -2
  64. package/dist/cli/{index-zeg8y1fw.js → index-ywmknn6m.js} +1 -1
  65. package/dist/cli/{index-d1bfyxj5.js → index-z1qs160n.js} +1 -1
  66. package/dist/cli/{index-gcdgtcg5.js → index-z7recmq5.js} +3 -3
  67. package/dist/cli/index.d.ts +36 -7
  68. package/dist/cli/index.js +352 -92
  69. package/dist/cli/{knowledge-escalator-rdgspj3v.js → knowledge-escalator-ghx76dcv.js} +12 -12
  70. package/dist/cli/{knowledge-events-zh16e78y.js → knowledge-events-kpw6fbmc.js} +10 -10
  71. package/dist/cli/{knowledge-link-ap2274vm.js → knowledge-link-xw6vsbx3.js} +3 -3
  72. package/dist/cli/{knowledge-store-jxke13cv.js → knowledge-store-fhdrpxdm.js} +4 -4
  73. package/dist/cli/{knowledge-validator-24myt9fp.js → knowledge-validator-7jr0aka1.js} +6 -6
  74. package/dist/cli/{mcp-a4q99fmb.js → mcp-v7cgf5tn.js} +1 -1
  75. package/dist/cli/{model-preflight-qy88p9fc.js → model-preflight-kn3xqvfk.js} +38 -38
  76. package/dist/cli/{pending-delegations-9vqyq3bj.js → pending-delegations-z7mcbecn.js} +10 -10
  77. package/dist/cli/{pr-subscriptions-hrefmtay.js → pr-subscriptions-1sb07tx3.js} +10 -10
  78. package/dist/cli/{pr-workflow-gate-1jcs4wnp.js → pr-workflow-gate-ph4fvf47.js} +38 -38
  79. package/dist/cli/{runner-yz3ysehf.js → runner-pvdhxh74.js} +4 -4
  80. package/dist/cli/{scan-cursor-krn56ew2.js → scan-cursor-7ny9bnmk.js} +5 -5
  81. package/dist/cli/{schema-zqankczb.js → schema-pjkzvcw8.js} +2 -2
  82. package/dist/cli/{scope-persistence-5qrjm5d2.js → scope-persistence-mkb8yc5s.js} +14 -14
  83. package/dist/cli/{server-7wydssat.js → server-4e853cwk.js} +38 -38
  84. package/dist/cli/{skill-generator-br4wctes.js → skill-generator-v6n0kwh0.js} +14 -14
  85. package/dist/cli/{snapshot-coordination-init-g4sg2fxv.js → snapshot-coordination-init-agx2sn6h.js} +38 -38
  86. package/dist/cli/{speckit-checkoff-82s1qy0c.js → speckit-checkoff-wfsbvt1b.js} +5 -5
  87. package/dist/cli/{workspace-snapshot-xwhhznt3.js → workspace-snapshot-553c6cd3.js} +3 -3
  88. package/dist/cli/{worktree-collision-ownership-19n9em8b.js → worktree-collision-ownership-4znww3nt.js} +11 -11
  89. package/dist/cli/{worktree-isolation-hkd7xtdp.js → worktree-isolation-w4k8q59z.js} +38 -38
  90. package/dist/commands/registry.d.ts +1 -1
  91. package/dist/gate-evidence.d.ts +51 -0
  92. package/dist/index.js +34 -34
  93. package/dist/tools/index.d.ts +1 -0
  94. package/dist/tools/manifest.d.ts +1 -0
  95. package/dist/tools/record-branch-freshness.d.ts +6 -0
  96. package/dist/tools/record-trace-validation.d.ts +11 -0
  97. package/dist/tools/recover-stage-a-task.d.ts +5 -0
  98. package/dist/tools/tool-metadata.d.ts +4 -0
  99. package/dist/workflow/settlement-recovery.d.ts +52 -0
  100. package/dist/workflow/stage-a-repair.d.ts +13 -8
  101. package/dist/workflow/task-recovery-status.d.ts +11 -2
  102. package/package.json +1 -1
  103. package/dist/cli/curator-llm-factory-782jtn0a.js +0 -75
  104. package/dist/cli/guardrail-explain-xgahzbts.js +0 -76
@@ -27,7 +27,7 @@ This contract is MANDATORY and blocking in every implementation mode. Closure is
27
27
  5. **Class eradication.** Phase 4.2 characterizes the defect class, sweeps the codebase, dispositions every hit, and installs a demonstrated guardrail.
28
28
  6. **Acceptance criteria closed.** Every acceptance criterion is re-verified at closure with concrete evidence.
29
29
  7. **Evidence over assertion, SHA-bound.** Every "passed"/"verified" claim cites command and output; every review verdict records the exact commit SHA and tree-id it examined, and closure requires the final approval identity to equal what ships.
30
- 8. **Anti-tampering.** Once the Phase 2.5 red checkpoint is frozen, weakening, skipping, or deleting an acceptance check is a contract violation; any legitimate change goes through the checkpoint manifest as an `AMEND` row with a closed reason. `repro-check.sh` enforces three properties only - it refuses to re-freeze an already-frozen path, and it rejects a manifest whose row count differs from the count recorded in its header or whose `seq` column is not contiguous - which close deletion, truncation, reordering, and silent re-freeze. They are within-file, shape-only checks: editing a blob id in place, or deleting the manifest and re-running the freeze, is NOT detected, because nothing yet binds the file to anything outside the agent-writable trace directory. The manifest is evidence a reviewer re-runs and reads, never a mechanism that prevents weakening.
30
+ 8. **Anti-tampering.** Once the Phase 2.5 red checkpoint is frozen, weakening, skipping, or deleting an acceptance check is a contract violation; any legitimate change goes through the checkpoint manifest as an `AMEND` row with a closed reason. `repro-check.sh` enforces the manifest shape and emits an `anchor` receipt containing the no-filter manifest digest, the ordered acceptance-table semantic digest (`AC/class/check/argv/expect`), and the recorded `checkpoint-tree-id`. External publication of that receipt is a human-enforced gate outside the writable trace: `trace-check.sh` can validate only local structure and cannot attest that a receipt was published or when. A reviewer records the exact line after Phase 2.5, outside the trace, and later runs `verify-anchor` against that supplied literal. Editing a blob id or acceptance-table semantic field in place, or deleting/refreezing the manifest, therefore fails against the published receipt. A byte-identical refreeze remains valid by design. The manifest and table remain evidence a reviewer re-runs and reads; the external receipt is the non-circular identity anchor.
31
31
 
32
32
  ## Gate Table
33
33
 
@@ -38,9 +38,9 @@ This table is the normative center of the protocol: `trace-check.sh` reads it, a
38
38
  | 0 Setup | `state.md` | `trace-check.sh phase 0` | base SHA, tree-id, tier, freshness, and handshake recorded |
39
39
  | 1 Intake | `01-issue-summary.md` | `trace-check.sh phase 1` | classification set; acceptance criteria numbered; related issues listed |
40
40
  | 2 Reproduction + localization | `02-reproduction.md`, `03-localization-log.md`, `04-root-cause.md` | `trace-check.sh phase 2` | reproduction command + exit code + output; root cause at line/condition level |
41
- | 2.5 Acceptance checks (red checkpoint) | `## Acceptance checks` table in `02`, `repro/checkpoint.manifest` | `trace-check.sh phase 2.5` | every AC typed and checked; checkpoint tree-id recorded; diff from Phase 0 limited to manifest paths |
41
+ | 2.5 Acceptance checks (red checkpoint) | `## Acceptance checks` table in `02`, `repro/checkpoint.manifest` | `trace-check.sh phase 2.5` | every AC typed and checked; manifest identities are `(path, check-id)` pairs, so multiple commands may freeze identical bytes from one file; checkpoint tree-id recorded; diff from Phase 0 limited to manifest paths; the external anchor publication is a human gate (not machine-verifiable by this validator) and must be confirmed before implementation |
42
42
  | 3 Plan + critic | `05-fix-plan.md`, `06-critic-review.md`, `07-approved-plan.md` | `trace-check.sh phase 3` | critic replays every frozen check; APPROVE recorded with both identities; user approval quoted |
43
- | 4 Implement + validate | `08-test-results.md` | `trace-check.sh phase 4` | every check RED-to-GREEN or GREEN-to-GREEN; checkpoint re-verified; `scan-deferred.sh` clean |
43
+ | 4 Implement + validate | `08-test-results.md` | `trace-check.sh phase 4` | every check RED-to-GREEN or GREEN-to-GREEN; acceptance-table executable semantics match the manifest; checkpoint re-verified; `scan-deferred.sh` clean |
44
44
  | 4.2 Recurrence census | `08a-recurrence-sweep.md` | `trace-check.sh phase 4.2` | predicates counted; dispositions sum to counts; guardrail proven |
45
45
  | 4.5 Implementation review | `08b-implementation-review.md` | `trace-check.sh phase 4.5` | clean tree; independent APPROVE with `reviewed-commit` == HEAD |
46
46
  | 4.6 Final critic | `09-final-critic.md` | `trace-check.sh phase 4.6` | clean tree; APPROVE with both identities == current; every AC has evidence |
@@ -32,6 +32,13 @@ This is a drafting aid. The published PR body must satisfy the repository's own
32
32
  - [Negative/boundary/adversarial case if relevant]
33
33
  - [Test drift review result]
34
34
 
35
+ ## External Checkpoint Anchor
36
+
37
+ - Receipt published before implementation (human-confirmed; local validation cannot attest publication/timing): `issue-tracer-checkpoint-v1 slug=<slug> manifest=<40-hex> semantics=<40-hex> tree=<40-hex>`
38
+ - External artifact location: [issue/PR/conversation URL or identifier]
39
+ - Independent verification: `repro-check.sh verify-anchor --slug <slug> --receipt '<published literal>'` -> PASS
40
+ - Local copy/provenance: [discovery copy path; explicitly non-authoritative]
41
+
35
42
  ## Acceptance Criteria -> Evidence
36
43
 
37
44
  | Acceptance criterion (from intake) | Evidence (command + output, or test name) |
@@ -9,6 +9,13 @@ Use this reference for Phase 2.5 (freezing the checks) and Phase 4 (proving they
9
9
  3. Freeze the check set with `repro-check.sh checkpoint` before any production fix code exists. The checkpoint tree-id must differ from the Phase 0 tree-id only by paths listed in `repro/checkpoint.manifest` - this is validated mechanically at `trace-check.sh phase 2.5`.
10
10
  4. Phase 4 re-runs every check against the fixed tree; results are appended to the same table's `post-fix` column and echoed in `08-test-results.md`.
11
11
 
12
+ The acceptance-table parser accepts either LF or CRLF line endings by removing
13
+ only each record's terminal CR before matching the header and rows. Embedded
14
+ C0/DEL control bytes (including controls in `AC`, `class`, `check`, `argv`,
15
+ `expect`, or `notes`) and rows without exactly ten pipe-separated fields are
16
+ rejected before any cell is used in a diagnostic. This keeps table validation
17
+ and the semantic digest deterministic across Windows and POSIX checkouts.
18
+
12
19
  ## The three executable classes, plus NON-EXECUTABLE
13
20
 
14
21
  - **DISCRIMINATING** - behavior the bug breaks. Must be RED on the pre-fix tree for the expected reason (base exit nonzero and output matching `--expect`), GREEN after the fix. This is the class the bug-contrast replay rule applies to hardest.
@@ -26,17 +33,34 @@ Research measured that an agent's own generated tests overfit toward validating
26
33
 
27
34
  ## Red checkpoint manifest and amendment procedure
28
35
 
29
- `repro/checkpoint.manifest` lives in the git-excluded trace directory and is written only by `repro-check.sh checkpoint`; `repro-check.sh verify-checkpoint` replays it. The format is defined by the script itself: a `# issue-tracer checkpoint manifest v1 rows=<N>` header line, where `<N>` is the number of data rows and is restamped on every append, then one tab-separated row per frozen path with exactly ten fields - seq, kind (`CHECKPOINT` or `AMEND`), path, blob id, mode, check id, argv, expected regex, base SHA, and reason. Files are formatted with the repo's own formatter before hashing, and new checks live in their own new files (never appended to an existing file already at the 500-line test-file cap) so a later formatter pass does not silently change a frozen blob.
36
+ `repro/checkpoint.manifest` lives in the git-excluded trace directory and is written only by `repro-check.sh checkpoint`; `repro-check.sh verify-checkpoint` replays it. The format is defined by the script itself: a `# issue-tracer checkpoint manifest v1 rows=<N>` header line, where `<N>` is the number of data rows and is restamped on every append, then one tab-separated row per checkpoint event with exactly ten fields - seq, kind (`CHECKPOINT` or `AMEND`), path, blob id, mode, check id, argv, expected regex, base SHA, and reason. Manifest identity is the `(path, check-id)` pair, so distinct checks may share a path when they capture the same current bytes. Files are formatted with the repo's own formatter before hashing, and new checks live in their own new files (never appended to an existing file already at the 500-line test-file cap) so a later formatter pass does not silently change a frozen blob.
37
+
38
+ Four properties are mechanically enforced, by both `checkpoint` and `verify-checkpoint`. First, **a frozen pair cannot be re-frozen**: once a `(path, check-id)` pair appears in the manifest, a plain `repro-check.sh checkpoint` on that pair exits 2, while a different check id may checkpoint the same path only after hashing the current bytes. `verify-checkpoint` independently rejects any later row for the same pair that is not an `AMEND`, so a forged duplicate `CHECKPOINT` row is refused too, and an `AMEND` must name an existing exact pair. Second, **the effective manifest has one blob per path**: multiple check ids sharing a path are deduplicable only when their latest blobs are identical; divergent effective blobs fail closed instead of becoming path-only last-writer-wins. Third, **the recorded row count is validated**: the header's `rows=<N>` must equal the number of data rows actually present. Fourth, **seq continuity is validated**: the seq column must run 1..N with no gaps and every row must carry exactly ten fields. The count and seq checks are complementary and neither is sufficient alone - seq continuity is only a *prefix* invariant, so truncating the tail (`head -3`, or dropping the last row) leaves the survivors perfectly contiguous; the count is what catches that, and seq is what catches a deletion in the middle. Together they make deleting, truncating, reordering, duplicating, or mangling a row exit 2 in both commands instead of silently dropping that check out of the replay set.
39
+
40
+ These row-shape properties do not by themselves inspect frozen content. The external checkpoint anchor below binds both content identity and the ordered acceptance-table semantics. Reviewers must retain the literal receipt emitted before implementation and verify it after the fix. The manifest and table remain agent-writable trace artifacts, so an in-place field edit, a semantic-table edit, a delete-and-refreeze, or a restamped state file is not independently authoritative; the old receipt is what makes those changes fail closed. A byte-identical refreeze is valid because it preserves the anchored digests and checkpoint tree id.
41
+
42
+ So be precise about what is bought. The manifest-only rules close the ACCIDENTAL routes - a partial write, a botched hand edit, a truncating rewrite - and they close the one route that previously needed no editing at all: re-running the sanctioned freeze command to re-baseline a weakened check to green. A deliberate manifest edit or delete-and-refreeze fails when a reviewer verifies the pre-implementation external receipt. The plan critic and implementation reviewer still assess the semantic adequacy of the originally frozen checks; receipt verification does not make a weak check meaningful. Treat the manifest as a record to verify, never as a guarantee that its checks are adequate. A `v1` header with no `rows=` count is rejected outright for the same reason - accepting it for compatibility would itself be a one-line way to switch the count check off.
43
+
44
+ Amending a frozen check (the check was wrong or the acceptance criterion changed) appends a new manifest entry rather than editing the old one, with a closed reason: `CHECK_WRONG` or `AC_CHANGED_BY_USER`. Both reasons require a fresh RED/GREEN replay before the amendment counts. Formatting changes to a frozen file are not a special exemption: use `CHECK_WRONG` or `AC_CHANGED_BY_USER` only when the check is genuinely being amended, then replay and review the result. The plan critic (before implementation) or the implementation reviewer (after) approves every amendment. Deleting or weakening a check to reach green, instead of amending it with a recorded reason, is a Full-Resolution Contract anti-tampering violation (clause 8).
30
45
 
31
- Three properties are mechanically enforced, by both `checkpoint` and `verify-checkpoint`. First, **a frozen path cannot be re-frozen**: once a path appears in the manifest, a plain `repro-check.sh checkpoint` on it exits 2, and `verify-checkpoint` independently rejects any later row for that path that is not an `AMEND` - so a forged `CHECKPOINT` row appended by hand is refused too, and the only way to supersede a frozen blob is an `AMEND` row carrying one of the closed reasons below, which stays in the file for the reviewer to read. Second, **the recorded row count is validated**: the header's `rows=<N>` must equal the number of data rows actually present. Third, **seq continuity is validated**: the seq column must run 1..N with no gaps and every row must carry exactly ten fields. The second and third are complementary and neither is sufficient alone - seq continuity is only a *prefix* invariant, so truncating the tail (`head -3`, or dropping the last row) leaves the survivors perfectly contiguous; the count is what catches that, and seq is what catches a deletion in the middle. Together they make deleting, truncating, reordering, duplicating, or mangling a row exit 2 in both commands instead of silently dropping that check out of the replay set - and, because a truncated-away path would otherwise no longer count as frozen, they are also what keeps the first property from being reopened by a truncation.
46
+ ## External checkpoint anchor
32
47
 
33
- These three properties are cardinality-and-shape checks. They never inspect row CONTENT, and that limit is the most important thing to understand about this artifact. **Editing a field of an existing row in place is not detected at all.** Replacing the blob id of a frozen row with the hash of a weakened file leaves `rows=<N>` correct, `seq` contiguous, ten fields intact, no `AMEND` row and no new line - a structurally pristine manifest - and `verify-checkpoint` then prints `OK` and exits 0. That is a single `sed`. Worse, the checks are all *within-file* invariants - nothing binds the manifest's existence or completeness to anything outside it - so deleting the manifest (or blanking it back to a `rows=0` header) and re-running the sanctioned `repro-check.sh checkpoint` re-freezes every path against whatever the files contain now, exits 0, and leaves a structurally pristine manifest that `verify-checkpoint` and Phase 2.5 both accept. No editing of any row is required.
48
+ After the final Phase-2.5 checkpoint and before any production edit, run `repro-check.sh anchor --slug <slug>`. It first verifies the manifest and that every executable table row's `check`, `argv`, and `expect` matches the effective manifest, then emits exactly one line in this shape:
34
49
 
35
- Closing this needs an anchor the manifest itself does not supply, and none is implemented yet. A hash stored beside the manifest is circular - the trace directory is the agent's own write surface, deliberately excluded from `tree-id` and from the dirty-tree gate, so the same hand writes both. The most promising in-band candidate is the `checkpoint-tree-id` already recorded in `state.md` and cross-checked at Phase 2.5: it is a content-addressed git tree, so each manifest blob id could be compared against `git rev-parse "<checkpoint-tree-id>:<path>"`, which would catch an in-place edit and a delete-and-re-freeze alike. It is not circular in the accidental case and raises cost in the adversarial one, though an agent that also restamps `checkpoint-tree-id` still gets through. A fully non-circular anchor has to live outside the agent's reach entirely - the manifest hash published in the PR body, a git note, or a CI artifact at freeze time. Both options are tracked in the follow-up issue; until one lands, treat the manifest accordingly.
50
+ ```text
51
+ issue-tracer-checkpoint-v1 slug=<slug> manifest=<40-hex manifest blob> semantics=<40-hex acceptance-table digest> tree=<40-hex checkpoint-tree-id>
52
+ ```
36
53
 
37
- So be precise about what is bought. These rules close the ACCIDENTAL routes - a partial write, a botched hand edit, a truncating rewrite - and they close the one route that previously needed no editing at all: re-running the sanctioned freeze command to re-baseline a weakened check to green. They do not raise a meaningful barrier against an agent that deliberately edits the file. Treat the manifest as a record a reviewer must independently re-run and read, never as a guarantee that the checks it lists are the checks that were frozen. Detecting a deliberate weakening remains the plan critic's and implementation reviewer's job. A `v1` header with no `rows=` count is rejected outright for the same reason - accepting it for compatibility would itself be a one-line way to switch the count check off.
54
+ The implementation owner publishes that literal in the issue, PR, or other reviewer-visible external conversation and records the artifact location in the trace as a non-authoritative discovery copy. Publication and its before/after timing are human-enforced: `trace-check.sh` cannot observe that external conversation. The owner must not regenerate it after implementation begins. An independent reviewer copies the published literal into `repro-check.sh verify-anchor --slug <slug> --receipt '<literal>'`; verification compares the current manifest digest, the current ordered `AC/class/check/argv/expect` digest, and `state.md`'s recorded `checkpoint-tree-id`. It deliberately does not compare the live working-tree tree, which changes as the fix is implemented. Malformed, stale, tampered, semantic-table-edited, or delete-and-refreeze evidence fails closed; a byte-identical refreeze remains valid because it has the same content identity.
38
55
 
39
- Amending a frozen check (the check was wrong, or a formatter-only touch changed its blob) appends a new manifest entry rather than editing the old one, with a closed reason: `CHECK_WRONG`, `FORMAT_ONLY`, or `AC_CHANGED_BY_USER`. `CHECK_WRONG` and `AC_CHANGED_BY_USER` require a fresh RED/GREEN replay before the amendment counts; `FORMAT_ONLY` is defined as behavior-preserving and so skips the replay. Note that the `reason` field is asserted by the writer and never verified: a semantic weakening labelled `FORMAT_ONLY` supersedes a frozen blob and skips the replay in one sanctioned command. The reviewer therefore checks every `FORMAT_ONLY` row against the actual blob diff rather than accepting the label. The plan critic (before implementation) or the implementation reviewer (after) approves every amendment. Deleting or weakening a check to reach green, instead of amending it with a recorded reason, is a Full-Resolution Contract anti-tampering violation (clause 8).
56
+ Receipt compatibility is intentionally strict: the pre-semantics receipt
57
+ syntax (the same `issue-tracer-checkpoint-v1` prefix without a `semantics=`
58
+ field) is rejected as `malformed anchor receipt`. There is no safe migration
59
+ or placeholder digest, because that old receipt never bound the acceptance
60
+ table's `AC/class/check/argv/expect` semantics. A trace with only an old
61
+ receipt must be rechecked and re-anchored before implementation; once
62
+ implementation has begun, stop and obtain a new reviewed checkpoint rather
63
+ than regenerating the receipt silently.
40
64
 
41
65
  ## Dependency strategy
42
66
 
@@ -30,6 +30,8 @@ Read these artifacts:
30
30
 
31
31
  Also inspect any files referenced in the plan. Do not trust summaries if the underlying code is available. Independently replay the frozen acceptance checks yourself (`repro-check.sh run` for each row) before returning a verdict - do not accept the table's pre-fix column on faith.
32
32
 
33
+ When a checkpoint anchor exists, independently compare the externally published receipt with `repro-check.sh verify-anchor --slug <slug> --receipt '<literal>'`; this verifies the local manifest/table/tree digests only, while publication and its timing remain a human gate that the validator cannot observe. Do not accept a receipt regenerated after implementation began.
34
+
33
35
  Return exactly:
34
36
 
35
37
  # Critic Review
@@ -159,6 +161,8 @@ Find, with concrete evidence:
159
161
  - independently re-run every acceptance check yourself with `repro-check.sh run` on both the pre-fix and current trees
160
162
  - verify `repro-check.sh verify-checkpoint`, scan for tautological checks, and (at tier M/L, any risk trigger, or any NEW-SURFACE row) run the revert/mutation probe from `references/acceptance-checks.md`
161
163
 
164
+ When a checkpoint anchor exists, independently compare the externally published receipt with `repro-check.sh verify-anchor --slug <slug> --receipt '<literal>'`; this verifies the local manifest/table/tree digests only, while publication and its timing remain a human gate that the validator cannot observe. Do not accept a receipt regenerated after implementation began.
165
+
162
166
  Return exactly:
163
167
 
164
168
  # Implementation Review
@@ -240,6 +244,7 @@ Check:
240
244
  - every acceptance criterion maps to concrete evidence
241
245
  - validation claims are backed by commands and output
242
246
  - no work was silently deferred, scoped out, or left unwired
247
+ - if a checkpoint anchor exists, verify the externally published literal with `repro-check.sh verify-anchor` and record human confirmation that it was published before implementation (the local validator cannot verify publication or timing)
243
248
 
244
249
  Return exactly:
245
250
 
@@ -105,13 +105,29 @@ Gate rows (`plan-critic`, `implementation-review`, `final-critic`, `merge-approv
105
105
  |---|---|---|---|---|---|---|---|
106
106
  | AC1 | DISCRIMINATING / PRESERVING / NEW-SURFACE / NON-EXECUTABLE | C1 or DOCS_ONLY/HOST_ONLY/PRODUCT_DECISION/EXTERNAL_SERVICE_UNAVAILABLE | `<command>` or `-` | `<regex>` or `-` | RED / GREEN / ERROR / `-` | GREEN or `pending` | [substitute evidence path or free text] |
107
107
 
108
- The table splits each row on `|`, so the `argv` cell must never contain a literal `|` (for example a shell pipeline). If a check needs a pipeline, write it as a small script under `repro/` and put the script's path/invocation in `argv` instead of the raw pipeline. `trace-check.sh` rejects any row with more than 8 cells with `FAIL acceptance-table-row-ACn: row for ACn has too many columns (literal | in argv?)`.
108
+ The table splits each row on `|`, so the `argv` cell must never contain a literal `|` (for example a shell pipeline). If a check needs a pipeline, write it as a small script under `repro/` and put the script's path/invocation in `argv` instead of the raw pipeline. Rows must have exactly ten pipe-separated fields, including the leading and trailing delimiters; missing a final delimiter is malformed just like an extra delimiter. The parser accepts LF and CRLF line endings by stripping only each record's terminal CR, while embedded C0/DEL control bytes in any cell are rejected before diagnostics. `trace-check.sh` reports the row shape/control failure without interpolating the untrusted cell.
109
109
 
110
110
  ## Red checkpoint
111
111
  manifest: repro/checkpoint.manifest
112
112
  checkpoint-tree-id: <40-hex>
113
113
  ```
114
114
 
115
+ ## External checkpoint anchor
116
+
117
+ After the final Phase-2.5 checkpoint and before production edits, the implementation owner runs `repro-check.sh anchor --slug <slug>` and publishes the exact one-line receipt in an external, reviewer-visible issue or PR conversation. This publication and its timing are a human-enforced gate; the local validator cannot attest to either. The receipt has no secrets or source content:
118
+
119
+ ```text
120
+ issue-tracer-checkpoint-v1 slug=<slug> manifest=<40-hex manifest blob> semantics=<40-hex acceptance-table digest> tree=<40-hex checkpoint-tree-id>
121
+ ```
122
+
123
+ Record the publication URL or conversation identifier and a verbatim discovery copy in the trace, but never treat that local copy as authority. The owner must not regenerate the receipt after implementation begins. Independent reviewers verify the externally copied literal with `repro-check.sh verify-anchor --slug <slug> --receipt '<literal>'`; verification uses the no-filter manifest digest, the ordered acceptance-table semantic digest, and the `checkpoint-tree-id` recorded in `state.md`, not the live working-tree tree. Any malformed, stale, in-place-edited, semantic-table-edited, or delete-and-refrozen manifest fails closed. A byte-identical refreeze is intentionally accepted.
124
+
125
+ Receipts emitted before the `semantics=` field was introduced are not
126
+ compatible with this schema and are rejected as malformed. No migration is
127
+ provided: an old receipt cannot prove that the acceptance table was frozen,
128
+ so a pre-implementation trace must be rechecked and re-anchored, while a
129
+ trace already under implementation must not silently regenerate its anchor.
130
+
115
131
  ## `03-localization-log.md`
116
132
 
117
133
  ```markdown
@@ -361,7 +377,7 @@ Written when CI rounds occur after publication: one entry per round with the fai
361
377
 
362
378
  ## `repro/` layout
363
379
 
364
- Lives inside the trace directory (git-excluded, never committed): `checkpoint.manifest` (rows are appended, never edited - a frozen path is superseded only by a recorded `AMEND` row, and both the header's recorded row count and `seq` continuity are validated on every read and write; header `# issue-tracer checkpoint manifest v1 rows=<N>`, restamped with the row and seeded by `trace-init.sh` as `rows=0`, and see `references/acceptance-checks.md` for what that does and does not guarantee) plus `<check-id>.base.log` and `<check-id>.head.log` per executable check, written by `repro-check.sh run`.
380
+ Lives inside the trace directory (git-excluded, never committed): `checkpoint.manifest` (rows are appended, never edited - a frozen `(path, check-id)` pair is superseded only by a recorded `AMEND` row, while distinct check ids may share a path only when they capture identical current bytes; divergent effective blobs for one path fail closed, and both the header's recorded row count and `seq` continuity are validated on every read and write; header `# issue-tracer checkpoint manifest v1 rows=<N>`, restamped with the row and seeded by `trace-init.sh` as `rows=0`, and see `references/acceptance-checks.md` for what that does and does not guarantee) plus `<check-id>.base.log` and `<check-id>.head.log` per executable check, written by `repro-check.sh run`.
365
381
 
366
382
  ## OBE subset
367
383