@azure-id/orc 2.1.0 → 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 (153) hide show
  1. package/CHANGELOG.md +374 -0
  2. package/README.md +49 -36
  3. package/bin/build-agents.js +7 -5
  4. package/bin/cli.js +1006 -235
  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 +169 -60
  19. package/bin/verify-package.js +3 -3
  20. package/bin/webui/api.js +8 -0
  21. package/bin/webui/fixtures/extra.js +9 -9
  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/a-normal-day.md +2 -2
  40. package/mock-run/extra-slots.md +177 -177
  41. package/mock-run/orc-cli.md +3 -2
  42. package/mock-run/orc-doc.md +452 -448
  43. package/mock-run/orc-fast.md +2 -2
  44. package/mock-run/orc-quick.md +146 -146
  45. package/mock-run/orc.md +4 -4
  46. package/package.json +2 -1
  47. package/templates/agents/MODEL-MAPPING.md +12 -12
  48. package/templates/agents/{orc-executor-haiku-4-5.md → orc-executor-haiku-5-high.md} +21 -8
  49. package/templates/agents/orc-executor-opus-4-7-high.md +17 -5
  50. package/templates/agents/orc-executor-opus-4-7-med.md +17 -5
  51. package/templates/agents/orc-executor-opus-4-8-high.md +17 -5
  52. package/templates/agents/orc-executor-opus-5-high.md +17 -5
  53. package/templates/agents/orc-executor-opus-5-low.md +17 -5
  54. package/templates/agents/orc-executor-opus-5-med.md +17 -5
  55. package/templates/agents/orc-executor-sonnet-4-6-high.md +17 -5
  56. package/templates/agents/orc-executor-sonnet-5-high.md +17 -5
  57. package/templates/agents/orc-executor-sonnet-5-low.md +17 -5
  58. package/templates/agents/orc-executor-sonnet-5-med.md +17 -5
  59. package/templates/agents/{orc-graph-noter-sonnet-4-6-med.md → orc-graph-noter-haiku-5-high.md} +4 -4
  60. package/templates/agents/orc-planner-mini-opus-5-med.md +3 -1
  61. package/templates/agents/orc-planner-mini-sonnet-5-high.md +3 -1
  62. package/templates/agents/orc-planner-opus-5-med.md +3 -1
  63. package/templates/agents/{orc-recon-sonnet-4-6-med.md → orc-recon-sonnet-5-med.md} +4 -4
  64. package/templates/agents/{orc-trace-writer-haiku-4-5.md → orc-trace-writer-haiku-5-high.md} +4 -3
  65. package/templates/commands/orc-doc.md +128 -128
  66. package/templates/commands/orc-export.md +51 -46
  67. package/templates/commands/orc-fast.md +10 -10
  68. package/templates/hooks/README.md +8 -3
  69. package/templates/hooks/orc-effort-guard.js +105 -27
  70. package/templates/hooks/orc-graph-hook.js +252 -4
  71. package/templates/hooks/orc-statusline.js +13 -6
  72. package/templates/hooks/orc-trace.js +1 -1
  73. package/templates/skills/_shared/README.md +2 -2
  74. package/templates/skills/_shared/code-graph.md +185 -251
  75. package/templates/skills/_shared/extra-dispatch.md +4 -4
  76. package/templates/skills/_shared/lane-contract.md +7 -3
  77. package/templates/skills/_shared/opus5-only.md +3 -3
  78. package/templates/skills/_shared/phases/execution.md +13 -11
  79. package/templates/skills/_shared/phases/planning.md +27 -9
  80. package/templates/skills/_shared/phases/preflight.md +3 -3
  81. package/templates/skills/_shared/phases/review.md +4 -3
  82. package/templates/skills/_shared/phases/ship.md +7 -10
  83. package/templates/skills/_shared/phases/summary.md +2 -3
  84. package/templates/skills/_shared/phases/trace-verbs.md +21 -16
  85. package/templates/skills/_shared/phases/trace.md +3 -3
  86. package/templates/skills/_shared/phases/wiki-consult.md +2 -2
  87. package/templates/skills/_shared/pr-templates.md +108 -106
  88. package/templates/skills/_shared/read-ladder.md +8 -2
  89. package/templates/skills/_shared/return-validation.md +10 -6
  90. package/templates/skills/_shared/review-slice.md +1 -1
  91. package/templates/skills/_shared/stack-plan.md +135 -135
  92. package/templates/skills/_shared/wait.md +14 -2
  93. package/templates/skills/context-combiner/SKILL.md +2 -2
  94. package/templates/skills/orc/SKILL.md +7 -7
  95. package/templates/skills/orc/config.md +2 -2
  96. package/templates/skills/orc/examples/full-run-mock.md +7 -7
  97. package/templates/skills/orc/references/effort-and-mode.md +222 -222
  98. package/templates/skills/orc/schemas/planning-output.md +3 -0
  99. package/templates/skills/orc-aftermath/SKILL.md +15 -15
  100. package/templates/skills/orc-analyze/SKILL.md +2 -2
  101. package/templates/skills/orc-analyze-mini/SKILL.md +2 -2
  102. package/templates/skills/orc-boundary/SKILL.md +15 -15
  103. package/templates/skills/orc-boundary/references/card.md +81 -78
  104. package/templates/skills/orc-boundary/references/gate.md +113 -113
  105. package/templates/skills/orc-brainstorm/SKILL.md +15 -15
  106. package/templates/skills/orc-budget/SKILL.md +15 -15
  107. package/templates/skills/orc-challenge/README.md +1 -1
  108. package/templates/skills/orc-challenge/SKILL.md +16 -16
  109. package/templates/skills/orc-challenge/examples/council-full-roster.md +1 -1
  110. package/templates/skills/orc-claude/SKILL.md +4 -4
  111. package/templates/skills/orc-claude/examples/claude-run-mock.md +1 -1
  112. package/templates/skills/orc-diy/SKILL.md +2 -2
  113. package/templates/skills/orc-diy/references/blocks/wiki.md +26 -26
  114. package/templates/skills/orc-diy/references/flow-schema.md +2 -2
  115. package/templates/skills/orc-doc/README.md +2 -2
  116. package/templates/skills/orc-doc/SKILL.md +501 -490
  117. package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +12 -1
  118. package/templates/skills/orc-doc/references/chunking.md +6 -4
  119. package/templates/skills/orc-doc/references/gates.md +311 -311
  120. package/templates/skills/orc-doc/references/resume-protocol.md +229 -228
  121. package/templates/skills/orc-explain/SKILL.md +88 -88
  122. package/templates/skills/orc-export/SKILL.md +190 -187
  123. package/templates/skills/orc-fast/SKILL.md +17 -14
  124. package/templates/skills/orc-grill/SKILL.md +16 -16
  125. package/templates/skills/orc-grill/references/grill-doc.md +1 -1
  126. package/templates/skills/orc-handoff/SKILL.md +11 -11
  127. package/templates/skills/orc-learn/SKILL.md +13 -13
  128. package/templates/skills/orc-learn/examples/learn-run-mock.md +2 -2
  129. package/templates/skills/orc-mini/SKILL.md +12 -12
  130. package/templates/skills/orc-mini/examples/mini-run-mock.md +4 -5
  131. package/templates/skills/orc-pact/SKILL.md +15 -15
  132. package/templates/skills/orc-pact/references/gate.md +70 -70
  133. package/templates/skills/orc-pattern/SKILL.md +3 -3
  134. package/templates/skills/orc-poly/SKILL.md +4 -4
  135. package/templates/skills/orc-poly/examples/poly-run-mock.md +51 -51
  136. package/templates/skills/orc-pr-driver/SKILL.md +4 -3
  137. package/templates/skills/orc-pr-driver/references/orc-run-split.md +108 -99
  138. package/templates/skills/orc-pr-setup/SKILL.md +2 -2
  139. package/templates/skills/orc-quick/README.md +11 -12
  140. package/templates/skills/orc-quick/SKILL.md +29 -32
  141. package/templates/skills/orc-quick/references/context-doc.md +5 -5
  142. package/templates/skills/orc-quick/references/dispatch-gate.md +10 -10
  143. package/templates/skills/orc-quick/references/gh-mode.md +2 -1
  144. package/templates/skills/orc-quick/references/look.md +34 -12
  145. package/templates/skills/orc-retro/SKILL.md +2 -2
  146. package/templates/skills/orc-retro/examples/retro-mock.md +2 -2
  147. package/templates/skills/orc-route/SKILL.md +2 -2
  148. package/templates/skills/orc-test/SKILL.md +6 -3
  149. package/templates/skills/orc-verify/SKILL.md +2 -2
  150. package/templates/skills/orc-wait/SKILL.md +10 -2
  151. package/templates/skills/orc-wiki/SKILL.md +4 -4
  152. package/templates/skills/orc-wiki/references/pattern-prewarm.md +19 -19
  153. package/templates/agents/orc-executor-sonnet-4-6-med.md +0 -155
package/CHANGELOG.md CHANGED
@@ -10,6 +10,380 @@ Format: `### v<version> — <title> _(<date>)_`.
10
10
 
11
11
  ---
12
12
 
13
+ ### v2.2.0 — one graph contract for every coding lane, a graph that reads Vue, and Haiku 5.5 _(2026-10-11)_
14
+
15
+ **Still on the unscoped `orc` package?** Do this once first - your `orc upgrade`
16
+ is the pre-v0.56.0 one and cannot install itself. Full detail in the CAUTION at
17
+ the top of this file.
18
+
19
+ - **Step 1 - release the command from the old package:** `npm uninstall -g orc`
20
+ - **Step 2 - install the current package:** `npm i -g @azure-id/orc`
21
+ - **Step 3 - re-apply it to your project:** `orc update`
22
+
23
+ **Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
24
+
25
+ This is a minor release. The code graph changes its index shape. Every project
26
+ rebuilds its graph ONE time (cold). Three agents get new names.
27
+
28
+ EVAL: real company Vue 2.7 repo, /orc-quick, graph OFF vs ON, medians. RMT2
29
+ (change one helper and every caller, N=3/3): cost −2.0 %, time −8.6 %, tokens
30
+ −4.2 %, grade equal (86). RMT1 (build step 1 of a create-transaction flow from a
31
+ requirement, N=3 ON / 5 OFF): cost −9.6 %, time −28.4 %, tokens −15.8 %, grade
32
+ equal (84), e2e 12/12 in every run. RMT3 (build step 2 on the built step 1, N=2/2, means): cost −8.9 %, tokens −14.0 %, time +4.0 %. RMT4 (a cross-file change inside the built page, stored notes on ON, N=2/2, means): no gain — cost +7.7 %, time +45.5 %, tokens +4.4 %; the executor explored only about 4 calls in either arm, so the graph and the stored notes had nothing to save. Details: guides/code-graph-benefit.md.
33
+
34
+ When the code graph helps, with live numbers: [guides/code-graph-benefit.md](guides/code-graph-benefit.md)
35
+
36
+ - **New guide:** `guides/code-graph-benefit.md` tells when the code graph helps, with live OFF / ON numbers.
37
+
38
+ **1. Code graph quality on Vue / JS**
39
+
40
+ - The `@/` alias resolves. The order is: `jsconfig` / `tsconfig` `paths` (and
41
+ `baseUrl`) nearest the importer, then the `'@'` alias in the vue / webpack /
42
+ vite config, then the nearest `src/`, then the repo-root `src/`.
43
+ - The template of a Vue SFC makes edges. Handlers, bindings and component tags
44
+ are callers. One `<Comp>.template` symbol owns them.
45
+ - `props`, `emits` and `inject` are symbols (`prop`, `emit`, `inject`). A card
46
+ shows the contract of the component.
47
+ - `() => import('x')` is an import, not a function. SPA route records are
48
+ `route` symbols (`VIEW /path`). `$router.push({ name })` and
49
+ `router-link :to` make a route-name edge.
50
+ - `this.$x` built-ins (`$t`, `$router`, …) make no edge.
51
+ - A caller that is not a test never resolves into a test file.
52
+ - `orc graph map --focus`: no word is dropped (IDF weight). Path segments
53
+ match first. Hubs are damped. Every file is ranked.
54
+ - `orc graph ctx` accepts a bare file name.
55
+ - `orc graph path` can end at a file.
56
+ - `orc graph impact` shows a tests row.
57
+
58
+ **2. One graph contract for every coding lane**
59
+
60
+ - Every coding lane uses the same four touchpoints: consult (probe) · orient
61
+ one time · anchors per code dispatch · affected tests with `changes`.
62
+ - The `graph-status` probe of `orc lane config` has a new field
63
+ `update_step` (`none` · `hook` · `lane` · `preflight`). A lane runs
64
+ `orc graph update` only when it is `lane`.
65
+ - Lanes do not call `orc graph gain`.
66
+ - New: `orc graph ctx --for-slice … --anchors`. It gives up to 12
67
+ `path:a-b` lines and ONE `read all:` command. The slice carries it as
68
+ `graph_anchors`. The executor runs that command first. This replaces the
69
+ card in the slice.
70
+ - Declared files can be joined with commas. `ctx --for-slice a.js,b.vue` is
71
+ the same as `ctx --for-slice a.js b.vue`. A wrong path prints
72
+ `not found: <path>` on the anchors line. Before, the full list was one
73
+ missing path, and the slice got no anchors.
74
+ - Focus callees. When a focus word names an exported function or method of a
75
+ declared file, the anchors are its definition and up to 8 call sites
76
+ (declared files included). Callers of other exports are dropped. One-word
77
+ member hits are dropped. A Vue component is never a focus callee.
78
+ - One look-time card. `orc graph ctx <symbol>` also lists the tests that reach
79
+ a caller (by call, import or name) and a coverage verdict. With `--anchors`
80
+ it also gives the slice anchors (`anchors_card`). One call replaces grep,
81
+ the test search, `coverage` and a separate `--for-slice` call. The
82
+ lane-config announce lines 2/4 and 3/4 name this path.
83
+ - The graph hook speaks to the main session (graph `on` only). (a) A
84
+ main-session Grep, Glob or shell search of a known symbol gets the ctx card.
85
+ Compound commands are included. The hook uses the matched name with the
86
+ highest fan-in, and never a name with fan-in 0. It gives one card per name
87
+ and 3 cards per run at most. (b) When an ORC executor returns, a new
88
+ PostToolUse(Task|Agent) hook entry injects the `changes` card (affected
89
+ tests and risk). The lane then does not call `orc graph changes`.
90
+ `orc init` and `orc update` add the new hook entry. `orc doctor` counts 6
91
+ hook entries.
92
+ - `--pack=` stays for users. No lane uses it.
93
+
94
+ **3. New: `code_graph: semi`**
95
+
96
+ - The preflight heal and the SubagentStop hook keep the graph current.
97
+ - Every lane read with `--if-enabled` exits 3 (the same as `off`). The trace
98
+ says `mode=semi`. No hint goes into a context.
99
+ - A read that you type without `--if-enabled` answers from the index.
100
+ - The status line and `orc doctor` show `semi`. The `orc ui` Code graph tab
101
+ shows a `SEMI` chip.
102
+
103
+ **4. Gain meter fixes**
104
+
105
+ - The run match is normalised.
106
+ - `changes` prices only old symbols with callers outside the diff, one time
107
+ per diff.
108
+ - Every ledger row has an `outcome` field.
109
+ - The heal line is correct.
110
+ - `cochange` says when the history is too short.
111
+ - The parse coverage line uses clearer words.
112
+
113
+ **5. Trace friction**
114
+
115
+ - `orc lane phases <lane> --json` has `trace_grammar` and `ask_ids` at the
116
+ top level.
117
+ - A refused packet names PHASE / NOTE / ASK and the verbs of the lane.
118
+ - A parse error quotes the bad line and shows an example packet.
119
+
120
+ **6. Models**
121
+
122
+ - `orc-executor-haiku-4-5` and `orc-executor-sonnet-4-6-med` become ONE
123
+ agent: `orc-executor-haiku-5-high` (`claude-haiku-5-5`, high).
124
+ - `orc-trace-writer-haiku-4-5` → `orc-trace-writer-haiku-5-high`.
125
+ - `orc-graph-noter-sonnet-4-6-med` → `orc-graph-noter-haiku-5-high`.
126
+ - An old name in your config still works. ORC prints ONE line:
127
+ `agent <old> is now <new> (2.2.0)`.
128
+ - `bin/pricing.json` has a `claude-haiku-5-5` row (input 0.1, cache write
129
+ 0.125, cache read 0.01, output 0.5; context 1M).
130
+
131
+ **7. Executor coverage rule**
132
+
133
+ - The executor runs coverage one time for its own files, with a text report.
134
+ It does not probe lcov, the jest cache or the transformer. It runs a second
135
+ time at most. The rest goes to `unmet[]`.
136
+
137
+ **8. Engine `graph@7`**
138
+
139
+ - `graph@7` / `heuristic@7` / `RESOLVE_SCHEMA 4`. The first `orc graph update`
140
+ after the upgrade rebuilds the index cold, one time.
141
+
142
+ **What you have to do:** run `orc update` once. Then run `orc graph update`
143
+ one time if `code_graph` is `on` or `semi`.
144
+
145
+ ### v2.1.2 — a typed /orc meets the effort guard, and the budget uses each model's price _(2026-10-03)_
146
+
147
+ **Still on the unscoped `orc` package?** Do this once first - your `orc upgrade`
148
+ is the pre-v0.56.0 one and cannot install itself. Full detail in the CAUTION at
149
+ the top of this file.
150
+
151
+ - **Step 1 - release the command from the old package:** `npm uninstall -g orc`
152
+ - **Step 2 - install the current package:** `npm i -g @azure-id/orc`
153
+ - **Step 3 - re-apply it to your project:** `orc update`
154
+
155
+ **Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
156
+
157
+ This is a fix release. It closes gaps between what the lanes say and what the
158
+ CLI does. It adds two commands (`orc wait start`, `orc wait end`) and two flags
159
+ (`orc doc parts --checked`, `--findings`).
160
+
161
+ **1. The effort guard for a typed `/orc`**
162
+
163
+ - The effort guard did not run when you typed `/orc` or `/orc-diy`. A typed
164
+ command does not cause a `PreToolUse` Skill call. Now a second event,
165
+ `UserPromptExpansion`, runs the same guard. A session below the necessary
166
+ effort is stopped at $0.
167
+ - `orc update` and `orc doctor --fix` add ONE `settings.json` entry:
168
+ `hooks.UserPromptExpansion`, matcher `orc|orc-diy`. A hand-edited matcher is
169
+ repaired.
170
+ - `orc doctor` shows `typed /orc + /orc-diy gate wired`. It warns
171
+ `typed-gate-unwired` or `typed-gate-matcher`. The fix for each is `orc update`.
172
+ - A typed `/orc-diy` with no compiled flow is refused at $0.
173
+ - The status-line bridge (`session-model.json`) has a new `session_id` field. A
174
+ bridge that v2.1.1 wrote still gives the `PreToolUse` medium allowance. A
175
+ bridge from a different session does not.
176
+ - **Limits you must know.** The guard fails open on each error. The typed gate
177
+ reads the bridge that the ORC status line writes. Where the ORC status line
178
+ does not run, the typed gate lets the prompt through. This is possible in the
179
+ desktop app Code tab, and it is not checked yet. The behaviour on an older
180
+ Claude Code build that does not know the `UserPromptExpansion` event is not
181
+ verified. If you change the model or the effort with a key shortcut, a false
182
+ block is possible until the status line shows again.
183
+
184
+ **2. Budget pricing**
185
+
186
+ - `orc budget` priced each token at the Opus 4.8 rate. Now each row uses the
187
+ rate of its pinned model. The USD figures for forecast and actual are lower.
188
+ Tokens, weighted tokens and quota do not change.
189
+ - `bands[]` and `fixed_roles[]` have a new `model` field.
190
+ - With `extra_enabled` on and an empty provider rate table, USD is `null` in
191
+ `--json` and "unavailable" in the text.
192
+ - Calibration now joins a point release to its family (`opus-5/low` and
193
+ `claude-opus-5-5`). The `unattributed` figure is lower.
194
+ - The pinned model id is correct for each shipped agent. This moves the context
195
+ window figure, the `orc wiki plan` price and the document cost.
196
+ - `orc budget forecast` with no plan exits 3 (it exited 1) and prints one
197
+ `--json` object.
198
+
199
+ **3. `orc wait start` and `orc wait end`**
200
+
201
+ - No command recorded a wait that started. Two new commands do:
202
+ `orc wait start <spec> --mode <safe|soft|hard> [--trigger user|gate] [--run <slug>] [--hop] [--max-hops] [--json]`
203
+ and
204
+ `orc wait end [<slug>] --reason <elapsed|recovered|cancelled|max-hops> [--json]`.
205
+ - `orc wait start` exits 0 when it records the wait, and also when there is no
206
+ run (`recorded:false reason:no-run`). It exits 1 for `no-mode`, `bad-trigger`,
207
+ `already-waiting` or a spec it cannot parse. It exits 2 for `no-reading`.
208
+ - `orc wait end` exits 0. It exits 1 for `no-run`, `no-wait` or `no-reason`.
209
+ - The trace has the lines
210
+ `WAIT mode=… requested=…m start=HH:MM end=HH:MM hops=<planned>/<max> trigger=…`
211
+ and `WAIT end :: done=k/n reason=…`. A block writes
212
+ `WAIT block :: reason=… by=user`, and its end writes `WAIT unblock`.
213
+ - `orc wait status --json` has a new `stale` field. `waiting` and `hops_done`
214
+ come from the clock. `orc wait cancel` refuses a stale wait.
215
+ - An old `wait.json` that holds only a block reads as "not waiting".
216
+ - **Known limits.** A wait that `max_hops` cuts short keeps its full `ends_at`,
217
+ so `status` shows `waiting` until `orc wait end` runs. A spec token that is
218
+ equal to a `--mode`, `--trigger` or `--run` value is ambiguous.
219
+
220
+ **4. orc-doc: `--checked` and `--findings`**
221
+
222
+ - No CLI path marked a section as checked, so `orc doc next` named the paid
223
+ check again. Two new flags record the check:
224
+ `orc doc parts <slug> --checked <ids>` and `--findings <id>=<n>,…`.
225
+ - A refusal exits 1 with `not-confirmed`, `no-such-section` or `bad-findings`,
226
+ and writes nothing.
227
+ - `orc doc parts --json` has new fields: `checked[]`,
228
+ `flagged[{id,findings}]` and `edit_rounds`. In `doc.json`, a section has
229
+ `checked_cycle` and `edit_rounds`.
230
+ - `orc doc next` has a new action, `plan-edit`. After 2 edit rounds on one
231
+ section it stops and asks you.
232
+ - The lane text says that a checker reads only the bounded part files of one
233
+ slice. The request log runs after the slug exists. An edit does not leave the
234
+ section as `user-edited`.
235
+ - **Known limits.** `edit_rounds` does not reset. `--confirm` and `--checked`
236
+ in one call are not atomic.
237
+
238
+ **5. The graph word focus**
239
+
240
+ - `orc graph map --focus <word>` ignored a plain word and said
241
+ "focus not in the graph". Now a word resolves to the files that hold it.
242
+ - `orc graph map --json` has new fields: `focus_words` and `focus_common`.
243
+ - The trace says `repo` when nothing resolved. `focus=` shows a maximum of 8
244
+ files, then `,+N`.
245
+
246
+ **6. `/orc-fix`: the host run and the FIX source**
247
+
248
+ - A stale `.current` (older than 6 hours), or a bootstrap `.current` with no
249
+ lane, was read as a host run. Now it gives `mode: may-fix`, `host: null`, no
250
+ `FIX` line and no `fix_run`.
251
+ - The classify JSON has a new `open_run` field.
252
+ - The `FIX` trace line and the stored row now show the same source.
253
+
254
+ **7. Boundary block lists**
255
+
256
+ - `orc boundary status` read only inline lists. It now reads block lists
257
+ (`- item` lines) also.
258
+ - A REFUSE card that uses a block list exits 2. It exited 3 (MALFORMED).
259
+ - Staleness counts only the commits that touch an anchored file.
260
+ - A field that is not a list gives this text:
261
+ "`<field>` is not a list — write `- item` lines or [a, b]".
262
+ - The header parser: ` #` inside quotes is text, and a comma inside quotes does
263
+ not split an inline item. The wiki documents use the same parser.
264
+
265
+ **8. Pact, aftermath and stack status**
266
+
267
+ - `orc pact`: the DRIFTED reason counted each anchor. Now it reads
268
+ "N commits since X touched K of M anchored files (a, b)". Each row has a new
269
+ `touched_files` field.
270
+ - `orc aftermath status` graded the open trace of its own lane. The open run
271
+ now has no row. A project that has only the open run exits 3 with `shallow`.
272
+ - `orc pr stack status`: `<n>` and `<m>`, a hole of 120 characters or less, and
273
+ a paragraph that is only a placeholder count as not filled. Comments, code
274
+ fences, generics and inline tags do not count. **A plan that v2.1.1 showed as
275
+ READY can show NOT READY.**
276
+ - The PR split does not pull. It runs
277
+ `git merge-base --is-ancestor <trunk> $SNAPSHOT` and stops when the trunk
278
+ moved. A pull that moved the trunk caused a silent revert.
279
+
280
+ **9. The call catalogue and the trace verbs**
281
+
282
+ - `orc lane calls`: the catalogue rows that listed only exit 0 now list each
283
+ exit code. The `budget-forecast` row has the correct codes. The catalogue
284
+ gaps are closed.
285
+ - The trace accepts three more verbs: `DOC`, `WAIT` and `GRAPH-COVERAGE`. The
286
+ `orc-mini` and `orc-fast` trace grammar includes the `GRAPH-*` verbs.
287
+ - `orc-learn` and `orc-poly` do not write a `WIKI-CONSULT` head that is not
288
+ declared.
289
+
290
+ **10. Small text and CLI fixes**
291
+
292
+ - Four refusals for a human reader crashed because a status mark was not
293
+ defined. They print the refusal now.
294
+ - The lexicon escape does not insert a stray comment line.
295
+ - `orc_wiki_pattern_findings`: the skills and the CLI use the same value.
296
+ - The `/orc-fast` text names the executor that it dispatches,
297
+ `orc-executor-sonnet-5-med`. Its `opus5_only` twin is `orc-executor-opus-5-low`
298
+ in the CLI also.
299
+ - `/orc-test`: the text names the server that `orc test env up` leaves running.
300
+ - `/orc-challenge` does not point its intake at the build-lane intake file.
301
+ - `/orc-export`: the text is correct for the challenge cycle source, for
302
+ `--check` with a hand-written `AGENTS.md`, and for the import of commands.
303
+ - The code-graph text says that the gain meter cannot see `graph_used: none`
304
+ yet, so `avoided` still counts that card.
305
+ - 9 `expect=` spellings in the templates changed to the pinned model ids.
306
+
307
+ **Changed behaviour**
308
+
309
+ - `orc budget forecast` with no plan: exit 3 (was 1).
310
+ - `orc budget`: lower USD figures; `model` in `bands[]` and `fixed_roles[]`;
311
+ USD `null` / "unavailable" with `extra_enabled` and no provider rates.
312
+ - `orc boundary status`: a block-list REFUSE card exits 2 (was 3); the new
313
+ "is not a list" text; staleness counts anchored-file commits only.
314
+ - `orc pact`: new DRIFTED `why` text; `touched_files` in each row.
315
+ - `orc pr stack status`: a READY plan from v2.1.1 can show NOT READY.
316
+ - `orc aftermath status`: no row for the open run; exit 3 `shallow` when that
317
+ is the only run.
318
+ - `/orc-fix`: `mode: may-fix` and `host: null` for a stale or lane-less
319
+ `.current`; `open_run` in the classify JSON.
320
+ - `orc graph map --focus <word>`: a word now focuses; `focus_words` and
321
+ `focus_common` in `--json`.
322
+ - `orc wait status --json`: `stale`; `cancel` refuses a stale wait; an old
323
+ block-only `wait.json` reads as not waiting.
324
+ - `orc doc parts --json`: `checked[]`, `flagged[]`, `edit_rounds`; `orc doc
325
+ next` can return `plan-edit`.
326
+ - `session-model.json`: `session_id`.
327
+
328
+ **What you have to do:** run `orc update` once. It adds the
329
+ `UserPromptExpansion` entry to `settings.json`.
330
+
331
+ ---
332
+
333
+ ### v2.1.1 — the quick and fast lanes move to Sonnet 5 _(2026-10-02)_
334
+
335
+ **Still on the unscoped `orc` package?** Do this once first - your `orc upgrade`
336
+ is the pre-v0.56.0 one and cannot install itself. Full detail in the CAUTION at
337
+ the top of this file.
338
+
339
+ - **Step 1 - release the command from the old package:** `npm uninstall -g orc`
340
+ - **Step 2 - install the current package:** `npm i -g @azure-id/orc`
341
+ - **Step 3 - re-apply it to your project:** `orc update`
342
+
343
+ **Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
344
+
345
+ This release changes the models that `/orc-quick`, `/orc-fast` and `orc extra`
346
+ use. Sonnet 4.6 leaves the coding lanes. Sonnet 5 (`claude-sonnet-5-5`) replaces it.
347
+
348
+ **1. The quick dispatch gate**
349
+
350
+ - Code entries: `orc-executor-sonnet-5-med` or `orc-executor-opus-5-low`. The
351
+ default suggestion for a mechanical edit is `orc-executor-sonnet-5-med`.
352
+ - Read-only entries: `orc-recon-sonnet-5-med` or `orc-recon-opus-5-low`.
353
+ - An agent's model change is a rename:
354
+ `orc-recon-sonnet-4-6-med` → `orc-recon-sonnet-5-med`. The agent count stays 51.
355
+
356
+ **2. orc extra**
357
+
358
+ - The `quick-executor` slot uses `orc-executor-sonnet-5-med`.
359
+ - `extra_fallback_agent` options and the fallback menu show
360
+ `orc-executor-sonnet-5-high`. They showed `orc-executor-sonnet-4-6-high`. A
361
+ config that names the old agent is still accepted.
362
+
363
+ **3. /orc-fast**
364
+
365
+ - The one executor is `orc-executor-sonnet-5-med`. It was
366
+ `orc-executor-sonnet-4-6-high`. The `fast-executor` extra slot, `orc budget`
367
+ and the `opus5_only` table use the new name. Under `opus5_only` it is still
368
+ `orc-executor-opus-5-low`.
369
+ - Run the lane from a Sonnet 5 (or higher) main session. A Sonnet 4.6 session is
370
+ below the executor's pin.
371
+
372
+ **4. Text and examples**
373
+
374
+ - `/orc`: the "even the smallest task gets a cheap subagent" rule names Sonnet 5
375
+ low. The examples dispatch Sonnet 5 high for scores 31–40.
376
+ - `/orc-grill`: the recon line names `claude-sonnet-5-5 / medium`.
377
+
378
+ **Not changed:** Sonnet 4.6 stays for the graph noter, the scout, the `orc diy`
379
+ choices and the opt-in executors (`orc-executor-sonnet-4-6-med`,
380
+ `orc-executor-sonnet-4-6-high`).
381
+
382
+ **What you have to do:** `orc update --prune`. If a script names
383
+ `orc-recon-sonnet-4-6-med`, change it to `orc-recon-sonnet-5-med`.
384
+
385
+ ---
386
+
13
387
  ### v2.1.0 — the review counts, the score table moves up, and old logs can go _(2026-10-02)_
14
388
 
15
389
  **Still on the unscoped `orc` package?** Do this once first - your `orc upgrade`
package/README.md CHANGED
@@ -7,14 +7,14 @@
7
7
  *Intake → analyze → plan → score → parallel subagents → review → verify → ship.*
8
8
 
9
9
  ![npm](https://img.shields.io/npm/v/%40azure-id%2Forc?style=for-the-badge&color=cb3837&logo=npm)
10
- ![Version](https://img.shields.io/badge/version-2.1.0-blue.svg?style=for-the-badge)
10
+ ![Version](https://img.shields.io/badge/version-2.2.0-blue.svg?style=for-the-badge)
11
11
  ![License](https://img.shields.io/badge/license-MIT-green.svg?style=for-the-badge)
12
12
  ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg?style=for-the-badge)
13
13
  ![Claude Code](https://img.shields.io/badge/Claude_Code-Skills-purple.svg?style=for-the-badge)
14
14
  ![Dependencies](https://img.shields.io/badge/dependencies-zero-lightgrey.svg?style=for-the-badge)
15
15
  ![GitHub stars](https://img.shields.io/github/stars/azure-id/orc?style=for-the-badge&color=yellow)
16
16
 
17
- **Latest: v2.1.0** · updated 02-10-2026 · [full changelog](CHANGELOG.md)
17
+ **Latest: v2.2.0** · updated 11-10-2026 · [full changelog](CHANGELOG.md)
18
18
 
19
19
  **On npm: [`@azure-id/orc`](https://www.npmjs.com/package/@azure-id/orc)** — `npm i -g @azure-id/orc`
20
20
 
@@ -266,7 +266,7 @@ ORC have terminal hook to see: Context Window %, 5 Hour usage %, Weekly usage %
266
266
  | **`/orc-grill`** | You have one idea and it is still vague. It asks rounds of questions, **looks facts up itself** instead of making you recite your own codebase, and never answers its own question. Ends when *you* say the idea matches what you meant. | [see it](mock-run/orc-grill.md) |
267
267
  | **`/orc-analyze`** | A document or a request → a scope-bounded, code-grounded spec. Every claim carries `file:line` evidence or becomes a question. Deep mode adds parallel scouts. | [see it](templates/skills/orc-analyze/examples/analyze-mock.md) |
268
268
  | **`/orc-plan`** | A request or a spec → a real task plan: grounded files, dependencies, facets, and a test disposition per task. | [see it](mock-run/orc-plan.md) |
269
- | **`/orc-doc`** | Writes the long document — a PRD, a TSD, a cross-team agreement, a status report or a runbook — as portable Markdown that imports cleanly into Notion, Obsidian, Docs, Coda, Craft and GitHub. **ORC never reads the document body**: each section is its own file under `sections/`, each writer owns exactly one of them, each checker reads one bounded part, and `document.md` is a build artifact rebuilt for free. Every wave is a stop you can walk away from, and it resumes months later without you explaining anything twice. | [see it](mock-run/orc-doc.md) |
269
+ | **`/orc-doc`** | Writes the long document — a PRD, a TSD, a cross-team agreement, a status report or a runbook — as portable Markdown that imports cleanly into Notion, Obsidian, Docs, Coda, Craft and GitHub. **ORC never reads the document body**: each section is its own file under `sections/`, each writer owns exactly one of them, each checker reads only the bounded part files of one slice, and `document.md` is a build artifact rebuilt for free. Every wave is a stop you can walk away from, and it resumes months later without you explaining anything twice. | [see it](mock-run/orc-doc.md) |
270
270
  | **`/orc-route`** | You have a plan — which lane should build it? It names one lane, the runners-up with what each costs you, and any lane that is impossible with the condition blocking it. **It refuses to route a sentence**, because that would be guessing. | [see it](mock-run/orc-route.md) |
271
271
  | **`/orc-explain`** | "Wait, what?" It says the last message again: the point first, then the background it assumed, then every ORC-only word defined in your project's terms. | [see it](mock-run/orc-explain.md) |
272
272
  | **`/orc-poly`** | One change across two or more repos, without drift. Peer source is read-only; it freezes the shared boundary into a contract and writes one plan per repo. It never builds. | [see it](templates/skills/orc-poly/examples/poly-run-mock.md) |
@@ -387,7 +387,7 @@ and its headings become the outline.
387
387
  A local map of how your code is connected. It is **off by default**.
388
388
 
389
389
  ```bash
390
- orc config set code_graph on # code lanes build and use the map (free)
390
+ orc config set code_graph on # code lanes build and use the map (free); `semi` = keep it current, no lane reads it
391
391
  orc config set code_graph_notes wave # optional: one-sentence notes (costs tokens)
392
392
  orc graph map # the repository ranked, before you know a file name
393
393
  orc graph ctx OrderService.create # a card: callers, calls, SQL/HTTP/env effects
@@ -419,8 +419,8 @@ orc graph gain # what the map put in, and an estimate of
419
419
  prints only the OUTSIDE view of a file an agent is about to read in full.
420
420
  `--format tree` names each column once instead of on every row.
421
421
  - **`orc graph map` answers "which files matter here"** before you know a file
422
- name, inside a budget. `--focus` re-ranks the whole repository around the files
423
- or names your request already mentioned. **Rank is a hint about where to look
422
+ name, inside a budget. `--focus` re-ranks the whole repository around the files,
423
+ names or plain words your request already mentioned. **Rank is a hint about where to look
424
424
  first**, never proof that a file matters to a change.
425
425
  - **It shows where code is. It does not replace reading it.** Agents still read
426
426
  the line range before they act. A card header says `coverage partial 327-466`
@@ -698,6 +698,7 @@ Some lanes ship a full how-to next to the skill, in plain language:
698
698
  | [Rules](guides/rules.md) | you want the 65 anti-slop rules, the precedence ladder and the lint |
699
699
  | [Configuration](guides/configuration.md) · [Model selection](guides/model-selection.md) | you want every key, or the scoring bands |
700
700
  | [Habits and gotchas](guides/habits-and-gotchas.md) | you want to know how a habit is proposed, how to import Sonar, SARIF or PR history, and how to undo |
701
+ | [Code graph benefit](guides/code-graph-benefit.md) | you want to know when the code graph helps, with live numbers |
701
702
  | [Other AI models](guides/extra-models.md) | you want part of the ladder to run somewhere other than Claude |
702
703
 
703
704
  Every skill also ships its own `SKILL.md` and `references/`. The guides above are
@@ -741,39 +742,51 @@ a current audit: [EVAL-REPORT.md](EVAL-REPORT.md).
741
742
  **Full history: [CHANGELOG.md](CHANGELOG.md)** — or `orc changelog`, which prints
742
743
  only what is newer than the version you have.
743
744
 
744
- ### v2.1.0 — the review counts, the score table moves up, and old logs can go _(2026-10-02)_
745
-
746
- - **A new score table with five bands.** Scores 0–40 go to Sonnet 5 (low,
747
- medium, high). Scores 41–89 go to Opus 5.5 low, and 90–100 to Opus 5.5 medium.
748
- Haiku is no longer in the table. **Every band from 41 needs an Opus 5.5 main
749
- session.**
750
- - **Sonnet 5 runs on `claude-sonnet-5-5`.** The price table is correct again.
751
- - **The reviewer is `orc-reviewer-opus-5-low`.** In the live eval, low effort
752
- found every seeded defect that was still in the diff.
753
- - **The wiki scanner and the CLAUDE.md writer use Opus 5.5 low** (they used Opus
754
- 4.8).
755
- - **Review quality no longer says "0 so far" after real reviews.** It counts
756
- reviews from the traces. A clean review counts too.
757
- - **Your project's own review rule.** When CLAUDE.md or AGENTS.md asks for a
758
- different review (for example `/code-review`), the lanes ask "ORC review, that
759
- review, or skip". `orc review policy` shows what ORC found.
760
- - **New lane `/orc-fix`.** It records a fix after a review (Sonar, a red CI, a
761
- bug) and who added the bug. The reviewer card shows it, and the panel shows
762
- "Fixes after review".
763
- - **`orc clear logs`** shows old traces and run folders. `--apply` deletes them.
764
- Nothing is deleted automatically unless you set `log_retention_auto: on`.
765
- - **The status line timer:** 1, 2, 3, 5 or 10 seconds. Below 1 second is refused,
766
- because Claude Code does not support it.
767
- - **Behaviour tab fixes:** with `habits: off` you still see Review quality and
768
- Gotchas, `/orc-fast` records your answers, and the answer log shows the question.
769
-
770
- **What you have to do:** `orc update`. If you compiled an `orc diy` flow, run
771
- `orc diy compile`. If a script names `orc-reviewer-opus-5-med`, change it to
772
- `orc-reviewer-opus-5-low`. The cost changes: read the CHANGELOG.
745
+ ### v2.2.0 — one graph contract for every coding lane, a graph that reads Vue, and Haiku 5.5 _(2026-10-11)_
746
+
747
+ - **The code graph reads Vue / JS.** The `@/` alias, template edges, props /
748
+ emits / inject, lazy imports, SPA routes and route-name edges. `$` built-ins
749
+ make no edge. A test file never takes a non-test caller.
750
+ - **One graph contract for every coding lane.** Four touchpoints. The new
751
+ `update_step` probe field says who updates the graph. Lanes do not call
752
+ `gain`. The slice gets `graph_anchors` (`ctx --for-slice --anchors`): up to
753
+ 12 ranges and one `read all:` command. Declared files can be joined with
754
+ commas. A focus word that names an exported function gives its definition
755
+ and up to 8 call sites.
756
+ - **One look-time card.** `orc graph ctx <symbol>` also lists the tests that
757
+ reach a caller and a coverage verdict. With `--anchors` it also gives the
758
+ slice anchors. One call replaces grep, the test search, `coverage` and
759
+ `--for-slice`.
760
+ - **The graph hook speaks to the main session** (graph `on` only). A search
761
+ of a known symbol gets its card (3 per run at most). When an executor
762
+ returns, a new hook entry gives the `changes` card. `orc doctor` counts 6
763
+ hook entries.
764
+ - **New: `code_graph: semi`.** The graph stays current. No lane reads it.
765
+ - **Gain meter fixes:** run match, `changes` pricing, the `outcome` field, the
766
+ heal line, short `cochange` history.
767
+ - **Trace friction:** `orc lane phases --json` gives `trace_grammar` and
768
+ `ask_ids`. A refused or bad packet tells you what to correct.
769
+ - **Haiku 5.5.** The Haiku 4.5 and Sonnet 4.6-medium agents become
770
+ `*-haiku-5-high`. An old name in your config still works, with one notice.
771
+ - **Engine `graph@7`.** The index rebuilds cold one time.
772
+
773
+ EVAL: real company Vue 2.7 repo, /orc-quick, graph OFF vs ON, medians. RMT2
774
+ (change one helper and every caller, N=3/3): cost −2.0 %, time −8.6 %, tokens
775
+ −4.2 %, grade equal (86). RMT1 (build step 1 of a create-transaction flow from a
776
+ requirement, N=3 ON / 5 OFF): cost −9.6 %, time −28.4 %, tokens −15.8 %, grade
777
+ equal (84), e2e 12/12 in every run. RMT3 (build step 2 on the built step 1, N=2/2, means): cost −8.9 %, tokens −14.0 %, time +4.0 %. RMT4 (a cross-file change inside the built page, stored notes on ON, N=2/2, means): no gain — cost +7.7 %, time +45.5 %, tokens +4.4 %; the executor explored only about 4 calls in either arm, so the graph and the stored notes had nothing to save. Details: guides/code-graph-benefit.md.
778
+
779
+ When the code graph helps, with live numbers: [guides/code-graph-benefit.md](guides/code-graph-benefit.md)
780
+
781
+ **What you have to do:** run `orc update` once. Then run `orc graph update`
782
+ one time if `code_graph` is `on` or `semi`.
773
783
 
774
784
  <details>
775
- <summary><strong>Earlier releases</strong> — 127 of them, titles only. Full text in <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
785
+ <summary><strong>Earlier releases</strong> — 130 of them, titles only. Full text in <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
776
786
 
787
+ - **v2.1.2** — a typed /orc meets the effort guard, and the budget uses each model's price · _2026-10-03_
788
+ - **v2.1.1** — the quick and fast lanes move to Sonnet 5 · _2026-10-02_
789
+ - **v2.1.0** — the review counts, the score table moves up, and old logs can go · _2026-10-02_
777
790
  - **v2.0.4** — design the status line to the last cell · _2026-09-30_
778
791
  - **v2.0.3** — the status line you designed is the status line you see · _2026-09-30_
779
792
  - **v2.0.2** — the lanes record what you answered, and the reviewer always gets the card · _2026-09-28_
@@ -36,7 +36,7 @@ const OUT_DIR = path.join(ROOT, "templates", "agents");
36
36
  //
37
37
  // v1.0.0 W4 — the table was SIX bands, not eight, and the `opus5_only` ladder is
38
38
  // TWO, not three. v2.1.0 made the table FIVE bands (Sonnet 5 low/med/high, then
39
- // Opus 5.5 low/med). Seven of these agents are named by NO default row:
39
+ // Opus 5.5 low/med). Six of these agents are named by NO default row:
40
40
  // names them, and they ship anyway (D14). They stay reachable through
41
41
  // `rubric_bands_override`, `orc diy` `fixed_executor` and `extra_fallback_agent`,
42
42
  // and deleting a generated file that no row happens to name today would be a
@@ -52,8 +52,10 @@ const VARIANTS = [
52
52
  // NAMED BY NO BAND since v1.0.0 W4 / v2.1.0 (D14) — kept on disk, dispatched
53
53
  // only when a user names one explicitly.
54
54
  { name: "orc-executor-sonnet-4-6-high", model: "claude-sonnet-4-6", effort: "high", band: "none (opt-in only, see MODEL-MAPPING.md)" },
55
- { name: "orc-executor-sonnet-4-6-med", model: "claude-sonnet-4-6", effort: "medium", band: "none (opt-in only, see MODEL-MAPPING.md)" },
56
- { name: "orc-executor-haiku-4-5", model: "claude-haiku-4-5", effort: null, band: "none (opt-in only, see MODEL-MAPPING.md)" },
55
+ // v2.2.0 — `haiku-4-5` and `sonnet-4-6-med` were RENAMED into this one row
56
+ // (an identical twin would have been the result). cli.js LEGACY_AGENTS maps
57
+ // the old names for configs that still write them.
58
+ { name: "orc-executor-haiku-5-high", model: "claude-haiku-5-5", effort: "high", band: "none (opt-in only, see MODEL-MAPPING.md)" },
57
59
  { name: "orc-executor-opus-5-high", model: "claude-opus-5-5", effort: "high", band: "none (opt-in only, see MODEL-MAPPING.md)" },
58
60
  { name: "orc-executor-opus-4-8-high", model: "claude-opus-4-8", effort: "high", band: "none (opt-in only, see MODEL-MAPPING.md)" },
59
61
  { name: "orc-executor-opus-4-7-high", model: "claude-opus-4-7", effort: "high", band: "none (opt-in only, see MODEL-MAPPING.md)" },
@@ -87,8 +89,8 @@ const TWINS = [
87
89
  desc: "ORC Pattern Codifier — claude-opus-5-5, medium effort. Dispatched by orc-pattern, instead of orc-pattern-codifier-sonnet-5-high when `opus5_only: true`." },
88
90
  ] },
89
91
  { family: "recon", variants: [
90
- { name: "orc-recon-sonnet-4-6-med", model: "claude-sonnet-4-6", effort: "medium", who: "Sonnet 4.6, medium",
91
- desc: "ORC Recon — claude-sonnet-4-6, medium effort. Dispatched by /orc-quick at the dispatch gate, for a read-only question. It never edits." },
92
+ { name: "orc-recon-sonnet-5-med", model: "claude-sonnet-5-5", effort: "medium", who: "Sonnet 5, medium",
93
+ desc: "ORC Recon — claude-sonnet-5-5, medium effort. Dispatched by /orc-quick at the dispatch gate, for a read-only question. It never edits." },
92
94
  { name: "orc-recon-opus-5-low", model: "claude-opus-5-5", effort: "low", who: "Opus 5.5, low",
93
95
  desc: "ORC Recon — claude-opus-5-5, low effort. Dispatched by /orc-quick at the dispatch gate, for a WIDE or SUBTLE read-only question. It never edits." },
94
96
  ] },