opencode-swarm 7.194.0 → 7.195.0

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 (110) hide show
  1. package/.opencode/skills/commit-pr/SKILL.md +8 -0
  2. package/.opencode/skills/issue-tracer/references/acceptance-checks.md +20 -0
  3. package/.opencode/skills/issue-tracer/references/full-resolution-contract.md +12 -0
  4. package/.opencode/skills/swarm-pr-feedback/SKILL.md +2 -2
  5. package/.opencode/skills/swarm-pr-feedback/references/operational-gotchas.md +18 -0
  6. package/.opencode/skills/swarm-pr-review/SKILL.md +11 -10
  7. package/.opencode/skills/swarm-pr-review/references/counterbalancing.md +68 -0
  8. package/.opencode/skills/swarm-pr-review/references/findings-persistence-contract.md +21 -0
  9. package/.opencode/skills/swarm-pr-review/references/parser-dry-run.md +11 -0
  10. package/.opencode/skills/swarm-pr-review/references/prompt-templates.md +8 -0
  11. package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
  12. package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
  13. package/dist/background/pr-review-collection-receipt.d.ts +7 -1
  14. package/dist/background/pr-review-contract.d.ts +10 -0
  15. package/dist/cli/{auto-checkpoint-67dk8rjz.js → auto-checkpoint-anf21wwa.js} +9 -9
  16. package/dist/cli/{checkpoint-jbqqyp5e.js → checkpoint-ngdw2qx2.js} +17 -17
  17. package/dist/cli/{coder-settlement-a09t7mvx.js → coder-settlement-bqb059y2.js} +13 -13
  18. package/dist/cli/{config-doctor-dkp263xx.js → config-doctor-vetg215g.js} +16 -16
  19. package/dist/cli/{core-stnmz1rg.js → core-8qgvsm6x.js} +4 -4
  20. package/dist/cli/{curation-policy-8j6qn6nt.js → curation-policy-5hm6328s.js} +6 -6
  21. package/dist/cli/{curator-drift-d1wedyed.js → curator-drift-3gjycbkv.js} +9 -9
  22. package/dist/cli/{curator-mc0wcpvw.js → curator-hh0n9wgz.js} +43 -43
  23. package/dist/cli/curator-llm-factory-d17ybmgm.js +82 -0
  24. package/dist/cli/{doctor-knowledge-receipt-phase-id-dfwx5jha.js → doctor-knowledge-receipt-phase-id-1d465vkg.js} +9 -9
  25. package/dist/cli/{evidence-summary-service-k1shqefr.js → evidence-summary-service-rkd3yc5x.js} +20 -20
  26. package/dist/cli/{gate-evidence-vw9y4gs6.js → gate-evidence-wtjrerkh.js} +8 -8
  27. package/dist/cli/guardrail-explain-8xh3r0dn.js +83 -0
  28. package/dist/cli/{guardrail-log-vbeyx6nq.js → guardrail-log-jrey2myg.js} +8 -8
  29. package/dist/cli/{guardrail-reset-jwtt15e3.js → guardrail-reset-m5qbg30j.js} +43 -43
  30. package/dist/cli/{hive-promoter-p9ad63mx.js → hive-promoter-36yhdfre.js} +43 -43
  31. package/dist/cli/{index-at34nry4.js → index-1hcjxz6w.js} +5 -5
  32. package/dist/cli/{index-dy7nztyp.js → index-3k65kdfp.js} +12 -10
  33. package/dist/cli/{index-d7pznffh.js → index-479kf368.js} +4 -4
  34. package/dist/cli/{index-5rkh69f3.js → index-4gmxdkcd.js} +2 -2
  35. package/dist/cli/{index-cwr69qw7.js → index-5gf2wx2c.js} +7 -7
  36. package/dist/cli/{index-qh93qjc2.js → index-6183at3v.js} +2 -2
  37. package/dist/cli/{index-r8mavcg6.js → index-6vpqe4ws.js} +5 -5
  38. package/dist/cli/{index-48h1yn6c.js → index-780g1hht.js} +5 -5
  39. package/dist/cli/{index-vjytfp05.js → index-7kbpzg05.js} +291 -92
  40. package/dist/cli/{index-mtqwyjrg.js → index-7rtq2t5n.js} +1 -1
  41. package/dist/cli/{index-7bfshvq1.js → index-82aj6gaj.js} +3 -3
  42. package/dist/cli/{index-vfdkvvkf.js → index-8448vj9w.js} +2 -2
  43. package/dist/cli/{index-y3n9ry9q.js → index-863hst4e.js} +3 -3
  44. package/dist/cli/{index-x7qeaa9y.js → index-9teqkkp4.js} +43 -43
  45. package/dist/cli/{index-51dxek4p.js → index-akb436kn.js} +4 -4
  46. package/dist/cli/{index-0e318vgt.js → index-app2rmxv.js} +1 -1
  47. package/dist/cli/{index-ajkdt5b8.js → index-bftpd2m5.js} +4 -4
  48. package/dist/cli/{index-h14wpwpa.js → index-bpq6z8qe.js} +4 -4
  49. package/dist/cli/{index-43v5axvm.js → index-c4hx57tz.js} +5 -5
  50. package/dist/cli/{index-668npagp.js → index-c5xvm318.js} +1 -1
  51. package/dist/cli/{index-0xe19j9g.js → index-c6hyd8hg.js} +1 -1
  52. package/dist/cli/{index-vg8sxg12.js → index-crz772sx.js} +1 -1
  53. package/dist/cli/{index-6s3ab22d.js → index-dfrcc46h.js} +2 -2
  54. package/dist/cli/{index-9v43y7y6.js → index-epdzvp4w.js} +11 -11
  55. package/dist/cli/{index-n5xwza76.js → index-fk4j26km.js} +7 -7
  56. package/dist/cli/{index-ndec8akq.js → index-gc0aeth5.js} +2 -2
  57. package/dist/cli/{index-fd6b9f38.js → index-ghckhk16.js} +2 -2
  58. package/dist/cli/{index-ehab3z5y.js → index-gns3gc87.js} +4 -4
  59. package/dist/cli/{index-rpnkp79f.js → index-gz16dke1.js} +6 -6
  60. package/dist/cli/{index-kp5qw5p4.js → index-h7275akd.js} +45 -45
  61. package/dist/cli/{index-9kbnxb7v.js → index-ha8xc5d3.js} +2 -2
  62. package/dist/cli/{index-1jt12p3y.js → index-hqrkr9ag.js} +1 -1
  63. package/dist/cli/{index-w2vbaczx.js → index-hy2fqapm.js} +1 -1
  64. package/dist/cli/{index-st80sjg7.js → index-j8t1g5qd.js} +1 -1
  65. package/dist/cli/{index-t6aae9wq.js → index-jatgbm7k.js} +1 -1
  66. package/dist/cli/{index-4ftg3p9n.js → index-jn4mmhqc.js} +2 -2
  67. package/dist/cli/{index-jrs2qh6j.js → index-kmvy5fr8.js} +4 -4
  68. package/dist/cli/{index-84k9zzv1.js → index-kphy4we7.js} +1 -1
  69. package/dist/cli/{index-7njm9jk1.js → index-necqa5bj.js} +2 -2
  70. package/dist/cli/{index-6xppb1er.js → index-peyz4k9k.js} +1 -1
  71. package/dist/cli/{index-3atkcqpb.js → index-ry5g9s8d.js} +1 -1
  72. package/dist/cli/{index-3dpb3kps.js → index-tc8x0zc5.js} +4 -4
  73. package/dist/cli/{index-e8k0v19e.js → index-xmbtwtgw.js} +1 -1
  74. package/dist/cli/{index-yfbk69b1.js → index-xs9cn3c0.js} +6 -6
  75. package/dist/cli/{index-hfssjyxs.js → index-yf2z4j7s.js} +2 -2
  76. package/dist/cli/{index-hfnyykvm.js → index-ypkfhqbc.js} +7 -7
  77. package/dist/cli/{index-9bzgea2y.js → index-yryy781f.js} +4 -4
  78. package/dist/cli/{index-f3ttgqak.js → index-z59414gv.js} +2 -2
  79. package/dist/cli/index.js +44 -44
  80. package/dist/cli/{knowledge-escalator-g6dctrae.js → knowledge-escalator-6sgrjbcj.js} +15 -15
  81. package/dist/cli/{knowledge-events-acdz0x2g.js → knowledge-events-hztjt63y.js} +13 -13
  82. package/dist/cli/{knowledge-link-srnt95wh.js → knowledge-link-8bn2b7vr.js} +5 -5
  83. package/dist/cli/{knowledge-store-vxtj4m59.js → knowledge-store-3sd2034v.js} +6 -6
  84. package/dist/cli/{knowledge-validator-b545vc9t.js → knowledge-validator-3fe82zy4.js} +8 -8
  85. package/dist/cli/{mcp-c3t18313.js → mcp-spbx3efe.js} +1 -1
  86. package/dist/cli/{model-preflight-r99c08re.js → model-preflight-k2bw7rt1.js} +43 -43
  87. package/dist/cli/{pending-delegations-57f3049j.js → pending-delegations-kcvd9t41.js} +12 -12
  88. package/dist/cli/{pr-subscriptions-5jb793xe.js → pr-subscriptions-nqby87en.js} +12 -12
  89. package/dist/cli/{pr-workflow-gate-n3x25ddw.js → pr-workflow-gate-cgbc0x1z.js} +57 -43
  90. package/dist/cli/{runner-b2e89cp1.js → runner-rt2smh14.js} +6 -6
  91. package/dist/cli/{scan-cursor-s9mazw82.js → scan-cursor-sphr9phs.js} +7 -7
  92. package/dist/cli/{schema-7czxpvwm.js → schema-x892aatt.js} +2 -2
  93. package/dist/cli/{scope-persistence-y0ebqyjm.js → scope-persistence-n9xksct2.js} +16 -16
  94. package/dist/cli/{server-m10e78ey.js → server-am2y11yn.js} +43 -43
  95. package/dist/cli/{skill-generator-kzw1dcba.js → skill-generator-p71b6h5k.js} +17 -17
  96. package/dist/cli/{snapshot-coordination-init-z1aqsvn4.js → snapshot-coordination-init-x9b4t9sk.js} +43 -43
  97. package/dist/cli/{speckit-checkoff-1g3vzywn.js → speckit-checkoff-xp9vsp9k.js} +5 -5
  98. package/dist/cli/{telemetry-qaymh4gg.js → telemetry-vapc5q4p.js} +1 -1
  99. package/dist/cli/{workspace-snapshot-p69t9zn7.js → workspace-snapshot-e3kw9kpg.js} +3 -3
  100. package/dist/cli/{worktree-collision-ownership-d0etv08a.js → worktree-collision-ownership-2pmyww6g.js} +13 -13
  101. package/dist/cli/{worktree-isolation-dj2qw13p.js → worktree-isolation-379tmkta.js} +43 -43
  102. package/dist/hooks/pr-workflow-gate.d.ts +153 -0
  103. package/dist/host/v2/session-client.d.ts +45 -26
  104. package/dist/index.js +28 -26
  105. package/dist/pr-review/legacy-transcript-adapter.d.ts +54 -0
  106. package/dist/pr-review/render-review-body.d.ts +20 -0
  107. package/dist/tools/dispatch-lanes.d.ts +16 -1
  108. package/package.json +1 -1
  109. package/dist/cli/curator-llm-factory-97dpqjz4.js +0 -82
  110. package/dist/cli/guardrail-explain-24g3bsqw.js +0 -83
@@ -100,3 +100,11 @@ If this session is running an issue trace (`/swarm issue --trace`), call
100
100
  right after the PR is opened so the issue-trace workflow can reach its terminal
101
101
  `published` state — without it the trace stays at `publication_handoff` and is NOT
102
102
  considered resolved.
103
+
104
+ ## Contract addendum (2026-10-12)
105
+
106
+ - **Publication-time re-derivation.** As the LAST step before `gh pr create`
107
+ / `pr edit`, re-derive every claim in the body from the final tree: PR head
108
+ SHA, test counts, file lists, closure evidence. A body drafted earlier is
109
+ stale by construction — the head moves with every amend — and a stale
110
+ `PR head:` line in particular is guarded by no validator.
@@ -88,3 +88,23 @@ Minimal recipe: `git stash` the fix hunk (or apply the inverse patch) in the thr
88
88
  ## When the path does not apply
89
89
 
90
90
  Some issues (pure documentation fixes, non-executable product decisions already resolved by classification) have no meaningful acceptance check at all. Use NON-EXECUTABLE rows with named substitute evidence rather than forcing an artificial executable check, and let the plan critic confirm the justification is real rather than a shortcut around the loop.
91
+
92
+ ## Contract addendum (2026-10-12)
93
+
94
+ - **Named-mutation discipline.** Every DISCRIMINATING check must name, in its
95
+ 08-test-results block, one concrete mutation that kills it and the test that
96
+ fails under it — "the suite passes" is not evidence a check bites. A check
97
+ whose named mutant survives the shipped suite is a coverage gap, not a pass.
98
+ Probe hygiene is part of the contract: restore with `git checkout -- <file>`
99
+ after every probe and verify `git status --porcelain` clean before any
100
+ commit — a stray uncommitted mutant can ride explicit-path staging into the
101
+ fix commit.
102
+ - **Frozen-docstring wording.** Check authors must phrase frozen-file
103
+ docstrings to stay true at both ends: "RED at base, GREEN after the fix",
104
+ never "must FAIL at the current tree" — the file ships and the claim becomes
105
+ false, and correcting it costs a checkpoint AMEND plus a re-anchored receipt.
106
+ - **Replay script at freeze.** Write `repro/replay-all.sh` beside the manifest:
107
+ one explicit `repro-check.sh run` per check with `--base --class --id
108
+ --expect --copy --deps` spelled out (every file the base leg needs listed in
109
+ `--copy`). Replays then run one command instead of re-assembling flags — an
110
+ omitted `--copy` silently rewrites certified RED base logs as ERROR.
@@ -67,3 +67,15 @@ Before declaring the issue ready:
67
67
  - [ ] Publication (commit/push/PR) followed the repo's canonical publish protocol.
68
68
  - [ ] Merge itself was not performed by this skill; an explicit, quoted, SHA-bound user approval is recorded (`10b-merge-approval.md`).
69
69
  - [ ] PR-ready summary is complete.
70
+
71
+ ## Contract addendum (2026-10-12)
72
+
73
+ - **Closure reconciliation.** Closure is a reconciliation against the final
74
+ PUBLISHED artifacts: every requirement and every source finding keeps a
75
+ stable identity through to the closure ledger; each disposition names what
76
+ was actually discharged (a mutant identity, a file, a published sentence)
77
+ and is grep-verified against the artifact it claims; any partial closure
78
+ carries explicit deferment authority (a filed follow-up issue or a quoted
79
+ user decision). A ledger that keeps the FIXED label while the obligation
80
+ changed shape is a false closure even when the code is correct, and a
81
+ mutation identity must never be substituted between obligation and proof.
@@ -12,7 +12,7 @@ description: >
12
12
  (structural pre-checks) and Stage B (reviewer + test_engineer) gates and the
13
13
  reviewer + critic closeout gate are MANDATORY for any change made as part of
14
14
  this process.
15
- swarm-contract-digest: 143d9443a82d
15
+ swarm-contract-digest: aca3f05b0677
16
16
  ---
17
17
 
18
18
  # Swarm PR Feedback
@@ -428,7 +428,7 @@ Rules:
428
428
  items.
429
429
  - Use explicit IDs for non-review feedback when useful, for example
430
430
  `CONFLICT-001` for merge/base drift and `CI-001` for check failures, so PR
431
- bodies can show exactly how operational blockers were closed.
431
+ bodies can show exactly how operational blockers were closed. See `references/operational-gotchas.md` (## Contract addendum (2026-10-12)) for the body-claim-audit, probe-hygiene, and stable-obligation/coverage-diff ledger rules.
432
432
 
433
433
  ### Mandatory: integrate all PR comments with feedback or findings before branch validation (Stage A)
434
434
 
@@ -47,3 +47,21 @@ requirements imposed on unrelated repositories.
47
47
  different fixes on different code paths, use separate coder tasks even if
48
48
  targeting the same file. The "ONE task per coder" rule is about distinct
49
49
  objectives, not about N edits to one file.
50
+
51
+ ## Contract addendum (2026-10-12)
52
+
53
+ - **Body-claim audit.** Before the reviewer gate, grep the LIVE published
54
+ artifact (PR body, issue body) against every ledger row whose fix-ref is that
55
+ artifact: the fixed phrasing present, the contradicting phrasing absent. A
56
+ row marked FIXED for a file never edited is an unbacked claim — record
57
+ CLOSED only after the grep matches.
58
+ - **Probe hygiene.** Mutation/revert probes must leave the tree as found:
59
+ restore with `git checkout -- <file>` after every probe and verify
60
+ `git status --porcelain` clean before the first commit of the round. An
61
+ uncommitted mutant left in a tracked source file can ride explicit-path
62
+ staging into the fix commit — or `git add -A` into the release.
63
+ - **Stable obligation identity + coverage-diff.** Never substitute the
64
+ obligation between ledger and proof: if the ledger defined mutant M4 as X,
65
+ closing it with a different mutant Y is a new row, not a closure.
66
+ Coverage-diff the ledger against EVERY source finding table by ID, both
67
+ directions, before implementing.
@@ -3,7 +3,7 @@ name: swarm-pr-review
3
3
  audience: swarm-plugin
4
4
  description: Run a graph-guided, tool-augmented PR review using context packing, parallel exploration, mandatory repository-agnostic risk-family coverage with dispatch scaled to diff size and risk, independent reviewer validation, critic challenge, and metrics writeback. Use for deep pull request review with low false-positive tolerance and high recall in any repository, on any agent harness (structured lane controller, native parallel subagents, or single-context sequential passes).
5
5
  disable-model-invocation: true
6
- swarm-contract-digest: a191a66d5a4d
6
+ swarm-contract-digest: 66db247ce302
7
7
  ---
8
8
 
9
9
  # /swarm-pr-review
@@ -167,7 +167,7 @@ receipt; persist post-explorer findings; run reviewers;
167
167
  run critics; then persist the final artifact and complete the workflow. Transcript
168
168
  `[CANDIDATE]` / `[CLEAN]` rows are deprecated legacy compatibility only for
169
169
  lanes whose snapped `pr_review_legacy_transcript_compatibility` contract
170
- explicitly enables them.
170
+ explicitly enables them. Candidate rows are defect claims only — never verification notes or INFO-severity confirmations (see `references/prompt-templates.md`, ## Contract addendum (2026-10-12)).
171
171
  The **initial** micro dispatch MUST supply the complete trigger-evaluation
172
172
  ledger; that dispatch freezes it for the session.
173
173
  Any subsequent micro batch in that same session MAY omit `trigger_evaluation`
@@ -1444,25 +1444,26 @@ Reviewer output format:
1444
1444
  [REVIEWED] | item_id | classification | evidence_type | severity | introduced_by_pr | file:line | rationale | probe | reviewer_notes | risk_impact | risk_tags
1445
1445
  ```
1446
1446
 
1447
- For the mechanically derived `CLEAN-REVIEW` sentinel, use the same exact row
1448
- with `DISPROVED | STRUCTURALLY_PROVEN | NONE | UNKNOWN | N/A` and concrete
1449
- rationale/probe/reviewer fields; the sentinel means the reviewer independently
1450
- found no surviving actionable candidate, not that reviewer validation was
1451
- skipped.
1447
+ CLEAN-REVIEW sentinel and DISPROVED/PRE_EXISTING row details: see
1448
+ `references/parser-dry-run.md`.
1452
1449
 
1453
1450
  Every reviewer response must end with one parseable `[REVIEWED]` row per
1454
1451
  assigned candidate. A malformed `[REVIEWED]` row is not a verdict: re-dispatch
1455
1452
  with the exact contract (max 2), then mark the reviewer dimension BLOCKED if no
1456
1453
  valid row returns.
1457
1454
 
1458
- `DISPROVED` reviewer rows must use `NONE` for `final_severity`. `PRE_EXISTING`
1459
- findings must include the base-branch evidence if available.
1460
-
1461
1455
  After reviewer lanes settle, persist the post-reviewer finding ledger before
1462
1456
  critic routing or synthesis. The artifact must preserve `CONFIRMED`,
1463
1457
  `DISPROVED`, `PRE_EXISTING`, and still-`PENDING` records with reviewer IDs and
1464
1458
  next actions.
1465
1459
 
1460
+ Counterbalanced reviewer passes (#2906): when the candidate inventory holds more
1461
+ than one item, dispatch the reviewer phase as two batches over the same inventory;
1462
+ the controller alternates presentation order A (canonical) / B (reversed), stamps
1463
+ `presentation_order` on each batch receipt, and marks each merged verdict
1464
+ `order_agreement` (agree/disagree/single); unstable items are auto-flagged to the
1465
+ critic and the report marks and counts them. Detail: references/counterbalancing.md.
1466
+
1466
1467
  ---
1467
1468
 
1468
1469
  ## Phase 7: Falsification Probe Requirement
@@ -0,0 +1,68 @@
1
+ # Counterbalanced Reviewer Passes (issue #2906)
2
+
3
+ The review protocol presents candidate findings to the reviewer phase in two
4
+ independent batches over the same full inventory whenever that inventory holds
5
+ more than one item. The controller assigns presentation orders to those
6
+ batches deterministically — the first reviewer batch in the window renders its
7
+ candidates in canonical (lexicographically sorted) order (`presentation_order:
8
+ A`) and the second renders the exact reverse (`presentation_order: B`),
9
+ alternating for any further batches. A retry batch receives the NEXT ordinal,
10
+ so a re-dispatch of a failed pass observes the opposite order by design.
11
+
12
+ ## Where the signal lives
13
+
14
+ - **Prompt**: each reviewer lane's controller contract carries the
15
+ `presentation_order:` line and renders `assigned_item_ids` in that pass's
16
+ order; the lane is instructed to order its candidate prose identically (the
17
+ mechanical reordering covers the controller-owned id list — prose-order
18
+ compliance is instruction-mediated).
19
+ - **Receipts**: the per-batch coherence record stamps `presentationOrder`
20
+ ('A' | 'B'), and the lane collection receipt footer names it when gate state
21
+ is readable at collection time.
22
+ - **Merged verdicts**: every composed reviewer claim carries `order_agreement`
23
+ — `agree` when both the A and B passes produced the same
24
+ (classification, severity) pair for the item, `disagree` when the verdict
25
+ flipped with presentation order, `single` when fewer than two marked orders
26
+ observed the item (including single-pass runs and pre-#2906 batches).
27
+ - **Critic routing**: order-unstable items are named on the critic contract's
28
+ `order_unstable_item_ids:` line so the critic prioritizes them; the critic
29
+ batch's coherence record keeps an audit-only snapshot of that list.
30
+ - **Findings and report**: findings rows carry `order_agreement` (validated
31
+ against the composed verdicts at write time — a contradictory or unbacked
32
+ affirmative label is rejected); the rendered PR-review report marks
33
+ order-unstable findings with the `order-unstable` token and counts them in a
34
+ summary line.
35
+
36
+ ## How to read the labels
37
+
38
+ - `agree` — order-stable: both passes reached the same classification and
39
+ severity. The strongest reviewer signal.
40
+ - `disagree` — order-unstable: the verdict flipped with presentation order.
41
+ Not automatically wrong — it means the finding's verdict is sensitive to
42
+ candidate ordering and deserves critic priority and explicit evidence.
43
+ - `single` — only one presentation order observed the item; no order-effect
44
+ evidence either way.
45
+
46
+ A single-item inventory (or single-item lane) renders identical A and B
47
+ sequences; its labels remain computed but are descriptive only — they cannot
48
+ implicate order effects at n=1.
49
+
50
+ ## Operator notes
51
+
52
+ - The presentation-order ordinal counts retained reviewer batches in the
53
+ reviewer window (batches after the latest council batch), excluding the
54
+ batch being recorded. Both the dispatch-time derivation and the record
55
+ guard apply the SAME pure capacity prune before counting, so at the
56
+ ≥128-batch cap the derived ordinal already reflects the post-prune window
57
+ and the two sides cannot disagree about prune parity. A dispatch whose
58
+ derived order still diverges from its recorded receipt — state genuinely
59
+ changed between derivation and recording — fails closed; re-derive and
60
+ re-dispatch. That retry cannot wedge: the derivation is deterministic over
61
+ the current state, so it re-derives exactly the value the guard will stamp.
62
+ - The capacity prune never drops a reviewer batch that contributed order
63
+ observations: an older counterbalanced pass is retained even when the newer
64
+ pass claimed every item (its observations ride the agreement-only
65
+ continuation), so `agree`/`disagree` labels survive GC and never silently
66
+ degrade to `single`.
67
+ - The wire `[REVIEWED]` row grammar is unchanged: presentation order is a
68
+ property of the pass (batch), not of any individual row.
@@ -10,6 +10,7 @@ reviewer_classifications: CONFIRMED | DISPROVED | UNVERIFIED | PRE_EXISTING
10
10
  reviewer_evidence_types: STRUCTURALLY_PROVEN | EXECUTION_PROVEN | STATIC_TRACE_PROVEN | PLAUSIBLE_BUT_UNVERIFIED
11
11
  critic_fields: marker | item_id | status | severity | rationale | required_change
12
12
  critic_statuses: UPHELD | DOWNGRADED | DISPROVED | NEEDS_MORE_EVIDENCE
13
+ order_agreements: agree | disagree | single
13
14
  severities: CRITICAL | HIGH | MEDIUM | LOW | INFO | NONE
14
15
  finding_statuses: PENDING | CONFIRMED | DISPROVED | PRE_EXISTING
15
16
  finding_actions: route_to_reviewer | route_to_critic | report | suppress_with_reason | handoff_to_feedback
@@ -251,3 +252,23 @@ newline, and `\r` a carriage return. The byte-zero contract card injected into
251
252
  each Profile A lane is authoritative for the live enums and includes positive
252
253
  and explicitly discarded negative examples. Discarded examples are
253
254
  documentation only and must never be emitted as live marker rows.
255
+
256
+ ## `order_agreement` (issue #2906)
257
+
258
+ Every findings record MAY carry `order_agreement`, the order-stability of that
259
+ finding's reviewer verdict across the counterbalanced presentation orders
260
+ (pass A = canonical sorted ids, pass B = the exact reverse):
261
+
262
+ - `agree` — both marked orders produced the same `(classification, severity)`;
263
+ - `disagree` — they differed. The finding is order-unstable: rendered with an
264
+ `(order-unstable)` marker and counted in the report summary, and flagged to
265
+ the critic via `order_unstable_item_ids`;
266
+ - `single` — fewer than two marked orders were observed (a single reviewer
267
+ pass, or unmarked/legacy batches, which contribute no observations).
268
+
269
+ The field is **optional**. It is written on `post_reviewer` and `post_critic`
270
+ rows, is cross-checked at write time against the composed reviewer verdicts,
271
+ and **must not be omitted** on a finding whose composed label is `disagree` —
272
+ an omitted label there fails the write closed rather than silently suppressing
273
+ the marker. It is part of the replay-identity key: a re-submission whose
274
+ `order_agreement` differs is not an exact replay.
@@ -252,3 +252,14 @@ IMPORTANT: If a finding claims behavior is "new" or "introduced by the PR", you
252
252
  is split before dispatch.
253
253
  - The `invocation_envelope` in the parser response provides audit provenance
254
254
  for every extracted candidate.
255
+
256
+ ## Reviewer row details (relocated from SKILL.md, issue #2906)
257
+
258
+ For the mechanically derived `CLEAN-REVIEW` sentinel, use the same exact row
259
+ with `DISPROVED | STRUCTURALLY_PROVEN | NONE | UNKNOWN | N/A` and concrete
260
+ rationale/probe/reviewer fields; the sentinel means the reviewer independently
261
+ found no surviving actionable candidate, not that reviewer validation was
262
+ skipped.
263
+
264
+ `DISPROVED` reviewer rows must use `NONE` for `final_severity`. `PRE_EXISTING`
265
+ findings must include the base-branch evidence if available.
@@ -171,3 +171,11 @@ format above remains the extraction contract. Explorers emit structured
171
171
  records regardless of which harness runs them.
172
172
 
173
173
  Do not let speed degrade validation quality.
174
+
175
+ ## Contract addendum (2026-10-12)
176
+
177
+ - **Candidate rows are defect claims only.** Never emit verification notes,
178
+ confirmations, or coverage observations as CANDIDATE rows, and no
179
+ INFO-severity candidates — confirmations belong in the lane's
180
+ attestation/CLEAN row. A misattributed or confirmatory candidate inflates
181
+ reviewer adjudication for zero signal.
@@ -21,7 +21,11 @@ declare const PrReviewCollectionReceiptPayloadSchema: z.ZodObject<{
21
21
  rejected: "rejected";
22
22
  }>;
23
23
  reviewItemIds: z.ZodArray<z.ZodString>;
24
- }, z.core.$strict>;
24
+ presentationOrder: z.ZodOptional<z.ZodEnum<{
25
+ A: "A";
26
+ B: "B";
27
+ }>>;
28
+ }, z.core.$loose>;
25
29
  export type PrReviewCollectionReceiptPayload = z.infer<typeof PrReviewCollectionReceiptPayloadSchema>;
26
30
  declare const PrReviewCollectionReceiptShedMarkerSchema: z.ZodObject<{
27
31
  schemaVersion: z.ZodLiteral<1>;
@@ -50,6 +54,8 @@ export interface PrReviewCollectionReceiptBinding {
50
54
  correlationId: string;
51
55
  mode?: string;
52
56
  workflowLane?: string;
57
+ /** Issue #2906: optional presentation order threaded from the batch's coherence record. */
58
+ presentationOrder?: 'A' | 'B';
53
59
  }
54
60
  export interface PrReviewCollectionReceiptResult {
55
61
  text?: string;
@@ -340,6 +340,11 @@ export declare const PrReviewFindingSchema: z.ZodObject<{
340
340
  GIT: "GIT";
341
341
  CONFIGURATION: "CONFIGURATION";
342
342
  }>>>;
343
+ order_agreement: z.ZodOptional<z.ZodEnum<{
344
+ agree: "agree";
345
+ disagree: "disagree";
346
+ single: "single";
347
+ }>>;
343
348
  }, z.core.$strict>;
344
349
  export { type PrReviewCriticRoutingInput, prReviewFindingRequiresCritic, } from '../pr-review/critic-routing.js';
345
350
  export declare const PrReviewHandoffSchema: z.ZodObject<{
@@ -428,6 +433,11 @@ export declare const WritePrReviewArtifactArgsSchema: z.ZodDiscriminatedUnion<[z
428
433
  GIT: "GIT";
429
434
  CONFIGURATION: "CONFIGURATION";
430
435
  }>>>;
436
+ order_agreement: z.ZodOptional<z.ZodEnum<{
437
+ agree: "agree";
438
+ disagree: "disagree";
439
+ single: "single";
440
+ }>>;
431
441
  }, z.core.$strict>>;
432
442
  partial_base_coverage: z.ZodOptional<z.ZodObject<{
433
443
  unresolved_dimensions: z.ZodArray<z.ZodEnum<{
@@ -1,27 +1,27 @@
1
1
  // @bun
2
- import"./index-7bfshvq1.js";
2
+ import"./index-82aj6gaj.js";
3
3
  import"./index-g22dps7x.js";
4
4
  import"./index-0725jpp7.js";
5
5
  import {
6
6
  appendCoreEventSync
7
- } from "./index-qh93qjc2.js";
7
+ } from "./index-6183at3v.js";
8
8
  import {
9
9
  derivePlanIdentityHash
10
10
  } from "./index-7pmbnjvj.js";
11
- import"./index-ndec8akq.js";
12
- import"./index-mtqwyjrg.js";
11
+ import"./index-gc0aeth5.js";
12
+ import"./index-7rtq2t5n.js";
13
13
  import"./index-fzpt2djt.js";
14
- import"./index-hfssjyxs.js";
14
+ import"./index-yf2z4j7s.js";
15
15
  import"./index-gx2vp8gx.js";
16
16
  import {
17
17
  loadPluginConfigWithMeta
18
- } from "./index-0xe19j9g.js";
18
+ } from "./index-c6hyd8hg.js";
19
19
  import {
20
20
  init_git_executable,
21
21
  resolveGitExecutable
22
22
  } from "./index-zxdawwc7.js";
23
- import"./index-4ftg3p9n.js";
24
- import"./index-1jt12p3y.js";
23
+ import"./index-jn4mmhqc.js";
24
+ import"./index-hqrkr9ag.js";
25
25
  import"./index-bk5tah7q.js";
26
26
  import"./index-gknz3bv1.js";
27
27
  import"./index-zpsr8rpc.js";
@@ -152,7 +152,7 @@ async function maybeSaveAutoCheckpoint(directory, plan) {
152
152
  generation += 1;
153
153
  label = buildAutoCheckpointLabel(plan, completedCount, generation);
154
154
  }
155
- const { saveCheckpointRecord } = await import("./checkpoint-jbqqyp5e.js");
155
+ const { saveCheckpointRecord } = await import("./checkpoint-ngdw2qx2.js");
156
156
  const result = await saveCheckpointRecord(label, directory);
157
157
  if (result.success) {
158
158
  emitAutoSavedEvent(directory, {
@@ -3,40 +3,40 @@ import {
3
3
  _internals,
4
4
  checkpoint,
5
5
  saveCheckpointRecord
6
- } from "./index-yfbk69b1.js";
7
- import"./index-9v43y7y6.js";
6
+ } from "./index-xs9cn3c0.js";
7
+ import"./index-epdzvp4w.js";
8
8
  import"./index-6b295cas.js";
9
9
  import"./index-9nyqt3kb.js";
10
- import"./index-6xppb1er.js";
10
+ import"./index-peyz4k9k.js";
11
11
  import"./index-v3bmwmqw.js";
12
- import"./index-f3ttgqak.js";
12
+ import"./index-z59414gv.js";
13
13
  import"./index-g4fs6z4e.js";
14
14
  import"./index-m9zzj4ee.js";
15
- import"./index-84k9zzv1.js";
15
+ import"./index-kphy4we7.js";
16
16
  import"./index-2s7dvzff.js";
17
- import"./index-7bfshvq1.js";
17
+ import"./index-82aj6gaj.js";
18
18
  import"./index-g22dps7x.js";
19
19
  import"./index-0725jpp7.js";
20
- import"./index-at34nry4.js";
21
- import"./index-qh93qjc2.js";
22
- import"./index-vg8sxg12.js";
23
- import"./index-0e318vgt.js";
20
+ import"./index-1hcjxz6w.js";
21
+ import"./index-6183at3v.js";
22
+ import"./index-crz772sx.js";
23
+ import"./index-app2rmxv.js";
24
24
  import"./index-ry16d01s.js";
25
25
  import"./index-rdm3px0g.js";
26
26
  import"./index-7pmbnjvj.js";
27
- import"./index-ndec8akq.js";
28
- import"./index-e8k0v19e.js";
27
+ import"./index-gc0aeth5.js";
28
+ import"./index-xmbtwtgw.js";
29
29
  import"./index-t7hmqgjy.js";
30
- import"./index-mtqwyjrg.js";
30
+ import"./index-7rtq2t5n.js";
31
31
  import"./index-fzpt2djt.js";
32
32
  import"./index-ejhxgyvm.js";
33
33
  import"./index-7g4c7s5r.js";
34
- import"./index-hfssjyxs.js";
34
+ import"./index-yf2z4j7s.js";
35
35
  import"./index-gx2vp8gx.js";
36
- import"./index-0xe19j9g.js";
36
+ import"./index-c6hyd8hg.js";
37
37
  import"./index-zxdawwc7.js";
38
- import"./index-4ftg3p9n.js";
39
- import"./index-1jt12p3y.js";
38
+ import"./index-jn4mmhqc.js";
39
+ import"./index-hqrkr9ag.js";
40
40
  import"./index-bk5tah7q.js";
41
41
  import"./index-gknz3bv1.js";
42
42
  import"./index-zpsr8rpc.js";
@@ -14,26 +14,26 @@ import {
14
14
  releaseCoderDispatchOwnership,
15
15
  settleCoderDispatch,
16
16
  transferCoderSettlementToBackground
17
- } from "./index-n5xwza76.js";
18
- import"./index-fd6b9f38.js";
19
- import"./index-6s3ab22d.js";
20
- import"./index-jrs2qh6j.js";
21
- import"./index-d7pznffh.js";
17
+ } from "./index-fk4j26km.js";
18
+ import"./index-ghckhk16.js";
19
+ import"./index-dfrcc46h.js";
20
+ import"./index-kmvy5fr8.js";
21
+ import"./index-479kf368.js";
22
22
  import"./index-g4fs6z4e.js";
23
- import"./index-84k9zzv1.js";
23
+ import"./index-kphy4we7.js";
24
24
  import"./index-2s7dvzff.js";
25
- import"./index-qh93qjc2.js";
26
- import"./index-ndec8akq.js";
27
- import"./index-5rkh69f3.js";
28
- import"./index-e8k0v19e.js";
25
+ import"./index-6183at3v.js";
26
+ import"./index-gc0aeth5.js";
27
+ import"./index-4gmxdkcd.js";
28
+ import"./index-xmbtwtgw.js";
29
29
  import"./index-t7hmqgjy.js";
30
- import"./index-mtqwyjrg.js";
30
+ import"./index-7rtq2t5n.js";
31
31
  import"./index-fzpt2djt.js";
32
32
  import"./index-ejhxgyvm.js";
33
33
  import"./index-7g4c7s5r.js";
34
- import"./index-hfssjyxs.js";
34
+ import"./index-yf2z4j7s.js";
35
35
  import"./index-zxdawwc7.js";
36
- import"./index-1jt12p3y.js";
36
+ import"./index-hqrkr9ag.js";
37
37
  import"./index-gknz3bv1.js";
38
38
  import"./index-zpsr8rpc.js";
39
39
  import"./index-9rwhas09.js";
@@ -21,36 +21,36 @@ import {
21
21
  shouldRunOnStartup,
22
22
  writeBackupArtifact,
23
23
  writeDoctorArtifact
24
- } from "./index-ehab3z5y.js";
25
- import"./index-9v43y7y6.js";
24
+ } from "./index-gns3gc87.js";
25
+ import"./index-epdzvp4w.js";
26
26
  import"./index-6b295cas.js";
27
- import"./index-6xppb1er.js";
27
+ import"./index-peyz4k9k.js";
28
28
  import"./index-v3bmwmqw.js";
29
- import"./index-f3ttgqak.js";
29
+ import"./index-z59414gv.js";
30
30
  import"./index-m9zzj4ee.js";
31
- import"./index-84k9zzv1.js";
31
+ import"./index-kphy4we7.js";
32
32
  import"./index-2s7dvzff.js";
33
33
  import"./index-0725jpp7.js";
34
- import"./index-at34nry4.js";
35
- import"./index-qh93qjc2.js";
36
- import"./index-vg8sxg12.js";
37
- import"./index-0e318vgt.js";
34
+ import"./index-1hcjxz6w.js";
35
+ import"./index-6183at3v.js";
36
+ import"./index-crz772sx.js";
37
+ import"./index-app2rmxv.js";
38
38
  import"./index-ry16d01s.js";
39
39
  import"./index-rdm3px0g.js";
40
40
  import"./index-7pmbnjvj.js";
41
- import"./index-ndec8akq.js";
42
- import"./index-e8k0v19e.js";
41
+ import"./index-gc0aeth5.js";
42
+ import"./index-xmbtwtgw.js";
43
43
  import"./index-t7hmqgjy.js";
44
- import"./index-mtqwyjrg.js";
44
+ import"./index-7rtq2t5n.js";
45
45
  import"./index-fzpt2djt.js";
46
46
  import"./index-ejhxgyvm.js";
47
47
  import"./index-7g4c7s5r.js";
48
- import"./index-hfssjyxs.js";
48
+ import"./index-yf2z4j7s.js";
49
49
  import"./index-gx2vp8gx.js";
50
- import"./index-0xe19j9g.js";
50
+ import"./index-c6hyd8hg.js";
51
51
  import"./index-zxdawwc7.js";
52
- import"./index-4ftg3p9n.js";
53
- import"./index-1jt12p3y.js";
52
+ import"./index-jn4mmhqc.js";
53
+ import"./index-hqrkr9ag.js";
54
54
  import"./index-bk5tah7q.js";
55
55
  import"./index-gknz3bv1.js";
56
56
  import"./index-zpsr8rpc.js";
@@ -14,13 +14,13 @@ import {
14
14
  resolveWorktreeBaseDir,
15
15
  shortenWorktreePath,
16
16
  writeLaneProfileToDiskReal
17
- } from "./index-d7pznffh.js";
18
- import"./index-84k9zzv1.js";
17
+ } from "./index-479kf368.js";
18
+ import"./index-kphy4we7.js";
19
19
  import"./index-2s7dvzff.js";
20
20
  import"./index-fzpt2djt.js";
21
- import"./index-hfssjyxs.js";
21
+ import"./index-yf2z4j7s.js";
22
22
  import"./index-zxdawwc7.js";
23
- import"./index-1jt12p3y.js";
23
+ import"./index-hqrkr9ag.js";
24
24
  import"./index-zpsr8rpc.js";
25
25
  import"./index-zgwm4ryv.js";
26
26
  import"./index-a76rekgs.js";
@@ -5,18 +5,18 @@ import {
5
5
  authorizeCuration,
6
6
  buildConfigFingerprintInput,
7
7
  readCohortConfigFingerprint
8
- } from "./index-w2vbaczx.js";
8
+ } from "./index-hy2fqapm.js";
9
9
  import"./index-rtry5xyf.js";
10
10
  import"./index-vzm6zre7.js";
11
- import"./index-3atkcqpb.js";
12
- import"./index-5rkh69f3.js";
13
- import"./index-e8k0v19e.js";
11
+ import"./index-ry5g9s8d.js";
12
+ import"./index-4gmxdkcd.js";
13
+ import"./index-xmbtwtgw.js";
14
14
  import"./index-t7hmqgjy.js";
15
- import"./index-mtqwyjrg.js";
15
+ import"./index-7rtq2t5n.js";
16
16
  import"./index-fzpt2djt.js";
17
17
  import"./index-ejhxgyvm.js";
18
18
  import"./index-7g4c7s5r.js";
19
- import"./index-hfssjyxs.js";
19
+ import"./index-yf2z4j7s.js";
20
20
  import"./index-gknz3bv1.js";
21
21
  import"./index-zpsr8rpc.js";
22
22
  import"./index-zgwm4ryv.js";
@@ -5,23 +5,23 @@ import {
5
5
  readPriorDriftReports,
6
6
  runDeterministicDriftCheck,
7
7
  writeDriftReport
8
- } from "./index-y3n9ry9q.js";
9
- import"./index-6xppb1er.js";
10
- import"./index-f3ttgqak.js";
11
- import"./index-84k9zzv1.js";
8
+ } from "./index-863hst4e.js";
9
+ import"./index-peyz4k9k.js";
10
+ import"./index-z59414gv.js";
11
+ import"./index-kphy4we7.js";
12
12
  import"./index-2s7dvzff.js";
13
13
  import"./index-0725jpp7.js";
14
- import"./index-0e318vgt.js";
14
+ import"./index-app2rmxv.js";
15
15
  import"./index-ry16d01s.js";
16
16
  import"./index-rdm3px0g.js";
17
17
  import"./index-fzpt2djt.js";
18
18
  import"./index-ejhxgyvm.js";
19
19
  import"./index-7g4c7s5r.js";
20
- import"./index-hfssjyxs.js";
21
- import"./index-0xe19j9g.js";
20
+ import"./index-yf2z4j7s.js";
21
+ import"./index-c6hyd8hg.js";
22
22
  import"./index-zxdawwc7.js";
23
- import"./index-4ftg3p9n.js";
24
- import"./index-1jt12p3y.js";
23
+ import"./index-jn4mmhqc.js";
24
+ import"./index-hqrkr9ag.js";
25
25
  import"./index-bk5tah7q.js";
26
26
  import"./index-gknz3bv1.js";
27
27
  import"./index-zpsr8rpc.js";