@deftai/directive-content 0.106.0 → 0.108.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 (46) hide show
  1. package/Taskfile.yml +14 -1
  2. package/UPGRADING.md +24 -5
  3. package/commands.md +29 -4
  4. package/contracts/design-critique.md +369 -14
  5. package/contracts/issue-eval.md +77 -0
  6. package/contracts/path-write-fence.md +126 -1
  7. package/contracts/runtime-authority.md +2 -0
  8. package/contracts/scm-readiness.md +2 -2
  9. package/docs/delivery-attempt.md +2 -1
  10. package/docs/freshness-contract.md +6 -1
  11. package/docs/getting-started.md +10 -11
  12. package/docs/hook-runtime-unavailable.md +54 -0
  13. package/docs/orphan-active-verdict-basis.md +166 -0
  14. package/docs/scope-provenance.md +1 -1
  15. package/package.json +1 -1
  16. package/packs/skills/skills-pack-0.1.json +24 -10
  17. package/scm/github.md +65 -2
  18. package/skills/deft-directive-build/SKILL.md +2 -2
  19. package/skills/deft-directive-cost/SKILL.md +7 -11
  20. package/skills/deft-directive-design-critique/SKILL.md +22 -6
  21. package/skills/deft-directive-design-critique/references/motion-shape.md +19 -0
  22. package/skills/deft-directive-feedback/SKILL.md +11 -2
  23. package/skills/deft-directive-interview/SKILL.md +10 -10
  24. package/skills/deft-directive-issue-eval/SKILL.md +48 -0
  25. package/skills/deft-directive-release/SKILL.md +10 -6
  26. package/skills/deft-directive-review-cycle/SKILL.md +33 -0
  27. package/skills/deft-directive-setup/SKILL.md +53 -22
  28. package/skills/deft-directive-swarm/references/core-ops.md +4 -0
  29. package/skills/deft-directive-swarm/references/core-phase-1-2.md +1 -1
  30. package/skills/deft-directive-swarm/references/core-phase-3.md +3 -1
  31. package/skills/deft-directive-swarm/references/core-phase-4.md +11 -8
  32. package/skills/deft-directive-swarm/references/host-cursor.md +1 -0
  33. package/skills/deft-directive-swarm/references/host-grok-build.md +1 -0
  34. package/skills/deft-directive-triage/SKILL.md +3 -2
  35. package/tasks/engine.yml +4 -0
  36. package/tasks/feedback.yml +1 -1
  37. package/tasks/occupancy.yml +34 -1
  38. package/tasks/prd.yml +4 -5
  39. package/tasks/scm.yml +14 -2
  40. package/tasks/session.yml +13 -2
  41. package/tasks/toolchain.yml +2 -2
  42. package/tasks/triage-evaluate.yml +22 -0
  43. package/tasks/verify.yml +21 -1
  44. package/templates/agent-prompt-preamble.md +28 -4
  45. package/templates/agents-entry.md +10 -5
  46. package/templates/design-critique-brief.md +19 -5
@@ -1,6 +1,6 @@
1
1
  # Design-critique contract
2
2
 
3
- Sole normative source of truth for the design-critique motion: charter, variant table, envelope and ceiling, and synthesis format. The copyable dispatch envelope is [`templates/design-critique-brief.md`](../templates/design-critique-brief.md). Phase 1 (the judgment gate) lives in [`docs/decisions/ADR-005-design-critique-judgment-gate.md`](../../docs/decisions/ADR-005-design-critique-judgment-gate.md).
3
+ Sole normative source of truth for the design-critique motion: charter, critic method, variant table, envelope and ceiling, synthesis format, and the operator-gated loop until synthesis is accepted. The copyable dispatch envelope is [`templates/design-critique-brief.md`](../templates/design-critique-brief.md). Phase 1 (the judgment gate) lives in [`docs/decisions/ADR-005-design-critique-judgment-gate.md`](../../docs/decisions/ADR-005-design-critique-judgment-gate.md). Parent-side substantiation principle: [`docs/decisions/ADR-006-parent-side-substantiation.md`](../../docs/decisions/ADR-006-parent-side-substantiation.md).
4
4
 
5
5
  Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
6
6
 
@@ -11,7 +11,24 @@ This contract scaffolds the motion. Only the ADR-005 judgment gate and the conte
11
11
  - ! Use `scaffolds` for protocol steps in this document.
12
12
  - ⊗ Use the verb "enforces" here for anything other than the ADR-005 judgment gate and the content-contract tests.
13
13
  - ⊗ Pin this contract or `skills/deft-directive-design-critique` into `templates/agents-entry.md` or the AGENTS.md always-pin list. Discovery is on-demand via the Skills Index.
14
- - ⊗ Auto-dispatch critics from this contract. Dispatch is deferred until a second consumer demands it (#1702). Until then the operator dispatches from the brief template.
14
+ - ⊗ Auto-dispatch critics from this contract (#3578 / #1702). Operator (or parent after an operator verb) dispatches the next envelope from the brief template.
15
+
16
+ ### The arc
17
+
18
+ **An arc is one recorded motion over one target revision**, from the Stop 1 write-back (or a voluntary dispatch) through accepted synthesis or the halt line. It holds one or more rounds, and therefore one or more ceilings. An arc is per-target, not per-issue: one issue carries several arcs over time, and one arc can span several issues.
19
+
20
+ The target is what the arc critiques. Under a refutation charter it is the recorded `refutation-target:`. Open critique names no refutation target, so the target there is the scope the write-back records. `### Target shape` describes the shapes that scope has taken.
21
+
22
+ Boundaries are read off the machinery in this document, not asserted here.
23
+
24
+ - A round takes a new ceiling. The converse does not hold: Amendment supersession under `### Audited residuals (panel bookkeeping)` records an amendment adopted as the ceiling **inside** round 2. Neither event opens an arc.
25
+ - Rounds accumulate inside one arc. The auto-stamp denominator is scoped to critic posts in this arc and keeps a Stop 4 retry's post, so a retry continues the arc it retries.
26
+ - Same-round siblings share one ceiling and one panel-deposit. A panel is one round, not N arcs.
27
+ - The arc stays open through the operator-gated loop until a verified synthesis is accepted, or until the halt line. Successor leans are moves inside that loop, so revising a lean before bind is not a boundary.
28
+ - A **recut** opens the next arc, and only after bind: it re-applies `design-critique:mechanism-shaped`, drops `design-critique:triage-ready`, and its new lean is not cleared by the older completed-arc record. That is a post-bind target revision.
29
+
30
+ - ! Read `arc` in this document as that unit.
31
+ - ⊗ Read a new ceiling, a new round, or a pre-bind lean revision as a new arc.
15
32
 
16
33
  ## Stop 1 — Gate
17
34
 
@@ -21,43 +38,163 @@ ADR-005 is vehicle-invariant. The gate never computes "is this triage mechanism-
21
38
  2. `plan.policy.judgmentGates` matches that label. Pure syntax.
22
39
  3. The clearance line on the thread is `design-critique: warranted | not warranted, because …`. `verify:judgment-gates` checks presence, shape, and authority. It never scores the because-clause.
23
40
 
41
+ The write-back first two lines name the model and role (Stop 3).
42
+
43
+ The Stop 1 write-back records `refutation-target:` naming the triage author's highest-leverage asserted premise.
44
+
45
+ - ! Record `refutation-target:` on the Stop 1 write-back.
46
+ - ⊗ Treat `refutation-target:` as an `audit:` marker. The field creates no unresolved-marker state and never blocks bind.
47
+
24
48
  `verify:judgment-gates --enforce` stays opt-in unused in this rollout. Advisory observe first. No marker means the gate never fires. Voluntary critiques stay legal.
25
49
 
26
50
  ## Stop 2 — Variant selection
27
51
 
28
- Record one line per arc: which variant, why, N.
52
+ Record one line per arc: the **charter** (`refutation` | `open critique`), the **spend** (`N=1`, or `N≥3` when the permission is used), and why.
53
+
54
+ - ! Record the charter and the spend as two fields. The charter is what the critic is given. The spend is how many critics that charter may use.
55
+ - ⊗ Record `panel` as the variant or charter. The panel row is spend permission, not a third charter.
29
56
 
30
57
  ### Variant table
31
58
 
32
- | Condition | Variant | N | Exemplar |
59
+ | Condition | Charter | N | Exemplar |
33
60
  |---|---|---|---|
34
61
  | Issue body names a defensible presumption with a refutation target | refutation | N=1 | #3462 |
35
62
  | Otherwise (default) | open critique | N=1 | #3547 |
36
- | No defensible presumption, and a genuinely open solution space or high blast radius | panel | N≥3 | #3383 |
37
63
 
38
- Default motion after a mechanism-shaped stamp: N=1 fresh open critique. If residual remains, one reiterating pass with a fresh critic that reads a disagreement map, then verified synthesis. Resume is optional sharpening ("does my prior finding still hold"), not the default reiterating agent.
64
+ | Condition | Spend | N | Exemplar |
65
+ |---|---|---|---|
66
+ | A genuinely open solution space or high blast radius | panel permission (not a charter) | N≥3 permitted | #3383 |
67
+
68
+ Supersedes #3434 disposition comment 5364365428 item 4, which accepted "no defensible presumption + genuinely open solution space / high blast radius → N≥3 panel" on 2026-08-20. The conjunct treated a drafted proposal and high blast radius as mutually exclusive, so a well-specified high-blast-radius issue could not earn a panel. This table drops that conjunct and grants N≥3 as permitted, not selected.
69
+
70
+ ### Evaluation rule
71
+
72
+ Charter selection and spend permission are evaluated independently.
73
+
74
+ - The first two rows select the **charter**: refutation when the issue names a defensible presumption with a refutation target; otherwise open critique. Those rows are unchanged in behaviour.
75
+ - The panel row grants **permission** for N≥3 when the solution space is genuinely open or blast radius is high. It does not select the charter and does not override charter.
76
+ - An issue that matches both a refutation charter and the panel condition is refutation with N≥3 permitted.
77
+ - A drafted-MUSTs issue with no refutation target and whole-motion blast radius is open critique with N≥3 permitted.
78
+
79
+ **Why permission rather than selection.** Serial reiteration is anchored by a parent-authored disagreement map correlated with round 1 by construction — the same correlation Decorrelation refuses to count as confirmation. Parallel critics carry independent priors, which is worth buying when being wrong is expensive and hard to reverse. That argues for making N≥3 available. One arc in which a panel added unique value does not establish that every high-blast-radius issue must spend it.
80
+
81
+ ⊗ Add a Stop 2 variant-table trigger for "the author is the party the proposed rule would constrain." Raising N changes spend; who may substantiate and clear an interested party's claims is a role-and-clearance problem owned by Decorrelation and Non-self-arbitration. Neither requires N≥3. If constrained-party risk needs stronger treatment, it belongs in Stop 5 disclosure and non-self-clearance (#3651).
82
+
83
+ Default motion after a mechanism-shaped stamp: N=1 fresh open critique. If residual remains, one reiterating pass with a fresh critic that reads a disagreement map, then verified synthesis. Resume is optional sharpening ("does my prior finding still hold"), not the default reiterating agent. A permitted N≥3 does not change that default; the parent records the spend when it uses the permission.
84
+
85
+ ### Target shape
86
+
87
+ Charter is what the critic is given. **Target shape is what is being critiqued.** The two are independent axes, and target shape selects neither the charter nor the spend, so it is not a row in either table above.
88
+
89
+ The default shape is one issue's premise, which every row above assumes. Two other shapes have been run.
90
+
91
+ | Target shape | The target | Exemplars |
92
+ |---|---|---|
93
+ | set-level | N issues as a remedy portfolio — whether they compose | #3781 / #3783 / #3790 (synthesis 5433848104, open critique); #3797 / #3798 / #3799 (synthesis 5434313019, refutation) |
94
+ | against-implementation | the design together with the diff that already implements it | #3610 with PR #3784 (synthesis 5434122672); #3796 with PR #3793 |
95
+
96
+ Those pairs are the whole record. Each shape has been run twice, which is not a settled pattern, and neither row grants a charter or a spend. The set-level pair is also the evidence for the axis being orthogonal: the same shape ran once under open critique and once under refutation.
97
+
98
+ **Set-level.** The arc anchors on one issue and takes its ceiling on that thread. The target is the portfolio claim, not any one issue's premise, and disposition is per-issue. The #3781 set arc closed one of the three as dominated and surfaced a fourth issue worth more than any of them.
99
+
100
+ **Against-implementation.** The implementation already exists, so critics judge the diff alongside the design. Tell them the PR's check status is unsettled, so a green review does not anchor them, and have author responses to earlier findings re-derived rather than accepted. The verdict has two parts — does the target survive, and should the PR merge — and they can differ. On #3610 the target survived 3/3 while the arc struck one acceptance criterion as an already-holding invariant and found two blocking defects a 5/5 review had missed.
101
+
102
+ - ? Record the target shape on the Stop 2 line when it is not a single issue. Two exemplars do not make it a required field.
103
+ - ⊗ Add a target shape as a charter row or a spend row. It is a third axis, and a row conflates two of them.
39
104
 
40
105
  ## Stop 3 — Critic envelope
41
106
 
42
- ### Charter
107
+ ### Parent-facing dispatch rules
43
108
 
44
109
  Process-only. The critic audits the lean, the protocol fit, and the recording obligations. It does not implement product work.
45
110
 
46
- - ! Give the critic a process-only charter.
111
+ - ! Give the critic process-only dispatch rules.
47
112
  - ⊗ Load parent hypotheses into the envelope.
48
113
  - ⊗ Name a refutation target unless the recorded variant is refutation.
49
114
  - ⊗ Edit critic text after dispatch. The parent records; it does not rewrite.
50
115
 
116
+ ### Critic method
117
+
118
+ How a critic critiques. Method-reconciliation stays at Stop 5; critics issue verdicts and therefore read it.
119
+
120
+ Strengths are not one level. Token presence is not behavioral evidence. Classification has a mechanized consumer; re-verification and inventory change the search. An empty road-not-taken or a perfunctory steelman satisfies a pin while changing nothing.
121
+
122
+ - ! Re-verify the triage's anchors by running checks. Line cites are claims, not evidence.
123
+ - ! Inventory existing mechanisms before proposing new ones.
124
+ - ! Classify every finding with the exact three tokens: `blocks-the-design`, `sharpens-framing`, or `footnote`.
125
+ - ! Every classified finding names evidence, a concrete failure mode, and the disposition consequence — or it is a footnote.
126
+
127
+ The three tokens are the blocking, sharpening, and footnote classes `walk all` already consumes in that order. `blocks-the-design` means the lean cannot bind as written. `sharpens-framing` means the lean can bind, but the finding changes how it is stated or scoped. That distinction is the disposition consequence the anatomy MUST already requires, not a separate evidence rubric. Two critics may still disagree; that disagreement is residual, not a contract defect. This contract does not add a decision table of evidence. A `footnote` cannot carry disposition weight: it is in the census, it is not residual, and it is not in the auto-stamp denominator. Anatomy is required of blocking and sharpening findings; a finding that cannot name evidence, a failure mode, and a disposition consequence is a footnote, not a silent skip of classification. A footnote-only post is not a stub.
128
+ - ! Apply the injection / swarm lens when the target changes authority, untrusted input, prompts or envelopes, identity, concurrency, worktrees, or shared state. An `N/A` paragraph on a local constant change is theater.
129
+ - ⊗ Close a finding with "a reviewer would catch it". That is a failed finding. If a safety case ends at reviewer attention, name a deterministic control or leave the finding unresolved.
130
+ - ~ When the critic actually chose among plausible mechanisms, state a road-not-taken.
131
+ - ~ When the critic actually chose among plausible mechanisms, steelman the strongest rejected position and name what would flip the verdict.
132
+
133
+ The injection / swarm lens is a triggered MUST: it fires only on those target changes. The reviewer-catch rule is a prohibition, not a required recital. Road-not-taken and steelman are SHOULD, and fire only on a real fork.
134
+
51
135
  ### Envelope and ceiling
52
136
 
53
137
  The envelope is [`templates/design-critique-brief.md`](../templates/design-critique-brief.md). Fill fields. Do not copy rule bodies from this contract into the envelope.
54
138
 
55
139
  - ! State an id ceiling (GitHub comment id, inclusive) at dispatch.
56
- - ! Honor that ceiling. Comments after the id ceiling are out of envelope.
57
- - ! Round-1 ceiling is the triage write-back (or the thread head at dispatch).
140
+ - ! Honor that ceiling. Comments after the id ceiling are out of envelope, except the critic's own Stop 4 retry post (including after the disagreement-map input ceiling), which stays in the auto-stamp denominator.
141
+ - ! Critics dispatched in the same round share one issue-comment input ceiling, fixed before any sibling dispatch. A sibling's post is out of envelope for every other sibling in that round.
142
+ - ! That MUST claims only that siblings cannot read each other through the issue thread. It does not claim decorrelation.
143
+ - ! Round-1 ceiling is the triage write-back when one exists. The "thread head at dispatch" fallback applies only to a single-critic round with no triage write-back. When two or more critics share the round, take one round-start snapshot before the first sibling dispatch and use that snapshot (or the triage write-back) as the shared ceiling.
144
+ - ! Before dispatching two or more critics in the same round, parent posts a panel-deposit comment (`role: parent`) that names `round:`, `siblings:`, and `input-ceiling:` (the shared GitHub comment id). That comment is the durable record. A missing or malformed deposit is a contract defect.
58
145
  - ! Round-2 ceiling is the disagreement-map comment.
59
146
  - ! Resolve SHAs from the tree. Do not invent them.
60
147
 
148
+ Canonical panel-deposit:
149
+
150
+ ```text
151
+ model: <your-model-slug>
152
+ role: parent
153
+
154
+ panel-deposit
155
+ round: 1
156
+ siblings: 3
157
+ input-ceiling: 5390001612
158
+ ```
159
+
160
+ **Panel completeness is behavioural.** The deposit MUST above, and every sibling-completeness clause in this document, bind the parent. No code observes them. `evaluateCompletedArcRecord` reads a deposit only as evidence that an arc is in flight; it never counts critic posts and never compares a count against `siblings:`. `evaluateParentAudit` carries no round, sibling, or deposit field. Both halves hold: the obligation on the parent is real, and nothing machine-checks it. A parent that binds on a partial panel breaks this contract and no gate will stop it (#3850).
161
+
162
+ ### Comment lead (model then role)
163
+
164
+ Comment-lead field. The first two lines of the triage write-back and of every critic, parent, and #3640 auto-posted comment name the LLM and the posting role. Keep the first line as `model: <slug>`. The second line is `role: triage|critic|parent`.
165
+
166
+ The `model:` line is a self-attestation. Nothing in this repository verifies which model produced a comment; do not treat it as provenance.
167
+
168
+ Canonical lead:
169
+
170
+ ```text
171
+ model: <your-model-slug>
172
+ role: critic
173
+ ```
174
+
175
+ Closed role set (do not invent chips or extra roles in v1): `role: triage|critic|parent`.
176
+
177
+ | role | Who posts |
178
+ | --- | --- |
179
+ | `triage` | Stop 1 write-back |
180
+ | `critic` | Stop 3 / Stop 4 critic comments |
181
+ | `parent` | successor lean, walk decisions, verified-claims table, synthesis-accepted line, halt line, panel-deposit, disposition map if not folded into the successor lean |
182
+
183
+ - ! First line of the triage write-back comment is `model: <slug>`.
184
+ - ! Second line of the triage write-back comment is `role: triage`.
185
+ - ! First line of every critic comment is `model: <slug>` naming the model slug the critic self-attests.
186
+ - ! Second line of every critic comment is `role: critic`.
187
+ - ! Same first-two-lines on a Stop 4 retry critic (`role: critic`).
188
+ - ! Same first-two-lines on #3640 auto-posted table / synthesis-accepted comments (`role: parent`).
189
+ - ! Parent comments (successor lean, walk decisions, halt line, verified-claims table, synthesis-accepted, panel-deposit) use `role: parent`.
190
+ - ! Synthesis comments use the same first-two-lines (`model: <slug>` then `role: parent`).
191
+ - ⊗ Put the model in an issue label.
192
+ - ⊗ Put role in an issue label (`design-critique:critic`, author/role chips).
193
+ - ⊗ Put a GitHub login, author name, or role name in that lead line in place of the model.
194
+ - ⊗ Replace the model line with a role or GitHub login.
195
+ - ⊗ Omit the model line. Post `model: <slug>` on the comment; do not substitute a slug inferred from `verify:routing` or spawn metadata.
196
+ - ⊗ Omit the role line. Post `role: triage|critic|parent` on the comment; do not substitute a role inferred from `verify:routing` or spawn metadata.
197
+
61
198
  ## Stop 4 — Residual reiteration
62
199
 
63
200
  Use this stop only when round 1 leaves residual disagreement that still changes disposition.
@@ -65,14 +202,143 @@ Use this stop only when round 1 leaves residual disagreement that still changes
65
202
  - ! Dispatch a fresh critic against a disagreement map. Do not default to resume.
66
203
  - ? Resume the same critic when the question is "does my prior finding still hold?"
67
204
  - ! Keep the id ceiling at the disagreement-map comment for that pass.
68
- - Run a third critic pass as the default. Record why if a panel variant already set N≥3.
205
+ - ! First-two-lines (model then `role: critic`) on the retry critic comment (Stop 3).
206
+ - ⊗ Run a third critic pass as the default. An N=3 panel is not a recorded why for a Stop 4 retry. See Dual stop.
207
+
208
+ ## Operator-gated loop
209
+
210
+ Keep the arc in this contract until a verified synthesis is accepted.
211
+
212
+ - ! Each critic dispatch EXITs after posting.
213
+ - ! Operator (or parent after an operator verb) dispatches the next envelope.
214
+ - ! After each critic EXIT, parent posts a successor lean with proposed per-heading takes **before** printing `accept` / `retry differences` / `walk` / `walk all`. That posted lean is the first operator surface. Chat is not the record.
215
+ - ! Operator confirm or amend binds the proposed takes on that posted lean. Binding takes is not synthesis bind and does not stamp `design-critique:triage-ready`.
216
+ - ⊗ Bind synthesis or stamp `design-critique:triage-ready` while same-round siblings remain unposted. The first lean after one critic EXIT is the take-offer, not the bind.
217
+ - ! Later successor leans follow accept-X or walk-end, or land before synthesis. This supersedes #3627's "successor lean only after accept-X" for the first lean after critic EXIT. Later leans may still follow accept-X / walk-end.
218
+ - ⊗ Print `accept` / `retry differences` / `walk` / `walk all` when no successor lean is posted for this critic EXIT. An empty-lean verb menu is a contract miss.
219
+ - ⊗ Auto-dispatch critics (#3578 / #1702).
220
+ - ⊗ Hand the arc to `triage:accept` / `scope:promote` until the completed-arc record is present: `design-critique: synthesis accepted, because …` citing the accepted successor lean (and the verified-claims table when posted). Catalog chips (`design-critique:mechanism-shaped` / `design-critique:triage-ready`) are list-visible convenience, not clearance. A lone synthesis-accepted-shaped comment that does not cite an accepted lean does not unblock ingest.
221
+ - ⊗ Stamp `design-critique:triage-ready` at critic-post.
222
+ - ⊗ Add a `design-critique:critic-posted` chip or any author/role chip.
223
+ - ⊗ Critic writes issue labels.
224
+ - ⊗ Add a #3607 thread interlock in this contract.
225
+
226
+ ## Successor lean
227
+
228
+ After each critic EXIT, parent posts a successor `**Lean:**` comment with proposed per-heading takes. That posted lean is the first operator surface. Later successor leans follow accept-X or walk-end, or land before synthesis.
229
+
230
+ - ! After critic EXIT, post the successor lean before printing `accept` / `retry differences` / `walk` / `walk all`.
231
+ - ! Operator confirm or amend is what makes those takes bindable. An all-accept draft still goes through this offer. Confirming or amending an all-accept first lean binds those takes. It does not auto-stamp synthesis or `design-critique:triage-ready` while same-round siblings remain unposted.
232
+ - ! Cite accepted critic ids/headings, the still-open residual, and the write-back or prior lean it supersedes.
233
+ - ! Carry a per-heading take on the successor lean: `accept-into-contract` | `disagree` | `defer`. Defer is not accepted.
234
+ - ! The successor lean is the disposition map. Do not post a third map type.
235
+ - ! The first posted map is an ADR-006 arbitration surface. Record a substantiation token when takes introduce load-bearing premises. Non-self-arbitration applies when the same party authored the triage and the proposed takes.
236
+ - ! Bind synthesis and `design-critique:triage-ready` to the latest successor lean, never a superseded write-back.
237
+ - ! Full template (accepted set, residual, supersedes-id, ceiling if retrying) lives only on the successor lean and on a retry disagreement map.
238
+ - ! Walk comments stay slim (model and role lines, Accept X, critic id, heading, decision, and when needed a token plus pointer).
239
+ - ⊗ Edit the ceiling write-back in place.
240
+ - ⊗ Fold the successor lean into the critic comment.
241
+ - ⊗ Paraphrase critic findings as new claims.
242
+
243
+ ## Parent-side substantiation
244
+
245
+ A `role: parent` artifact that introduces a load-bearing premise while adjudicating a critic finding records a substantiation token at that point. The token records the premise. It does not decide whether the reading is true.
246
+
247
+ A load-bearing premise introduced before any critic exists is outside this obligation. At Stop 1 nobody has spoken and the entire critic pass is the audit. ADR-006 addresses post-critic arbitration where the critic gets no reply. #3651's round-1 critic named a pre-critic premise and instructed: state expressly that the initial triage remains outside this amendment, or widen scope deliberately. The successor lean widened the trigger. This paragraph is the other half.
248
+
249
+ Token grammar:
250
+
251
+ ```text
252
+ audit:<id> sha=<git-sha> pointer=<path:start-end|comment:<id>> reading=measured|asserted
253
+ ```
254
+
255
+ - ! Record dispatch SHA, source pointer, and measured-versus-asserted at the point of use.
256
+ - ⊗ Push substantiation prose into walk comments. A token plus pointer satisfies this at the walk surface. The substantiation lives in the parent artifact or its linked successor lean.
257
+ - ! A premise under this section that changes classification, residual, or next-build contract stays unaudited until a later `role: critic` artifact targets its marker.
258
+ - ! The predicate is independence, not provenance. Primary-source citation by the parent does not clear the marker.
259
+ - ⊗ A `role: parent` artifact clears its own marker.
260
+ - ⊗ Mixed-basis laundering: one independently reproduced premise does not clear an unaudited load-bearing one.
261
+ - ! An unresolved marker is residual and blocks verified-synthesis bind.
262
+ - ⊗ Discharge a marker by promising a later pass.
263
+ - ! Auto-bind requires an all-accept disposition map AND zero unresolved audit markers AND the operator has confirmed or amended that map AND no unposted same-round siblings remain. This conjunct applies at Operator verbs auto-stamp and at Bind after accepted synthesis path 1.
264
+ - ! The brief envelope names unresolved marker ids as `audit-targets` (ids only, or `none`). It does not carry parent rationale.
265
+ - ! `evaluateParentAudit` fails closed on a missing token, a silently cleared marker, a parent self-clear, or an envelope that omits a named audit target.
266
+
267
+ ## Operator verbs
268
+
269
+ Contract stops stay internal. Parent prints these phrases when they apply. They apply only after a successor lean is posted for this critic EXIT. Printing the verb menu with no posted successor lean is a contract miss. The operator does not have to remember them.
270
+
271
+ - **accept** (cite findings)
272
+ - **retry differences**
273
+ - **walk**
274
+ - **walk all**
275
+ - **post the verified-claims table**
276
+ - **accept synthesis**
277
+
278
+ **walk** iterates recorded parent-disagree headings (successor-lean take is `disagree`). **walk all** is the census of every classified finding in existing order (blocking then sharpening then footnotes — or the critic's numbering). For one release, `walk findings one at a time` is an alias of **walk all**. Short forms of accept synthesis are valid: `accept synt`, `synt accepted`, `synt approved`, `accept synthesis`, `synthesis accepted`, `synthesis approved`. Same idea for other printed verbs when the short form is unambiguous (`retry` for `retry differences`). If the operator types a bare word that could be either **walk** or **walk all** and only one was offered, map it to the offered one. If ambiguous, parent re-prints the offered phrases and waits.
279
+
280
+ - ! Print the phrases when they apply. An empty-lean verb menu is a miss.
281
+ - ! Do not print **walk** until at least one proposed take on the posted lean is `disagree`.
282
+ - ! Do not print **retry differences** until residual headings are named on that map.
283
+ - ! Do not skip the first-lean offer because the draft is all-accept.
284
+ - ! Non-empty disagree set: print **walk** / **walk all** / **retry differences** / **accept**. Walk is an option, not the only path. Do not auto-start the walk.
285
+ - ! When the successor lean's per-heading map is total over a **non-empty** in-envelope classified-finding set, every heading is `accept-into-contract` (no `disagree`, no `defer`), AND zero unresolved audit markers, AND the operator has confirmed or amended that map, AND no unposted same-round siblings remain: parent auto-posts the verified-claims table as its own comment, then auto-posts `design-critique: synthesis accepted, because agents agreed (empty disagreement set)` and remaining-set-replaces the chip via `task scm:issue:design-critique-chip -- --issue N --chip triage-ready`. If that write misses, continue; do not halt. Do not print **accept synthesis**, **post the verified-claims table**, **walk**, or **walk all**.
286
+ - ⊗ Auto-stamp a parent-drafted all-accept map that the operator has not confirmed or amended.
287
+ - ⊗ Auto-stamp while same-round siblings remain unposted.
288
+ - ⊗ Auto-stamp when any audit marker is unresolved.
289
+ - ! The auto-stamp denominator is the union of (a) classified headings from critic comments posted in this arc and (b) still-open residual headings on the latest successor lean. Classified headings in (a) are blocking and sharpening; footnotes stay in the walk-all census and are not in (a). Each critic's own post is in-envelope for the pass that dispatched it, including a Stop 4 retry that posts after the disagreement-map input ceiling. The input id ceiling bounds what the critic may read; it does not exclude that critic's own post from the denominator. Headings already `accept-into-contract` remain in the accepted set. Still-open residual headings persist in the denominator until they receive an explicit take on a successor lean. A retry may add headings. A retry that omits, renames, splits, or merges a still-open heading does not drop the prior heading unless the successor lean cites that prior heading and records the take. Uncited still-open headings remain `disagree` (walkable) and the map is not total. A successor-lean map is total only when every heading in that union has a take. Do not auto-stamp on a partial map.
290
+ - ! Parse classified headings only.
291
+ - ⊗ Stamp when the critic posts zero classified headings (stub / blank). Stop and inform. Do not stamp.
292
+ - ⊗ Treat a footnote-only post as a stub. Stub is zero headings with any of the three class tokens. Footnote-only is a valid census; (a) is empty, so do not auto-stamp.
293
+ - ⊗ Stamp on dispatch-fail. Stop and inform. Do not stamp.
294
+ - ⊗ Use Phase 3 or Stop 5 as operator commands.
295
+ - ⊗ Infer accept-synthesis from looks-good, ok, proceed, or bare **accept**. Looks-good still does not bind.
296
+ - ⊗ Mix walk and retry on the same finding in one turn.
297
+ - ⊗ Auto-post the verified-claims table on a non-empty disagree set.
298
+
299
+ Walk order for **walk all**: classified findings in order (blocking first, then sharpening, then footnotes — or the critic's numbering). For **walk**: only headings whose successor-lean take is `disagree`. For each: restated critic claim, parent take if it differs, then wait. Each decision is a thread comment (`Accept X` / skip / amend), citing critic comment id and finding heading. Chat is not the record. When the walk ends, parent offers to post a successor lean. The walk is not synthesis. When that successor lean is later total and all `accept-into-contract` over a non-empty classified-finding set AND zero unresolved audit markers AND the operator has confirmed or amended that map AND no unposted same-round siblings remain, the auto-table + auto-stamp path runs with no extra verb.
300
+
301
+ ## Dual stop
302
+
303
+ Numbered dual stop (#2442):
304
+
305
+ - Default critic posts without extra record: 2 (round 1 plus one Stop 4 retry).
306
+ - A third critic only with a recorded why (panel already N≥3, or operator raises the cap for this arc). Otherwise halt.
307
+ - An N=3 panel is permitted three round-1 posts and no default retry. A fourth post requires the operator to raise the cap for this arc and record it.
308
+ - Panels larger than three (N>3) are unaddressed. The variant table permits N≥3; this section names only a third critic.
309
+ - Fingerprint: the set of still-open finding headings/ids on the disagreement map. Two retries in a row with that set unchanged and no new successor lean = same-fingerprint halt.
310
+ - Dispatch failure (no comment posted, spawn died) is a separate halt. It does not spend a retry slot. Stop and inform. Do not stamp.
311
+
312
+ ### Audited residuals (panel bookkeeping)
313
+
314
+ These are not rules. They record open protocol questions with the working default one arc used. A parent that leans on any of them MUST carry an audit marker (`## Parent-side substantiation`).
315
+
316
+ - **Round-3+ ceiling.** The round-1 and round-2 ceiling rules cover those rounds. Stop 4 pins a retry to the disagreement-map comment. Round 3 and later have no stated ceiling. *Working default:* the most recent parent artifact that supersedes the map.
317
+ - **Amendment supersession.** The round-2 ceiling is the disagreement-map comment. An amendment that supersedes a stale map has been used as the ceiling instead. *Working default:* that amendment becomes the ceiling.
318
+ - **Pass-4 accounting.** Where the optional pass-4 synthesis audit counts against the budget is unaddressed. At N=3 it would be a fifth post. *Working default:* both panel arcs declined it.
319
+ - **Parallel fingerprint.** The halt fingerprint is the still-open headings on the disagreement map. Parallel critics merge into one map. The same-fingerprint halt assumes sequential retries against a stable finding set and is untested with a panel. *Working default:* the merged map.
320
+
321
+ ## Halt line
322
+
323
+ At dual-stop halt (cap, same-fingerprint, or dispatch-fail), parent posts:
324
+
325
+ ```text
326
+ design-critique: halted, because …
327
+ ```
328
+
329
+ Presence, shape, and authority only. Do not score the because-clause.
330
+
331
+ - ⊗ Add a `design-critique:halted` issue label.
332
+ - ! Resume after halt is a new operator verb, not a silent retry.
69
333
 
70
334
  ## Stop 5 — Verified synthesis
71
335
 
72
336
  ### Synthesis format
73
337
 
74
- Post a verified-claims table. Each quantitative row names its method.
338
+ On the #3640 all-accept path, parent auto-posts the verified-claims table as its own comment (`role: parent`). On a non-empty disagree set, parent does not auto-post the table. Each quantitative row names its method.
75
339
 
340
+ - ! Synthesis comments start with the same first-two-lines (`model: <slug>` then `role: parent`).
341
+ - ! #3640 auto-posted verified-claims table and synthesis-accepted comments use `role: parent`.
76
342
  - ! Put a method column in every verified-claims table.
77
343
  - ! Decorrelation: a row whose only evidence is prior critics' agreement MUST NOT be marked verified. Require primary-source re-derivation or a cross-family re-check.
78
344
  - ! Method-reconciliation: when verifying, upholding, or issuing any verdict that a measurement or count claim is false, first reproduce the original claimant's method. A different number under a different method is a discrepancy to explain, not a refutation.
@@ -82,9 +348,98 @@ Post a verified-claims table. Each quantitative row names its method.
82
348
 
83
349
  Distinguish measured evidence from endorsed evidence. Same-family agreement is correlated, not confirmatory.
84
350
 
351
+ ## Bind after accepted synthesis
352
+
353
+ Two bind paths authorize:
354
+
355
+ ```text
356
+ design-critique: synthesis accepted, because …
357
+ ```
358
+
359
+ 1. #3640 auto-stamp: when the successor lean map is total over the auto-stamp denominator (critic posts in this arc, including Stop 4 retry output, plus still-open residual headings) and that set is non-empty and every heading is `accept-into-contract` AND zero unresolved audit markers AND the operator has confirmed or amended that map AND no unposted same-round siblings remain, parent posts `design-critique: synthesis accepted, because agents agreed (empty disagreement set)` and remaining-set-replaces the chip to `design-critique:triage-ready` via `task scm:issue:design-critique-chip -- --issue N --chip triage-ready`. If that write misses, continue; do not halt. Do not print **accept synthesis**. Do not auto-stamp on a partial map, an unconfirmed parent draft, or when any audit marker is unresolved, or while same-round siblings remain unposted.
360
+ 2. Explicit operator **accept synthesis** (or a listed short form), subject to the two non-empty refusals below. Parent may post that line and cite the verb. Then apply `design-critique:triage-ready` as the exclusive catalog chip via remaining-set write. If that write misses, continue; do not halt.
361
+
362
+ Closed catalog (last chip wins): `design-critique:mechanism-shaped` (in-flight, gate match) and `design-critique:triage-ready` (bound). No halt chip.
363
+
364
+ - ⊗ Bind path 2 when the critic posts zero classified headings (stub / blank). The same refusal path 1 carries at Operator verbs. Stop and inform. Do not stamp.
365
+ - ⊗ Bind path 2 on a footnote-only census. A footnote-only post is a valid census and is not a stub, but denominator set (a) is empty, so it carries no bind at either path.
366
+ - ! Exclusive replace is one merged remaining-set write: GET current labels, drop the other catalog names (`design-critique:mechanism-shaped` and `design-critique:triage-ready`), PUT/PATCH that list with the new chip. Other facets stay. Parent write path: `task scm:issue:design-critique-chip -- --issue N --chip triage-ready|mechanism-shaped [--repo OWNER/NAME]` (`deft scm issue design-critique-chip` dual-invoke). The verb GET-drops via `applyDesignCritiqueCatalogChip` / `designCritiqueChipApplyDelta` and one `ScmLabelClient.apply`. Inventory: `LabelClient.apply` / `mergeIssueLabels`.
367
+ - ⊗ `gh api POST .../labels` or additive `scm:issue:edit --add-label` for this facet.
368
+ - ⊗ Intercept mixed `scm issue edit` adds/removes for this facet.
369
+ - ⊗ General-purpose labels CLI.
370
+ - ! After the completed-arc record is present, `triage:accept` / `scope:promote` / `issue:ingest` / build may proceed. Any identity may run those verbs. Same-session parent continuation is not required. GitHub Triage on the implementer is not required. They read the accepted verified synthesis (latest successor lean plus the verified-claims table).
371
+ - ! Ingest clearance cites the latest successor lean. An older completed-arc record does not clear a later recut lean. A panel-deposit is in-flight even when the catalog chip missed and no critic has posted.
372
+ - ! The lexical form of that citation, and the requirement that the occurrence be affirmative, are published in `## Citation grammar`. Ingest reads that grammar, not prose intent.
373
+ - ! Keep `plan.policy.judgmentGates` matching only `design-critique:mechanism-shaped`. After `triage-ready` replaces it, the issue leaves the gate match.
374
+ - ! Chip is list-visible state, not consent. Do not drop `mechanism-shaped` without the synthesis-accepted line (or the #3640 empty-disagreement path).
375
+ - ⊗ Treat `design-critique:triage-ready` as ingest clearance.
376
+ - ! Chip apply miss is non-blocking convenience. Do not invent a 403 HTTP parser. Any apply miss is the same miss. Do not use the halt line. Do not block ingest. Optional later remaining-set by a write-capable identity is hygiene.
377
+ - ! Leftover `design-critique:mechanism-shaped` after a chip apply miss does not block ingest. `judgmentGates` match is advisory/observe.
378
+ - ⊗ Use the halt line for a chip apply miss.
379
+ - ! Write-back `mechanism-shaped: true` is history after replace. Current-state authority is the last catalog chip.
380
+ - ! Recut (new lean) applies `design-critique:mechanism-shaped` with the same remaining-set write and drops `triage-ready`.
381
+ - ~ A live `design-critique:*` count!=1 check is SHOULD, not a new `judgmentGates` match.
382
+ - ⊗ Add `design-critique:triage-ready` to `judgmentGates` labels.any-of.
383
+ - ⊗ Infer consent from looks-good.
384
+ - ⊗ DELETE-then-POST the chip (unchipped window if POST fails).
385
+ - ⊗ PUT a naive full wipe of every label.
386
+ - ⊗ Classify-mirror this facet.
387
+
388
+ ## Citation grammar
389
+
390
+ Closed set (#3831). The completed-arc record clears ingest only when a citation matches an accepted form **and** the occurrence is affirmative. `evaluateCompletedArcRecord` reads both through one parser, `scanCitations` (`packages/core/src/design-critique/citation-grammar.ts`). Nothing else parses citations.
391
+
392
+ Citation keywords are `successor lean`, `lean`, `verified-claims table`, and `comment`. The id follows the keyword immediately: a colon and horizontal whitespace are the only things allowed between them.
393
+
394
+ Accepted forms, and nothing else:
395
+
396
+ 1. bare decimal — `successor lean 12345678`
397
+ 2. colon, following space optional — `successor lean: 12345678`, `successor lean:12345678`
398
+ 3. balanced single-backtick decimal — `` successor lean `12345678` ``
399
+ 4. emphasised keyword, `*` or `**`, with either id form — `**successor lean:** 12345678`
400
+ 5. canonical comment permalink fragment — `#issuecomment-12345678`
401
+ 6. canonical comment permalink path — `/issues/comments/12345678`
402
+
403
+ - ! Publish a form in this list before the parser accepts it. An unpublished spelling is not a citation.
404
+ - ⊗ Widen the accept set with `.*`, arbitrary decoration, or an open decorator class.
405
+ - ⊗ Accept a bold, italic, underscore, hash-prefixed, parenthesised, quoted, HTML-tagged, or display-text-link id. Those sit outside the closed set, and the refusal names the accepted forms.
406
+ - ⊗ Count every 8-or-more digit run in the body as a citation. Keyword adjacency and the two permalink targets are the whole anchor.
407
+
408
+ ### Position predicate
409
+
410
+ Accepting an id is not accepting a citation. A match is classified by where it landed, and an occurrence that is not affirmative does not clear:
411
+
412
+ - inside a fenced code block, including a fence indented up to three spaces — prose that shows the form
413
+ - keyword inside an inline code span, including a span that opened on an earlier line — `` the parser wants `successor lean 12345678` shaped text ``
414
+ - in a blockquote, including an unmarked lazy-continuation line — `> they wrote: successor lean 12345678`
415
+ - struck through — `~~successor lean 12345678~~`
416
+ - explicitly negated within three words of the keyword — `do not use successor lean 12345678`
417
+
418
+ Those five are the whole refused set. An indented code block and an HTML comment are deliberately outside it: a four-space indent is also ordinary list-continuation content, so refusing it would block valid records more often than it would catch example text. Widening the refused set is a contract change, not an implementation detail.
419
+
420
+ - ! Classify the position of a match. Prior art is `classifyHit` (`packages/core/src/pr-closing-keywords/detect.ts`), which records where a hit landed.
421
+ - ! Read the enclosing block, not one physical line. A code span, a strikethrough run, and a blockquote all carry across a newline, and they end at the blank line.
422
+ - ! A quote block also ends at a fence delimiter, and a `>` line inside an open fence is example text rather than a marker. A quoted line in a fenced example does not refuse the citation that follows the closing fence.
423
+ - ! The negation form is explicit: `cannot`, `never`, `no longer`, an auxiliary plus `not`, or an auxiliary contraction ending in `n't`, closing within three plain words of the citation keyword and inside the same sentence.
424
+ - ! A negated verb of denial affirms the citation instead of refusing it, because the negation binds the verb and the citation sits in the complement clause. The verb set is closed: `deny`, `doubt`, `dispute`, `contest`, `question`. `we cannot deny that successor lean 12345678 binds` cites.
425
+ - ! That carve-out suspends a negation that already fired; it never refuses on its own, and it does not accept the citation outright. The complement clause carries the claim, so a negation anywhere in the rest of that sentence keeps the refusal: `we do not doubt that successor lean 12345678 does not bind` says the lean does not bind.
426
+ - ⊗ Read a trailing `that` as the complement-clause signal on its own. `that` is also a determiner, so `do not use that successor lean 12345678` and the cleft `the record is not that successor lean 12345678` stay refused, and a second negation before the keyword still binds.
427
+ - ⊗ Refuse on a negation word anywhere in the sentence prefix. `without a doubt, successor lean 12345678 is accepted` and `not only successor lean 12345678 but also the table` are affirmative citations, and refusing them blocks a valid record.
428
+ - ⊗ Strip the span instead. The established markdown scanners delete a code span with its contents, which destroys the digits.
429
+
430
+ ### Which code-span convention governs
431
+
432
+ The intake cross-ref scanners (`packages/core/src/intake/markdown-scanners.ts`) delete code spans, so for them a backticked id is an example and never a reference. The citation scan takes the opposite polarity for the **id token only**: a balanced single-backtick id is an accepted citation, because arc comments are hand-written prose and the mandated lean heading is itself `**Lean:**`. A keyword inside a code span, and anything inside a fence, stays an example in both layers. The two conventions differ deliberately, and this paragraph is the record of which governs where.
433
+
434
+ ### One parser, set membership, observed diagnostics
435
+
436
+ - ! Citation extraction and the verified-claims-table claim read the same parse. Two regexes answering one question let a decorated table id waive the table requirement and return `complete` with a null table id.
437
+ - ! Clearance is set membership: the record clears when the cited set contains the latest successor lean id. Position in the body does not select the lean, so citing the prior lean that `## Successor lean` requires cannot block.
438
+ - ! A block detail reports what was scanned, what was found, and the accepted forms. ⊗ Guess at a cause. A guessed detail sends the operator back to re-post the same body and reproduce the refusal.
439
+
85
440
  ## Failure and budget stop
86
441
 
87
- - ! Failure/budget stop (#2442): if a critic run fails or the arc exhausts its envelope, halt with an operator-visible report. Do not thrash.
442
+ - ! Failure/budget stop (#2442): Dual stop and Halt line. If a critic run fails or the arc exhausts its envelope, halt with the halt line. Do not thrash.
88
443
 
89
444
  ## Security context (#480)
90
445
 
@@ -97,4 +452,4 @@ This motion ingests untrusted issue threads by design.
97
452
 
98
453
  ## Test surface
99
454
 
100
- `packages/core/src/content-contracts/standards/design_critique_contract.test.ts` locks required pointer strings, the scaffolds framing, the brief-template forbidden-inputs list, and the thin router skill (existence, line cap, pointer resolution, no-normative-content).
455
+ `packages/core/src/content-contracts/standards/design_critique_contract.test.ts` locks required pointer strings, the scaffolds framing, the comment-lead field as model then role from the closed set (not an issue label), the operator-gated loop (successor lean, operator verbs including walk / walk all, dual stop, halt line, exclusive remaining-set replace of the two catalog chips, #3640 auto-stamp on a non-empty all-accept map and no-stamp on stubs, first-lean recording obligation after critic EXIT), the parent-side substantiation token and independence rules, the Stop 1 exclusion (pre-critic premises outside the trigger) and `refutation-target:` field tokens rather than full body sentences, the composed auto-bind conjunct (all-accept map AND zero unresolved audit markers) at Operator verbs and Bind path 1, the variant-table evaluation rule (charter selection and spend permission evaluated independently), the critic-method heading and distinctive obligation tokens (exact class tokens, citations-are-claims, existing mechanisms, injection / swarm trigger nouns, failed-reviewer phrase, finding anatomy) rather than full body sentences, the brief-template forbidden-inputs list, and the thin router skill (existence, line cap, pointer resolution, no-normative-content). `evaluateParentAudit` locks the omission failure modes. This suite locks the SoT MUST and the thin skill pointer for the first-lean recording obligation, including the auto-stamp operator-confirm conjunct and the no-bind-while-unposted-same-round-siblings rule. `evaluateCompletedArcRecord` locks ingest on the completed-arc record rather than a catalog chip. It does not fail-close live parent turns. `packages/core/src/design-critique/citation-grammar.test.ts` locks the `## Citation grammar` closed set, the refused positions, and the diagnostics surface; `packages/core/src/design-critique/completed-arc-record.test.ts` locks one parser for both questions, set membership against the latest lean, and the observation-echoing block details (#3831). Runtime parent-turn detection only if `evaluateParentAudit` is extended; that extension is not required to ship the recording obligation. Panel completeness is locked as contract text only. No predicate observes it on a live arc (#3850). `### The arc` and its derived boundaries, the `### Target shape` axis with its twice-run caveat, and the two bind-path-2 non-empty refusals are locked as contract text (#3797).
@@ -0,0 +1,77 @@
1
+ # Issue-eval contract (#3648)
2
+
3
+ Sole normative source of truth for Stage A issue evaluation: isolated validity, parent WIP census, named gitignored sink, and value advice that must not stamp the reserved design-critique clearance line. The thin skill [`skills/deft-directive-issue-eval/SKILL.md`](../skills/deft-directive-issue-eval/SKILL.md) is a pointer only. The verb is `task triage:evaluate`.
4
+
5
+ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
6
+
7
+ **See also**: [`design-critique.md`](./design-critique.md) (reserved clearance grammar) | [`docs/decisions/ADR-005-design-critique-judgment-gate.md`](../../docs/decisions/ADR-005-design-critique-judgment-gate.md) (gate; not amended here)
8
+
9
+ Stage B (accept-path default-flip stamp) is not this contract. ⊗ Amend ADR-005 vehicle invariance from this surface.
10
+
11
+ ## Split read sources
12
+
13
+ ! A detached worktree at `origin/master` owns validity and ADR / contract reads.
14
+
15
+ ! The parent on the live working set owns the WIP census: `xbrief/active/`, `xbrief/pending/`, and `plan-sequence`.
16
+
17
+ ! GitHub REST owns open PRs, open issues, and duplicate linkage. Prefer `ghx` for repeated GETs. ⊗ `gh issue view --json` / `gh pr view --json` (GraphQL).
18
+
19
+ ! The evaluator never receives WIP conflict inputs. Parent joins after the evaluator returns.
20
+
21
+ ## Verdict sink
22
+
23
+ ! The parent writes under `.deft-scratch/issue-eval/<sha12>/<invocation-id>/`.
24
+
25
+ ! `<sha12>` is `origin/master` at evaluation start (invalidation key). `<invocation-id>` is a fresh UUID per `triage:evaluate` invocation.
26
+
27
+ ! **No assist posture marker on the CLI parent.** The parent writes after join. The evaluator writes nothing durable.
28
+
29
+ ! Parent tears down evaluator worktrees on success and on failure. Parent MAY GC `<sha12>` directories that are not the current `origin/master`.
30
+
31
+ ⊗ Widen `VALID_DECISIONS` or append a candidates-log row. The audit log is closed and has no SHA field.
32
+
33
+ ⊗ Write under `xbrief/.eval/` (eval-health namespace).
34
+
35
+ ⊗ Use `xbrief/.triage-cache/candidates.jsonl` as the verdict store.
36
+
37
+ ## Evaluator worktrees
38
+
39
+ ! Path: `.deft-scratch/worktrees/issue-eval-<issue>-<invocation-id>` (same layout class as `defaultWorktree`).
40
+
41
+ ! Parent owns `git worktree add --detach` at `origin/master` and `git worktree remove`. The evaluator never creates or removes worktrees.
42
+
43
+ ! Evaluators run `deft session:start --read-only` (never claims occupancy).
44
+
45
+ ⊗ Reuse `swarm:launch` until #3649 lands (create-before-claim occupancy defect).
46
+
47
+ ⊗ Checkout or commit to `origin/master` on the shared working tree.
48
+
49
+ ⊗ Let evaluators read or write the shared working tree.
50
+
51
+ ## Value advice grammar
52
+
53
+ ! Value MAY recommend a critique via a distinct field `critique-recommend:`.
54
+
55
+ ⊗ Emit `design-critique: warranted | not warranted, because …` — that line is the reserved posted clearance shape. The author stamps clearance independently.
56
+
57
+ ## No GitHub writes; existing decisions
58
+
59
+ ! Evaluation writes nothing to GitHub (no comments, labels, or issue edits).
60
+
61
+ ! Operator decisions stay the existing `triage:*` verbs (`accept` / `reject` / `defer` / `needs-ac` / `mark-duplicate`). No new decision verb. No direct `xbrief/proposed/` write.
62
+
63
+ ## Fan-out
64
+
65
+ ! Default **4** parallel evaluators. Override `--concurrency N`. 4 is a bind, not a measured existing cap.
66
+
67
+ ! REST-first reads.
68
+
69
+ ## Acceptance-criterion amendment
70
+
71
+ The body AC "shared checkout and master untouched" is recut:
72
+
73
+ ! Evaluators never read or write the shared working tree.
74
+
75
+ ! The parent MAY write the named gitignored sink and create the named sibling worktrees.
76
+
77
+ ! `origin/master` is not checked out and not committed to.