@azure-id/orc 2.1.1 → 2.2.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 (145) hide show
  1. package/CHANGELOG.md +320 -0
  2. package/README.md +48 -23
  3. package/bin/build-agents.js +207 -205
  4. package/bin/cli.js +48188 -47417
  5. package/bin/fix.js +21 -18
  6. package/bin/graph-extract.js +314 -6
  7. package/bin/graph-gain.js +83 -2
  8. package/bin/graph-map.js +23 -1
  9. package/bin/graph-notes.js +1 -1
  10. package/bin/graph-query.js +1362 -37
  11. package/bin/graph-resolve.js +1 -1
  12. package/bin/graph-shard.js +29 -6
  13. package/bin/graph-signals.js +5 -3
  14. package/bin/graph.js +7 -3
  15. package/bin/habit.js +1 -1
  16. package/bin/pricing.json +8 -1
  17. package/bin/trace-write.js +40 -11
  18. package/bin/verify-contracts.js +5661 -5552
  19. package/bin/verify-package.js +716 -716
  20. package/bin/webui/api.js +8 -0
  21. package/bin/webui/fixtures/extra.js +2036 -2036
  22. package/bin/webui/fixtures/flow.js +1 -1
  23. package/bin/webui/fixtures/index.js +2 -2
  24. package/bin/webui/fixtures/knowledge.js +8 -1
  25. package/bin/webui/fixtures/pact.js +112 -111
  26. package/bin/webui/fixtures/stats.js +2 -2
  27. package/bin/webui/i18n/en/knowledge.json +2 -0
  28. package/bin/webui/i18n/id/knowledge.json +2 -0
  29. package/bin/webui/js/panels/knowledge.js +17 -0
  30. package/guides/code-graph-benefit.md +116 -0
  31. package/guides/configuration.md +150 -0
  32. package/guides/documents.md +262 -0
  33. package/guides/extra-models.md +448 -0
  34. package/guides/habits-and-gotchas.md +152 -0
  35. package/guides/knowledge-reads.md +190 -0
  36. package/guides/model-selection.md +186 -0
  37. package/guides/rules.md +305 -0
  38. package/guides/status-line.md +344 -0
  39. package/mock-run/orc-cli.md +3 -2
  40. package/mock-run/orc-doc.md +452 -448
  41. package/mock-run/orc.md +157 -157
  42. package/package.json +2 -1
  43. package/templates/agents/MODEL-MAPPING.md +176 -176
  44. package/templates/agents/{orc-executor-haiku-4-5.md → orc-executor-haiku-5-high.md} +21 -8
  45. package/templates/agents/orc-executor-opus-4-7-high.md +17 -5
  46. package/templates/agents/orc-executor-opus-4-7-med.md +17 -5
  47. package/templates/agents/orc-executor-opus-4-8-high.md +17 -5
  48. package/templates/agents/orc-executor-opus-5-high.md +17 -5
  49. package/templates/agents/orc-executor-opus-5-low.md +17 -5
  50. package/templates/agents/orc-executor-opus-5-med.md +17 -5
  51. package/templates/agents/orc-executor-sonnet-4-6-high.md +17 -5
  52. package/templates/agents/orc-executor-sonnet-5-high.md +17 -5
  53. package/templates/agents/orc-executor-sonnet-5-low.md +17 -5
  54. package/templates/agents/orc-executor-sonnet-5-med.md +17 -5
  55. package/templates/agents/{orc-graph-noter-sonnet-4-6-med.md → orc-graph-noter-haiku-5-high.md} +4 -4
  56. package/templates/agents/orc-planner-mini-opus-5-med.md +3 -1
  57. package/templates/agents/orc-planner-mini-sonnet-5-high.md +3 -1
  58. package/templates/agents/orc-planner-opus-5-med.md +3 -1
  59. package/templates/agents/{orc-trace-writer-haiku-4-5.md → orc-trace-writer-haiku-5-high.md} +4 -3
  60. package/templates/commands/orc-doc.md +128 -128
  61. package/templates/commands/orc-export.md +51 -46
  62. package/templates/hooks/README.md +8 -3
  63. package/templates/hooks/orc-effort-guard.js +105 -27
  64. package/templates/hooks/orc-graph-hook.js +252 -4
  65. package/templates/hooks/orc-statusline.js +13 -6
  66. package/templates/hooks/orc-trace.js +1 -1
  67. package/templates/skills/_shared/README.md +2 -2
  68. package/templates/skills/_shared/code-graph.md +185 -251
  69. package/templates/skills/_shared/extra-dispatch.md +1331 -1331
  70. package/templates/skills/_shared/lane-contract.md +7 -3
  71. package/templates/skills/_shared/opus5-only.md +137 -137
  72. package/templates/skills/_shared/phases/execution.md +13 -11
  73. package/templates/skills/_shared/phases/planning.md +27 -9
  74. package/templates/skills/_shared/phases/preflight.md +3 -3
  75. package/templates/skills/_shared/phases/review.md +4 -3
  76. package/templates/skills/_shared/phases/ship.md +7 -10
  77. package/templates/skills/_shared/phases/summary.md +2 -3
  78. package/templates/skills/_shared/phases/trace-verbs.md +21 -16
  79. package/templates/skills/_shared/phases/trace.md +3 -3
  80. package/templates/skills/_shared/phases/wiki-consult.md +2 -2
  81. package/templates/skills/_shared/pr-templates.md +108 -106
  82. package/templates/skills/_shared/read-ladder.md +8 -2
  83. package/templates/skills/_shared/return-validation.md +10 -6
  84. package/templates/skills/_shared/review-slice.md +1 -1
  85. package/templates/skills/_shared/stack-plan.md +135 -135
  86. package/templates/skills/_shared/wait.md +14 -2
  87. package/templates/skills/context-combiner/SKILL.md +2 -2
  88. package/templates/skills/orc/SKILL.md +227 -227
  89. package/templates/skills/orc/config.md +2 -2
  90. package/templates/skills/orc/examples/full-run-mock.md +74 -74
  91. package/templates/skills/orc/schemas/planning-output.md +3 -0
  92. package/templates/skills/orc-aftermath/SKILL.md +15 -15
  93. package/templates/skills/orc-analyze/SKILL.md +2 -2
  94. package/templates/skills/orc-analyze-mini/SKILL.md +2 -2
  95. package/templates/skills/orc-boundary/SKILL.md +15 -15
  96. package/templates/skills/orc-boundary/references/card.md +81 -78
  97. package/templates/skills/orc-boundary/references/gate.md +113 -113
  98. package/templates/skills/orc-brainstorm/SKILL.md +15 -15
  99. package/templates/skills/orc-budget/SKILL.md +15 -15
  100. package/templates/skills/orc-challenge/README.md +1 -1
  101. package/templates/skills/orc-challenge/SKILL.md +16 -16
  102. package/templates/skills/orc-challenge/examples/council-full-roster.md +1 -1
  103. package/templates/skills/orc-claude/SKILL.md +4 -4
  104. package/templates/skills/orc-claude/examples/claude-run-mock.md +1 -1
  105. package/templates/skills/orc-diy/SKILL.md +2 -2
  106. package/templates/skills/orc-diy/references/blocks/wiki.md +26 -26
  107. package/templates/skills/orc-diy/references/flow-schema.md +2 -2
  108. package/templates/skills/orc-doc/README.md +2 -2
  109. package/templates/skills/orc-doc/SKILL.md +501 -490
  110. package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +12 -1
  111. package/templates/skills/orc-doc/references/chunking.md +6 -4
  112. package/templates/skills/orc-doc/references/gates.md +311 -311
  113. package/templates/skills/orc-doc/references/resume-protocol.md +229 -228
  114. package/templates/skills/orc-explain/SKILL.md +88 -88
  115. package/templates/skills/orc-export/SKILL.md +190 -187
  116. package/templates/skills/orc-fast/SKILL.md +213 -210
  117. package/templates/skills/orc-grill/SKILL.md +245 -245
  118. package/templates/skills/orc-handoff/SKILL.md +11 -11
  119. package/templates/skills/orc-learn/SKILL.md +13 -13
  120. package/templates/skills/orc-learn/examples/learn-run-mock.md +2 -2
  121. package/templates/skills/orc-mini/SKILL.md +12 -12
  122. package/templates/skills/orc-mini/examples/mini-run-mock.md +4 -5
  123. package/templates/skills/orc-pact/SKILL.md +15 -15
  124. package/templates/skills/orc-pact/references/gate.md +70 -70
  125. package/templates/skills/orc-pattern/SKILL.md +3 -3
  126. package/templates/skills/orc-poly/SKILL.md +4 -4
  127. package/templates/skills/orc-poly/examples/poly-run-mock.md +51 -51
  128. package/templates/skills/orc-pr-driver/SKILL.md +4 -3
  129. package/templates/skills/orc-pr-driver/references/orc-run-split.md +108 -99
  130. package/templates/skills/orc-pr-setup/SKILL.md +2 -2
  131. package/templates/skills/orc-quick/README.md +535 -536
  132. package/templates/skills/orc-quick/SKILL.md +29 -32
  133. package/templates/skills/orc-quick/references/context-doc.md +145 -145
  134. package/templates/skills/orc-quick/references/dispatch-gate.md +220 -220
  135. package/templates/skills/orc-quick/references/gh-mode.md +2 -1
  136. package/templates/skills/orc-quick/references/look.md +34 -12
  137. package/templates/skills/orc-retro/SKILL.md +2 -2
  138. package/templates/skills/orc-retro/examples/retro-mock.md +2 -2
  139. package/templates/skills/orc-route/SKILL.md +2 -2
  140. package/templates/skills/orc-test/SKILL.md +6 -3
  141. package/templates/skills/orc-verify/SKILL.md +2 -2
  142. package/templates/skills/orc-wait/SKILL.md +10 -2
  143. package/templates/skills/orc-wiki/SKILL.md +4 -4
  144. package/templates/skills/orc-wiki/references/pattern-prewarm.md +19 -19
  145. package/templates/agents/orc-executor-sonnet-4-6-med.md +0 -155
@@ -10,13 +10,17 @@ those values, and a spine never restates this file.
10
10
  ## Calls
11
11
 
12
12
  **ONE catalogue, and it is not you:** `orc lane calls <lane> --json` names every
13
- CLI call the lane makes. Each row gives the exit-code contract, the cost, when
14
- to run the call, and what an EMPTY answer means.
13
+ SHARED CLI call (a call that two or more lanes make). Each row gives the
14
+ exit-code contract, the cost, when to run the call, and what an EMPTY answer
15
+ means.
15
16
 
17
+ - A call that only this lane makes is not in the catalogue. Its spelling and its
18
+ exit codes are in the lane's own skill files.
16
19
  - Never invent a spelling. Never re-word an exit code.
17
20
  - Never re-derive a state word. The CLI's state words are the only state words.
18
21
  - **An exit code is an ANSWER wherever that contract says so, not a failure.**
19
- - A call that the answer does not name is a call the lane does not make.
22
+ - A call that neither the answer nor the lane's own skill files name is a call
23
+ the lane does not make.
20
24
  - The catalogue itself exits ≠ 0 → say that the CLI is unavailable. Before you
21
25
  run a command, name it out loud.
22
26
 
@@ -1,137 +1,137 @@
1
- # Shared contract — Opus-5-only dispatch mode (hard-gated, forcing)
2
-
3
- Canonical rule for routing EVERY dispatched role to Opus 5. Consumed by the full
4
- orc spine, the ultra lane, and every lane with a fixed-role dispatch; the lint
5
- pins the `opus5-only.md` pointer into each of them.
6
-
7
- ## The gate
8
-
9
- Read the resolved config at run start (`config.md` defaults ← `orc.config.yaml`).
10
- The mode is **hard-gated**: absolutely nothing changes unless `opus5_only: true`.
11
- When it is false (the default), dispatch every role exactly as today — this file
12
- is inert.
13
-
14
- ## The mapping (only when `opus5_only: true`)
15
-
16
- **Scored executors** — one model, EFFORT as the cost dial, replacing the 5-band
17
- mixed-model table:
18
-
19
- | Score | Executor agent |
20
- |-----------|---------------------------|
21
- | `[0,90)` | `orc-executor-opus-5-low` |
22
- | `[90,100]` | `orc-executor-opus-5-med` |
23
-
24
- Two bands, sharing the 90 edge with the default table's top two rows. Since
25
- v1.0.0 the default table's high end is ALREADY Opus 5.5 with effort as the dial,
26
- so this mode differs from it only below 41 — a third band here would be a
27
- distinction the default table stopped making.
28
-
29
- **Fixed roles** — dispatch the Opus 5.5 variant **instead of** the default role
30
- agent: same task slice, same return contract, same phase.
31
-
32
- | Role | Default agent | Opus-5-only variant |
33
- |------|---------------|---------------------|
34
- | mini executor | `orc-executor-sonnet-5-high` | `orc-executor-opus-5-low` |
35
- | fast executor | `orc-executor-sonnet-5-med` | `orc-executor-opus-5-low` |
36
- | mini analyze | `orc-analyze-mini-sonnet-5-high` | `orc-analyze-mini-opus-5-med` |
37
- | mini plan | `orc-planner-mini-sonnet-5-high` | `orc-planner-mini-opus-5-med` |
38
- | scout | `orc-scout-sonnet-4-6-high` | `orc-scout-opus-5-low` |
39
- | pattern codify | `orc-pattern-codifier-sonnet-5-high` | `orc-pattern-codifier-opus-5-med` |
40
- | wiki scan | `orc-wiki-scanner-sonnet-5-high` (light) | `orc-wiki-scanner-opus-5-low` |
41
- | retro mine | `orc-retro-sonnet-5-high` | `orc-retro-opus-5-med` |
42
-
43
- The eleven roles already pinned to `claude-opus-5-5` — analyst, planner, reviewer,
44
- verifier, test-author, combiner, learn-writer, advisor, judge, CLAUDE.md writer
45
- (`orc-claude-writer-opus-5-low`), deep wiki scanner (`orc-wiki-scanner-opus-5-low`)
46
- — are already
47
- compliant and dispatch unchanged (their efforts are NOT rewritten by this mode).
48
-
49
- **The wiki scan tier ladder (v0.46.0) needs no new pair.**
50
- Off, the ladder picks deep or light per delta. ON, this mode flips the light tier
51
- to `orc-wiki-scanner-opus-5-low`. The deep tier is already that agent. So **both
52
- tiers collapse onto that one shipped agent** and the ladder simply stops applying.
53
- Do not add a second Opus 5.5 scanner variant. A pair for a tier that cannot occur
54
- while the flag is on is exactly the phantom this table exists to prevent. Ladder: `../orc-wiki/references/partial-refresh.md`.
55
-
56
- ## Out of scope — never forced
57
-
58
- - **`orc-trace-writer-haiku-4-5` stays Haiku 4.5.** It transcribes a packet the
59
- orchestrator hands it — no reasoning, no source reads. It is never in the
60
- roster.
61
- - **`orc-graph-noter-sonnet-4-6-med` is not dispatched at all.** It has no Opus 5.5
62
- variant: under the mode a code lane skips graph notes and prints
63
- `graph notes: skipped (opus5_only)` (`code-graph.md` §6). The graph's structure
64
- layer costs no model, so nothing else about the graph changes.
65
- - **`orc-diy`.** Its score table is compile-owned (`orc diy compile` →
66
- `flow.lock.json`); a DIY flow dispatches whatever its lock says. Re-compile to
67
- change it.
68
- - **`orc-quick` — the ONE exception to the flat precedence below.** Its dispatch
69
- gate asks the USER which agent to spawn before every single dispatch, and that
70
- hard gate is the lane's entire premise. A forcing mode that collapsed the menu
71
- to one option would silently delete it, so the mode is fully INERT there:
72
- `opus5_only` is neither read nor honored by `orc-quick`. When the mode is on,
73
- the lane SAYS so at the gate (`orc-quick ignores opus5_only — both options are
74
- live`), because a shadowed setting must never be silent in either direction.
75
- - **`/orc-challenge` — UNAFFECTED, not exempt.** All three of its agents are
76
- already `claude-opus-5-5` (judge high, advisor medium, reader low), so the mode
77
- has nothing to force: zero new pairs, no rename churn, no roster row. The
78
- reader's `low` effort is a MEASUREMENT choice, not a cost one — a
79
- harder-thinking cold reader reasons around exactly the gaps D4 exists to find
80
- — so nothing may ever "upgrade" it.
81
- See `orc-quick/references/dispatch-gate.md`.
82
-
83
- ## It FORCES — precedence is flat while ON
84
-
85
- `opus5_only: true` outranks every other dispatch selector:
86
-
87
- - each role's default frontmatter pin;
88
- - **`rubric_bands_override`** — a hand-written executor table is ignored while
89
- the mode is on.
90
-
91
- Turning the mode off restores both. `rubric_bands` remains granularity
92
- only, never a preset selector, in both modes.
93
-
94
- The forcing is flat across every lane that HONORS the mode — `orc-quick` does
95
- not, per "Out of scope" above.
96
-
97
- ### `orc extra` sits ABOVE the mode, and it is not a fourth thing it overrides
98
-
99
- Extra decides **whether a Claude agent runs at all**. `opus5_only` and the score
100
- tables only decide WHICH Claude agent runs where extra did not take it. So the
101
- mode is neither shadowed nor shadowing — it is simply **NOT CONSULTED** for the
102
- work extra took:
103
-
104
- - **a scored task** — an extra route row covering that score outranks the mode;
105
- every score no row covers still resolves on the Opus 5.5 ladder.
106
- - **a POSITION** (v0.55.0 — `quick-executor`, `fast-executor`, `doc-writer`,
107
- `doc-checker`, `wiki-scanner-deep`, `wiki-scanner-light`) — an extra slot row
108
- holding that position outranks the mode's variant of that slot's agent; **a
109
- position with no row is fully governed by the mode.** With `doc-writer` routed
110
- and `doc-checker` not, `opus5_only` is entirely live for the checker.
111
-
112
- "Not consulted for that slot" and "inert" are different claims, and only the
113
- first one is true. `orc config list` and `orc config set` NAME the taken bands
114
- AND the taken positions for exactly that reason: a shadowed setting must never
115
- be silent, and neither must a partly shadowed one.
116
-
117
- Both wiki slots collapse onto `orc-wiki-scanner-opus-5-low` while the mode is on,
118
- which is why the slot table adds **no agent and no pair**. A slot names the
119
- POSITION, not the model.
120
-
121
- ## Tier honesty
122
-
123
- A subagent can never outrank the main session. With the mode ON, EVERY dispatch
124
- needs an Opus 5.5 main session — not just the top executor band. On a lower
125
- session every role silently falls back to the session model and the tier-honesty
126
- rule (`return-validation.md`) reports a downgrade on **every** return. That is
127
- correct behavior, not a bug: hooks cannot block on model, only on effort, so the
128
- `orc config set opus5_only true` notice is the only up-front warning.
129
-
130
- This also means `orc-fast`'s "the orchestrator runs fine at Sonnet medium" holds
131
- only while the mode is OFF. The effort guard is unchanged — it still matches the
132
- exact skill name `orc`, and orc-fast is never added to it.
133
-
134
- ## Trace
135
-
136
- Phase 1's `CONFIG` line always records the resolved `opus5_only`, so
137
- `/orc-retro` can segment per-band outcomes BY dispatch mode.
1
+ # Shared contract — Opus-5-only dispatch mode (hard-gated, forcing)
2
+
3
+ Canonical rule for routing EVERY dispatched role to Opus 5. Consumed by the full
4
+ orc spine, the ultra lane, and every lane with a fixed-role dispatch; the lint
5
+ pins the `opus5-only.md` pointer into each of them.
6
+
7
+ ## The gate
8
+
9
+ Read the resolved config at run start (`config.md` defaults ← `orc.config.yaml`).
10
+ The mode is **hard-gated**: absolutely nothing changes unless `opus5_only: true`.
11
+ When it is false (the default), dispatch every role exactly as today — this file
12
+ is inert.
13
+
14
+ ## The mapping (only when `opus5_only: true`)
15
+
16
+ **Scored executors** — one model, EFFORT as the cost dial, replacing the 5-band
17
+ mixed-model table:
18
+
19
+ | Score | Executor agent |
20
+ |-----------|---------------------------|
21
+ | `[0,90)` | `orc-executor-opus-5-low` |
22
+ | `[90,100]` | `orc-executor-opus-5-med` |
23
+
24
+ Two bands, sharing the 90 edge with the default table's top two rows. Since
25
+ v1.0.0 the default table's high end is ALREADY Opus 5.5 with effort as the dial,
26
+ so this mode differs from it only below 41 — a third band here would be a
27
+ distinction the default table stopped making.
28
+
29
+ **Fixed roles** — dispatch the Opus 5.5 variant **instead of** the default role
30
+ agent: same task slice, same return contract, same phase.
31
+
32
+ | Role | Default agent | Opus-5-only variant |
33
+ |------|---------------|---------------------|
34
+ | mini executor | `orc-executor-sonnet-5-high` | `orc-executor-opus-5-low` |
35
+ | fast executor | `orc-executor-sonnet-5-med` | `orc-executor-opus-5-low` |
36
+ | mini analyze | `orc-analyze-mini-sonnet-5-high` | `orc-analyze-mini-opus-5-med` |
37
+ | mini plan | `orc-planner-mini-sonnet-5-high` | `orc-planner-mini-opus-5-med` |
38
+ | scout | `orc-scout-sonnet-4-6-high` | `orc-scout-opus-5-low` |
39
+ | pattern codify | `orc-pattern-codifier-sonnet-5-high` | `orc-pattern-codifier-opus-5-med` |
40
+ | wiki scan | `orc-wiki-scanner-sonnet-5-high` (light) | `orc-wiki-scanner-opus-5-low` |
41
+ | retro mine | `orc-retro-sonnet-5-high` | `orc-retro-opus-5-med` |
42
+
43
+ The eleven roles already pinned to `claude-opus-5-5` — analyst, planner, reviewer,
44
+ verifier, test-author, combiner, learn-writer, advisor, judge, CLAUDE.md writer
45
+ (`orc-claude-writer-opus-5-low`), deep wiki scanner (`orc-wiki-scanner-opus-5-low`)
46
+ — are already
47
+ compliant and dispatch unchanged (their efforts are NOT rewritten by this mode).
48
+
49
+ **The wiki scan tier ladder (v0.46.0) needs no new pair.**
50
+ Off, the ladder picks deep or light per delta. ON, this mode flips the light tier
51
+ to `orc-wiki-scanner-opus-5-low`. The deep tier is already that agent. So **both
52
+ tiers collapse onto that one shipped agent** and the ladder simply stops applying.
53
+ Do not add a second Opus 5.5 scanner variant. A pair for a tier that cannot occur
54
+ while the flag is on is exactly the phantom this table exists to prevent. Ladder: `../orc-wiki/references/partial-refresh.md`.
55
+
56
+ ## Out of scope — never forced
57
+
58
+ - **`orc-trace-writer-haiku-5-high` stays Haiku 4.5.** It transcribes a packet the
59
+ orchestrator hands it — no reasoning, no source reads. It is never in the
60
+ roster.
61
+ - **`orc-graph-noter-haiku-5-high` is not dispatched at all.** It has no Opus 5.5
62
+ variant: under the mode a code lane skips graph notes and prints
63
+ `graph notes: skipped (opus5_only)` (`code-graph.md` §6). The graph's structure
64
+ layer costs no model, so nothing else about the graph changes.
65
+ - **`orc-diy`.** Its score table is compile-owned (`orc diy compile` →
66
+ `flow.lock.json`); a DIY flow dispatches whatever its lock says. Re-compile to
67
+ change it.
68
+ - **`orc-quick` — the ONE exception to the flat precedence below.** Its dispatch
69
+ gate asks the USER which agent to spawn before every single dispatch, and that
70
+ hard gate is the lane's entire premise. A forcing mode that collapsed the menu
71
+ to one option would silently delete it, so the mode is fully INERT there:
72
+ `opus5_only` is neither read nor honored by `orc-quick`. When the mode is on,
73
+ the lane SAYS so at the gate (`orc-quick ignores opus5_only — both options are
74
+ live`), because a shadowed setting must never be silent in either direction.
75
+ - **`/orc-challenge` — UNAFFECTED, not exempt.** All three of its agents are
76
+ already `claude-opus-5-5` (judge high, advisor medium, reader low), so the mode
77
+ has nothing to force: zero new pairs, no rename churn, no roster row. The
78
+ reader's `low` effort is a MEASUREMENT choice, not a cost one — a
79
+ harder-thinking cold reader reasons around exactly the gaps D4 exists to find
80
+ — so nothing may ever "upgrade" it.
81
+ See `orc-quick/references/dispatch-gate.md`.
82
+
83
+ ## It FORCES — precedence is flat while ON
84
+
85
+ `opus5_only: true` outranks every other dispatch selector:
86
+
87
+ - each role's default frontmatter pin;
88
+ - **`rubric_bands_override`** — a hand-written executor table is ignored while
89
+ the mode is on.
90
+
91
+ Turning the mode off restores both. `rubric_bands` remains granularity
92
+ only, never a preset selector, in both modes.
93
+
94
+ The forcing is flat across every lane that HONORS the mode — `orc-quick` does
95
+ not, per "Out of scope" above.
96
+
97
+ ### `orc extra` sits ABOVE the mode, and it is not a fourth thing it overrides
98
+
99
+ Extra decides **whether a Claude agent runs at all**. `opus5_only` and the score
100
+ tables only decide WHICH Claude agent runs where extra did not take it. So the
101
+ mode is neither shadowed nor shadowing — it is simply **NOT CONSULTED** for the
102
+ work extra took:
103
+
104
+ - **a scored task** — an extra route row covering that score outranks the mode;
105
+ every score no row covers still resolves on the Opus 5.5 ladder.
106
+ - **a POSITION** (v0.55.0 — `quick-executor`, `fast-executor`, `doc-writer`,
107
+ `doc-checker`, `wiki-scanner-deep`, `wiki-scanner-light`) — an extra slot row
108
+ holding that position outranks the mode's variant of that slot's agent; **a
109
+ position with no row is fully governed by the mode.** With `doc-writer` routed
110
+ and `doc-checker` not, `opus5_only` is entirely live for the checker.
111
+
112
+ "Not consulted for that slot" and "inert" are different claims, and only the
113
+ first one is true. `orc config list` and `orc config set` NAME the taken bands
114
+ AND the taken positions for exactly that reason: a shadowed setting must never
115
+ be silent, and neither must a partly shadowed one.
116
+
117
+ Both wiki slots collapse onto `orc-wiki-scanner-opus-5-low` while the mode is on,
118
+ which is why the slot table adds **no agent and no pair**. A slot names the
119
+ POSITION, not the model.
120
+
121
+ ## Tier honesty
122
+
123
+ A subagent can never outrank the main session. With the mode ON, EVERY dispatch
124
+ needs an Opus 5.5 main session — not just the top executor band. On a lower
125
+ session every role silently falls back to the session model and the tier-honesty
126
+ rule (`return-validation.md`) reports a downgrade on **every** return. That is
127
+ correct behavior, not a bug: hooks cannot block on model, only on effort, so the
128
+ `orc config set opus5_only true` notice is the only up-front warning.
129
+
130
+ This also means `orc-fast`'s "the orchestrator runs fine at Sonnet medium" holds
131
+ only while the mode is OFF. The effort guard is unchanged — it still matches the
132
+ exact skill name `orc`, and orc-fast is never added to it.
133
+
134
+ ## Trace
135
+
136
+ Phase 1's `CONFIG` line always records the resolved `opus5_only`, so
137
+ `/orc-retro` can segment per-band outcomes BY dispatch mode.
@@ -27,10 +27,10 @@ the codifier); hold resolved patterns in run state.
27
27
  1. Dispatch EVERY task as a spawned subagent (emit `DISPATCH <agent> :: <task>
28
28
  expect=<model>/<effort>` BEFORE the Task call; subagent wrapper framing + the
29
29
  task's INPUT SLICE per orc-execution/core.md + its scored model). Every
30
- slice carries ONE `orc graph ctx --for-slice <the task's declared_files> --if-enabled --json --brief`
31
- `card` as its `graph` block (`../code-graph.md` §7; exit 3 = off → no block) —
32
- the OUTSIDE view only, because the executor reads each declared file in full
33
- itself,
30
+ slice that writes code carries `graph_anchors` from ONE anchors call —
31
+ `orc graph ctx --for-slice <the task's declared_files> --focus=<the planning words> [--refs=<task.precedent>] --anchors --if-enabled --json --brief` (a request that names one symbol: `ctx <symbol> --anchors` gives the card and the anchors in one call)
32
+ (`../code-graph.md` §0 step 3, §7): print its `line`; paste its `card` into
33
+ the slice VERBATIM as `graph_anchors`, with its `read all: …` line and its code block — never shorten it; exit 3 or 4 → none. With `graph_anchors` in the slice, list at most ONE wiki page path (the one about the feature's intent), not 1–3. No anchors when the change stays inside ONE file the user named and nothing outside it changes (no signature change, no new export) — the executor reads that file anyway. The slice also carries
34
34
  the task's `acceptance[]`, its `tdd_spec` tests (the executor
35
35
  implements to green: implement→test→repair, cap `tdd_loop_max`, emitting
36
36
  `TDD-RED`/`TDD-GREEN` per iteration; cap hit → STOP SEQUENCE + honest red
@@ -71,13 +71,14 @@ the codifier); hold resolved patterns in run state.
71
71
  `unmet[]` is `partial`.
72
72
  4. **Post-wave worktree audit (GATE, `_shared/return-validation.md` §6):** diff `git status --short` before/after the wave — a changed path in NO task's `declared_files`, INCLUDING one that became less modified (the revert signature), blocks the close until named and decided.
73
73
  Overlap → `failure_reason: "file-collision:<file> with <agent>"`, requeue later wave.
74
- 4a. **Code graph (`../code-graph.md` §5–§6):** after the audit, ONE call —
74
+ 4a. **Code graph (`../code-graph.md` §5–§6):** ONLY when `probes["graph-status"].update_step`
75
+ is `lane` (else the hook already did it — no call): after the audit, ONE call —
75
76
  `orc graph update --notes-pending --files <the wave's changed paths> --at wave --if-enabled --json --brief`
76
77
  (emit `GRAPH-UPDATE`; the answer's `notes_pending` is the notes half):
77
- `notes_pending.exit` 0 → dispatch `orc-graph-noter-sonnet-4-6-med` (slice = paths only) in the
78
+ `notes_pending.exit` 0 → dispatch `orc-graph-noter-haiku-5-high` (slice = paths only) in the
78
79
  SAME tool block as the next wave's first dispatch; 3 or 5 → nothing, the
79
80
  symbols wait for a later batch. The noter returns ONE line (emit `GRAPH-NOTES`) —
80
- never pull its notes into this context. A slice that carried cards gets a
81
+ never pull its notes into this context. A slice that carried `graph_anchors` gets a
81
82
  `graph:` continuation on its `DISPATCH` line and a `graph_used` return.
82
83
  5. Append worker `log_entries` to the decision log; regenerate the digest.
83
84
  **Gotcha capture (`gotchas: on`):** a return that CLOSED a repair loop carries
@@ -139,11 +140,12 @@ outside `declared_files` (a revert included) gates the wave close.
139
140
  <!-- /diy:when -->
140
141
 
141
142
  <!-- diy:when code_graph=on -->
142
- Code graph cache (never skipped): each slice gets ONE `orc graph ctx --for-slice <the task's
143
- declared_files> --if-enabled --json --brief` `card` as its `graph` block, and the return
144
- carries `graph_used`. After each wave's worktree audit run ONE call —
143
+ Code graph anchors (never skipped): each slice that writes code carries `graph_anchors` (the `card`, inline) from
144
+ ONE call — `orc graph ctx --for-slice <the task's declared_files> --focus=<the planning words> [--refs=<task.precedent>] --anchors --if-enabled --json --brief`
145
+ (print its `line`; exit 3 or 4 → none), and the return carries `graph_used`. ONLY when
146
+ `update_step` is `lane`, after each wave's worktree audit run ONE call —
145
147
  `orc graph update --notes-pending --files <the wave's changed paths> --at wave --if-enabled --json --brief`
146
- (copy its `trace` verbatim); `notes_pending.exit` 0 → dispatch `orc-graph-noter-sonnet-4-6-med` paired
148
+ (copy its `trace` verbatim); `notes_pending.exit` 0 → dispatch `orc-graph-noter-haiku-5-high` paired
147
149
  with the next wave's first dispatch, exit 3 or 5 → nothing. Canonical:
148
150
  `.claude/skills/_shared/code-graph.md`.
149
151
  <!-- /diy:when -->
@@ -20,20 +20,22 @@ task (advisory) and print + emit `CROSSLINK <state> :: boundaries=<n> peers=<nam
20
20
  only pre-built needs/cache, never peer source live). **Gotchas (repair memory,
21
21
  config `gotchas`):** probe ONCE with `orc gotcha status` (exit 0 = entries exist,
22
22
  1 = none — never a `find`); canonical `_shared/gotchas.md`.
23
- **Code graph (`../code-graph.md` §3b and §7):** with the graph on, run
24
- `orc graph map --focus <every file or symbol the request NAMES> --if-enabled --json --brief`
23
+ **Code graph (`../code-graph.md` §0 step 2, §3b):** with the graph on, run
24
+ `orc graph map --focus=<3–6 words from the request> --budget 800 --if-enabled --json --brief`
25
25
  **FIRST, once** — before any Glob and before `impact`. It ranks the repository
26
- around the request and names the files worth reading, which is the question
27
- `impact` cannot answer because `impact` needs the files already chosen. Print its
26
+ around the request and names the files worth reading; `impact` cannot answer that,
27
+ because it needs the files already chosen. Print its
28
28
  `line` and emit `GRAPH-MAP`. Rank is a HINT about where to look first, never
29
29
  proof a file matters — and never a reason to skip reading a range you will edit.
30
- Exit 1 or 3 → orient exactly as before. Then run
30
+ Never call `map` twice. Exit 1 or 3 → orient exactly as before. Then run
31
31
  `orc graph impact <candidate declared_files> --if-enabled --json --brief` and hand its
32
32
  callers to the planner — they sharpen `declared_files` and the `fan` and risk
33
- facets. Also run `orc graph cochange <each candidate file> --if-enabled --json --brief`:
34
- it answers "what else will I have to touch" from HISTORY, which a static edge
35
- cannot see. Co-change is a HINT about people, never a dependency — exit 4 means
36
- this file changes alone, which is an answer. Exit 3 or 4 → plan exactly as before.
33
+ facets. `/orc`, `/orc-ultra` and `/orc-diy` also run
34
+ `orc graph cochange <each candidate file> --if-enabled --json --brief`: it answers
35
+ "what else will I have to touch" from HISTORY. Co-change is a HINT about people,
36
+ never a dependency. A short history answers exit 4 at once — this file changes
37
+ alone, which is an answer. Exit 3 or 4 → plan exactly as before. A task's optional
38
+ `precedent[]` (the planner's copy-from files) becomes that task's pack `--refs=`.
37
39
  **Pact / boundary / aftermath / wiki debt (all CONSUMED here, never
38
40
  written here):** probe `orc pact status --json` (`pact_gate`, default `warn`),
39
41
  `orc boundary status --json` (`boundary_gate`, default `warn`), `orc wiki debt
@@ -136,4 +138,20 @@ TDD is ON for this flow: the plan must carry a `tdd_spec` per requirement
136
138
  project → whole-run exemption, stated once at preflight.
137
139
  <!-- /diy:when -->
138
140
 
141
+ <!-- diy:when code_graph=on -->
142
+ Code graph — consult (before the first dispatch): print `probes["graph-status"].line` from
143
+ `orc lane config orc-diy --json`. Run `orc graph status --if-enabled --heal --json --brief` only
144
+ when `heal_needed` is true. Put the `trace` (`GRAPH-CONSULT …`) in the next packet as it is.
145
+ Exit 3 (`off` or `semi`) → make NO other graph call in this run.
146
+
147
+ Code graph — orient (once, before the planner chooses files): run
148
+ `orc graph map --focus=<3–6 words from the request> --budget 800 --if-enabled --json --brief`
149
+ FIRST, once; print its `line` and emit `GRAPH-MAP`. Rank is a HINT about where to look first,
150
+ never proof a file matters. Never call `map` twice. Then run
151
+ `orc graph impact <candidate declared_files> --if-enabled --json --brief` and hand its callers to
152
+ the planner. Also run `orc graph cochange <each candidate file> --if-enabled --json --brief`:
153
+ a HINT about people, never a dependency; a short history answers exit 4 at once. Exit 3 or 4 →
154
+ plan exactly as before. A task's optional `precedent[]` becomes that task's pack `--refs=`.
155
+ Canonical: `.claude/skills/_shared/code-graph.md`.
156
+ <!-- /diy:when -->
139
157
  <!-- /orc:layer -->
@@ -81,9 +81,9 @@ that the line is printed and when.
81
81
  dispatch — never skipped. Run `orc graph status --if-enabled --heal --json --brief`
82
82
  only when `heal_needed` is true (it builds or updates the graph, free). Put the
83
83
  `trace` (`GRAPH-CONSULT …`) in the next packet as it is — never as a `GATE` line
84
- in your own words. While the graph is
85
- on, `orc lane config` prints the three graph steps in `announce[]` (`../code-graph.md`
86
- §0). **The lane reads no `code_graph` key:** `--if-enabled`
84
+ in your own words. Exit 3 (`off`, or `semi` — kept current, never read) → make no other
85
+ graph call in this run. While the graph is on, `orc lane config` prints the four graph
86
+ touchpoints in `announce[]` (`../code-graph.md` §0). **The lane reads no `code_graph` key:** `--if-enabled`
87
87
  makes the CLI decide, which is how `/orc-quick` takes part while its step 1 still
88
88
  reads `log_dir` and nothing else. A graph that cannot be built never stops a run,
89
89
  and `/orc-fast` gains no third gate. Every other lane prints nothing.
@@ -53,9 +53,10 @@ P0/P1 findings gate anything; P2/P3 findings are listed once in the summary
53
53
  and never re-offered as fix-up tasks.
54
54
  <!-- /diy:when -->
55
55
  <!-- diy:when code_graph=on -->
56
- With the code graph on, the reviewer also gets the callers from
57
- `orc graph changes --if-enabled --json` — an unchanged caller of a
58
- changed signature is a finding candidate (`.claude/skills/_shared/code-graph.md` §7).
56
+ With the code graph on, run ONCE
57
+ `orc graph changes --files=<the changed paths> --if-enabled --json --brief`: print its `tests_line`,
58
+ run its `tests[]` first, print its `blast_line`, and hand the reviewer its callers — an unchanged
59
+ caller of a changed signature is a finding candidate (`.claude/skills/_shared/code-graph.md` §0 step 4).
59
60
  <!-- /diy:when -->
60
61
 
61
62
  <!-- /orc:layer -->
@@ -41,14 +41,10 @@ wiki now?"** (H `orc.phase-8.wiki-refresh`); on "later" print the prominent stal
41
41
  usage report — /usage limits + the full dispatch log (model/effort/score per
42
42
  subagent). The user must always know what the run cost. A `proposal` in
43
43
  `habits{}` → its ONE line joins that report (`../habits.md` §3). **Code graph
44
- (`../code-graph.md` §5–§6):** run `orc graph update --if-enabled` once more —
45
- fix rounds move code — and emit `GRAPH-UPDATE`; then run `orc graph notes pending
46
- --files <every path the run changed> --at end --if-enabled` — exit 0 → one noter
47
- dispatch, exit 3 or 5 → nothing. Then ONE line, once, copied VERBATIM from
48
- `orc graph gain --run <this run's trace name> --if-enabled --json --brief` (emit
49
- `GRAPH-GAIN`): what the graph put in, and an ESTIMATE of the retrieval it kept
50
- out. Exit 1 or 3 → no line. **Never restate it as one number** — the range and
51
- the word "estimate" are the claim. Finally emit
44
+ (`../code-graph.md` §5–§6):** ONLY when `probes["graph-status"].update_step` is
45
+ `lane`, run `orc graph update --notes-pending --files <every path the run changed> --at end --if-enabled --json --brief`
46
+ once more — fix rounds move code — and emit `GRAPH-UPDATE`; `notes_pending.exit` 0 →
47
+ one noter dispatch, 3 or 5 → nothing. No lane calls `orc graph gain`. Finally emit
52
48
  `PHASE ship end`, then the one-line `STATS lane=… dispatches=… downgrades=…`
53
49
  summary (trace.md — what `orc stats` reads), then `FINISH :: <detail>`,
54
50
  and in ONE step delete BOTH `log_dir/.current` and the run's `RESUME.md` (that
@@ -64,8 +60,9 @@ State the current branch and the change summary BEFORE any git action, and
64
60
  never ship on a red build (locked rule).
65
61
 
66
62
  <!-- diy:when code_graph=on -->
67
- Before the ship action, run `orc graph update --if-enabled` once more — fix rounds
68
- move code (`.claude/skills/_shared/code-graph.md` §5).
63
+ Before the ship action, ONLY when `update_step` is `lane`, run
64
+ `orc graph update --notes-pending --files <every path the run changed> --at end --if-enabled --json --brief`
65
+ once more — fix rounds move code (`.claude/skills/_shared/code-graph.md` §5).
69
66
  <!-- /diy:when -->
70
67
  <!-- diy:when ship_mode=ask -->
71
68
  Ask the user how to ship: commit, PR (via
@@ -54,7 +54,7 @@ entry that wrote code. Every detail goes BELOW the card, never above it.
54
54
  ✅ Fixed the null charge on guest checkout — 3 files, tests 14 passed (2 affected first)
55
55
  review 2 findings · 1 fixed · 1 disputed (recorded) gotchas 1 recorded (G-044)
56
56
  risk low — callers 3 in 2 files, tests reach 2 habits 1 proposal below
57
- flaky 1 test passed on the re-run (no repair round) graph <gain line>
57
+ flaky 1 test passed on the re-run (no repair round) graph <pack line>
58
58
  undo orc undo --run <run-slug> next commit? (your usual: review → commit)
59
59
  ```
60
60
 
@@ -69,5 +69,4 @@ entry that wrote code. Every detail goes BELOW the card, never above it.
69
69
  `undo none — no snapshot`. The command only PRINTS the undo; `--apply` runs
70
70
  it. The lane never runs it itself.
71
71
  - **Copy the CLI's words.** `risk` is the `blast_line` with its `why`;
72
- `graph` is the `orc graph gain` `line`, VERBATIM — an estimate with a range,
73
- never restated as a saving. `flaky` is the `GATE flaky` tests.
72
+ `graph` is the last pack call's `line`, VERBATIM (no lane calls `orc graph gain`). `flaky` is the `GATE flaky` tests.
@@ -19,14 +19,15 @@ owner is this file has its detail in "Verb detail" below.
19
19
  | `CONFIG <key=value …>` | orc → writer | Phase 1 — the resolved config values this run will consume, ALWAYS with opus5_only | `_shared/phases/trace-verbs.md` |
20
20
  | `WIKI-CONSULT <fresh\|aging\|stale\|absent\|empty> :: docs=<list\|none>` | orc → writer | project wiki consulted for grounding, with its staleness tier | `_shared/phases/wiki-consult.md` |
21
21
  | `CROSSLINK <cached\|configured-no-cache\|none> :: boundaries=<n> peers=<names> · CROSSLINK inject task=<id> :: <boundary>` | orc → writer | cross-repo peer-knowledge state at the consult point; `inject` when a slice receives a linked contract | `_shared/phases/wiki-consult.md` |
22
- | `GRAPH-CONSULT <fresh\|updated\|built\|drifted\|none\|off> :: files=<n> symbols=<n>[ density=<n>[ thin=1]] · GRAPH-CONSULT card task=<id> :: targets=<…>` | orc → writer | the code graph's preflight state, copied VERBATIM from the CLI `trace` field | `_shared/code-graph.md` |
22
+ | `GRAPH-CONSULT <fresh\|updated\|built\|drifted\|none\|semi\|off\|pack\|anchors> :: files=<n> symbols=<n>[ density=<n>[ thin=1]] · GRAPH-CONSULT card task=<id> :: targets=<…> · GRAPH-CONSULT pack :: files=<n> refs=<n> excerpts=<n> tokens=<n> gen=<n> · GRAPH-CONSULT anchors :: ranges=<n> files=<n> gen=<n>` | orc → writer | the code graph's preflight state, copied VERBATIM from the CLI `trace` field | `_shared/code-graph.md` |
23
23
  | `GRAPH-UPDATE <state> :: parsed=<n> reused=<n> deleted=<n> gen=<n> route=<n> ms=<n>` | orc → writer | one graph update, the `trace` field of `orc graph update --json`, verbatim | `_shared/phases/trace-verbs.md` |
24
24
  | `GRAPH-MAP <repo\|focused> :: files=<shown>/<total> [focus=<a,b>] gen=<n>` | orc → writer | ONE line at the start of planning, the `trace` field of `orc graph map --json`, verbatim | `_shared/phases/trace-verbs.md` |
25
25
  | `GRAPH-CHANGES <found\|none> :: symbols=<n> high=<n> medium=<n> low=<n> gen=<n>` | orc → writer | one line at review, the `trace` field of `orc graph changes --json`, verbatim | `_shared/phases/trace-verbs.md` |
26
26
  | `GRAPH-COMPLEXITY <mini-ok\|recommend-orc> :: files=<n> callers=<n> caller_files=<n> maybe=<n> tests=<n> risk=<n> cochange=<n> gen=<n>` | orc → writer | one line per /orc-mini run, the `trace` field of the `--complexity` impact call, verbatim | `_shared/phases/trace-verbs.md` |
27
- | `GRAPH-COCHANGE <found\|none> :: rows=<n> commits=<n>` | orc → writer | one line per planning batch, for the file that produced the widest answer | `_shared/phases/trace-verbs.md` |
27
+ | `GRAPH-COCHANGE <found\|none> :: rows=<n> commits=<n> · GRAPH-COCHANGE none :: history=<n>` | orc → writer | one line per planning batch, for the file that produced the widest answer | `_shared/phases/trace-verbs.md` |
28
+ | `GRAPH-COVERAGE <clean\|gaps> :: paths=<n> gaps=<n> gen=<n>` | orc → writer | the `trace` field of `orc graph coverage --json` — which files a card's silence can be trusted on | `_shared/phases/trace-verbs.md` |
28
29
  | `GRAPH-HINT injected=<n> subagent_start=<n> read_notes=<n> updates=<n>` | orc → writer | ONE line per phase close, the graph hook's counters; omitted when the counter file does not exist | `_shared/phases/trace-verbs.md` |
29
- | `GRAPH-GAIN paid=<n> low=<n> high=<n> calls=<n>` | orc → writer | ONE line per run at ship; `paid` is exact, `low`/`high` are an estimate never collapsed into one number | `_shared/phases/trace-verbs.md` |
30
+ | `GRAPH-GAIN paid=<n> low=<n> high=<n> calls=<n>` | orc → writer | OLD traces only — no lane emits it now (`orc graph gain` is a user command); `paid` is exact, `low`/`high` are an estimate never collapsed into one number | `_shared/phases/trace-verbs.md` |
30
31
  | `GRAPH-NOTES <applied\|below-min\|none\|deferred\|off\|skipped> :: <detail>` | orc → writer | one notes batch; `applied` copies the noter's one-line return verbatim | `_shared/phases/trace-verbs.md` |
31
32
  | `SPAWN <agent>` | hook | an agent dispatch was observed (skeleton) | `hooks/orc-trace.js` |
32
33
  | `RETURN <agent> :: <desc> dur=<m>m<s>s [model=<id>]` | hook | a subagent finished (skeleton) — not an orchestrator obligation; the model check is VERIFY | `hooks/orc-trace.js` |
@@ -44,17 +45,19 @@ owner is this file has its detail in "Verb detail" below.
44
45
  | `FINDING p0=<n> p1=<n> p2=<n> p3=<n>[ pre=<n> suppressed=<n> folded=<n>]` | reviewer→orc → writer | review outcome (P0–P3 severity ladder); the tail counts the after-filter's buckets | `_shared/phases/review.md` |
45
46
  | `FINDING-OUTCOME addressed=<n> disputed=<n> wontfix=<n> open=<n> pre=<n> suppressed=<n> :: <cat>:<addressed>/<total>,…` | orc → writer | ONE line at review close (a clean review too) — what became of each finding; `orc gotcha quality` counts it as a review | `_shared/phases/trace-verbs.md` |
46
47
  | `REVIEW-WHICH chose=<orc\|project\|skip> name=<the review the rule names> by=<user\|ledger\|learned> :: <file:line of the rule>` | orc → writer | the answer to §0 "which review" when the project names its own review — written ALWAYS, also under habits off; the FINISH nudge reads it | `_shared/phases/trace-verbs.md` |
47
- | `FIX source=<sonar\|ci\|defect\|pr\|review\|other> introduced_by=<orc\|ai\|human\|unknown> by=<user\|evidence> obs=<id8>[ missed_by=<run>] :: <path:lines> <rule or finding>` | cli | one fix recorded by `orc fix record` (/orc-fix) into the HOST run's trace — the CLI writes it, never a packet | `orc-fix/SKILL.md` |
48
+ | `FIX source=<sonar\|ci\|defect\|pr\|review> introduced_by=<orc\|ai\|human\|unknown> by=<user\|evidence> obs=<id8>[ missed_by=<run>] :: <path:lines> <rule or finding>` | cli | one fix recorded by `orc fix record` (/orc-fix) into the HOST run's trace — the CLI writes it, never a packet — `source` is the FILED kind: a class `other` is filed as `defect` | `orc-fix/SKILL.md` |
49
+ | `WAIT mode=<safe\|soft\|hard> requested=<n>m start=<HH:MM> end=<HH:MM> hops=<planned>/<max> trigger=<user\|gate> · WAIT end :: done=<k>/<planned> reason=<elapsed\|recovered\|cancelled\|max-hops> · WAIT block :: reason="<why>" by=user · WAIT unblock` | cli | a wait started, ended, blocked or unblocked — `orc wait` writes it into the open trace, never a packet | `_shared/wait.md` |
48
50
  | `VERDICT pass\|fail :: <detail>` | verifier→orc → writer | verification outcome | `_shared/phases/verify.md` |
49
51
  | `DRIFT loop=<n> :: <user description, compressed>` | orc → writer | mock-example drift-recovery loop opened (hard cap 2 loops) | `_shared/drift-recovery.md` |
50
52
  | `TDD-RED task=<id> iter=<n> :: <failing tests>` | executor→orc → writer | TDD repair-loop iteration — the plan's acceptance tests still red | `_shared/phases/trace-verbs.md` |
51
53
  | `TDD-GREEN task=<id> iter=<n>` | executor→orc → writer | the task's TDD acceptance tests pass | `_shared/phases/trace-verbs.md` |
52
54
  | `REPRO red\|green :: <cmd> exit=<n> · REPRO none :: <reason>` | executor→orc → writer | a DEFECT task's reproduction: RED before the fix, GREEN after | `_shared/return-validation.md` |
53
- | `NOTE :: <decisions>` | writer | the packet's `decisions` field — the WHY layer; one line, only when non-empty | `agents/orc-trace-writer-haiku-4-5.md` |
55
+ | `NOTE :: <decisions>` | writer | the packet's `decisions` field — the WHY layer; one line, only when non-empty | `agents/orc-trace-writer-haiku-5-high.md` |
54
56
  | `STATS lane=<l> slug=<s> dispatches=<n> waves=<n> tasks=<n> bands=<h:n,m:n,l:n> downgrades=<n> duration_ms=<n>` | orc → writer | ONE summary line per run, in the FINISH packet, immediately BEFORE the FINISH line | `_shared/phases/trace-verbs.md` |
55
57
  | `PACT <state> :: <ids> · PACT inject task=<id> :: <PACT-id> · PACT recheck pass\|fail :: <ids>` | orc → writer | invariant-ledger state at the Phase-1 probe, a promise injected into a task, the Phase-6 recheck | `orc-pact/references/gate.md` |
56
58
  | `BOUNDARY <EXECUTE\|ESCALATE\|REFUSE\|unknown> task=<id> :: <area> · BOUNDARY lift task=<id> :: <area>` | orc → writer | per-task boundary verdict; an uncarded area is `unknown`, never REFUSE | `orc-boundary/references/gate.md` |
57
59
  | `CHALLENGE iter=<n> findings=P0:<n>/P1:<n>/P2:<n> coverage=<n>% verdict=PASS\|FAIL · CHALLENGE accept\|rebut :: <id> · CHALLENGE regoal\|retemplate :: v<n>` | orc → writer | one line per completed /orc-challenge iteration — `orc challenge record`'s `trace_line`, verbatim | `orc-challenge/SKILL.md` |
60
+ | `DOC cycle=<n> sections=<k>/<m>[ wave=<k>/<n>]` | orc → writer | one line per completed /orc-doc cycle — a completed WAVE is a completed cycle | `orc-doc/SKILL.md` |
58
61
  | `EXTRA <profile>/<model> engine=<api\|claude-shim\|cli> task=<id> band=[lo,hi) tok=in/cw/cr/out outcome=<done\|partial\|failed\|fallback> dur=<m>m<s>s · EXTRA fallback task=<id> :: <reason> → <agent> · EXTRA substitution task=<id> :: requested=<m> reported=<m> · EXTRA reroute task=<id> :: <providers> · EXTRA resume task=<id> attempt=<n> :: from=<reason> attribution=<verdict> target=<extra:profile\|agent> files_preexisting=<n> · EXTRA orphan task=<id> :: attempt=<n> lease-expired files_changed=<n> state=<state> · EXTRA demote run=<slug> :: profile=<p> reason=<consecutive-stall\|stale-live-attempt\|manual> n=<k> → <ladder>` | orc → writer | one line per FOREIGN dispatch — `orc extra dispatch`'s `trace_line`, verbatim | `_shared/extra-dispatch.md` |
59
62
  | `FINISH :: <detail>` | orc → writer | run ended — mandatory, even on an abort | `_shared/phases/trace.md` |
60
63
 
@@ -98,17 +101,19 @@ reaches the file through a packet — you never append lines by hand.
98
101
  `orc graph status --heal --json --brief` (`code-graph.md` §4). `density=` is
99
102
  the named symbols per file, and `thin=1` means most files hold none, so most
100
103
  questions asked of the graph will not find one (v1.9.1). A `GATE` line that
101
- describes the graph in other words does not replace it. The `card` form is the
102
- `trace` of `orc graph ctx --json`, with `task=` added, when a slice receives
103
- cards.
104
- - **`GRAPH-UPDATE`.** One graph update at a wave close, a green smoke gate, a
105
- code-writing `/orc-quick` request, or ship. The graph HOOK writes its own
104
+ describes the graph in other words does not replace it. The `anchors` form is the
105
+ `trace` of the anchors call (`orc graph ctx --for-slice … --anchors --json --brief`),
106
+ with `task=` added, when a slice receives `graph_anchors`. The `card` form is the
107
+ `trace` of a plain `orc graph ctx --json` (an orient call).
108
+ - **`GRAPH-UPDATE`.** One lane graph update — ONLY when `update_step` is `lane` — at a
109
+ wave close, a green smoke gate, a code-writing `/orc-quick` request, or ship. The graph HOOK writes its own
106
110
  `GRAPH-UPDATE … :: by=hook …` lines directly; never copy one of those, it is
107
111
  already in the file.
108
112
  - **`GRAPH-MAP`.** Also at a `/orc-quick` Q1 look that had no file to name.
109
113
  `files=` is how many the budget SHOWED over how many the repository has, so a
110
114
  short map can be told from a small repository. `focused` means `--focus`
111
- re-ranked the repository around what the request named. RANK is a hint about
115
+ re-ranked the repository around the files the focus RESOLVED to (`repo` when
116
+ nothing resolved). RANK is a hint about
112
117
  where to look first and the trace never says more than that.
113
118
  - **`GRAPH-CHANGES`.** `high` counts symbols that are exported, have three or
114
119
  more callers and NO test reaching them.
@@ -119,13 +124,13 @@ reaches the file through a packet — you never append lines by hand.
119
124
  the USER chose after the offer.
120
125
  - **`GRAPH-COCHANGE`.** Not per file — the `trace` field of
121
126
  `orc graph cochange --json` for the file that produced the widest answer.
127
+ - **`GRAPH-COVERAGE`.** One line per `coverage` call. `gaps` counts files the
128
+ extractor did not finish; a gap is an answer, never an error.
122
129
  - **`GRAPH-HINT`.** Not one per hint — the counters `orc-graph-hook.js` keeps in
123
130
  `<log_dir>/<run>.graph-hook.json`. Omitted when the file does not exist (the
124
131
  hook is off, or it never had anything to say).
125
- - **`GRAPH-GAIN`.** The `trace` field of `orc graph gain --run <trace name>
126
- --json`, verbatim. `paid` is exact (the tokens the graph put in); `low`/`high`
127
- are an ESTIMATE of the retrieval it kept out. Omitted when the ledger is empty
128
- or the graph is off.
132
+ - **`GRAPH-GAIN`.** Kept so OLD traces still parse. No lane emits it now: `orc graph gain`
133
+ is a user command. `paid` is exact; `low`/`high` are an ESTIMATE.
129
134
  - **`GRAPH-NOTES`.** The `trace` field of `orc graph notes pending --json` when
130
135
  it exited 3 or 5; `skipped` under the Opus-5-only mode.
131
136
  - **`RETURN`.** The hook attributes the RETURN to the finishing agent from the
@@ -282,7 +287,7 @@ for every run even if the orchestrator never writes a rich marker. Only
282
287
  formats — the two halves agree by construction. An unknown verb, a missing or
283
288
  "now" `ts`, or a parse error exits 2 and writes NOTHING; a missing `.current`
284
289
  on a later packet exits 3. Only on exit ≠ 0 does the lane dispatch
285
- `orc-trace-writer-haiku-4-5` with the SAME packet (the fallback).
290
+ `orc-trace-writer-haiku-5-high` with the SAME packet (the fallback).
286
291
  - **Pairing rule (the anti-forget mechanism).** The write for phase N is issued
287
292
  **in the same tool block as phase N+1's first dispatch** — logging
288
293
  piggybacks on the very action the model reliably performs. A phase with no next