@azure-id/orc 0.56.1 → 1.0.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 +2367 -2218
  2. package/README-id.md +49 -107
  3. package/README.md +45 -133
  4. package/bin/build-agents.js +18 -11
  5. package/bin/cli.js +33060 -29855
  6. package/bin/onboarding-content.js +0 -3
  7. package/bin/test-run.js +491 -0
  8. package/bin/verify-contracts.js +4256 -3277
  9. package/bin/verify-package.js +563 -498
  10. package/bin/webui/api.js +1186 -1163
  11. package/bin/webui/app.html +9 -0
  12. package/bin/webui/css/06-responsive.css +120 -108
  13. package/bin/webui/css/panels/extra.css +29 -0
  14. package/bin/webui/css/panels/lanes.css +134 -0
  15. package/bin/webui/css/panels/settings.css +79 -3
  16. package/bin/webui/fixtures/extra.js +2036 -1934
  17. package/bin/webui/fixtures/flow.js +2 -2
  18. package/bin/webui/fixtures/index.js +503 -486
  19. package/bin/webui/fixtures/lanes.js +218 -0
  20. package/bin/webui/fixtures/settings.js +261 -34
  21. package/bin/webui/fixtures/stats.js +3 -3
  22. package/bin/webui/i18n/TERMS.md +135 -134
  23. package/bin/webui/i18n/en/extra.json +345 -313
  24. package/bin/webui/i18n/en/lanes.json +29 -0
  25. package/bin/webui/i18n/en/nav.json +1 -0
  26. package/bin/webui/i18n/en/overview.json +2 -0
  27. package/bin/webui/i18n/en/settings.json +16 -5
  28. package/bin/webui/i18n/id/extra.json +345 -313
  29. package/bin/webui/i18n/id/lanes.json +29 -0
  30. package/bin/webui/i18n/id/nav.json +1 -0
  31. package/bin/webui/i18n/id/overview.json +2 -0
  32. package/bin/webui/i18n/id/settings.json +15 -4
  33. package/bin/webui/js/01-i18n.js +1 -0
  34. package/bin/webui/js/panels/extra.js +3199 -3011
  35. package/bin/webui/js/panels/lanes.js +259 -0
  36. package/bin/webui/js/panels/overview.js +10 -0
  37. package/bin/webui/js/panels/settings.js +149 -3
  38. package/package.json +39 -39
  39. package/templates/agents/MODEL-MAPPING.md +23 -35
  40. package/templates/agents/orc-executor-opus-4-7-high.md +1 -1
  41. package/templates/agents/orc-executor-opus-4-7-med.md +1 -1
  42. package/templates/agents/orc-executor-opus-4-8-high.md +1 -1
  43. package/templates/agents/orc-executor-opus-5-high.md +1 -1
  44. package/templates/agents/orc-executor-opus-5-low.md +1 -1
  45. package/templates/agents/orc-executor-opus-5-med.md +1 -1
  46. package/templates/agents/orc-retro-opus-5-med.md +73 -73
  47. package/templates/agents/orc-retro-sonnet-5-high.md +72 -72
  48. package/templates/agents/orc-trace-writer-haiku-4-5.md +107 -107
  49. package/templates/commands/orc-route.md +1 -1
  50. package/templates/commands/orc.md +1 -1
  51. package/templates/skills/_shared/README.md +7 -3
  52. package/templates/skills/_shared/config-precedence.md +198 -0
  53. package/templates/skills/_shared/drift-recovery.md +1 -1
  54. package/templates/skills/_shared/extra-dispatch.md +159 -7
  55. package/templates/skills/_shared/interview.md +1 -1
  56. package/templates/skills/_shared/opus5-only.md +9 -7
  57. package/templates/skills/_shared/phases/README.md +82 -0
  58. package/templates/skills/{orc/references → _shared/phases}/analyst-gates.md +15 -3
  59. package/templates/skills/_shared/phases/execution.md +143 -0
  60. package/templates/skills/{orc/references → _shared/phases}/house-rules.md +13 -1
  61. package/templates/skills/{orc/references → _shared/phases}/intake.md +15 -2
  62. package/templates/skills/_shared/phases/mock-example.md +56 -0
  63. package/templates/skills/{orc/references → _shared/phases}/plan-handoff.md +16 -3
  64. package/templates/skills/_shared/phases/planning.md +135 -0
  65. package/templates/skills/_shared/phases/preflight.md +76 -0
  66. package/templates/skills/_shared/phases/review.md +53 -0
  67. package/templates/skills/_shared/phases/scoring.md +65 -0
  68. package/templates/skills/{orc/references → _shared/phases}/security-checklist.md +12 -1
  69. package/templates/skills/_shared/phases/security.md +55 -0
  70. package/templates/skills/_shared/phases/ship.md +88 -0
  71. package/templates/skills/{orc/references/stop-and-resume.md → _shared/phases/stop-resume.md} +169 -160
  72. package/templates/skills/_shared/phases/summary.md +48 -0
  73. package/templates/skills/_shared/phases/testgen.md +51 -0
  74. package/templates/skills/{orc/references/trace-protocol.md → _shared/phases/trace.md} +49 -6
  75. package/templates/skills/_shared/phases/verify.md +70 -0
  76. package/templates/skills/{orc/references → _shared/phases}/wave-grouping.md +14 -2
  77. package/templates/skills/{orc/references → _shared/phases}/wiki-consult.md +13 -1
  78. package/templates/skills/_shared/read-ladder.md +48 -0
  79. package/templates/skills/context-combiner/SKILL.md +214 -187
  80. package/templates/skills/orc/README.md +148 -150
  81. package/templates/skills/orc/SKILL.md +70 -358
  82. package/templates/skills/orc/config.md +137 -389
  83. package/templates/skills/orc/examples/full-run-mock.md +1 -1
  84. package/templates/skills/orc/references/effort-and-mode.md +16 -18
  85. package/templates/skills/orc/references/phases/intake.md +47 -0
  86. package/templates/skills/orc/references/phases/integration.md +19 -0
  87. package/templates/skills/orc/references/preflight-report.md +4 -4
  88. package/templates/skills/orc/references/ultra-mode.md +117 -123
  89. package/templates/skills/orc/schemas/planning-output.md +279 -279
  90. package/templates/skills/orc/subskills/orc-planner/SKILL.md +260 -264
  91. package/templates/skills/orc/subskills/orc-pr/stack-gate.md +4 -1
  92. package/templates/skills/orc-aftermath/SKILL.md +153 -136
  93. package/templates/skills/orc-analyze/SKILL.md +247 -220
  94. package/templates/skills/orc-analyze/references/branching.md +51 -51
  95. package/templates/skills/orc-analyze/references/thin-input.md +1 -1
  96. package/templates/skills/orc-analyze-mini/SKILL.md +128 -112
  97. package/templates/skills/orc-boundary/SKILL.md +244 -208
  98. package/templates/skills/orc-brainstorm/SKILL.md +372 -339
  99. package/templates/skills/orc-budget/SKILL.md +243 -225
  100. package/templates/skills/orc-challenge/README.md +1 -1
  101. package/templates/skills/orc-challenge/SKILL.md +293 -255
  102. package/templates/skills/orc-challenge/examples/council-full-roster.md +1 -1
  103. package/templates/skills/orc-claude/SKILL.md +216 -199
  104. package/templates/skills/orc-diy/README.md +2 -1
  105. package/templates/skills/orc-diy/SKILL.md +129 -70
  106. package/templates/skills/orc-diy/references/blocks/analyze.md +1 -1
  107. package/templates/skills/orc-diy/references/compile.md +21 -7
  108. package/templates/skills/orc-diy/references/flow-schema.md +2 -2
  109. package/templates/skills/orc-doc/SKILL.md +44 -7
  110. package/templates/skills/orc-explain/SKILL.md +19 -0
  111. package/templates/skills/orc-export/SKILL.md +26 -5
  112. package/templates/skills/orc-fast/SKILL.md +215 -187
  113. package/templates/skills/orc-grill/SKILL.md +233 -207
  114. package/templates/skills/orc-handoff/SKILL.md +223 -204
  115. package/templates/skills/orc-learn/SKILL.md +176 -156
  116. package/templates/skills/orc-mini/SKILL.md +41 -23
  117. package/templates/skills/orc-pact/SKILL.md +250 -218
  118. package/templates/skills/orc-pattern/SKILL.md +149 -124
  119. package/templates/skills/orc-poly/SKILL.md +237 -216
  120. package/templates/skills/orc-poly/references/gather.md +1 -1
  121. package/templates/skills/orc-pr-driver/SKILL.md +196 -167
  122. package/templates/skills/orc-pr-driver/references/orc-run-split.md +1 -1
  123. package/templates/skills/orc-pr-setup/SKILL.md +212 -184
  124. package/templates/skills/orc-quick/README.md +2 -2
  125. package/templates/skills/orc-quick/SKILL.md +45 -12
  126. package/templates/skills/orc-quick/references/dispatch-gate.md +2 -3
  127. package/templates/skills/orc-retro/SKILL.md +244 -222
  128. package/templates/skills/orc-retro/examples/retro-mock.md +171 -171
  129. package/templates/skills/orc-route/SKILL.md +183 -165
  130. package/templates/skills/orc-verify/SKILL.md +100 -86
  131. package/templates/skills/orc-wiki/SKILL.md +55 -206
  132. package/templates/skills/orc-wiki/references/phases/phase-0.md +71 -0
  133. package/templates/skills/orc-wiki/references/phases/phase-1.md +35 -0
  134. package/templates/skills/orc-wiki/references/phases/phase-2.md +52 -0
  135. package/templates/skills/orc-wiki/references/phases/phase-3.md +57 -0
  136. package/templates/skills/orc-wiki/references/phases/phase-3c.md +36 -0
  137. package/templates/agents/orc-advisor-fable-5.md +0 -50
  138. package/templates/agents/orc-analyst-fable-5.md +0 -115
  139. package/templates/agents/orc-judge-fable-5.md +0 -79
  140. package/templates/agents/orc-planner-fable-5.md +0 -152
  141. package/templates/agents/orc-reviewer-fable-5.md +0 -57
  142. package/templates/skills/_shared/fable5-override.md +0 -56
  143. package/templates/skills/orc-diy/references/blocks/execution.md +0 -42
  144. package/templates/skills/orc-diy/references/blocks/mock-example.md +0 -22
  145. package/templates/skills/orc-diy/references/blocks/planning.md +0 -34
  146. package/templates/skills/orc-diy/references/blocks/review.md +0 -18
  147. package/templates/skills/orc-diy/references/blocks/scoring.md +0 -16
  148. package/templates/skills/orc-diy/references/blocks/security.md +0 -25
  149. package/templates/skills/orc-diy/references/blocks/ship.md +0 -25
  150. package/templates/skills/orc-diy/references/blocks/summary.md +0 -18
  151. package/templates/skills/orc-diy/references/blocks/testgen.md +0 -17
  152. package/templates/skills/orc-diy/references/blocks/trace.md +0 -28
  153. package/templates/skills/orc-diy/references/blocks/verify.md +0 -25
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ /* fixtures/lanes.js — canned data for `orc ui --fixtures`.
3
+ The `orc lane` noun: the registry, one lane's phases, and the call catalogue.
4
+
5
+ THE RULE FOR EVERY FILE IN HERE: carry ONE OF EVERY STATE, including the
6
+ ugly ones. For this panel the states that matter are the ones a happy lane
7
+ never shows you:
8
+
9
+ · a lane with NO COMMAND — dispatched by something else, never invoked;
10
+ · a lane with NO SHARED PHASES — five keep their pipeline in their own
11
+ spine on purpose, and "none" has to read as an ANSWER rather than as a
12
+ fetch that failed;
13
+ · a phase whose `when` is not `always`, and one carrying `optional_when`;
14
+ · a phase that catalogues NO calls, beside one that catalogues seven;
15
+ · a call that COSTS something, beside the free ones.
16
+
17
+ Shapes MUST match what `bin/cli.js --json` really emits — a drifted fixture
18
+ is worse than no fixture. These were copied from `orc lane list --json`,
19
+ `orc lane phases <lane> --json` and `orc lane calls --all --json`. */
20
+
21
+ const laneList = {
22
+ ok: true,
23
+ count: 5,
24
+ lanes: [
25
+ // NO COMMAND, and the note that says what opens it instead. An unexplained
26
+ // null reads as an oversight, which is why the CLI refuses to have one.
27
+ {
28
+ lane: "context-combiner",
29
+ command: null,
30
+ command_note: "a PHASE inside an orc-analyze run — dispatched, never invoked (v0.42.0)",
31
+ keys: 2,
32
+ inert: 0,
33
+ },
34
+ { lane: "orc", command: "/orc", command_note: null, keys: 40, inert: 0 },
35
+ { lane: "orc-mini", command: "/orc-mini", command_note: null, keys: 9, inert: 0 },
36
+ // INERT rules — the count that tells you some of this lane's keys do
37
+ // nothing here however they are set.
38
+ { lane: "orc-quick", command: "/orc-quick", command_note: null, keys: 6, inert: 5 },
39
+ { lane: "orc-wiki", command: "/orc-wiki", command_note: null, keys: 11, inert: 0 },
40
+ ],
41
+ aliases: {},
42
+ rank_states: ["resolved", "partly-resolved", "not-read", "inert", "demoted", "absent"],
43
+ };
44
+
45
+ const lanePhases = {
46
+ orc: {
47
+ ok: true,
48
+ lane: "orc",
49
+ all: false,
50
+ count: 6,
51
+ layer_set: ["core", "full"],
52
+ phase_files: 6,
53
+ lanes: [
54
+ {
55
+ lane: "orc",
56
+ trace_tier: "Build lanes",
57
+ trace_token: "orc",
58
+ phases: [
59
+ {
60
+ ord: 1,
61
+ id: "preflight",
62
+ file: "_shared/phases/preflight.md",
63
+ layers: ["core", "full"],
64
+ read: "whole",
65
+ when: "always",
66
+ optional_when: null,
67
+ calls: [
68
+ "lane-config",
69
+ "wiki-status",
70
+ "pattern-status",
71
+ "gotcha-status",
72
+ "pact-status",
73
+ "boundary-status",
74
+ "aftermath-status",
75
+ ],
76
+ },
77
+ // A phase that catalogues NO call, directly beside one that
78
+ // catalogues seven — the empty list has to be visibly empty.
79
+ {
80
+ ord: 2,
81
+ id: "trace",
82
+ file: "_shared/phases/trace.md",
83
+ layers: ["core"],
84
+ read: "whole",
85
+ when: "always",
86
+ optional_when: null,
87
+ calls: [],
88
+ },
89
+ {
90
+ ord: 3,
91
+ id: "intake",
92
+ file: "_shared/phases/intake.md",
93
+ layers: ["core"],
94
+ read: "whole",
95
+ when: "on-phase",
96
+ optional_when: null,
97
+ calls: [],
98
+ },
99
+ // A row that names a HEADING rather than a file — the manifest rule
100
+ // says a row is one or the other, never both and never neither.
101
+ {
102
+ ord: 4,
103
+ id: "waves",
104
+ file: null,
105
+ heading: "## Phase 4 — waves",
106
+ layers: ["core"],
107
+ read: "section",
108
+ when: "on-phase",
109
+ optional_when: null,
110
+ calls: ["boundary-status"],
111
+ },
112
+ // OPTIONAL, with the condition spelled out. A phase that only
113
+ // sometimes runs and does not say when is a phase nobody can plan
114
+ // around.
115
+ {
116
+ ord: 5,
117
+ id: "security",
118
+ file: "_shared/phases/security.md",
119
+ layers: ["full"],
120
+ read: "whole",
121
+ when: "on-phase",
122
+ optional_when: "only when security_review is on and a task scored >= 70",
123
+ calls: [],
124
+ },
125
+ {
126
+ ord: 6,
127
+ id: "stop-resume",
128
+ file: "_shared/phases/stop-resume.md",
129
+ layers: ["core"],
130
+ read: "whole",
131
+ when: "always",
132
+ optional_when: null,
133
+ calls: ["run-list"],
134
+ },
135
+ ],
136
+ },
137
+ ],
138
+ },
139
+ // IN-SPINE: no shared phases at all. This is the state the panel has to
140
+ // render as an answer — five lanes are deliberately like this, and a blank
141
+ // card would make "this lane owns its pipeline" look like "the read failed".
142
+ "orc-mini": {
143
+ ok: true,
144
+ lane: "orc-mini",
145
+ all: false,
146
+ count: 0,
147
+ layer_set: [],
148
+ phase_files: 0,
149
+ lanes: [{ lane: "orc-mini", trace_tier: "Build lanes", trace_token: "orc-mini", phases: [] }],
150
+ },
151
+ };
152
+
153
+ const laneCalls = {
154
+ ok: true,
155
+ lane: null,
156
+ all: true,
157
+ count: 4,
158
+ calls: [
159
+ {
160
+ id: "lane-config",
161
+ cmd: "orc lane config <lane> [--json]",
162
+ what: "what did this lane's config resolve to, with every shadow and inertness already worded",
163
+ exits: { 0: "answered", 2: "unknown lane" },
164
+ states: null,
165
+ cost: "free",
166
+ when: "once, at preflight, before the first decision that reads a setting",
167
+ on_absent:
168
+ "exit ≠ 0 → say the CLI is unavailable and use the documented defaults, out loud, treating every P0 forcing mode as OFF",
169
+ never:
170
+ "never merge `.claude/orc.config.yaml` yourself, and never re-derive a precedence — the answer already carries it",
171
+ canonical: "_shared/config-precedence.md",
172
+ lanes: ["orc", "orc-mini", "orc-quick", "orc-wiki"],
173
+ },
174
+ {
175
+ id: "wiki-status",
176
+ cmd: "orc wiki status [--json]",
177
+ what: "does a wiki exist here, and how stale is its worst doc",
178
+ exits: { 0: "answered in every state, including none" },
179
+ states: ["none", "unregistered", "FRESH", "AGING", "STALE"],
180
+ cost: "free",
181
+ when: "once, at preflight",
182
+ on_absent: "state `none` is an ANSWER — there is no wiki, so nothing consults one",
183
+ never: "never compute the tier yourself, and never store it",
184
+ canonical: "_shared/detecting-artifacts.md",
185
+ lanes: ["orc", "orc-fast", "orc-learn", "orc-wiki"],
186
+ },
187
+ // A call that COSTS. Every other row here is free, and a panel where every
188
+ // chip says the same word teaches nothing.
189
+ {
190
+ id: "wiki-refresh",
191
+ cmd: "/orc-wiki refresh --top <n>",
192
+ what: "re-scan the ranked docs a delta actually touched",
193
+ exits: { 0: "refreshed", 1: "nothing pending" },
194
+ states: null,
195
+ cost: "paid",
196
+ when: "only when the user asked for it, and only after every free repair ran",
197
+ on_absent: "nothing pending is an ANSWER — do not scan to produce work",
198
+ never: "never run it to clear a caution the free repairs would have cleared",
199
+ canonical: "orc-wiki/references/staleness.md",
200
+ lanes: ["orc-wiki"],
201
+ },
202
+ {
203
+ id: "run-list",
204
+ cmd: "orc run list [--limit <n>] [--json]",
205
+ what: "which runs are unfinished, and what each one was doing when it stopped",
206
+ exits: { 0: "answered, including an empty list" },
207
+ states: null,
208
+ cost: "free",
209
+ when: "at a stop, and when the user asks what is open",
210
+ on_absent: "an empty list is an ANSWER — no run is waiting",
211
+ never: "never claim a run finished; the disk only proves it stopped",
212
+ canonical: "_shared/phases/stop-resume.md",
213
+ lanes: ["orc", "orc-doc", "orc-mini"],
214
+ },
215
+ ],
216
+ };
217
+
218
+ module.exports = { laneList, lanePhases, laneCalls };
@@ -9,7 +9,10 @@
9
9
  test asserts this, so a new state cannot ship without one.
10
10
 
11
11
  Shapes MUST match what `bin/cli.js --json` really emits — a drifted
12
- fixture is worse than no fixture. */
12
+ fixture is worse than no fixture. The v1.0.0 W2 fields (answers/family/prio/
13
+ lanes/gated_by per key, and the `families` table) were copied straight from
14
+ the live registry for that reason — a shadow you can design against has to
15
+ carry the RANK that causes it, not just the sentence. */
13
16
 
14
17
  const { PROJECT } = require("./shell.js");
15
18
 
@@ -17,40 +20,52 @@ const config = {
17
20
  config_path: PROJECT + "/.claude/orc.config.yaml",
18
21
  exists: true,
19
22
  keys: [
20
- { key: "max_wave_tasks", tier: "common", value: 4, default: 3, is_overridden: true, is_shadowed: false, shadow_reason: null, desc: "Max parallel tasks per execution wave (higher = more parallelism, more collision risk).", options: [2, 3, 4, 5], control: { kind: "int", choices: null, min: 1, max: null } },
21
- { key: "batch_pause_every", tier: "common", value: 2, default: 2, is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Waves between stop-and-continue pauses (1 = pause every wave).", options: [1, 2, 3, 4, 5], control: { kind: "int", choices: null, min: 1, max: null } },
22
- { key: "rubric_bands", tier: "common", value: 5, default: 5, is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Scoring granularity (2-5 narrow preset, 6-8 wide preset).", options: [2, 3, 4, 5, 6, 7, 8], control: { kind: "range", choices: null, min: 2, max: 8 } },
23
- { key: "pattern_findings", tier: "common", value: "on", default: "ask", is_overridden: true, is_shadowed: false, shadow_reason: null, desc: "Code-pattern gate on an FE/BE cache miss.", options: ["ask", "on", "off"], control: { kind: "enum", choices: ["ask", "on", "off"], min: null, max: null } },
24
- { key: "generate_tests", tier: "common", value: false, default: false, is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Opt-in Phase 6.5: author test cases before ship.", options: ["true", "false"], control: { kind: "enum", choices: ["true", "false"], min: null, max: null } },
25
- // ON, so the whole fable5_* block below renders shadowed — the animation
26
- // §6.2 calls the single best argument for the project.
27
- { key: "opus5_only", tier: "common", value: "true", default: false, is_overridden: true, is_shadowed: false, shadow_reason: null, desc: "EVERY dispatched role uses ONE model — Opus 5 — with EFFORT as the cost dial.", options: ["true", "false"], control: { kind: "enum", choices: ["true", "false"], min: null, max: null } },
28
- { key: "fable5_enabled", tier: "fable5", value: "true", default: false, is_overridden: true, is_shadowed: true, shadow_reason: "shadowed by opus5_only — every role dispatches its Opus 5 agent, so the Fable 5 override is inert", desc: "Master gate route selected roles to Fable 5 agents.", options: ["true", "false"], control: { kind: "enum", choices: ["true", "false"], min: null, max: null } },
29
- { key: "fable5_effort", tier: "fable5", value: "medium", default: "medium", is_overridden: false, is_shadowed: true, shadow_reason: "shadowed by opus5_only — every role dispatches its Opus 5 agent, so the Fable 5 override is inert", desc: "Effort for the Fable 5 role agents.", options: ["medium", "high", "xhigh", "max"], control: { kind: "enum", choices: ["medium", "high", "xhigh", "max"], min: null, max: null } },
30
- { key: "fable5_roles", tier: "fable5", value: "[analyze, plan]", default: "[]", is_overridden: true, is_shadowed: true, shadow_reason: "shadowed by opus5_onlyevery role dispatches its Opus 5 agent, so the Fable 5 override is inert", desc: "Which roles use Fable 5 (CSV).", options: ["analyze", "plan", "advisor", "judge", "review"], control: { kind: "subset", choices: ["analyze", "plan", "advisor", "judge", "review"], min: null, max: null } },
31
- { key: "wiki_fresh_max", tier: "advanced", value: 10, default: 10, is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Wiki freshness: commit distance < this → FRESH.", options: null, control: { kind: "int", choices: null, min: 1, max: null } },
32
- { key: "wiki_aging_max", tier: "advanced", value: 30, default: 30, is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Wiki freshness: commit distance <= this → AGING; beyond → STALE.", options: null, control: { kind: "int", choices: null, min: 1, max: null } },
33
- { key: "log_dir", tier: "advanced", value: ".claude/orc/logs", default: ".claude/orc/logs", is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Persistent trace folder (never auto-deleted).", options: null, control: { kind: "path", choices: null, min: null, max: null } },
34
- { key: "retro_repo", tier: "advanced", value: "azure-id/orc", default: "azure-id/orc", is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "GitHub owner/repo that receives /orc-retro reports.", options: null, control: { kind: "repo", choices: null, min: null, max: null } },
23
+ { key: "max_wave_tasks", tier: "common", answers: [{"family":"waves","prio":"P2","mode":"replace"}], family: "waves", prio: "P2", lanes: ["orc","orc-diy"], gated_by: null, value: 4, default: 3, is_overridden: true, is_shadowed: false, shadow_reason: null, desc: "Max parallel tasks per execution wave (higher = more parallelism, more collision risk).", options: [2, 3, 4, 5], control: { kind: "int", choices: null, min: 1, max: null } },
24
+ { key: "batch_pause_every", tier: "common", answers: [{"family":"waves","prio":"P2","mode":"replace"}], family: "waves", prio: "P2", lanes: ["orc","orc-diy"], gated_by: null, value: 2, default: 2, is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Waves between stop-and-continue pauses (1 = pause every wave).", options: [1, 2, 3, 4, 5], control: { kind: "int", choices: null, min: 1, max: null } },
25
+ { key: "rubric_bands", tier: "common", answers: [{"family":"scoring","prio":"P2","mode":"replace"}], family: "scoring", prio: "P2", lanes: ["orc","orc-diy"], gated_by: null, value: 5, default: 5, is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Scoring granularity (2-5 narrow preset, 6-8 wide preset).", options: [2, 3, 4, 5, 6, 7, 8], control: { kind: "range", choices: null, min: 2, max: 8 } },
26
+ { key: "pattern_findings", tier: "common", answers: [{"family":"patterns","prio":"P2","mode":"replace"}], family: "patterns", prio: "P2", lanes: ["orc","orc-pattern","orc-wiki"], gated_by: null, value: "on", default: "ask", is_overridden: true, is_shadowed: false, shadow_reason: null, desc: "Code-pattern gate on an FE/BE cache miss.", options: ["ask", "on", "off"], control: { kind: "enum", choices: ["ask", "on", "off"], min: null, max: null } },
27
+ { key: "generate_tests", tier: "common", answers: [{"family":"testing","prio":"P2","mode":"replace"}], family: "testing", prio: "P2", lanes: ["orc","orc-mini"], gated_by: null, value: false, default: false, is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Opt-in Phase 6.5: author test cases before ship.", options: ["true", "false"], control: { kind: "enum", choices: ["true", "false"], min: null, max: null } },
28
+ // ON, and PARTLY SHADOWED by the extra overlay above it — the animation
29
+ // §6.2 calls the single best argument for the project. Since v1.0.0 W3
30
+ // removed the Fable 5 block, the overlay is the ONLY way a registry key
31
+ // reaches `is_shadowed`, so this row is the fixture set's whole coverage of
32
+ // that state. Do not quietly make it false.
33
+ { key: "opus5_only", tier: "common", answers: [{"family":"executor-band","prio":"P1","mode":"replace"},{"family":"fixed-role-model","prio":"P1","mode":"replace"}], family: "executor-band", prio: "P1", lanes: ["orc","orc-analyze","orc-challenge","orc-claude","orc-diy","orc-doc","orc-fast","orc-mini","orc-pattern","orc-quick","orc-retro","orc-wiki"], gated_by: null, value: "true", default: false, is_overridden: true, is_shadowed: true, shadow_reason: "partly shadowed by extra_enabled[0,30), [30,55), [50,60), [60,70) are routed to a non-Claude worker; the quick-executor, doc-writer position is held by one too (not consulted here); every other score and position still resolves here", desc: "EVERY dispatched role uses ONE model — Opus 5 — with EFFORT as the cost dial.", options: ["true", "false"], control: { kind: "enum", choices: ["true", "false"], min: null, max: null } },
34
+ { key: "wiki_fresh_max", tier: "advanced", answers: [{"family":"wiki","prio":"P2","mode":"replace"}], family: "wiki", prio: "P2", lanes: ["orc","orc-fast","orc-learn","orc-wiki"], gated_by: null, value: 10, default: 10, is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Wiki freshness: commit distance < this → FRESH.", options: null, control: { kind: "int", choices: null, min: 1, max: null } },
35
+ { key: "wiki_aging_max", tier: "advanced", answers: [{"family":"wiki","prio":"P2","mode":"replace"}], family: "wiki", prio: "P2", lanes: ["orc","orc-fast","orc-learn","orc-wiki"], gated_by: null, value: 30, default: 30, is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Wiki freshness: commit distance <= this → AGING; beyond → STALE.", options: null, control: { kind: "int", choices: null, min: 1, max: null } },
36
+ { key: "log_dir", tier: "advanced", answers: [{"family":"paths","prio":"P2","mode":"replace"}], family: "paths", prio: "P2", lanes: ["context-combiner","orc","orc-aftermath","orc-analyze","orc-analyze-mini","orc-boundary","orc-brainstorm","orc-budget","orc-challenge","orc-claude","orc-diy","orc-doc","orc-explain","orc-export","orc-fast","orc-grill","orc-handoff","orc-learn","orc-mini","orc-pact","orc-pattern","orc-poly","orc-pr-driver","orc-pr-setup","orc-quick","orc-retro","orc-route","orc-verify","orc-wiki"], gated_by: null, value: ".claude/orc/logs", default: ".claude/orc/logs", is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Persistent trace folder (never auto-deleted).", options: null, control: { kind: "path", choices: null, min: null, max: null } },
37
+ { key: "retro_repo", tier: "advanced", answers: [{"family":"retro","prio":"P2","mode":"replace"}], family: "retro", prio: "P2", lanes: ["orc","orc-retro"], gated_by: null, value: "azure-id/orc", default: "azure-id/orc", is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "GitHub owner/repo that receives /orc-retro reports.", options: null, control: { kind: "repo", choices: null, min: null, max: null } },
35
38
  // v0.50.0 — the nine `orc extra` keys, copied from the live registry so the
36
39
  // shapes cannot drift. `extra_enabled` is TRUE here on purpose: an ARMED
37
40
  // subsystem is the state that needs designing.
38
- {"key": "extra_enabled", "tier": "common", "value": true, "default": false, "is_overridden": true, "is_shadowed": false, "shadow_reason": null, "desc": "Master gate for `orc extra` — dispatching a scored task to a non-Claude worker (DeepSeek, GLM, Kimi, a local Ollama, any OpenAI-/Anthropic-compatible endpoint you can name). NOTHING changes unless true, the fable5_enabled precedent. The orchestrator always stays Claude; what moves is who executes a slice. Every run that will cross the boundary PRINTS it at Phase 1 — routing work off Claude silently is the failure mode this whole subsystem is shaped around.", "options": ["true", "false"], "control": {"kind": "enum", "choices": ["true", "false"], "min": null, "max": null}},
39
- {"key": "extra_roles", "tier": "common", "value": "[executor]", "default": "[executor]", "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Which dispatched roles may go foreign (CSV). Executor only by default, deliberately: an executor's output is checked by the smoke gate, the TDD gate, the reviewer and the worktree-delta check, all of which are engine-blind — while a REVIEWER you cannot trust is worse than no reviewer at all, because it launders a finding nobody made.", "options": ["executor", "reviewer", "verifier", "analyst", "planner", "scout", "test-author", "doc-writer", "doc-checker"], "control": {"kind": "subset", "choices": ["executor", "reviewer", "verifier", "analyst", "planner", "scout", "test-author", "doc-writer", "doc-checker"], "min": null, "max": null}},
40
- {"key": "extra_risk_tasks", "tier": "common", "value": "off", "default": "off", "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Whether a task with a non-empty cited `risk[]` (auth, money, migration, security, concurrency, data-integrity) may leave Claude. OFF holds it on the Claude ladder whatever the route table says, and the preflight NAMES it as held back. ORC already refuses to send a refund-endpoint change to a cheap model; this keeps Extra from becoming the hole in that rule.", "options": ["off", "on"], "control": {"kind": "enum", "choices": ["off", "on"], "min": null, "max": null}},
41
- {"key": "extra_on_failure", "tier": "common", "value": "fallback", "default": "fallback", "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "What an unreachable endpoint, a 401, a 429 past backoff, a timeout or a malformed return does. `fallback` re-dispatches the task to the Claude band it would have had, ANNOUNCED, and the run continues. `stop` is for people who would rather stop than silently start paying Anthropic rates. A failed foreign dispatch is never a dead run either way.", "options": ["fallback", "stop"], "control": {"kind": "enum", "choices": ["fallback", "stop"], "min": null, "max": null}},
42
- {"key": "extra_max_concurrent", "tier": "common", "value": 1, "default": 1, "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Foreign dispatches in flight at once. Per-provider rate limits are undocumented in aggregate, so 1 is the honest default — a wave of 3 that 429s costs more in repairs than the parallelism saved.", "options": [1, 2, 3], "control": {"kind": "int", "choices": null, "min": 1, "max": null}},
43
- {"key": "extra_unlock", "tier": "common", "value": "per-run", "default": "per-run", "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "When a vault-stored key asks for its passphrase. `per-run` asks ONCE at the Phase-1 stop the lane already has, so an unattended wave can actually run. `per-dispatch` prompts every time and REFUSES to start an unattended wave, naming why — it is interactive-only by design. Irrelevant when the credential source is an environment variable, which is the recommended one.", "options": ["per-run", "per-dispatch"], "control": {"kind": "enum", "choices": ["per-run", "per-dispatch"], "min": null, "max": null}},
44
- {"key": "extra_vault_max_attempts", "tier": "advanced", "value": 10, "default": 10, "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Wrong passphrases before the encrypted key DELETES ITSELF. It is a key rather than a magic number so the count is inspectable and testable — NOT so it can be switched off; below 3 is refused. The counter stops someone at your keyboard; it does not stop someone who copies the vault file and tries offline, and scrypt's cost is the only defence there.", "options": null, "control": {"kind": "int", "choices": null, "min": 3, "max": null}},
45
- {"key": "extra_timeout_s", "tier": "advanced", "value": 900, "default": 900, "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Per-dispatch wall clock for a foreign worker. The child's own timeouts are DERIVED from this rather than set independently, so three timeouts cannot disagree about which one fires first.", "options": null, "control": {"kind": "int", "choices": null, "min": 30, "max": null}},
46
- {"key": "extra_verify_max_days", "tier": "advanced", "value": 7, "default": 7, "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Past this a profile's verification reads STALE and is re-pinged before wave 1. A STALE profile STILL ROUTES — a stale check is not a failed one (the /orc-pact UNCHECKABLE rule) — and freshness is computed on read, never stored.", "options": null, "control": {"kind": "int", "choices": null, "min": 1, "max": null}},
47
- { key: "orchestrator_model", tier: "advanced", value: "claude-opus-4-8", tierNote: null, default: "claude-opus-4-8", is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Main-session model (below Opus breaks the tier ladder).", options: null, control: { kind: "enum", choices: ["claude-opus-5", "claude-opus-4-8", "claude-sonnet-5"], min: null, max: null } },
41
+ {"key": "extra_enabled", "tier": "common", answers: [{"family":"executor-band","prio":"P0","mode":"overlay"},{"family":"fixed-role-model","prio":"P0","mode":"overlay"}], family: "executor-band", prio: "P0", lanes: ["orc","orc-boundary","orc-challenge","orc-diy","orc-doc","orc-fast","orc-mini","orc-quick","orc-wiki"], gated_by: null, "value": true, "default": false, "is_overridden": true, "is_shadowed": false, "shadow_reason": null, "desc": "Master gate for `orc extra` — dispatching a scored task to a non-Claude worker (DeepSeek, GLM, Kimi, a local Ollama, any OpenAI-/Anthropic-compatible endpoint you can name). NOTHING changes unless true. The orchestrator always stays Claude; what moves is who executes a slice. Every run that will cross the boundary PRINTS it at Phase 1 — routing work off Claude silently is the failure mode this whole subsystem is shaped around.", "options": ["true", "false"], "control": {"kind": "enum", "choices": ["true", "false"], "min": null, "max": null}},
42
+ {"key": "extra_roles", "tier": "common", answers: [{"family":"extra","prio":"P2","mode":"replace"}], family: "extra", prio: "P2", lanes: ["orc-doc","orc-wiki"], gated_by: "extra_enabled", "value": "[executor]", "default": "[executor]", "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Which dispatched roles may go foreign (CSV). Executor only by default, deliberately: an executor's output is checked by the smoke gate, the TDD gate, the reviewer and the worktree-delta check, all of which are engine-blind — while a REVIEWER you cannot trust is worse than no reviewer at all, because it launders a finding nobody made.", "options": ["executor", "reviewer", "verifier", "analyst", "planner", "scout", "test-author", "doc-writer", "doc-checker"], "control": {"kind": "subset", "choices": ["executor", "reviewer", "verifier", "analyst", "planner", "scout", "test-author", "doc-writer", "doc-checker"], "min": null, "max": null}},
43
+ {"key": "extra_risk_tasks", "tier": "common", answers: [{"family":"extra","prio":"P2","mode":"replace"}], family: "extra", prio: "P2", lanes: ["orc","orc-diy","orc-mini"], gated_by: "extra_enabled", "value": "off", "default": "off", "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Whether a task with a non-empty cited `risk[]` (auth, money, migration, security, concurrency, data-integrity) may leave Claude. OFF holds it on the Claude ladder whatever the route table says, and the preflight NAMES it as held back. ORC already refuses to send a refund-endpoint change to a cheap model; this keeps Extra from becoming the hole in that rule.", "options": ["off", "on"], "control": {"kind": "enum", "choices": ["off", "on"], "min": null, "max": null}},
44
+ {"key": "extra_on_failure", "tier": "common", answers: [{"family":"extra","prio":"P2","mode":"replace"}], family: "extra", prio: "P2", lanes: ["orc-quick","orc-wiki"], gated_by: "extra_enabled", "value": "fallback", "default": "fallback", "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "What an unreachable endpoint, a 401, a 429 past backoff, a timeout or a malformed return does. `fallback` re-dispatches the task to the Claude band it would have had, ANNOUNCED, and the run continues. `stop` is for people who would rather stop than silently start paying Anthropic rates. A failed foreign dispatch is never a dead run either way.", "options": ["fallback", "stop"], "control": {"kind": "enum", "choices": ["fallback", "stop"], "min": null, "max": null}},
45
+ {"key": "extra_max_concurrent", "tier": "common", answers: [{"family":"extra","prio":"P2","mode":"replace"}], family: "extra", prio: "P2", lanes: [], gated_by: "extra_enabled", "value": 1, "default": 1, "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Foreign dispatches in flight at once. Per-provider rate limits are undocumented in aggregate, so 1 is the honest default — a wave of 3 that 429s costs more in repairs than the parallelism saved.", "options": [1, 2, 3], "control": {"kind": "int", "choices": null, "min": 1, "max": null}},
46
+ {"key": "extra_unlock", "tier": "common", answers: [{"family":"extra","prio":"P2","mode":"replace"}], family: "extra", prio: "P2", lanes: [], gated_by: "extra_enabled", "value": "per-run", "default": "per-run", "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "When a vault-stored key asks for its passphrase. `per-run` asks ONCE at the Phase-1 stop the lane already has, so an unattended wave can actually run. `per-dispatch` prompts every time and REFUSES to start an unattended wave, naming why — it is interactive-only by design. Irrelevant when the credential source is an environment variable, which is the recommended one.", "options": ["per-run", "per-dispatch"], "control": {"kind": "enum", "choices": ["per-run", "per-dispatch"], "min": null, "max": null}},
47
+ {"key": "extra_vault_max_attempts", "tier": "advanced", answers: [{"family":"extra","prio":"P2","mode":"replace"}], family: "extra", prio: "P2", lanes: [], gated_by: "extra_enabled", "value": 10, "default": 10, "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Wrong passphrases before the encrypted key DELETES ITSELF. It is a key rather than a magic number so the count is inspectable and testable — NOT so it can be switched off; below 3 is refused. The counter stops someone at your keyboard; it does not stop someone who copies the vault file and tries offline, and scrypt's cost is the only defence there.", "options": null, "control": {"kind": "int", "choices": null, "min": 3, "max": null}},
48
+ {"key": "extra_timeout_s", "tier": "advanced", answers: [{"family":"extra","prio":"P2","mode":"replace"}], family: "extra", prio: "P2", lanes: [], gated_by: "extra_enabled", "value": 900, "default": 900, "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Per-dispatch wall clock for a foreign worker. The child's own timeouts are DERIVED from this rather than set independently, so three timeouts cannot disagree about which one fires first.", "options": null, "control": {"kind": "int", "choices": null, "min": 30, "max": null}},
49
+ {"key": "extra_verify_max_days", "tier": "advanced", answers: [{"family":"extra","prio":"P2","mode":"replace"}], family: "extra", prio: "P2", lanes: [], gated_by: "extra_enabled", "value": 7, "default": 7, "is_overridden": false, "is_shadowed": false, "shadow_reason": null, "desc": "Past this a profile's verification reads STALE and is re-pinged before wave 1. A STALE profile STILL ROUTES — a stale check is not a failed one (the /orc-pact UNCHECKABLE rule) — and freshness is computed on read, never stored.", "options": null, "control": {"kind": "int", "choices": null, "min": 1, "max": null}},
50
+ { key: "orchestrator_model", tier: "advanced", answers: [{"family":"session","prio":"P2","mode":"replace"}], family: "session", prio: "P2", lanes: ["orc"], gated_by: null, value: "claude-opus-4-8", tierNote: null, default: "claude-opus-4-8", is_overridden: false, is_shadowed: false, shadow_reason: null, desc: "Main-session model (below Opus breaks the tier ladder).", options: null, control: { kind: "enum", choices: ["claude-opus-5", "claude-opus-4-8", "claude-sonnet-5"], min: null, max: null } },
48
51
  ],
49
52
  // The registry-less, hand-written key — read-only everywhere, and shadowed here.
50
53
  hand_edited: [
51
- { key: "rubric_bands_override", value: "[[0,50,'orc-executor-sonnet-5-high'],[50,100,'orc-executor-opus-5-high']]", is_shadowed: true, shadow_reason: "shadowed by opus5_only — executors use the fixed 3-band Opus 5 ladder", editable: false },
54
+ { key: "rubric_bands_override", value: "[[0,50,'orc-executor-sonnet-5-high'],[50,100,'orc-executor-opus-5-high']]", is_shadowed: true, shadow_reason: "shadowed by opus5_only — executors use the fixed 2-band Opus 5 ladder", editable: false },
52
55
  ],
53
56
  legacy_keys: [{ key: "opus5_executor_only", renamed_to: "opus5_only" }],
57
+ // A key that was REMOVED, not renamed — the ugly state `--fixtures` exists to
58
+ // carry. You cannot design the "still on disk, no longer read" row against a
59
+ // clean config, and a panel that renders it as an editable setting is the
60
+ // failure this field prevents.
61
+ retired_keys: [
62
+ {
63
+ key: "fable5_enabled",
64
+ value: "true",
65
+ removed_in: "1.0.0",
66
+ why: "the Fable 5 role override was removed — every role dispatches its shipped Claude agent, or the Opus 5 variant under opus5_only",
67
+ },
68
+ ],
54
69
  score_table: {
55
70
  active: "opus5_only",
56
71
  default: [
@@ -58,17 +73,229 @@ const config = {
58
73
  { from: 30, to: 40, inclusive_to: false, agent: "orc-executor-sonnet-4-6-med" },
59
74
  { from: 40, to: 55, inclusive_to: false, agent: "orc-executor-sonnet-4-6-high" },
60
75
  { from: 55, to: 65, inclusive_to: false, agent: "orc-executor-sonnet-5-high" },
61
- { from: 65, to: 70, inclusive_to: false, agent: "orc-executor-opus-4-7-med" },
62
- { from: 70, to: 80, inclusive_to: false, agent: "orc-executor-opus-4-7-high" },
63
- { from: 80, to: 90, inclusive_to: false, agent: "orc-executor-opus-4-8-high" },
64
- { from: 90, to: 100, inclusive_to: true, agent: "orc-executor-opus-5-high" },
76
+ { from: 65, to: 90, inclusive_to: false, agent: "orc-executor-opus-5-low" },
77
+ { from: 90, to: 100, inclusive_to: true, agent: "orc-executor-opus-5-med" },
65
78
  ],
66
79
  opus5_only: [
67
- { from: 0, to: 40, inclusive_to: false, agent: "orc-executor-opus-5-low" },
68
- { from: 40, to: 80, inclusive_to: false, agent: "orc-executor-opus-5-med" },
69
- { from: 80, to: 100, inclusive_to: true, agent: "orc-executor-opus-5-high" },
80
+ { from: 0, to: 90, inclusive_to: false, agent: "orc-executor-opus-5-low" },
81
+ { from: 90, to: 100, inclusive_to: true, agent: "orc-executor-opus-5-med" },
70
82
  ],
71
83
  },
84
+ families: {
85
+ "executor-band": {
86
+ "contested": true,
87
+ "question": "which model executes a SCORED task",
88
+ "ranks": [
89
+ {
90
+ "prio": "P0",
91
+ "key": "extra_enabled",
92
+ "mode": "overlay"
93
+ },
94
+ {
95
+ "prio": "P1",
96
+ "key": "opus5_only",
97
+ "mode": "replace"
98
+ },
99
+ {
100
+ "prio": "P2",
101
+ "key": "rubric_bands_override",
102
+ "mode": "replace",
103
+ "registry_less": true,
104
+ "shadow_note": "shadowed by {by} — executors use the fixed 2-band Opus 5 ladder"
105
+ },
106
+ {
107
+ "prio": "P3",
108
+ "key": null,
109
+ "terminal": "the shipped score→model table"
110
+ }
111
+ ]
112
+ },
113
+ "fixed-role-model": {
114
+ "contested": true,
115
+ "question": "which model runs a role that has no score",
116
+ "ranks": [
117
+ {
118
+ "prio": "P0",
119
+ "key": "extra_enabled",
120
+ "mode": "overlay"
121
+ },
122
+ {
123
+ "prio": "P1",
124
+ "key": "opus5_only",
125
+ "mode": "replace"
126
+ },
127
+ {
128
+ "prio": "P2",
129
+ "key": null,
130
+ "terminal": "the agent shipped for that position"
131
+ }
132
+ ]
133
+ },
134
+ "waves": {
135
+ "contested": false,
136
+ "question": "how a run is broken into waves and when it pauses"
137
+ },
138
+ "scoring": {
139
+ "contested": false,
140
+ "question": "how finely a task is scored"
141
+ },
142
+ "analysis": {
143
+ "contested": false,
144
+ "question": "how wide the analyst sweeps before planning"
145
+ },
146
+ "testing": {
147
+ "contested": false,
148
+ "question": "which tests a run writes, and how long it repairs"
149
+ },
150
+ "patterns": {
151
+ "contested": false,
152
+ "question": "when the project's code conventions are learned"
153
+ },
154
+ "gotchas": {
155
+ "contested": false,
156
+ "question": "what repair memory is kept and injected"
157
+ },
158
+ "security": {
159
+ "contested": false,
160
+ "question": "when a security pass runs"
161
+ },
162
+ "mock": {
163
+ "contested": false,
164
+ "question": "when a runnable mocked example is produced"
165
+ },
166
+ "pr": {
167
+ "contested": false,
168
+ "question": "when a change ships as a stack instead of one PR"
169
+ },
170
+ "extra": {
171
+ "contested": false,
172
+ "question": "how a foreign dispatch behaves once extra is on"
173
+ },
174
+ "pact": {
175
+ "contested": false,
176
+ "question": "what a drifted promise does to a run"
177
+ },
178
+ "boundary": {
179
+ "contested": false,
180
+ "question": "what a refused area does to a wave"
181
+ },
182
+ "handoff": {
183
+ "contested": false,
184
+ "question": "whether a non-engineer may write a graded surface"
185
+ },
186
+ "budget": {
187
+ "contested": false,
188
+ "question": "how a cost forecast is computed and shown"
189
+ },
190
+ "aftermath": {
191
+ "contested": false,
192
+ "question": "how far back a run is graded from the repo's future"
193
+ },
194
+ "challenge": {
195
+ "contested": false,
196
+ "question": "what counts as a pass, and which lenses run"
197
+ },
198
+ "doc": {
199
+ "contested": false,
200
+ "question": "how a long document is written and checked"
201
+ },
202
+ "wiki": {
203
+ "contested": false,
204
+ "question": "how the project wiki is scanned and when it is stale"
205
+ },
206
+ "crosslink": {
207
+ "contested": false,
208
+ "question": "when a peer repo's wiki reads stale"
209
+ },
210
+ "retro": {
211
+ "contested": false,
212
+ "question": "where a retro is delivered"
213
+ },
214
+ "paths": {
215
+ "contested": false,
216
+ "question": "where ORC writes on disk"
217
+ },
218
+ "session": {
219
+ "contested": false,
220
+ "question": "what the main session itself runs as"
221
+ }
222
+ },
223
+ // THE FAMILY TABLE RESOLVED (v1.0.0 W16), and the state set is why it is here.
224
+ // `families` above is the static registry; this is what those ranks actually
225
+ // did. Shapes copied from `orc config list --json`'s `families_resolved`.
226
+ //
227
+ // ONE OF EVERY REACHABLE STATE, per this folder's standing rule. `demoted` is
228
+ // the ugly one and the reason the fixture is shaped this way at all: you
229
+ // cannot design a demotion row against a project where nothing was ever
230
+ // demoted, and the wording has to carry the run, the profiles and the command
231
+ // that clears it.
232
+ //
233
+ // TWO of the six states are DELIBERATELY not here, each because the real CLI
234
+ // could not emit it either — a fixture carrying a state its own command
235
+ // cannot produce is a fixture lying about the thing it stands in for.
236
+ //
237
+ // `inert` — inertness is a fact about a LANE ("/orc-quick does not read
238
+ // this"), and `families_resolved` resolves project-wide with no
239
+ // lane. It IS on this panel, on the per-key rows, where
240
+ // `state: "inert"` genuinely occurs; `orc lane config <lane>
241
+ // --json` is the command that produces it in a family.
242
+ // `absent` — a rank is `absent` only when it was CONSULTED and declined.
243
+ // Here `opus5_only` is on and resolves at P1, so everything
244
+ // below it is `not-read` instead. It is the state a project with
245
+ // nothing configured shows for every rank — the default `orc ui`
246
+ // experience — and it renders as a plain chip exactly like
247
+ // `not-read`, so there is no styling it hides.
248
+ //
249
+ // The legend still shows the CLI's whole closed set, because that is what
250
+ // `rank_states` publishes and the legend's job is to explain the vocabulary,
251
+ // not to inventory this page.
252
+ families_resolved: {
253
+ "executor-band": {
254
+ contested: true,
255
+ question: "which model executes a SCORED task",
256
+ resolved_by: "opus5_only",
257
+ resolved_at: "P1",
258
+ inert: false,
259
+ inert_reason: null,
260
+ ranks: [
261
+ {
262
+ prio: "P0",
263
+ key: "extra_enabled",
264
+ terminal: null,
265
+ state: "demoted",
266
+ why: 'deepseek demoted for run add-oauth-login — 2 consecutive stalled dispatches. 1 row(s) on another profile still route. orc extra promote add-oauth-login --reason "<why>"',
267
+ },
268
+ { prio: "P1", key: "opus5_only", terminal: null, state: "resolved", why: null },
269
+ { prio: "P2", key: "rubric_bands_override", terminal: null, state: "not-read", why: "a higher rank resolved" },
270
+ { prio: "P3", key: null, terminal: "the shipped score→model table", state: "not-read", why: "a higher rank resolved" },
271
+ ],
272
+ },
273
+ "fixed-role-model": {
274
+ contested: true,
275
+ question: "which model runs a role that has no score",
276
+ // `partly-resolved` does NOT set `resolved_by` — an overlay takes only
277
+ // the positions its slot rows name, so the ladder carries on and the rank
278
+ // BELOW it is the one that answered. Getting this wrong in a fixture
279
+ // would teach the panel to render a contradiction.
280
+ resolved_by: "opus5_only",
281
+ resolved_at: "P1",
282
+ inert: false,
283
+ inert_reason: null,
284
+ ranks: [
285
+ {
286
+ prio: "P0",
287
+ key: "extra_enabled",
288
+ terminal: null,
289
+ state: "partly-resolved",
290
+ why: "the quick-executor and doc-writer positions are held by a route row; every other position falls through",
291
+ },
292
+ { prio: "P1", key: "opus5_only", terminal: null, state: "resolved", why: null },
293
+ { prio: "P2", key: null, terminal: "the agent shipped for that position", state: "not-read", why: "a higher rank resolved" },
294
+ ],
295
+ },
296
+ },
297
+ // The CLI's closed set, published so the legend never invents a word.
298
+ rank_states: ["resolved", "partly-resolved", "not-read", "inert", "demoted", "absent"],
72
299
  behavior_trace: { always_on: true, configurable_key: "log_dir" },
73
300
  };
74
301
 
@@ -48,14 +48,14 @@ const budgetForecast = {
48
48
  price_table: { as_of: "2026-08-01", age_days: 9, stale: false, path: "bin/pricing.json" },
49
49
  quota: { available: true, plan: "max20", label: "Max 20x", window_pct: 18.2, weekly_pct: 4.1 },
50
50
  // A task at CONTEXT RISK — the state that cannot be designed on a small plan.
51
- context_risk: [{ task: "T12", agent: "orc-executor-opus-5-high", peak: 189000, window: 200000, pct: 95 }],
51
+ context_risk: [{ task: "T12", agent: "orc-executor-opus-5-med", peak: 189000, window: 200000, pct: 95 }],
52
52
  bands: [
53
53
  { band: "[0,30)", agent: "orc-executor-haiku-4-5", count: 2, tasks: ["T01", "T02"], samples: 9, p50: { input: 1200, cache_write: 6400, cache_read: 11800, output: 900 }, p90: { input: 1800, cache_write: 9200, cache_read: 17000, output: 1400 } },
54
54
  { band: "[40,55)", agent: "orc-executor-sonnet-4-6-high", count: 3, tasks: ["T03", "T05", "T07"], samples: 12, p50: { input: 7800, cache_write: 52100, cache_read: 104000, output: 8400 }, p90: { input: 11000, cache_write: 75000, cache_read: 150000, output: 12000 } },
55
- { band: "[70,80)", agent: "orc-executor-opus-4-7-high", count: 1, tasks: ["T04"], samples: 6, p50: { input: 5700, cache_write: 40200, cache_read: 81000, output: 9300 }, p90: { input: 8100, cache_write: 58000, cache_read: 117000, output: 13400 } },
55
+ { band: "[65,90)", agent: "orc-executor-opus-5-low", count: 1, tasks: ["T04"], samples: 6, p50: { input: 5700, cache_write: 40200, cache_read: 81000, output: 9300 }, p90: { input: 8100, cache_write: 58000, cache_read: 117000, output: 13400 } },
56
56
  // A band with insufficient history — the low-confidence warning is not
57
57
  // optional chrome, so the fixture has to be able to trigger it.
58
- { band: "[90,100]", agent: "orc-executor-opus-5-high", count: 1, tasks: ["T12"], samples: 2, p50: { input: 9100, cache_write: 61000, cache_read: 128000, output: 17000 }, p90: { input: 14000, cache_write: 94000, cache_read: 198000, output: 26000 } },
58
+ { band: "[90,100]", agent: "orc-executor-opus-5-med", count: 1, tasks: ["T12"], samples: 2, p50: { input: 9100, cache_write: 61000, cache_read: 128000, output: 17000 }, p90: { input: 14000, cache_write: 94000, cache_read: 198000, output: 26000 } },
59
59
  ],
60
60
  fixed_roles: [
61
61
  { role: "orc-system-analyst-opus-5-high", samples: 11, p50: { input: 6100, cache_write: 41000, cache_read: 82000, output: 9000 }, p90: { input: 8600, cache_write: 58000, cache_read: 116000, output: 13000 } },