@azure-id/orc 2.0.2 → 2.1.1

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 (129) hide show
  1. package/CHANGELOG.md +455 -0
  2. package/README-id.md +52 -23
  3. package/README.md +36 -20
  4. package/bin/build-agents.js +205 -206
  5. package/bin/clear-logs.js +620 -0
  6. package/bin/cli.js +47417 -46420
  7. package/bin/fix.js +459 -0
  8. package/bin/gotcha.js +288 -8
  9. package/bin/habit.js +1538 -1453
  10. package/bin/mockrun-catalog.js +3 -0
  11. package/bin/onboarding-content.js +2 -1
  12. package/bin/pricing.json +28 -21
  13. package/bin/trace-write.js +869 -657
  14. package/bin/verify-contracts.js +5552 -5471
  15. package/bin/verify-package.js +716 -705
  16. package/bin/webui/api.js +125 -6
  17. package/bin/webui/css/panels/hookui.css +79 -0
  18. package/bin/webui/fixtures/behaviour.js +30 -0
  19. package/bin/webui/fixtures/extra.js +2036 -2036
  20. package/bin/webui/fixtures/flow.js +81 -81
  21. package/bin/webui/fixtures/hookui.js +506 -431
  22. package/bin/webui/fixtures/index.js +32 -3
  23. package/bin/webui/fixtures/knowledge.js +2 -2
  24. package/bin/webui/fixtures/maintenance.js +123 -42
  25. package/bin/webui/fixtures/rules.js +1007 -1002
  26. package/bin/webui/fixtures/settings.js +6 -7
  27. package/bin/webui/fixtures/stats.js +9 -6
  28. package/bin/webui/fixtures/wait.js +98 -97
  29. package/bin/webui/i18n/en/behaviour.json +13 -0
  30. package/bin/webui/i18n/en/hookui.json +290 -194
  31. package/bin/webui/i18n/en/maintenance.json +71 -52
  32. package/bin/webui/i18n/en/settings.json +60 -60
  33. package/bin/webui/i18n/id/behaviour.json +13 -0
  34. package/bin/webui/i18n/id/hookui.json +290 -194
  35. package/bin/webui/i18n/id/maintenance.json +71 -52
  36. package/bin/webui/i18n/id/settings.json +60 -60
  37. package/bin/webui/js/05-banners.js +181 -172
  38. package/bin/webui/js/06-edit.js +193 -183
  39. package/bin/webui/js/panels/behaviour.js +77 -12
  40. package/bin/webui/js/panels/hookui.js +2196 -1691
  41. package/bin/webui/js/panels/maintenance.js +336 -235
  42. package/bin/webui/js/panels/settings.js +726 -719
  43. package/mock-run/INDEX.md +1 -0
  44. package/mock-run/a-normal-day.md +2 -2
  45. package/mock-run/extra-slots.md +177 -177
  46. package/mock-run/habits.md +1 -1
  47. package/mock-run/orc-aftermath.md +392 -392
  48. package/mock-run/orc-budget.md +29 -33
  49. package/mock-run/orc-cli.md +200 -200
  50. package/mock-run/orc-explain.md +86 -86
  51. package/mock-run/orc-extra.md +389 -392
  52. package/mock-run/orc-fast.md +2 -2
  53. package/mock-run/orc-fix.md +87 -0
  54. package/mock-run/orc-pattern.md +112 -112
  55. package/mock-run/orc-quick.md +146 -146
  56. package/mock-run/orc.md +4 -4
  57. package/package.json +1 -1
  58. package/templates/agents/MODEL-MAPPING.md +176 -173
  59. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +2 -2
  60. package/templates/agents/{orc-claude-writer-opus-5-med.md → orc-claude-writer-opus-5-low.md} +4 -4
  61. package/templates/agents/orc-executor-haiku-4-5.md +1 -1
  62. package/templates/agents/orc-executor-opus-5-low.md +1 -1
  63. package/templates/agents/orc-executor-sonnet-4-6-high.md +1 -1
  64. package/templates/agents/orc-executor-sonnet-4-6-med.md +1 -1
  65. package/templates/agents/orc-executor-sonnet-5-high.md +2 -2
  66. package/templates/agents/orc-executor-sonnet-5-low.md +155 -0
  67. package/templates/agents/orc-executor-sonnet-5-med.md +155 -0
  68. package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +2 -2
  69. package/templates/agents/orc-planner-mini-sonnet-5-high.md +2 -2
  70. package/templates/agents/{orc-recon-sonnet-4-6-med.md → orc-recon-sonnet-5-med.md} +4 -4
  71. package/templates/agents/orc-retro-sonnet-5-high.md +2 -2
  72. package/templates/agents/{orc-reviewer-opus-5-med.md → orc-reviewer-opus-5-low.md} +4 -4
  73. package/templates/agents/{orc-wiki-scanner-opus-5-med.md → orc-wiki-scanner-opus-5-low.md} +3 -3
  74. package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +2 -2
  75. package/templates/commands/orc-fast.md +10 -10
  76. package/templates/commands/orc-fix.md +18 -0
  77. package/templates/commands/orc-wiki.md +64 -64
  78. package/templates/hooks/README.md +75 -7
  79. package/templates/hooks/orc-session-hook.js +78 -3
  80. package/templates/hooks/orc-statusline-render.js +317 -23
  81. package/templates/hooks/orc-statusline.js +162 -49
  82. package/templates/hooks/orc-subagent-line.js +23 -5
  83. package/templates/hooks/orc-weather-fetch.js +123 -0
  84. package/templates/skills/_shared/extra-dispatch.md +1331 -1331
  85. package/templates/skills/_shared/gotchas.md +27 -7
  86. package/templates/skills/_shared/habits.md +2 -2
  87. package/templates/skills/_shared/opus5-only.md +137 -137
  88. package/templates/skills/_shared/phases/review.md +2 -2
  89. package/templates/skills/_shared/phases/trace-verbs.md +17 -3
  90. package/templates/skills/_shared/phases/trace.md +136 -136
  91. package/templates/skills/_shared/review-slice.md +28 -1
  92. package/templates/skills/_shared/wait.md +1 -0
  93. package/templates/skills/orc/README.md +2 -2
  94. package/templates/skills/orc/SKILL.md +227 -227
  95. package/templates/skills/orc/config.md +25 -27
  96. package/templates/skills/orc/examples/full-run-mock.md +74 -73
  97. package/templates/skills/orc/references/effort-and-mode.md +222 -222
  98. package/templates/skills/orc/references/preflight-report.md +3 -3
  99. package/templates/skills/orc/references/ultra-mode.md +1 -1
  100. package/templates/skills/orc/schemas/checkpoint.md +122 -122
  101. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +3 -3
  102. package/templates/skills/orc/subskills/orc-review-verify/core.md +1 -1
  103. package/templates/skills/orc-analyze/SKILL.md +4 -2
  104. package/templates/skills/orc-claude/SKILL.md +14 -14
  105. package/templates/skills/orc-claude/examples/claude-run-mock.md +65 -65
  106. package/templates/skills/orc-diy/SKILL.md +5 -5
  107. package/templates/skills/orc-fast/SKILL.md +210 -208
  108. package/templates/skills/orc-fix/SKILL.md +110 -0
  109. package/templates/skills/orc-grill/SKILL.md +232 -232
  110. package/templates/skills/orc-grill/references/grill-doc.md +1 -1
  111. package/templates/skills/orc-mini/SKILL.md +4 -4
  112. package/templates/skills/orc-mini/examples/mini-run-mock.md +4 -2
  113. package/templates/skills/orc-quick/README.md +536 -536
  114. package/templates/skills/orc-quick/SKILL.md +2 -2
  115. package/templates/skills/orc-quick/references/context-doc.md +145 -145
  116. package/templates/skills/orc-quick/references/dispatch-gate.md +220 -219
  117. package/templates/skills/orc-quick/references/gh-mode.md +4 -2
  118. package/templates/skills/orc-retro/SKILL.md +1 -1
  119. package/templates/skills/orc-retro/examples/retro-mock.md +16 -16
  120. package/templates/skills/orc-wiki/README.md +325 -325
  121. package/templates/skills/orc-wiki/SKILL.md +195 -195
  122. package/templates/skills/orc-wiki/examples/wiki-run-mock.md +37 -37
  123. package/templates/skills/orc-wiki/references/extra.md +2 -2
  124. package/templates/skills/orc-wiki/references/partial-refresh.md +276 -271
  125. package/templates/skills/orc-wiki/references/phases/phase-0.md +1 -1
  126. package/templates/skills/orc-wiki/references/phases/phase-2.md +3 -3
  127. package/templates/skills/orc-wiki/references/phases/phase-3c.md +3 -2
  128. package/templates/agents/orc-claude-writer-opus-4-8-high.md +0 -48
  129. package/templates/agents/orc-wiki-scanner-opus-4-8-high.md +0 -74
@@ -185,7 +185,19 @@ cited one), then ONE trace line:
185
185
  `FINDING-OUTCOME addressed=<n> disputed=<n> wontfix=<n> open=<n> pre=<n> suppressed=<n> :: <cat>:<addressed>/<total>,…`.
186
186
  Where: `/orc` and `/orc-ultra` at Phase 7 (`phases/summary.md`), `/orc-mini`
187
187
  after the risk option's review, `/orc-quick` after the review offer. A review
188
- with zero findings records nothing and is a HEALTHY answer.
188
+ with zero findings records no observation and is a HEALTHY answer: its
189
+ `FINDING-OUTCOME` line (or the hook `RETURN orc-reviewer-*` line) already counts
190
+ it as a review in `orc gotcha quality` (v2.1.0). An `author: orc` observation
191
+ without `run` is refused (exit 2) — a `ref` that starts with the run id fills it.
192
+
193
+ **The reviewed ranges (v2.1.0, DE-13).** In the same step, store what the review
194
+ READ: `orc gotcha observe -` with
195
+ `{"kind": "review-scope", "run": "<trace name>", "commit": "<HEAD>", "files": {"<path>": [[start, end], …]}}`
196
+ — the slice's `diff_ranges`, a clean review too. The CLI keeps the last 500
197
+ reviews in `.claude/orc/review-scope.jsonl` (user data, never pruned by age) and
198
+ counts what it drops. A later `orc fix record` on lines inside a stored range
199
+ of an EARLIER run is a computed `miss`: the fix is promoted at 1 case and goes
200
+ first in the next card.
189
201
 
190
202
  ### Per-lane mechanics (the spines keep the trigger; this is the detail)
191
203
 
@@ -205,16 +217,24 @@ file is never a reason to fall back, and gotchas here are purely additive: probe
205
217
  inject the scope-matching entries into the F2 slice, and stop there. It never
206
218
  writes one, because one executor plus one repair round is too little signal to
207
219
  attribute a cause — and a lane with no analyst writing repair memory is how that
208
- memory fills with guesses.
220
+ memory fills with guesses. **A review is different (v2.1.0):** when `/orc-fast` runs
221
+ a review (the F4 offer, or the user asks for one), it records that review's outcomes
222
+ as "Review close" says — an observation is REVIEW LEARNING, not a repair-memory
223
+ entry, and every lane that ran a review records it.
209
224
 
210
225
  **`/orc-quick` — reads and records, since 2.0.0 (a deliberate reversal).**
211
- Record at step 3.3, after entry N is appended, and only for a request with
212
- programmatic proof: a defect entry with `REPRO red` then `REPRO green`
226
+ Record after the step 3.5 offers (v2.1.0 — it was 3.3, before the review offer
227
+ existed to record), and only for a request with programmatic proof: a defect entry with `REPRO red` then `REPRO green`
213
228
  (`source: defect`, `reproduced: true`) · a PR thread the request took and fixed
214
229
  (`source: pr`) · a Sonar or SARIF item fixed (`source: sonar` / `sarif`) · a CI
215
- failure fixed (`source: ci`) · a review-offer P0/P1 fixed (`source: review`,
216
- `addressed`) · a review finding the user called "not a problem here"
217
- (`source: review`, `disputed`). A plain fix with none of these records nothing.
230
+ failure fixed (`source: ci`) · every finding of a review offer, ONE observation per finding
231
+ with its outcome, as "Review close" says (`source: review`; "not a problem here"
232
+ = `disputed`). A plain fix with none of these records nothing.
233
+ A FIX of a named finding (a Sonar issue, a failed check, a defect ORC or an AI
234
+ tool caused) goes through `orc fix record -` (`via: "orc-quick"`, v2.1.0): the
235
+ author is the finder, never `orc`; a Sonar issue key gives the importer's own id,
236
+ so a later gotcha sync completes the same row; and the CLI computes `miss`
237
+ from `review-scope.jsonl`.
218
238
  Why the reversal: quick is where most of the fixes happen, so a memory that
219
239
  skips it never learns; a PR thread is a human's judgement and a red → green
220
240
  repro is proof, so the v1 "too little signal" objection does not apply; and the
@@ -74,14 +74,14 @@ compiled flow's last phase. `/orc-wait` makes no proposal.
74
74
  question; its `announce[]` line names the habit and its undo. A habit
75
75
  toward `no` is a pre-mark only, never applied. A learned
76
76
  `review_before_push: on` → the end-of-run batch ALWAYS carries option *a*
77
- (dispatch `orc-reviewer-opus-5-med` on the diff), marked `→ usual`, even with
77
+ (dispatch `orc-reviewer-opus-5-low` on the diff), marked `→ usual`, even with
78
78
  no `risk: high` row. Record `any.ship.review-before-push` whenever option *a*
79
79
  is offered: `chose=review` when the user takes it, else `push`.
80
80
  - **`/orc-fast`.** `fast.f0.stale-wiki`: a habit NEVER suggests `continue`
81
81
  (a stale wiki is a risk the user takes each time). The CLI never proposes
82
82
  it (`never_option`); a suggestion row that names it anyway is ignored. Show
83
83
  a `refresh` or `mini` suggestion only, and never apply one. A learned `review_before_push: on` → F4
84
- offers a dispatch of `orc-reviewer-opus-5-med` on the diff FIRST (P0/P1 block
84
+ offers a dispatch of `orc-reviewer-opus-5-low` on the diff FIRST (P0/P1 block
85
85
  the commit), marked `→ usual`; the reviewer is not in the fast pipeline, so
86
86
  it runs only on that yes. Record `any.ship.review-before-push` whenever it is
87
87
  offered.
@@ -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 6-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 65 — 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-4-6-high` | `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-opus-4-8-high` (deep) **or** `orc-wiki-scanner-sonnet-5-high` (light) | `orc-wiki-scanner-opus-5-med` |
41
- | claude write | `orc-claude-writer-opus-4-8-high` | `orc-claude-writer-opus-5-med` |
42
- | retro mine | `orc-retro-sonnet-5-high` | `orc-retro-opus-5-med` |
43
-
44
- The nine roles already pinned to `claude-opus-5-5` — analyst, planner, reviewer,
45
- verifier, test-author, combiner, learn-writer, advisor, judge — are already
46
- compliant and dispatch unchanged (their efforts are NOT rewritten by this mode).
47
-
48
- **The wiki scan tier ladder (v0.46.0) adds NO row here, and needs no new pair.**
49
- Off, the ladder picks deep or light per delta. ON, this mode already forces the
50
- wiki scanner to `orc-wiki-scanner-opus-5-med` — so **both tiers collapse onto that
51
- one shipped agent** and the ladder simply stops applying. A cheaper Opus 5.5 scanner
52
- variant for the light tier does not exist and must never be added: a pair for a
53
- tier that cannot occur while the flag is on is exactly the phantom this table
54
- 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-med` 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-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.
@@ -10,7 +10,7 @@ Emit `PHASE review start`. **Build the slice from `../review-slice.md`** — its
10
10
  §1 free check FIRST, then its §2 fields (with the graph on, `graph_changes` keeps
11
11
  its rows: no `--brief` here). Superpowers path: its review skill incl. tests
12
12
  (Sonnet 4.6 medium), then `../review-slice.md` §3 on its findings — no second
13
- dispatch. OpenSpec/self path: review worker (Opus 5.5 medium). Pass the resolved
13
+ dispatch. OpenSpec/self path: review worker (Opus 5.5 low). Pass the resolved
14
14
  `code_pattern` + its invariants + gate lines for the re-check
15
15
  (pattern-gate.md); no resolved pattern → FIRST ask for one (paste/md/none) (H `orc.phase-5.pattern-missing`).
16
16
  FE tasks in run → pass `fe_rules[]` from `../../orc-pattern/references/` fe-a11y
@@ -41,7 +41,7 @@ skipped by flow config") — never imply the work was reviewed.
41
41
  <!-- diy:when review=on -->
42
42
  Dispatch the reviewer exactly as the full lane does — follow the review half
43
43
  of `.claude/skills/orc/subskills/orc-review-verify/SKILL.md` (reviewer agent
44
- `orc-reviewer-opus-5-med`; findings ride the severity ladder from the
44
+ `orc-reviewer-opus-5-low`; findings ride the severity ladder from the
45
45
  locked rules, blocking and advisory findings both surfaced). Build its slice
46
46
  from `.claude/skills/_shared/review-slice.md` (§1 free check, §3 after-filter).
47
47
  <!-- /diy:when -->
@@ -42,7 +42,9 @@ owner is this file has its detail in "Verb detail" below.
42
42
  | `JUDGE <analysis\|plan\|implementation> <verdict> round=<n> blocking=<n> advisory=<n> downgraded=<n>` | orc → writer | ultra judgment verdict | `orc/references/ultra-mode.md` |
43
43
  | `OUTCOME task=<id> score=<n> band=<range> model=<m> retries=<n> requeues=<n> needs_context=<n> unmet=<n>` | orc → writer | task closed — links the scoring band to what it actually took | `_shared/phases/execution.md` |
44
44
  | `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
- | `FINDING-OUTCOME addressed=<n> disputed=<n> wontfix=<n> open=<n> pre=<n> suppressed=<n> :: <cat>:<addressed>/<total>,…` | orc → writer | ONE line at review close — what became of each finding; `orc gotcha quality` reads it | `_shared/phases/trace-verbs.md` |
45
+ | `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
+ | `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` |
46
48
  | `VERDICT pass\|fail :: <detail>` | verifier→orc → writer | verification outcome | `_shared/phases/verify.md` |
47
49
  | `DRIFT loop=<n> :: <user description, compressed>` | orc → writer | mock-example drift-recovery loop opened (hard cap 2 loops) | `_shared/drift-recovery.md` |
48
50
  | `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` |
@@ -170,6 +172,16 @@ reaches the file through a packet — you never append lines by hand.
170
172
  the user said "not a problem here" = disputed; declined with no reason = wontfix.
171
173
  `pre` and `suppressed` copy the after-filter's buckets; they never gate. The
172
174
  `FINDING` tail `pre= suppressed= folded=` is additive (the `sections=` precedent).
175
+ - **`REVIEW-WHICH`** (v2.1.0). ONE line, before ship, in every coding lane that
176
+ changed code, when the `review-policy` probe says `policy: project`
177
+ (the review slice, §0). It is written ALWAYS — habits off too — because it is a
178
+ record of what ran, not a habit. The `ASK any.review.which` line is written in
179
+ addition only when habits is on. A run that changed code under `policy:
180
+ project` with no `REVIEW-WHICH` line gets one nudge at FINISH.
181
+ - **`FIX`** (v2.1.0). Written by `orc fix record` ITSELF into the run in flight
182
+ (`/orc-fix`, a rider that opens no run). A packet that carries it is refused.
183
+ A lane never narrates it and never repeats it; `orc stats` and `/orc-retro`
184
+ read it like any other line.
173
185
  - **`DRIFT`.** `PHASE mock-example`; canonical `_shared/drift-recovery.md`.
174
186
  - **`TDD-RED` / `TDD-GREEN`.** Cap `tdd_loop_max`; a paired TDD task's red proof
175
187
  also emits iter=0. `TDD-GREEN` is the non-exempt definition-of-done.
@@ -334,8 +346,10 @@ trace and never emit `SPAWN`/`RETURN`.
334
346
 
335
347
  ### Files & lifecycle
336
348
 
337
- - Folder: `log_dir` (default `.claude/orc/logs/`). Persistent — **never deleted**
338
- (deliberate opposite of the decision log). Top level holds the run `.txt` plus
349
+ - Folder: `log_dir` (default `.claude/orc/logs/`). Persistent (deliberate
350
+ opposite of the decision log): kept until you run `orc clear logs --apply`, or
351
+ until the automatic sweep removes it (`log_retention_auto: on`, older than
352
+ `log_retention_days`). Top level holds the run `.txt` plus
339
353
  its sidecars (`.pending.json`, `.jsonl`); generated reports live in
340
354
  subfolders (`retro/`).
341
355
  - One file per run: **`run-<lane>-<slug>-<DDMMYY>-<HHMMSS>.txt`**, append-only.