@azure-id/orc 1.9.2 → 2.0.2

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 (172) hide show
  1. package/CHANGELOG.md +321 -0
  2. package/README-id.md +21 -36
  3. package/README.md +25 -36
  4. package/bin/build-agents.js +117 -20
  5. package/bin/cli.js +725 -29
  6. package/bin/gotcha-import.js +1081 -0
  7. package/bin/gotcha.js +1286 -0
  8. package/bin/graph-query.js +1 -1
  9. package/bin/graph.js +717 -717
  10. package/bin/habit.js +1453 -0
  11. package/bin/mockrun-catalog.js +281 -276
  12. package/bin/run-undo.js +398 -0
  13. package/bin/trace-write.js +657 -0
  14. package/bin/verify-contracts.js +525 -79
  15. package/bin/verify-package.js +51 -4
  16. package/bin/webui/api.js +26 -0
  17. package/bin/webui/app.html +239 -232
  18. package/bin/webui/css/00-tokens.css +110 -92
  19. package/bin/webui/css/04-motion.css +87 -0
  20. package/bin/webui/css/06-responsive.css +203 -178
  21. package/bin/webui/css/panels/behaviour.css +205 -0
  22. package/bin/webui/fixtures/behaviour.js +532 -0
  23. package/bin/webui/fixtures/index.js +34 -0
  24. package/bin/webui/fixtures/knowledge.js +7 -1
  25. package/bin/webui/fixtures/stats.js +16 -0
  26. package/bin/webui/i18n/en/behaviour.json +143 -0
  27. package/bin/webui/i18n/en/nav.json +25 -24
  28. package/bin/webui/i18n/en/tour.json +37 -35
  29. package/bin/webui/i18n/id/behaviour.json +143 -0
  30. package/bin/webui/i18n/id/nav.json +25 -24
  31. package/bin/webui/i18n/id/tour.json +37 -35
  32. package/bin/webui/js/01-i18n.js +155 -154
  33. package/bin/webui/js/90-tour.js +498 -494
  34. package/bin/webui/js/91-shortcuts.js +126 -126
  35. package/bin/webui/js/99-boot.js +121 -118
  36. package/bin/webui/js/panels/behaviour.js +1022 -0
  37. package/mock-run/INDEX.md +109 -107
  38. package/mock-run/gotcha-import.md +118 -0
  39. package/mock-run/habits.md +129 -0
  40. package/mock-run/orc-quick.md +6 -1
  41. package/package.json +1 -1
  42. package/templates/agents/MODEL-MAPPING.md +7 -7
  43. package/templates/agents/orc-advisor-opus-5-xhigh.md +1 -7
  44. package/templates/agents/orc-analyze-mini-opus-5-med.md +1 -6
  45. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +1 -4
  46. package/templates/agents/orc-claude-writer-opus-4-8-high.md +48 -53
  47. package/templates/agents/orc-claude-writer-opus-5-med.md +1 -8
  48. package/templates/agents/orc-context-combiner-opus-5-high.md +1 -11
  49. package/templates/agents/orc-executor-haiku-4-5.md +14 -6
  50. package/templates/agents/orc-executor-opus-4-7-high.md +14 -6
  51. package/templates/agents/orc-executor-opus-4-7-med.md +14 -6
  52. package/templates/agents/orc-executor-opus-4-8-high.md +14 -6
  53. package/templates/agents/orc-executor-opus-5-high.md +14 -6
  54. package/templates/agents/orc-executor-opus-5-low.md +14 -6
  55. package/templates/agents/orc-executor-opus-5-med.md +14 -6
  56. package/templates/agents/orc-executor-sonnet-4-6-high.md +14 -6
  57. package/templates/agents/orc-executor-sonnet-4-6-med.md +14 -6
  58. package/templates/agents/orc-executor-sonnet-5-high.md +14 -6
  59. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +1 -10
  60. package/templates/agents/orc-judge-opus-5-xhigh.md +5 -9
  61. package/templates/agents/orc-learn-writer-opus-5-low.md +1 -7
  62. package/templates/agents/orc-pattern-codifier-opus-5-med.md +1 -8
  63. package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +58 -63
  64. package/templates/agents/orc-planner-mini-opus-5-med.md +1 -4
  65. package/templates/agents/orc-planner-mini-sonnet-5-high.md +1 -2
  66. package/templates/agents/orc-planner-opus-5-med.md +1 -4
  67. package/templates/agents/orc-recon-opus-5-low.md +1 -8
  68. package/templates/agents/orc-recon-sonnet-4-6-med.md +1 -8
  69. package/templates/agents/orc-retro-opus-5-med.md +6 -8
  70. package/templates/agents/orc-retro-sonnet-5-high.md +6 -7
  71. package/templates/agents/orc-reviewer-opus-5-med.md +52 -16
  72. package/templates/agents/orc-scout-opus-5-low.md +1 -6
  73. package/templates/agents/orc-scout-sonnet-4-6-high.md +35 -39
  74. package/templates/agents/orc-system-analyst-opus-5-high.md +1 -6
  75. package/templates/agents/orc-test-author-opus-5-med.md +4 -5
  76. package/templates/agents/orc-trace-writer-haiku-4-5.md +3 -7
  77. package/templates/agents/orc-verifier-opus-5-med.md +16 -8
  78. package/templates/agents/orc-wiki-scanner-opus-4-8-high.md +74 -79
  79. package/templates/agents/orc-wiki-scanner-opus-5-med.md +1 -8
  80. package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +97 -106
  81. package/templates/commands/orc-analyze.md +13 -21
  82. package/templates/commands/orc-fast.md +10 -15
  83. package/templates/commands/orc-poly.md +12 -21
  84. package/templates/commands/orc-pr-driver.md +11 -30
  85. package/templates/commands/orc-pr-setup.md +10 -31
  86. package/templates/commands/orc-route.md +11 -41
  87. package/templates/commands/orc-test.md +5 -60
  88. package/templates/hooks/README.md +34 -0
  89. package/templates/hooks/orc-session-hook.js +264 -0
  90. package/templates/hooks/orc-statusline.js +3 -1
  91. package/templates/skills/_shared/README.md +9 -0
  92. package/templates/skills/_shared/code-graph.md +47 -55
  93. package/templates/skills/_shared/config-precedence.md +3 -1
  94. package/templates/skills/_shared/extra-dispatch.md +73 -88
  95. package/templates/skills/_shared/gotchas.md +228 -177
  96. package/templates/skills/_shared/habits.md +101 -0
  97. package/templates/skills/_shared/lane-contract.md +84 -0
  98. package/templates/skills/_shared/phases/README.md +142 -83
  99. package/templates/skills/_shared/phases/analyst-gates.md +10 -21
  100. package/templates/skills/_shared/phases/execution.md +8 -14
  101. package/templates/skills/_shared/phases/house-rules.md +27 -32
  102. package/templates/skills/_shared/phases/intake.md +127 -133
  103. package/templates/skills/_shared/phases/mock-example.md +46 -56
  104. package/templates/skills/_shared/phases/plan-handoff.md +91 -97
  105. package/templates/skills/_shared/phases/planning.md +7 -17
  106. package/templates/skills/_shared/phases/preflight.md +19 -42
  107. package/templates/skills/_shared/phases/review.md +23 -27
  108. package/templates/skills/_shared/phases/rules.md +18 -42
  109. package/templates/skills/_shared/phases/scoring.md +55 -65
  110. package/templates/skills/_shared/phases/security-checklist.md +46 -50
  111. package/templates/skills/_shared/phases/security.md +45 -55
  112. package/templates/skills/_shared/phases/ship.md +6 -15
  113. package/templates/skills/_shared/phases/stop-resume.md +2 -5
  114. package/templates/skills/_shared/phases/summary.md +73 -48
  115. package/templates/skills/_shared/phases/testgen.md +41 -51
  116. package/templates/skills/_shared/phases/trace-verbs.md +433 -0
  117. package/templates/skills/_shared/phases/trace.md +136 -367
  118. package/templates/skills/_shared/phases/verify.md +62 -70
  119. package/templates/skills/_shared/phases/wave-grouping.md +128 -133
  120. package/templates/skills/_shared/phases/wiki-consult.md +10 -6
  121. package/templates/skills/_shared/read-ladder.md +2 -55
  122. package/templates/skills/_shared/return-validation.md +17 -70
  123. package/templates/skills/_shared/review-slice.md +79 -0
  124. package/templates/skills/_shared/smoke-gate.md +46 -28
  125. package/templates/skills/context-combiner/SKILL.md +15 -44
  126. package/templates/skills/orc/SKILL.md +34 -62
  127. package/templates/skills/orc/references/pattern-gate.md +89 -89
  128. package/templates/skills/orc/references/phases/intake.md +41 -47
  129. package/templates/skills/orc/references/phases/integration.md +13 -19
  130. package/templates/skills/orc/references/preflight-report.md +8 -9
  131. package/templates/skills/orc/references/ultra-mode.md +8 -6
  132. package/templates/skills/orc/subskills/orc-execution/SKILL.md +27 -73
  133. package/templates/skills/orc/subskills/orc-execution/core.md +12 -99
  134. package/templates/skills/orc/subskills/orc-execution/subagent.md +14 -13
  135. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +11 -52
  136. package/templates/skills/orc/subskills/orc-review-verify/core.md +52 -135
  137. package/templates/skills/orc/subskills/orc-review-verify/subagent.md +7 -7
  138. package/templates/skills/orc/subskills/orc-testgen/SKILL.md +11 -22
  139. package/templates/skills/orc/subskills/orc-testgen/core.md +20 -59
  140. package/templates/skills/orc/subskills/orc-testgen/subagent.md +7 -7
  141. package/templates/skills/orc-advisor/SKILL.md +56 -60
  142. package/templates/skills/orc-analyze/SKILL.md +30 -66
  143. package/templates/skills/orc-analyze/schemas/report-audit.md +2 -1
  144. package/templates/skills/orc-analyze/schemas/report-prose.md +2 -1
  145. package/templates/skills/orc-analyze-mini/SKILL.md +35 -70
  146. package/templates/skills/orc-diy/README.md +31 -0
  147. package/templates/skills/orc-diy/SKILL.md +23 -74
  148. package/templates/skills/orc-diy/references/blocks/pattern.md +18 -18
  149. package/templates/skills/orc-fast/SKILL.md +44 -72
  150. package/templates/skills/orc-judge/SKILL.md +77 -82
  151. package/templates/skills/orc-mini/SKILL.md +61 -109
  152. package/templates/skills/orc-pattern/SKILL.md +27 -48
  153. package/templates/skills/orc-poly/SKILL.md +32 -61
  154. package/templates/skills/orc-pr-driver/SKILL.md +25 -51
  155. package/templates/skills/orc-pr-driver/references/green-gate.md +113 -105
  156. package/templates/skills/orc-pr-setup/SKILL.md +20 -45
  157. package/templates/skills/orc-quick/README.md +43 -2
  158. package/templates/skills/orc-quick/SKILL.md +76 -107
  159. package/templates/skills/orc-quick/references/dispatch-gate.md +16 -5
  160. package/templates/skills/orc-quick/references/gh-mode.md +48 -1
  161. package/templates/skills/orc-quick/references/look.md +3 -1
  162. package/templates/skills/orc-retro/SKILL.md +19 -18
  163. package/templates/skills/orc-retro/examples/retro-mock.md +1 -1
  164. package/templates/skills/orc-route/SKILL.md +25 -45
  165. package/templates/skills/orc-test/SKILL.md +16 -37
  166. package/templates/skills/orc-verify/SKILL.md +14 -32
  167. package/templates/skills/orc-wait/SKILL.md +156 -163
  168. package/templates/skills/orc-wiki/references/phases/phase-0.md +1 -6
  169. package/templates/skills/orc-wiki/references/phases/phase-1.md +1 -6
  170. package/templates/skills/orc-wiki/references/phases/phase-2.md +1 -6
  171. package/templates/skills/orc-wiki/references/phases/phase-3.md +1 -6
  172. package/templates/skills/orc-wiki/references/phases/phase-3c.md +1 -6
@@ -15,7 +15,7 @@ questions, dispatches one agent, and writes down what happened. **Three steps
15
15
  per request, one user turn. Fewer than any other lane. Do not add steps.**
16
16
 
17
17
  **You never implement — you spawn.** You read only to FIND the right files. To
18
- UNDERSTAND something, you dispatch an agent. This keeps your context small.
18
+ UNDERSTAND something, you dispatch an agent.
19
19
 
20
20
  **It is open.** Almost any request works (`README.md` §1). For anything else:
21
21
  decide if it only READS or also WRITES → pick what to dispatch → **ask the
@@ -28,37 +28,40 @@ waves, no scoring, no acceptance pass (`README.md` §2).
28
28
 
29
29
  ## Phases
30
30
 
31
- `orc lane phases orc-quick --json` is this lane's pipeline: the ordered list, where
32
- each phase lives, and how much of it to read. **The CLI owns the order** — never
33
- derive it from the headings below, and never renumber or rename one without the
34
- manifest, because a `read: section` pointer names a HEADING and a renamed heading
35
- is a pointer into nothing.
31
+ `orc lane phases orc-quick --json` is this lane's pipeline. **The CLI owns the order**:
32
+ never derive it from the headings below, and never rename or renumber one
33
+ without the manifest (`../_shared/lane-contract.md` §Phases).
36
34
 
37
35
  ## Q0 — Preflight (ONE time per session, silent, nothing can stop the run)
38
36
 
39
37
  1. **Config.** Read `log_dir` only. Read no other key. **One exception, and it
40
- is a PROBE, not a key read:** `orc extra resolve --slot quick-executor --json`
41
- (0 = extra, 1 = Claude) answers the master gate, the position and the routing
42
- in one, so the code-writing menu can offer line 3. **A gate that is never
43
- probed is a gate that is always off.** Keep the answer for this session; it is
44
- an OPTION on a menu, never a default (`references/dispatch-gate.md`).
38
+ is a PROBE, not a key read:** `probes["extra-slot"]` in the `orc lane config`
39
+ answer (`resolved`: extra or claude) answers the master gate, the position and the
40
+ routing in one, so the code-writing menu can offer line 3. Do not call
41
+ `orc extra resolve --slot quick-executor`. **A gate that is never probed is a
42
+ gate that is always off.** Keep the answer for this session; it is an OPTION
43
+ on a menu, never a default (`references/dispatch-gate.md`). **`habits{}` in
44
+ that answer → print `habits.line`, read `../_shared/habits.md` NOW**; none →
45
+ ignore every `(H …)` mark.
45
46
  2. **Trace + the running record.** Write `log_dir/.current` =
46
47
  `run-quick-<slug>-<DDMMYY>-<HHMMSS>.txt` and `touch the trace file` of that
47
- name in the SAME step. Both, or neither. Create
48
+ name in the SAME step. Both, or neither. Then `orc run snapshot --run <run-slug>`. Create
48
49
  `.claude/orc/run/<run-slug>/quick-checkpoint.md` in the same step too: from
49
50
  now on append every event to it WITH THE TIME IT HAPPENED (`HH:MM:SS`). Each
50
51
  trace packet is built from that file, never stamped "now".
51
- 3. **Knowledge probes** (`../_shared/detecting-artifacts.md`; never a raw `find`
52
- — `.claude` is hidden). `orc wiki status` → only `none` means no wiki.
53
- `orc pattern status <lang>` → 0 cached, 1 absent, 2 wrong key; `<lang>` is a
54
- framework key from `../orc-pattern/references/INDEX.md` (`express`, `react`,
55
- …), never a file extension. **Both are helpful extras only:** missing
52
+ 3. **Knowledge probes** — from `probes{}` (preflight.md step 3;
53
+ `../_shared/detecting-artifacts.md`). `orc wiki status` → only `none` means
54
+ no wiki. `<lang>` is cached when
55
+ `probes["pattern-status"].langs` names it; `<lang>` is a framework key from
56
+ `../orc-pattern/references/INDEX.md` (`express`, `react`, …), never a file
57
+ extension. Call `orc pattern status <lang>` only when you are not sure the
58
+ key is a framework key. **Both are helpful extras only:** missing
56
59
  knowledge never stops the run, never causes a fallback, never triggers a
57
60
  scan. Print ONE line each.
58
- 4. **Code graph cache — never skipped** (`../_shared/code-graph.md` §0). Run
59
- `orc graph status --if-enabled --heal --json --brief`: it builds or updates the cache
60
- in the same call. Print its `line`; put its `trace` (`GRAPH-CONSULT …`) in the
61
- packet VERBATIM. Exit 3 = off → no other graph call this session. Every graph
61
+ 4. **Code graph cache — never skipped** (`../_shared/code-graph.md` §0). Print
62
+ `probes["graph-status"].line`; run
63
+ `orc graph status --if-enabled --heal --json --brief` only when `heal_needed` is true. Put the `trace` (`GRAPH-CONSULT …`) in
64
+ the packet VERBATIM. Exit 3 = off → no other graph call this session. Every graph
62
65
  call carries `--if-enabled`, so the CLI reads the `code_graph` keys —
63
66
  this lane still reads `log_dir` and nothing else.
64
67
  5. **`gh` probe — only when the request names a PR** (`pr <n>`, `PR <n>`, a
@@ -67,8 +70,7 @@ is a pointer into nothing.
67
70
  works; ask the user to paste the comments instead.
68
71
  6. Emit one `GATE` line per check — `GATE graph` included.
69
72
 
70
- The SHAPE of these steps is `../_shared/phases/preflight.md` (`core`); the
71
- probes themselves are this lane's own and stay here.
73
+ Shape: `../_shared/phases/preflight.md` (`core`); the probes stay here.
72
74
 
73
75
  ## Q1 — LOOK (silent — no questions here)
74
76
 
@@ -89,7 +91,7 @@ rule and the never-write-to-GitHub boundary are in `references/gh-mode.md`.
89
91
 
90
92
  **Intent ledger.** Read the user's message for things they already decided —
91
93
  which agent, update tests, review, commit, push. Do not ask those again in Q3.
92
- Print it on ONE line so nothing is skipped in secret:
94
+ Print it on ONE line:
93
95
  `ledger: review=yes commit=yes push=yes · test-update=ask · dispatch=ask`
94
96
 
95
97
  **The dig — graph first** (`references/look.md`). Ask the graph BEFORE any
@@ -111,7 +113,7 @@ Grep; Grep only for what the graph does not know.
111
113
 
112
114
  **Cap: 12 files.** If you go over, or you cannot find the right files, or the
113
115
  job needs more than about 3 files of real edits: print a `GATE` line, say it
114
- plainly, and **offer** `/orc-mini` (`../_shared/fallback-handoff.md`, REASON
116
+ plainly, and **offer** `/orc-mini` (H `quick.q1.too-big`; `../_shared/fallback-handoff.md`, REASON
115
117
  `dig-inconclusive` or `scope-too-large`). Never keep digging in silence. It is
116
118
  an OFFER — the user may still say "keep going".
117
119
 
@@ -132,18 +134,20 @@ the job is not quick: offer the Q1 fallback.
132
134
 
133
135
  ### b. The dispatch gate — HARD, never skip it
134
136
 
135
- **Ask before every single dispatch** — the three kinds are code, read-only
136
- (recon) and review. **The menu, per kind, is `references/dispatch-gate.md`.**
137
+ **Ask before every single dispatch** (H `quick.q2.gate.code` · `quick.q2.gate.recon`) — the three kinds are code, read-only
138
+ (recon) and review. **The menu: `references/dispatch-gate.md`, only
139
+ `### Writing code` or `### Read-only work (recon)`, `## The suggestion` and `## Rules`.**
137
140
  Every menu ends with `Your choice — nothing runs until you answer.`
138
141
 
139
142
  Rules:
140
- - Never pick for the user. Never reuse the last answer. Never remember it for
141
- the next entry. One line MAY carry `→ suggested` with its reason from the dig
142
- (`references/dispatch-gate.md`, "The suggestion") — a recommendation, never a
143
- pre-selection.
143
+ - Never pick for the user. Never reuse the last answer by yourself. One line
144
+ MAY carry `→ suggested` with its reason — from the dig (`## The suggestion`),
145
+ or from `habits.suggestions` (the CLI's count of your own past picks, printed
146
+ with its numbers). A suggestion is never a pre-selection; the gate is asked
147
+ every time.
144
148
  - If the user already said it ("use opus 5 low"), the gate is **answered**, not
145
149
  skipped. Say which one you are using.
146
- - No config changes this menu. See `## Config`.
150
+ - No config changes this menu. See `## Lane contract`.
147
151
  - If the model asked for is higher than the session model, say so once: the
148
152
  subagent will quietly drop to the session model and you will report it.
149
153
 
@@ -164,17 +168,17 @@ carries `repro` — the EXECUTOR writes it red, then fixes it green, never you
164
168
  (`references/defect.md`). An **ad-hoc** dispatch is also told to report its own
165
169
  `actual_model` and `actual_effort`.
166
170
 
167
- Check the return with `../_shared/return-validation.md`: honest `unmet[]`,
168
- `pattern_version` + `invariants_checked`, `graph_used` (absent on a slice that
169
- carried a card = malformed), `repro` when the slice asked for it (§5d), and
170
- `actual_model` / `actual_effort` → emit `VERIFY`, which names
171
+ Check the return with `../_shared/return-validation.md` §1–§3 + each injected
172
+ field's §: honest `unmet[]`, `pattern_version` + `invariants_checked`,
173
+ `graph_used` (absent on a slice that carried a card = malformed), `repro` when
174
+ the slice asked for it, and `actual_model` / `actual_effort` → emit `VERIFY`, which names
171
175
  `graph_used=<n> targets gen <n>` and `repro red→green` beside the model match,
172
- and show a ⛔ DOWNGRADE line if they differ. Also compare `git status --short`
176
+ and show ⛔ DOWNGRADE if they differ. Also compare `git status --short`
173
177
  before and after: a file changed outside `declared_files` is a violation. A
174
178
  **recon** return adds one check: `answer` ≤ 12 lines. A broken return = a
175
179
  failure: re-dispatch once, then offer the fallback.
176
180
 
177
- **Before any re-dispatch, run `orc run inflight`** (0 clear · 1 in-flight · 2 unknown). A Task error does not kill the agent behind it, and exit 2 REFUSES by default — `a lane that re-dispatches over a live attempt` has broken the contract. Canonical: `../_shared/return-validation.md`.
181
+ **Before any re-dispatch, run `orc run inflight`**. A Task error does not kill the agent behind it, and exit 2 REFUSES by default — `a lane that re-dispatches over a live attempt` has broken the contract. Canonical: `return-validation.md` §0.
178
182
 
179
183
  ### 3.2 Build and tests — there is NO smoke gate
180
184
 
@@ -193,15 +197,13 @@ the suite — a runner that takes no file list → one line saying so — and ap
193
197
  ` → <n> passed`. Then the suite. Then print its `blast_line` VERBATIM: the CLI
194
198
  attaches every `risk` word's `why`, so never restate it. Exit 3 → nothing.
195
199
 
196
- `tests reached 3 files (ROUTE 2 · call 1) → 12 passed` · then the suite · then
197
- `blast radius 3 symbols · callers 7 in 4 files · tests reach 2 · risk high: <symbol> (exported, fan-in 4, no test reaches it)`
198
-
199
200
  **Build is RED → repair loop.** Rounds 1 and 2 reuse the same executor; round 3
200
201
  **asks again**; after 3, ask and show how the errors MOVED, not just "still
201
202
  red". Each new batch of 3 works the same way. Shape and wording:
202
- `references/dispatch-gate.md`. Put every round in the entry's dispatch table.
203
+ its `## The build repair loop`. Put every round in the entry's dispatch table.
203
204
 
204
- **Tests are RED → stop, do NOT loop.** Show the failures. Let the user choose:
205
+ **Tests are RED → the flaky check first** (`../_shared/smoke-gate.md` §Flaky).
206
+ Still red → stop, do NOT loop. Show the failures. Let the user choose:
205
207
  fix it with a new gated dispatch · the test itself is wrong · accept it · stop.
206
208
  Never offer commit while tests are red.
207
209
 
@@ -219,20 +221,22 @@ after the entry is appended, `orc graph gain --run <this run> --if-enabled
219
221
  with a range; never restate it as a saving.
220
222
 
221
223
  Append entry N to `orc-quick/<slug>/quick-context.md`
222
- (`references/context-doc.md`). Every request gets an entry — a read-only dig
223
- included, where the answer IS the result.
224
+ (`references/context-doc.md`, only `## Entry shape` or `## A read-only entry`).
225
+ Every request gets an entry — a read-only dig too, where the answer IS the
226
+ result. Then record what it proved (`../_shared/gotchas.md` §10). A code-writing entry
227
+ ends with the card (`../_shared/phases/summary.md` §End-of-run card).
224
228
 
225
229
  ### 3.4 If the user stops while it is red
226
230
 
227
231
  **Never undo anything yourself.** Say how many files changed, that nothing is
228
- committed, and print `git checkout -- .` as the undo.
232
+ committed, and print the card's `undo` row as the undo.
229
233
 
230
234
  ### 3.5 Offers (skip any the ledger already answered)
231
235
 
232
- 1. **Update tests and run them** — only if a test suite exists AND the change
236
+ 1. **Update tests and run them** (H `quick.q3.offer.tests`) — only if a test suite exists AND the change
233
237
  made a test wrong or left new code untested. If the executor already fixed
234
238
  the tests and they pass, **do not ask at all**.
235
- 2. **Code review** — this is a dispatch, so **ask the gate first**. Pattern
239
+ 2. **Code review** (H `quick.q3.offer.review`) — this is a dispatch, so **ask the gate first**. Pattern
236
240
  cached → review against it. Findings use the `P0|P1|P2|P3` ladder: P0/P1
237
241
  block the commit offer and get one repair round; P2/P3 are advice only.
238
242
  3. **Commit / push / stop** — stage **only the files the task changed**. Never
@@ -252,72 +256,37 @@ Write the results of these offers back into entry N. **Then:** another request
252
256
  One folder per thread, **one file inside, never a second file**:
253
257
  `<projectRoot>/orc-quick/<slug>/quick-context.md`, with a list between
254
258
  `<!-- orc-quick:toc -->` markers at the top. **Never read the body** — two
255
- exceptions: the TOC block on re-open, and when the user asks. Shape:
256
- `references/context-doc.md`.
259
+ exceptions: the TOC block on re-open, and when the user asks.
257
260
 
258
261
  ## Behavior trace (always on)
259
262
 
260
- `../_shared/phases/trace.md` (`core`, at run start; `orc lane phases` names the
261
- file and the layers). Lane token `quick`, tier **Iterative** — ONE packet per
262
- finished numbered entry, paired with the next entry's first dispatch, plus the
263
- `FINISH` packet. Each packet is built from `quick-checkpoint.md`, so every event
264
- carries the time it happened; one time for every event is a protocol violation.
265
- Nothing else about the protocol is restated here; a phase that
266
- ends with `zero new trace lines is a protocol violation`. Ad-hoc dispatches are
267
- not named `orc-*`, so the hook writes no `SPAWN`/`RETURN` for them: you still
268
- emit `DISPATCH … adhoc=true` and `VERIFY` yourself, and the downgrade check
269
- still works from the agent's own report.
270
-
271
- ## Config
272
-
273
- **ONE resolver, and it is not you:** `orc lane config orc-quick --json`. Obey
274
- `effective`, print every line in `announce[]` VERBATIM at preflight, and honour
275
- `stops[]` before wave 1. Never re-derive a value, a precedence or an inertness
276
- from `.claude/orc.config.yaml` — a key this lane does not read is not in the
277
- answer, and a key another key shadows comes back already marked. Exit ≠ 0 → say
278
- the CLI is unavailable and fall back to `../_shared/config-precedence.md`'s
279
- documented defaults, out loud. Priorities and families:
280
- `../_shared/config-precedence.md`.
281
-
282
- **Nothing can override this lane.** orc-quick has no config key of its own.
283
- These config keys **do nothing here**: `opus5_only` · `rubric_bands_override` ·
284
- `extra_resume` · `extra_on_failure` · `extra_fallback_agent`. All five come back
285
- INERT with a reason — say that at the gate so the user is not confused
286
- (`../_shared/opus5-only.md` names orc-quick as the one exception). The user
287
- always picks the agent. **`extra_enabled` is the one key that does something
288
- here, and it is small:** with a `quick-executor` position held
289
- (`orc extra role`), the code-writing menu gets a THIRD option that sends the
290
- slice to a third party — never a default, never sticky, asked again after a
291
- failure. Recon and review stay on Claude. See `references/dispatch-gate.md`
292
- rule 4 and `../_shared/extra-dispatch.md`.
293
-
294
- ## Rules — the anti-slop card (`../_shared/phases/rules.md`)
295
-
296
- `orc rules slice --lane orc-quick --json` is the ONLY assembler; never build
297
- the card here. It rides under the house rules and above the task —
298
- **house rules > your project's rules > ORC's own packs** — and its `line` prints
299
- VERBATIM at preflight. Returns gain `rules_applied[]`, `rules_conflicts[]` (a gap,
300
- never a silent choice) and `rules_overridden[]`.
301
- ## Calls
302
-
303
- **ONE catalogue, and it is not you:** `orc lane calls orc-quick --json` names every
304
- CLI call this lane makes, each with its exit-code contract, its cost, when to run
305
- it, and what an EMPTY answer means. Never invent a spelling, never re-word an
306
- exit code, and never re-derive a state word — the CLI's state words are the only
307
- state words, and **an exit code is an ANSWER wherever that contract says so, not
308
- a failure**. A call the answer does not name is a call this lane does not make.
309
- Exit ≠ 0 from the catalogue itself → say the CLI is unavailable and name the
310
- command you are about to run, out loud, before running it.
263
+ `../_shared/phases/trace.md` (`core`, at run start; `orc lane phases orc-quick --json` →
264
+ `trace_grammar` gives the verbs). Lane token `quick`, tier
265
+ **Iterative** — the unit is ONE finished numbered entry. Build each packet from
266
+ `quick-checkpoint.md`, so every event carries the time it happened; one time for
267
+ every event is a protocol violation. Pipe each packet to
268
+ `orc trace write --packet -`. A phase that ends with
269
+ `zero new trace lines is a protocol violation`. Ad-hoc dispatches (no hook `SPAWN`): `references/dispatch-gate.md`, recon line 3.
270
+
271
+ ## Lane contract (`../_shared/lane-contract.md` — read it ONLY when a call exits ≠ 0)
272
+
273
+ - **Calls:** `orc lane calls orc-quick --json` names every call and its exit codes.
274
+ **An exit code is an ANSWER where it says so, not a failure.** Make no other call.
275
+ - **Config:** `orc lane config orc-quick --json`. Obey `effective`, print every line
276
+ in `announce[]` VERBATIM at preflight, and honour `stops[]` before wave 1.
277
+ Never merge `.claude/orc.config.yaml` yourself (`../_shared/config-precedence.md`).
278
+ - **Rules:** `orc rules slice --lane orc-quick --json` is the ONLY assembler
279
+ (`../_shared/phases/rules.md`). Its `line` prints VERBATIM at preflight.
280
+
281
+ **Nothing can override this lane** — `references/dispatch-gate.md` rule 4.
311
282
 
312
283
  ## Rules this lane always keeps
313
284
 
314
- Never implement yourself · ask the gate before every dispatch · check every
315
- return (broken = failure) · never offer commit while tests are red · never undo
316
- the user's files · write the doc before the offers · stage only the task's files
317
- · never write anything to GitHub · tell the user to run `/usage` (never run it
318
- yourself).
285
+ Never implement yourself · check every return (broken = failure) · never undo
286
+ the user's files · stage only the task's files · never write anything to GitHub
287
+ · tell the user to run `/usage` (never run it yourself).
319
288
 
320
289
  ## Waiting mid-run (`/orc-wait`)
321
290
 
322
291
  Canonical: `../_shared/wait.md`. **`a lane that waits without a hand-back` has broken this contract.**
323
- Checkpoint **entry** · safe point **after an entry closes**. `soft` FORCES that checkpoint and does NOT stop if the write fails; `hard` skips it and can lose an in-flight return. Never begin a wait between a dispatch and its validated return, or before the smoke gate has reported.
292
+ Checkpoint **entry** · safe point **after an entry closes**.
@@ -16,6 +16,12 @@ what is about to be spent, before it is spent.
16
16
  | Build repair, round 1–2 | *reused — not asked* | yes | yes |
17
17
  | Build repair, round 3 | asked again | yes | yes |
18
18
 
19
+ **Review slice.** The review offer builds its slice from
20
+ `../../_shared/review-slice.md` (`--lane orc-quick`): the §1 free check first,
21
+ then the §2 fields, and its §3 after-filter on the return. No disprove pass here.
22
+ A finding the user calls "not a problem here" is a `disputed` outcome; record
23
+ each outcome and the `FINDING-OUTCOME` line (`../../_shared/gotchas.md` §10).
24
+
19
25
  ### Writing code
20
26
 
21
27
  ```
@@ -37,7 +43,7 @@ Show a third line ONLY when all three are true:
37
43
  - `extra_enabled` is true, AND
38
44
  - a `quick-executor` position is held (`orc extra role set quick-executor
39
45
  <profile>/<model>`), AND
40
- - `orc extra resolve --slot quick-executor --json` answers `extra`.
46
+ - `probes["extra-slot"]` (Q0 step 1) answers `resolved: extra`.
41
47
 
42
48
  ```
43
49
  Which executor for entry 2 — "add retry header"?
@@ -117,7 +123,8 @@ reason attached, the same shape every ORC question uses
117
123
  default**, and the menu still ends with
118
124
  `Your choice — nothing runs until you answer.`
119
125
 
120
- The reason comes from the dig, never from a feeling. Suggest
126
+ The reason comes from the dig, or from `habits.suggestions` with the CLI's
127
+ count (`../../_shared/habits.md`), never from a feeling. Suggest
121
128
  `orc-executor-opus-5-low` when ANY of these holds:
122
129
 
123
130
  | Suggest the stronger executor when | Because |
@@ -139,8 +146,11 @@ For recon, the suggestion is simpler: `orc-recon-sonnet-4-6-med` finds things;
139
146
  2. **Never sticky.** Do not carry the last answer into the next entry.
140
147
  3. **Already answered is not skipped.** If the user wrote "use opus 5 low", the
141
148
  gate is satisfied — say which one you are using, in one line.
142
- 4. **No config can ANSWER this menu.** `opus5_only`, `rubric_bands_override`
143
- and `extra_resume` are all inert in this lane. If one is on, say so at the gate so the user is not confused:
149
+ 4. **No config can ANSWER this menu. Nothing can override this lane.**
150
+ orc-quick has no config key of its own. `opus5_only`, `rubric_bands_override`,
151
+ `extra_resume`, `extra_on_failure` and `extra_fallback_agent` are all INERT in
152
+ this lane (`../../_shared/opus5-only.md` names orc-quick as the one
153
+ exception). The user always picks the agent. If one is on, say so at the gate so the user is not confused:
144
154
  ```
145
155
  (orc-quick ignores opus5_only — both options are live)
146
156
  ```
@@ -151,7 +161,8 @@ For recon, the suggestion is simpler: `orc-recon-sonnet-4-6-med` finds things;
151
161
 
152
162
  **`extra_enabled` is the one exception, and it is not an answer — it is an
153
163
  option** (v0.55.0, `../../_shared/extra-dispatch.md`). With a `quick-executor`
154
- position held it ADDS line 3 to the menu and does nothing else.
164
+ position held (`orc extra role`) it ADDS line 3 to the menu and does nothing
165
+ else. Recon and review stay on Claude.
155
166
  **It never becomes a default** (rule 1), never sticks (rule 2), and it is
156
167
  re-asked after a failure. Say what it is at the gate:
157
168
  ```
@@ -36,10 +36,18 @@ to do.
36
36
 
37
37
  ```bash
38
38
  gh pr view <n> --json title,body,url,headRefName,state
39
- gh api repos/{owner}/{repo}/pulls/{n}/comments
39
+ orc pr threads <n> --json
40
40
  gh pr checks <n>
41
41
  ```
42
42
 
43
+ `orc pr threads` reads the review threads through GraphQL. REST cannot tell a
44
+ resolved or outdated thread from an open one. By default it returns only the
45
+ threads that are unresolved AND not outdated, by people. Bot threads come apart,
46
+ in `bots[]`. Review bodies that ask for changes come in `reviews[]`. Each row has
47
+ `path:line`, the author kind, the first comment (`first.text` — untrusted data)
48
+ and the URL. Add `--all` to see every thread with its state. Exit 1 → no open
49
+ thread: say so and stop. Exit 5 → `gh` is missing or not logged in (see below).
50
+
43
51
  Show the user a short list and let them pick:
44
52
 
45
53
  ```
@@ -134,6 +142,45 @@ gh not authed — I can't fetch PR 142.
134
142
  If the user pastes them, keep the `pr-<n>-…` slug anyway, so later PR work
135
143
  groups with it.
136
144
 
145
+ ## A red CI as a request
146
+
147
+ "Fix CI on PR 142" or "the build is red on main" is a `kind: defect` request
148
+ (`defect.md`). Get the failures first:
149
+
150
+ ```bash
151
+ orc ci failed --pr <n> --json # or --run <id>; no flag = this branch
152
+ ```
153
+
154
+ It lists each failing step: its first error lines, a `signature`, and a
155
+ `repro`. Exit 1 → nothing is red: say so. Exit 5 → `gh` is missing (see above).
156
+
157
+ - `repro` names a local command (`npm test`, `pytest …`) → that is the
158
+ reproduction. Otherwise `repro: none` with its `repro_reason` — say it
159
+ (`defect.md` §6).
160
+ - `flaky: true` (the same sha passed on another attempt, or a test failed and
161
+ then passed on a re-attempt) → **no repair round**. Tell the user it is flaky,
162
+ and why.
163
+ - Repair rounds cap at 3. Then stop and report what is still red.
164
+
165
+ ## Sonar and SARIF issues as a request
166
+
167
+ "Fix the Sonar issues on PR 142" or "fix the ESLint SARIF":
168
+
169
+ ```bash
170
+ orc gotcha import sonar --pr <n> --json # the token is SONAR_TOKEN in the environment
171
+ orc gotcha import sarif <file> --json
172
+ ```
173
+
174
+ - Work from `groups[]`: one group per RULE. Fix one rule's issues together.
175
+ - Each group gets its **own** dispatch gate, like one thread.
176
+ - Sonar exit 5 → the token is missing or refused. Tell the user to set
177
+ `SONAR_TOKEN` in the environment. Never ask for the token in the chat. A saved
178
+ answer also works: `--file <saved.json>`.
179
+ - The import records each issue as an observation. After a green fix, the next
180
+ import records the group as `addressed`. Do not record it yourself.
181
+ - **Never change an issue's status on the Sonar server.** ORC reads external
182
+ systems. It does not write to them — the GitHub boundary, extended.
183
+
137
184
  ## What goes in the doc
138
185
 
139
186
  Record the PR number, title, url, and branch. For each thread: the reviewer, the
@@ -2,7 +2,9 @@
2
2
 
3
3
  This is Q1's read-only half. It has one job: **find the right files, fast, and
4
4
  then stop.** You are not studying the code here. An agent does that later, if
5
- the user says yes at the gate.
5
+ the user says yes at the gate. This keeps your context small.
6
+
7
+ The intent ledger prints on ONE line so nothing is skipped in secret.
6
8
 
7
9
  ## 1. Why the graph goes first
8
10
 
@@ -70,7 +70,7 @@ to `orc-retro-opus-5-med` when `opus5_only: true` forces it
70
70
  date range from `$ARGUMENTS`). Show the count and ask nothing else.
71
71
  2. Dispatch `orc-retro-sonnet-5-high` (or `orc-retro-opus-5-med` under
72
72
  `opus5_only`) with the slice: trace file paths + the
73
- verb reference (`../_shared/phases/trace.md`). The agent mines the
73
+ verb reference (`../_shared/phases/trace-verbs.md`). The agent mines the
74
74
  `<trace>.jsonl` sidecar first when present (structured — no regex over free
75
75
  text) and falls back to `.txt` parsing for pre-v0.32.0 traces, merging the
76
76
  hook's `.txt`-only skeleton lines by timestamp. It parses the CLOSED verb set
@@ -94,10 +94,11 @@ to `orc-retro-opus-5-med` when `opus5_only: true` forces it
94
94
  - **Trace hygiene → narration coverage:** the hook's `PHASE-EDGE` lines
95
95
  segment every run with zero model cooperation, so a missing narration is
96
96
  now DETERMINISTICALLY visible: count the phases whose edge-interval
97
- contains no trace-writer `SPAWN`. Report `covered/total` + the unnarrated
98
- phases. The question is no longer "were rich markers forgotten?" but
99
- "which phases never dispatched their writer?" — a run with edges and zero
100
- writer spawns is a total narration failure and is named as such.
97
+ contains no trace-writer `SPAWN` and no narrated (non-`hook`) line STAMPED
98
+ inside it — the CLI writes most packets, with no SPAWN. Report
99
+ `covered/total` + the unnarrated phases. The question is "which phases were
100
+ never narrated?" — a run with edges and no narration at all is a total
101
+ narration failure and is named as such.
101
102
  2a. **Repair memory as calibration input (READ-ONLY).** Probe `orc gotcha status`
102
103
  (exit 0 = entries, 1 = none — never a `find`). On a hit, add
103
104
  `.claude/orc/gotchas.md` to the agent's slice as one more read-only source:
@@ -241,16 +242,16 @@ exit code, and never re-derive a state word — the CLI's state words are the on
241
242
  state words, and **an exit code is an ANSWER wherever that contract says so, not
242
243
  a failure**. A call the answer does not name is a call this lane does not make.
243
244
  Exit ≠ 0 from the catalogue itself → say the CLI is unavailable and name the
244
- command you are about to run, out loud, before running it.
245
-
246
- ## Rules — the anti-slop card (`../_shared/phases/rules.md`)
247
-
248
- `orc rules slice --lane orc-retro --json` is the ONLY assembler; never build
249
- the card here. It rides under the house rules and above the task —
250
- **house rules > your project's rules > ORC's own packs** — and its `line` prints
251
- VERBATIM at preflight. Returns gain `rules_applied[]`, `rules_conflicts[]` (a gap,
252
- never a silent choice) and `rules_overridden[]`.
253
- ## Waiting mid-run (`/orc-wait`)
254
-
255
- Canonical: `../_shared/wait.md`. **`a lane that waits without a hand-back` has broken this contract.**
256
- Checkpoint **none** · safe point **read-only, seconds long**. Nothing here to checkpoint, so all three modes behave identically — say so rather than asking. Never begin a wait between a dispatch and its validated return, or before the smoke gate has reported.
245
+ command you are about to run, out loud, before running it.
246
+
247
+ ## Rules — the anti-slop card (`../_shared/phases/rules.md`)
248
+
249
+ `orc rules slice --lane orc-retro --json` is the ONLY assembler; never build
250
+ the card here. It rides under the house rules and above the task —
251
+ **house rules > your project's rules > ORC's own packs** — and its `line` prints
252
+ VERBATIM at preflight. Returns gain `rules_applied[]`, `rules_conflicts[]` (a gap,
253
+ never a silent choice) and `rules_overridden[]`.
254
+ ## Waiting mid-run (`/orc-wait`)
255
+
256
+ Canonical: `../_shared/wait.md`. **`a lane that waits without a hand-back` has broken this contract.**
257
+ Checkpoint **none** · safe point **read-only, seconds long**. Nothing here to checkpoint, so all three modes behave identically — say so rather than asking. Never begin a wait between a dispatch and its validated return, or before the smoke gate has reported.
@@ -70,7 +70,7 @@ packet; its meaningful signal is the writer's tier honesty):
70
70
 
71
71
  ```
72
72
  C: Spawning orc-retro-sonnet-5-high → claude-sonnet-5 / high
73
- slice: trace_files=[3 paths] + verb_reference=_shared/phases/trace.md
73
+ slice: trace_files=[3 paths] + verb_reference=_shared/phases/trace-verbs.md
74
74
  (This lane writes NO run pointer and emits NO markers — tracing the retro
75
75
  would pollute the very data it mines.)
76
76
  ```
@@ -1,14 +1,12 @@
1
1
  ---
2
2
  name: orc-route
3
3
  description: >
4
- Plan-only lane router — you have a plan, this tells you which lane should build
5
- it. Use for "/orc-route", "which lane for this plan?", "is this worth the full
6
- orc run?". It reads the plan's own numbers (tasks, waves, files, top score,
7
- risk) plus ORC's deterministic knowledge probes, then names ONE recommended
8
- lane, the runners-up with the reason each lost, and any lane that is not
9
- possible with the blocking condition named. It routes a PLAN and nothing else —
10
- given a request in words it refuses and says why, because routing from a
11
- sentence is guessing. Zero agents, user-invoked only, nothing is built.
4
+ Plan-only lane router — you have a plan, this tells you which lane should
5
+ build it. Use for "/orc-route", "which lane for this plan?", "is this worth
6
+ the full orc run?". It reads the plan's own numbers and ORC's knowledge
7
+ probes, then names ONE recommended lane, the runners-up with the reason each
8
+ lost, and any lane that is not possible. It routes a PLAN only, never a
9
+ request in words. Zero agents, nothing is built.
12
10
  ---
13
11
 
14
12
  # ORC-ROUTE
@@ -148,13 +146,11 @@ exactly one branch.
148
146
 
149
147
  ## Behavior trace (always on)
150
148
 
151
- `../_shared/phases/trace.md` (`core`, at run start; `orc lane phases` names
152
- the file and the layers). Lane token `route`, tier **Single-dispatch** —
153
- exactly ONE end-of-run packet, dispatched solo before `.current` is deleted.
154
- At run start write `log_dir/.current` = `run-route-<slug>-<DDMMYY>-<HHMMSS>.txt` AND
155
- `touch the trace file` of that name in the SAME step.
156
- Nothing else about the protocol is restated here; a phase that ends with
157
- `zero new trace lines is a protocol violation`.
149
+ `../_shared/phases/trace.md` (`core`, at run start; `orc lane phases orc-route --json` →
150
+ `trace_grammar` gives the verbs). Lane token `route`, tier
151
+ **Single-dispatch**. At run start write `log_dir/.current` =
152
+ `run-route-<slug>-<DDMMYY>-<HHMMSS>.txt` AND `touch the trace file` of that name
153
+ in the SAME step. A phase that ends with `zero new trace lines is a protocol violation`.
158
154
 
159
155
  ## Rules this lane always keeps
160
156
 
@@ -163,33 +159,17 @@ Routes a plan, refuses anything else · zero agents, nothing dispatched · reuse
163
159
  only, never an ad-hoc `find` · reads no source file · never starts a lane the
164
160
  user did not accept · never edits config or any project file.
165
161
 
166
- ## Config
167
-
168
- Resolve with `orc lane config orc-route --json` and obey `effective`. Never merge
169
- `.claude/orc.config.yaml` yourself, and never re-derive a precedence. Exit ≠ 0 →
170
- say so and use `../_shared/config-precedence.md`'s documented defaults, out
171
- loud. Nothing this lane reads is contested, gated or a stop, so it owes no
172
- preflight line and has no gate to honour.
173
-
174
- ## Calls
175
-
176
- **ONE catalogue, and it is not you:** `orc lane calls orc-route --json` names every
177
- CLI call this lane makes, each with its exit-code contract, its cost, when to run
178
- it, and what an EMPTY answer means. Never invent a spelling, never re-word an
179
- exit code, and never re-derive a state word — the CLI's state words are the only
180
- state words, and **an exit code is an ANSWER wherever that contract says so, not
181
- a failure**. A call the answer does not name is a call this lane does not make.
182
- Exit ≠ 0 from the catalogue itself → say the CLI is unavailable and name the
183
- command you are about to run, out loud, before running it.
184
-
185
- ## Rules — the anti-slop card (`../_shared/phases/rules.md`)
186
-
187
- `orc rules slice --lane orc-route --json` is the ONLY assembler; never build
188
- the card here. It rides under the house rules and above the task —
189
- **house rules > your project's rules > ORC's own packs** — and its `line` prints
190
- VERBATIM at preflight. Returns gain `rules_applied[]`, `rules_conflicts[]` (a gap,
191
- never a silent choice) and `rules_overridden[]`.
192
- ## Waiting mid-run (`/orc-wait`)
193
-
194
- Canonical: `../_shared/wait.md`. **`a lane that waits without a hand-back` has broken this contract.**
195
- Checkpoint **none** · safe point **read-only, seconds long**. Nothing here to checkpoint, so all three modes behave identically — say so rather than asking. Never begin a wait between a dispatch and its validated return, or before the smoke gate has reported.
162
+ ## Lane contract (`../_shared/lane-contract.md` — read it ONLY when a call exits ≠ 0)
163
+
164
+ - **Calls:** `orc lane calls orc-route --json` names every call and its exit codes.
165
+ **An exit code is an ANSWER where it says so, not a failure.** Make no other call.
166
+ - **Config:** `orc lane config orc-route --json`. Obey `effective`. Never merge
167
+ `.claude/orc.config.yaml` yourself (`../_shared/config-precedence.md`). Nothing
168
+ here is contested, gated or a stop: no preflight line, no gate to honour.
169
+ - **Rules:** `orc rules slice --lane orc-route --json` is the ONLY assembler
170
+ (`../_shared/phases/rules.md`). Its `line` prints VERBATIM at preflight.
171
+
172
+ ## Waiting mid-run (`/orc-wait`)
173
+
174
+ Canonical: `../_shared/wait.md`. **`a lane that waits without a hand-back` has broken this contract.**
175
+ Checkpoint **none** · safe point **read-only, seconds long**.