@azure-id/orc 0.56.1 → 1.1.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 (162) hide show
  1. package/CHANGELOG.md +219 -0
  2. package/README-id.md +49 -107
  3. package/README.md +694 -719
  4. package/bin/build-agents.js +18 -11
  5. package/bin/cli.js +33699 -29855
  6. package/bin/onboarding-content.js +0 -3
  7. package/bin/test-run.js +491 -0
  8. package/bin/verify-contracts.js +4330 -3277
  9. package/bin/verify-package.js +76 -6
  10. package/bin/webui/api.js +1201 -1163
  11. package/bin/webui/app.html +210 -198
  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/css/panels/wait.css +123 -0
  17. package/bin/webui/fixtures/extra.js +2036 -1934
  18. package/bin/webui/fixtures/flow.js +2 -2
  19. package/bin/webui/fixtures/index.js +510 -486
  20. package/bin/webui/fixtures/lanes.js +218 -0
  21. package/bin/webui/fixtures/settings.js +261 -34
  22. package/bin/webui/fixtures/stats.js +3 -3
  23. package/bin/webui/fixtures/wait.js +97 -0
  24. package/bin/webui/i18n/TERMS.md +135 -134
  25. package/bin/webui/i18n/en/extra.json +345 -313
  26. package/bin/webui/i18n/en/lanes.json +29 -0
  27. package/bin/webui/i18n/en/nav.json +21 -19
  28. package/bin/webui/i18n/en/overview.json +2 -0
  29. package/bin/webui/i18n/en/settings.json +16 -5
  30. package/bin/webui/i18n/en/wait.json +41 -0
  31. package/bin/webui/i18n/id/extra.json +345 -313
  32. package/bin/webui/i18n/id/lanes.json +29 -0
  33. package/bin/webui/i18n/id/nav.json +21 -19
  34. package/bin/webui/i18n/id/overview.json +2 -0
  35. package/bin/webui/i18n/id/settings.json +15 -4
  36. package/bin/webui/i18n/id/wait.json +41 -0
  37. package/bin/webui/js/01-i18n.js +151 -149
  38. package/bin/webui/js/panels/extra.js +3199 -3011
  39. package/bin/webui/js/panels/lanes.js +259 -0
  40. package/bin/webui/js/panels/overview.js +10 -0
  41. package/bin/webui/js/panels/settings.js +149 -3
  42. package/bin/webui/js/panels/wait.js +253 -0
  43. package/package.json +39 -39
  44. package/templates/agents/MODEL-MAPPING.md +23 -35
  45. package/templates/agents/orc-executor-opus-4-7-high.md +1 -1
  46. package/templates/agents/orc-executor-opus-4-7-med.md +1 -1
  47. package/templates/agents/orc-executor-opus-4-8-high.md +1 -1
  48. package/templates/agents/orc-executor-opus-5-high.md +1 -1
  49. package/templates/agents/orc-executor-opus-5-low.md +1 -1
  50. package/templates/agents/orc-executor-opus-5-med.md +1 -1
  51. package/templates/agents/orc-retro-opus-5-med.md +73 -73
  52. package/templates/agents/orc-retro-sonnet-5-high.md +72 -72
  53. package/templates/agents/orc-trace-writer-haiku-4-5.md +107 -107
  54. package/templates/commands/orc-route.md +1 -1
  55. package/templates/commands/orc-wait.md +19 -0
  56. package/templates/commands/orc.md +1 -1
  57. package/templates/hooks/orc-statusline.js +39 -0
  58. package/templates/skills/_shared/README.md +7 -3
  59. package/templates/skills/_shared/config-precedence.md +198 -0
  60. package/templates/skills/_shared/drift-recovery.md +1 -1
  61. package/templates/skills/_shared/extra-dispatch.md +159 -7
  62. package/templates/skills/_shared/interview.md +1 -1
  63. package/templates/skills/_shared/opus5-only.md +9 -7
  64. package/templates/skills/_shared/phases/README.md +82 -0
  65. package/templates/skills/{orc/references → _shared/phases}/analyst-gates.md +15 -3
  66. package/templates/skills/_shared/phases/execution.md +143 -0
  67. package/templates/skills/{orc/references → _shared/phases}/house-rules.md +13 -1
  68. package/templates/skills/{orc/references → _shared/phases}/intake.md +15 -2
  69. package/templates/skills/_shared/phases/mock-example.md +56 -0
  70. package/templates/skills/{orc/references → _shared/phases}/plan-handoff.md +16 -3
  71. package/templates/skills/_shared/phases/planning.md +135 -0
  72. package/templates/skills/_shared/phases/preflight.md +98 -0
  73. package/templates/skills/_shared/phases/review.md +53 -0
  74. package/templates/skills/_shared/phases/scoring.md +65 -0
  75. package/templates/skills/{orc/references → _shared/phases}/security-checklist.md +12 -1
  76. package/templates/skills/_shared/phases/security.md +55 -0
  77. package/templates/skills/_shared/phases/ship.md +88 -0
  78. package/templates/skills/{orc/references/stop-and-resume.md → _shared/phases/stop-resume.md} +169 -160
  79. package/templates/skills/_shared/phases/summary.md +48 -0
  80. package/templates/skills/_shared/phases/testgen.md +51 -0
  81. package/templates/skills/{orc/references/trace-protocol.md → _shared/phases/trace.md} +49 -6
  82. package/templates/skills/_shared/phases/verify.md +70 -0
  83. package/templates/skills/{orc/references → _shared/phases}/wave-grouping.md +14 -2
  84. package/templates/skills/{orc/references → _shared/phases}/wiki-consult.md +13 -1
  85. package/templates/skills/_shared/read-ladder.md +48 -0
  86. package/templates/skills/_shared/wait.md +240 -0
  87. package/templates/skills/context-combiner/SKILL.md +214 -187
  88. package/templates/skills/orc/README.md +148 -150
  89. package/templates/skills/orc/SKILL.md +75 -358
  90. package/templates/skills/orc/config.md +137 -389
  91. package/templates/skills/orc/examples/full-run-mock.md +1 -1
  92. package/templates/skills/orc/references/effort-and-mode.md +16 -18
  93. package/templates/skills/orc/references/phases/intake.md +47 -0
  94. package/templates/skills/orc/references/phases/integration.md +19 -0
  95. package/templates/skills/orc/references/preflight-report.md +4 -4
  96. package/templates/skills/orc/references/ultra-mode.md +117 -123
  97. package/templates/skills/orc/schemas/planning-output.md +279 -279
  98. package/templates/skills/orc/subskills/orc-planner/SKILL.md +260 -264
  99. package/templates/skills/orc/subskills/orc-pr/stack-gate.md +4 -1
  100. package/templates/skills/orc-aftermath/SKILL.md +158 -136
  101. package/templates/skills/orc-analyze/SKILL.md +252 -220
  102. package/templates/skills/orc-analyze/references/branching.md +51 -51
  103. package/templates/skills/orc-analyze/references/thin-input.md +1 -1
  104. package/templates/skills/orc-analyze-mini/SKILL.md +128 -112
  105. package/templates/skills/orc-boundary/SKILL.md +249 -208
  106. package/templates/skills/orc-brainstorm/SKILL.md +377 -339
  107. package/templates/skills/orc-budget/SKILL.md +248 -225
  108. package/templates/skills/orc-challenge/README.md +1 -1
  109. package/templates/skills/orc-challenge/SKILL.md +298 -255
  110. package/templates/skills/orc-challenge/examples/council-full-roster.md +1 -1
  111. package/templates/skills/orc-claude/SKILL.md +221 -199
  112. package/templates/skills/orc-diy/README.md +2 -1
  113. package/templates/skills/orc-diy/SKILL.md +132 -68
  114. package/templates/skills/orc-diy/references/blocks/analyze.md +1 -1
  115. package/templates/skills/orc-diy/references/compile.md +21 -7
  116. package/templates/skills/orc-diy/references/flow-schema.md +2 -2
  117. package/templates/skills/orc-doc/SKILL.md +49 -7
  118. package/templates/skills/orc-explain/SKILL.md +24 -0
  119. package/templates/skills/orc-export/SKILL.md +31 -5
  120. package/templates/skills/orc-fast/SKILL.md +218 -185
  121. package/templates/skills/orc-grill/SKILL.md +238 -207
  122. package/templates/skills/orc-handoff/SKILL.md +223 -204
  123. package/templates/skills/orc-learn/SKILL.md +181 -156
  124. package/templates/skills/orc-mini/SKILL.md +47 -24
  125. package/templates/skills/orc-pact/SKILL.md +255 -218
  126. package/templates/skills/orc-pattern/SKILL.md +154 -124
  127. package/templates/skills/orc-poly/SKILL.md +242 -216
  128. package/templates/skills/orc-poly/references/gather.md +1 -1
  129. package/templates/skills/orc-pr-driver/SKILL.md +196 -167
  130. package/templates/skills/orc-pr-driver/references/orc-run-split.md +1 -1
  131. package/templates/skills/orc-pr-setup/SKILL.md +212 -184
  132. package/templates/skills/orc-quick/README.md +2 -2
  133. package/templates/skills/orc-quick/SKILL.md +51 -13
  134. package/templates/skills/orc-quick/references/dispatch-gate.md +2 -3
  135. package/templates/skills/orc-retro/SKILL.md +249 -222
  136. package/templates/skills/orc-retro/examples/retro-mock.md +171 -171
  137. package/templates/skills/orc-route/SKILL.md +188 -165
  138. package/templates/skills/orc-verify/SKILL.md +103 -84
  139. package/templates/skills/orc-wait/SKILL.md +163 -0
  140. package/templates/skills/orc-wiki/SKILL.md +60 -206
  141. package/templates/skills/orc-wiki/references/phases/phase-0.md +71 -0
  142. package/templates/skills/orc-wiki/references/phases/phase-1.md +35 -0
  143. package/templates/skills/orc-wiki/references/phases/phase-2.md +52 -0
  144. package/templates/skills/orc-wiki/references/phases/phase-3.md +57 -0
  145. package/templates/skills/orc-wiki/references/phases/phase-3c.md +36 -0
  146. package/templates/agents/orc-advisor-fable-5.md +0 -50
  147. package/templates/agents/orc-analyst-fable-5.md +0 -115
  148. package/templates/agents/orc-judge-fable-5.md +0 -79
  149. package/templates/agents/orc-planner-fable-5.md +0 -152
  150. package/templates/agents/orc-reviewer-fable-5.md +0 -57
  151. package/templates/skills/_shared/fable5-override.md +0 -56
  152. package/templates/skills/orc-diy/references/blocks/execution.md +0 -42
  153. package/templates/skills/orc-diy/references/blocks/mock-example.md +0 -22
  154. package/templates/skills/orc-diy/references/blocks/planning.md +0 -34
  155. package/templates/skills/orc-diy/references/blocks/review.md +0 -18
  156. package/templates/skills/orc-diy/references/blocks/scoring.md +0 -16
  157. package/templates/skills/orc-diy/references/blocks/security.md +0 -25
  158. package/templates/skills/orc-diy/references/blocks/ship.md +0 -25
  159. package/templates/skills/orc-diy/references/blocks/summary.md +0 -18
  160. package/templates/skills/orc-diy/references/blocks/testgen.md +0 -17
  161. package/templates/skills/orc-diy/references/blocks/trace.md +0 -28
  162. package/templates/skills/orc-diy/references/blocks/verify.md +0 -25
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ /* panels/wait.js — orc ui client
3
+ The usage window, and the wait that answers it.
4
+
5
+ THE PANEL DERIVES NOTHING. Not the state word, not which window is worst,
6
+ not the threshold, not a lane's checkpoint kind, not whether a wait is
7
+ running. It draws `orc usage check --json` and `orc wait … --json`. (The
8
+ Flow-stepper rule: a second idea of the mechanic is exactly the drift this
9
+ panel exists to make impossible.)
10
+
11
+ AND IT CANNOT START A WAIT. A wait lives in a Claude Code session, and
12
+ `orc ui` never runs a lane. What it can do is show the reading, show a wait
13
+ that is running, cancel one, and lift a block. Everything that COSTS a
14
+ decision — starting a wait, blocking a gate — is a copy-able command.
15
+
16
+ Loaded by app.html in the order its numeric prefix names. Classic script,
17
+ no import/export: an ES module import carries no query string, and every
18
+ static request here needs the per-launch session token. */
19
+
20
+ /* ------------------------------------------------------------------- WAIT */
21
+
22
+ // The CLI's own state words, and only those. A friendlier synonym would be a
23
+ // state that does not exist.
24
+ const USAGE_KIND = { ok: "ok", low: "warn", unknown: null };
25
+
26
+ PANELS.wait = function (host) {
27
+ head(host, t("wait.title"), t("wait.sub"));
28
+
29
+ section(
30
+ host,
31
+ () =>
32
+ Promise.all([
33
+ read("/api/usage").then((r) => r.data),
34
+ read("/api/wait/status").then((r) => r.data),
35
+ read("/api/wait/lanes").then((r) => r.data),
36
+ ]),
37
+ ([usage, status, lanes]) => {
38
+ const out = frag();
39
+ out.append(usageCard(usage));
40
+ out.append(runCard(status));
41
+ out.append(lanesCard(lanes));
42
+ out.append(settingsCard(usage));
43
+ return out;
44
+ }
45
+ );
46
+ };
47
+
48
+ // ── the reading ────────────────────────────────────────────────────────────
49
+ function usageCard(u) {
50
+ const c = card(t("wait.window"));
51
+ if (!u) return c;
52
+
53
+ // UNKNOWN IS A STATE, NOT A GAP. It gets the same card, the same size and a
54
+ // sentence saying a run is never stopped on it — because the alternative is a
55
+ // user believing the gate is watching when Claude Code sends no headers.
56
+ if (u.state === "unknown") {
57
+ const row = el("div", "row-actions");
58
+ row.append(chip(u.state, null));
59
+ c.append(row);
60
+ c.append(el("div", "note", u.reason || ""));
61
+ c.append(el("div", "note", u.note || ""));
62
+ c.append(gateNote(u));
63
+ return c;
64
+ }
65
+
66
+ const row = el("div", "row-actions");
67
+ row.append(chip(u.state, USAGE_KIND[u.state]));
68
+ if (u.worst) row.append(chip(t("wait.worst", { w: u.worst }), u.state === "low" ? "warn" : null));
69
+ if (typeof u.reading_age_minutes === "number")
70
+ row.append(chip(tn(u.reading_age_minutes, "wait.age"), null));
71
+ c.append(row);
72
+
73
+ const rows = [];
74
+ for (const w of [u.five_hour, u.seven_day]) {
75
+ if (!w) continue;
76
+ rows.push([
77
+ w.window,
78
+ // The bar is a WIDTH INSIDE the row, so nothing can fight it for space.
79
+ barFor(w),
80
+ ]);
81
+ }
82
+ const grid = el("div", "wait-windows");
83
+ for (const [label, node] of rows) {
84
+ const r = el("div", "wait-win");
85
+ r.append(el("span", "mono wait-win-label", label));
86
+ r.append(node);
87
+ grid.append(r);
88
+ }
89
+ c.append(grid);
90
+
91
+ // A context figure the CLI could not compute is an em dash, never a guess.
92
+ const ctx = el("div", "note");
93
+ ctx.textContent =
94
+ typeof u.context === "number"
95
+ ? t("wait.context", { n: String(u.context) })
96
+ : t("wait.contextUnknown");
97
+ c.append(ctx);
98
+ if (typeof u.context === "number" && u.context >= 70)
99
+ c.append(el("div", "note warn", t("wait.contextLarge")));
100
+
101
+ c.append(el("div", "note", u.note || ""));
102
+ c.append(gateNote(u));
103
+ return c;
104
+ }
105
+
106
+ function barFor(w) {
107
+ const wrap = el("div", "wait-bar-wrap");
108
+ const bar = el("div", "wait-bar" + (w.low ? " low" : ""));
109
+ const fill = el("div", "wait-bar-fill");
110
+ fill.style.width = Math.max(0, Math.min(100, w.used_percentage)) + "%";
111
+ bar.append(fill);
112
+ wrap.append(bar);
113
+ const txt = el("span", "wait-bar-text");
114
+ txt.textContent =
115
+ w.used_percentage +
116
+ "% · " +
117
+ t("wait.left", { n: String(w.remaining_percentage) }) +
118
+ (w.resets_in_minutes != null ? " · " + t("wait.resets", { t: mins(w.resets_in_minutes) }) : "");
119
+ wrap.append(txt);
120
+ return wrap;
121
+ }
122
+
123
+ const mins = (n) => (n < 60 ? n + "m" : Math.floor(n / 60) + "h" + (n % 60 ? (n % 60) + "m" : ""));
124
+
125
+ function gateNote(u) {
126
+ const n = el("div", "note");
127
+ n.textContent =
128
+ u.gate === "off"
129
+ ? t("wait.gateOff")
130
+ : t("wait.gateOn", { gate: u.gate, pct: String(u.stop_pct) });
131
+ return n;
132
+ }
133
+
134
+ // ── the run: a wait running, a block standing, or neither ──────────────────
135
+ function runCard(s) {
136
+ const c = card(t("wait.run"));
137
+ if (!s || !s.run) {
138
+ // KEEPS ITS SLOT. "No run in flight" is an answer.
139
+ c.append(empty(t("wait.noRun"), t("wait.noRunHint")));
140
+ c.append(laneCommand("/orc-wait 30", t("wait.startWhy")));
141
+ return c;
142
+ }
143
+
144
+ const row = el("div", "row-actions");
145
+ row.append(el("span", "mono", s.run));
146
+ if (s.waiting) row.append(chip(t("wait.waiting"), "warn", true));
147
+ if (s.blocked) row.append(chip(t("wait.blocked"), "bad"));
148
+ if (!s.waiting && !s.blocked) row.append(chip(t("wait.idle"), null));
149
+ c.append(row);
150
+
151
+ if (s.waiting) {
152
+ c.append(
153
+ el(
154
+ "div",
155
+ "note",
156
+ t("wait.hops", {
157
+ mode: s.mode || "?",
158
+ done: String(s.hops_done || 0),
159
+ planned: String(s.hops_planned || "?"),
160
+ ends: s.ends_at ? new Date(s.ends_at).toLocaleTimeString() : "?",
161
+ })
162
+ )
163
+ );
164
+ c.append(el("div", "note", t("wait.zeroTokens")));
165
+ if (s.cancel_requested) c.append(el("div", "note warn", t("wait.cancelPending")));
166
+ // FREE action → a real button.
167
+ else c.append(actionRow("wait.cancel", "/api/wait/cancel", { slug: s.run }, t("wait.cancelWhy")));
168
+ }
169
+
170
+ if (s.blocked) {
171
+ const b = el("div", "wait-block");
172
+ b.append(el("div", "wait-block-head", t("wait.blockHead")));
173
+ // The reason VERBATIM. It is the record that makes the risk the user's.
174
+ b.append(el("div", "wait-block-reason", s.block_reason || ""));
175
+ // The AGE is what keeps an old block from applying invisibly — there is no
176
+ // auto-expiry, so the panel must always show how old it is.
177
+ if (typeof s.block_age_minutes === "number")
178
+ b.append(el("div", "note", tn(s.block_age_minutes, "wait.blockAge")));
179
+ b.append(el("div", "note", t("wait.blockRisk")));
180
+ b.append(actionRow("wait.unblock", "/api/wait/unblock", { slug: s.run }, t("wait.unblockWhy")));
181
+ c.append(b);
182
+ } else {
183
+ // A block CANNOT be created here: it needs a reason typed in the moment.
184
+ c.append(laneCommand("/orc-wait block <reason>", t("wait.blockWhy")));
185
+ }
186
+ return c;
187
+ }
188
+
189
+ // NOTE the parameter name: `route` is the ROUTER's function, and shadowing it
190
+ // here made the post-action refresh call a string.
191
+ function actionRow(labelKey, endpoint, body, why) {
192
+ const wrap = el("div", null);
193
+ const row = el("div", "row-actions");
194
+ const b = el("button", "btn btn-sm", t(labelKey));
195
+ b.type = "button";
196
+ b.addEventListener("click", async () => {
197
+ b.disabled = true;
198
+ try {
199
+ const r = await post(endpoint, body);
200
+ toast(r && r.ok ? t("wait.done") : t("wait.failed"), r && r.ok ? "ok" : "bad");
201
+ route();
202
+ } catch (e) {
203
+ toast(t("wait.failed"), "bad", String(e));
204
+ b.disabled = false;
205
+ }
206
+ });
207
+ row.append(b);
208
+ wrap.append(row);
209
+ if (why) wrap.append(el("div", "note", why));
210
+ return wrap;
211
+ }
212
+
213
+ // ── which lanes support a wait ─────────────────────────────────────────────
214
+ function lanesCard(d) {
215
+ const c = card(t("wait.lanes"));
216
+ if (!d || !d.lanes) return c;
217
+ c.append(el("div", "note", t("wait.lanesWhy")));
218
+ const list = el("div", "wait-lanes");
219
+ for (const l of d.lanes) {
220
+ const r = el("div", "wait-lane");
221
+ r.append(el("span", "mono wait-lane-name", l.lane));
222
+ // `none` KEEPS ITS SLOT and reads as its own state, never as a blank.
223
+ r.append(chip(l.checkpoint, l.modes_differ ? "ok" : null));
224
+ r.append(el("span", "wait-lane-safe", l.safe_point));
225
+ r.append(el("div", "note wait-lane-detail", l.detail));
226
+ list.append(r);
227
+ }
228
+ c.append(list);
229
+ c.append(el("div", "note", d.note || ""));
230
+ return c;
231
+ }
232
+
233
+ // ── settings: read-only here, edited where every other key is edited ───────
234
+ function settingsCard(u) {
235
+ const c = card(t("wait.settings"));
236
+ c.append(
237
+ kvList([
238
+ ["usage_gate", u && u.gate ? u.gate : "—"],
239
+ ["usage_stop_pct", u && u.stop_pct != null ? String(u.stop_pct) : "—"],
240
+ ])
241
+ );
242
+ // A SECOND editor for keys Settings already stages would be a second idea of
243
+ // the same thing — the drift this panel exists to prevent. Route to the panel
244
+ // that can change it instead (the FINDING_ROUTE rule).
245
+ c.append(el("div", "note", t("wait.settingsWhy")));
246
+ const b = el("button", "btn btn-ghost btn-sm", t("wait.openSettings"));
247
+ b.type = "button";
248
+ b.addEventListener("click", () => (location.hash = "#/settings"));
249
+ const row = el("div", "row-actions");
250
+ row.append(b);
251
+ c.append(row);
252
+ return c;
253
+ }
package/package.json CHANGED
@@ -1,39 +1,39 @@
1
- {
2
- "name": "@azure-id/orc",
3
- "version": "0.56.1",
4
- "description": "ORC — an orchestrator skill constellation for Claude Code: intake, planning, scored parallel subagents, code-pattern matching, review, verify, ship, plus a project knowledge-base wiki.",
5
- "bin": {
6
- "orc": "bin/cli.js"
7
- },
8
- "files": [
9
- "README.md",
10
- "README-id.md",
11
- "CHANGELOG.md",
12
- "bin/",
13
- "mock-run/",
14
- "templates/"
15
- ],
16
- "scripts": {
17
- "postinstall": "node -e \"try{require('fs').accessSync(require('path').join(__dirname,'bin','cli.js'));console.log('\\nORC installed. Run: orc init (or orc init --global)\\n')}catch(e){console.error('\\n[orc] WARNING: bin/cli.js missing from this install — the repo/publish was incomplete. Reinstall from a complete source.\\n')}\"",
18
- "build:agents": "node bin/build-agents.js",
19
- "test": "node --test --test-concurrency=6 test/",
20
- "verify": "node bin/build-agents.js --check && node bin/verify-package.js && node bin/verify-contracts.js",
21
- "prepack": "node bin/build-agents.js --check && node bin/verify-package.js && node bin/verify-contracts.js && node --test --test-concurrency=6 test/"
22
- },
23
- "keywords": [
24
- "claude",
25
- "claude-code",
26
- "orchestrator",
27
- "skills",
28
- "agents",
29
- "ai"
30
- ],
31
- "license": "MIT",
32
- "engines": {
33
- "node": ">=18"
34
- },
35
- "repository": {
36
- "type": "git",
37
- "url": "github:azure-id/orc"
38
- }
39
- }
1
+ {
2
+ "name": "@azure-id/orc",
3
+ "version": "1.1.0",
4
+ "description": "ORC — an orchestrator skill constellation for Claude Code: intake, planning, scored parallel subagents, code-pattern matching, review, verify, ship, plus a project knowledge-base wiki.",
5
+ "bin": {
6
+ "orc": "bin/cli.js"
7
+ },
8
+ "files": [
9
+ "README.md",
10
+ "README-id.md",
11
+ "CHANGELOG.md",
12
+ "bin/",
13
+ "mock-run/",
14
+ "templates/"
15
+ ],
16
+ "scripts": {
17
+ "postinstall": "node -e \"try{require('fs').accessSync(require('path').join(__dirname,'bin','cli.js'));console.log('\\nORC installed. Run: orc init (or orc init --global)\\n')}catch(e){console.error('\\n[orc] WARNING: bin/cli.js missing from this install — the repo/publish was incomplete. Reinstall from a complete source.\\n')}\"",
18
+ "build:agents": "node bin/build-agents.js",
19
+ "test": "node bin/test-run.js",
20
+ "verify": "node bin/build-agents.js --check && node bin/verify-package.js && node bin/verify-contracts.js",
21
+ "prepack": "node bin/build-agents.js --check && node bin/verify-package.js && node bin/verify-contracts.js && node bin/test-run.js"
22
+ },
23
+ "keywords": [
24
+ "claude",
25
+ "claude-code",
26
+ "orchestrator",
27
+ "skills",
28
+ "agents",
29
+ "ai"
30
+ ],
31
+ "license": "MIT",
32
+ "engines": {
33
+ "node": ">=18"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "github:azure-id/orc"
38
+ }
39
+ }
@@ -3,7 +3,7 @@
3
3
  Single-role, model-specific agents. The orchestrator dispatches BY AGENT NAME —
4
4
  model is pinned in frontmatter, not requested in prose. No agent is multi-role.
5
5
 
6
- ## Executors (score-mapped by the single 8-band table in config.md)
6
+ ## Executors (score-mapped by the single 6-band table in config.md)
7
7
 
8
8
  | Score band | Agent | Model | Effort |
9
9
  |-----------|-------|-------|--------|
@@ -11,14 +11,20 @@ model is pinned in frontmatter, not requested in prose. No agent is multi-role.
11
11
  | [30,40) | orc-executor-sonnet-4-6-med | claude-sonnet-4-6 | medium |
12
12
  | [40,55) | orc-executor-sonnet-4-6-high | claude-sonnet-4-6 | high |
13
13
  | [55,65) | orc-executor-sonnet-5-high | claude-sonnet-5 | high |
14
- | [65,70) | orc-executor-opus-4-7-med | claude-opus-4-7 | medium |
15
- | [70,80) | orc-executor-opus-4-7-high | claude-opus-4-7 | high |
16
- | [80,90) | orc-executor-opus-4-8-high | claude-opus-4-8 | high |
17
- | [90,100] | orc-executor-opus-5-high | claude-opus-5 | high |
14
+ | [65,90) | orc-executor-opus-5-low | claude-opus-5 | low |
15
+ | [90,100] | orc-executor-opus-5-med | claude-opus-5 | medium |
18
16
 
19
- Score→executor mapping lives in config.md (one canonical 8-band table;
17
+ Score→executor mapping lives in config.md (one canonical 6-band table;
20
18
  `rubric_bands` is granularity only, not a preset selector).
21
19
 
20
+ **Executors no band names — they still ship.**
21
+ `orc-executor-opus-4-7-med`, `orc-executor-opus-4-7-high`,
22
+ `orc-executor-opus-4-8-high` and `orc-executor-opus-5-high` are still generated
23
+ and still installed. Since v1.0.0 they are reachable only when a user names one
24
+ explicitly: `rubric_bands_override`, `orc diy`'s `fixed_executor`, or
25
+ `extra_fallback_agent`. They are not deleted because a table change is not a
26
+ model change, and an agent's model change is always a RENAME.
27
+
22
28
  ## Fixed-role agents
23
29
 
24
30
  | Agent | Model | Effort | Role |
@@ -36,8 +42,8 @@ Score→executor mapping lives in config.md (one canonical 8-band table;
36
42
  | orc-retro-sonnet-5-high | claude-sonnet-5 | high | mine behavior traces → calibration report (/orc-retro; read-only) |
37
43
  | orc-wiki-scanner-opus-4-8-high | claude-opus-4-8 | high | scan ONE wiki coverage area → evidence-anchored doc body + crosslink tags (/orc-wiki only; read-only against the project). The DEEP half of the v0.46.0 tier ladder: first scan · STRUCTURAL · wide delta · a new exported symbol |
38
44
  | orc-wiki-scanner-sonnet-5-high | claude-sonnet-5 | high | the LIGHT half of the same ladder — an existing doc whose covered files moved by a small, no-new-surface delta. IDENTICAL return contract; it escalates with `needs_context` rather than under-delivering. Never used for a first scan |
39
- | orc-executor-opus-5-med | claude-opus-5 | medium | `opus5_only` ladder ONLY — the [40,80) band (never dispatched by the default 8-band table) |
40
- | orc-executor-opus-5-low | claude-opus-5 | low | `opus5_only` ladder ONLY the [0,40) band, and the forced mini/fast executor (never dispatched by the default 8-band table) |
45
+ | orc-executor-opus-5-med | claude-opus-5 | medium | the `[90,100]` band in BOTH tables |
46
+ | orc-executor-opus-5-low | claude-opus-5 | low | the default table's `[65,90)`, `opus5_only`'s `[0,90)`, and the forced mini/fast executor |
41
47
  | orc-advisor-opus-5-xhigh | claude-opus-5 | xhigh | ultra Phase U0 advisory brief + rubric + clarification questions (read-only; /orc-ultra only) |
42
48
  | orc-judge-opus-5-xhigh | claude-opus-5 | xhigh | ultra judgment gates — analysis / plan / implementation (read-only; /orc-ultra only) |
43
49
  | orc-learn-writer-opus-5-low | claude-opus-5 | low | deepen ONE feature → learning-docs/<slug>/ (/orc-learn only; git-ignored output) |
@@ -58,15 +64,14 @@ Score→executor mapping lives in config.md (one canonical 8-band table;
58
64
 
59
65
  `opus5_only` FORCES every dispatched role onto `claude-opus-5`, with effort as
60
66
  the only cost dial. Each agent below replaces its default with the same slice
61
- and the same return contract. Effort is PINNED per role (unlike `fable5_effort`,
62
- no CLI rewrites these). Full mapping + precedence:
67
+ and the same return contract. Effort is PINNED per role no CLI rewrites
68
+ these. Full mapping + precedence:
63
69
  `../skills/_shared/opus5-only.md`.
64
70
 
65
71
  | Agent | Model | Effort | Replaces |
66
72
  |-------|-------|--------|----------|
67
- | orc-executor-opus-5-low | claude-opus-5 | low | the `[0,40)` band · orc-mini's and orc-fast's fixed executor |
68
- | orc-executor-opus-5-med | claude-opus-5 | medium | the `[40,80)` band |
69
- | orc-executor-opus-5-high | claude-opus-5 | high | the `[80,100]` band |
73
+ | orc-executor-opus-5-low | claude-opus-5 | low | the `[0,90)` band · orc-mini's and orc-fast's fixed executor |
74
+ | orc-executor-opus-5-med | claude-opus-5 | medium | the `[90,100]` band |
70
75
  | orc-analyze-mini-opus-5-med | claude-opus-5 | medium | orc-analyze-mini-sonnet-5-high |
71
76
  | orc-planner-mini-opus-5-med | claude-opus-5 | medium | orc-planner-mini-sonnet-5-high |
72
77
  | orc-scout-opus-5-low | claude-opus-5 | low | orc-scout-sonnet-4-6-high |
@@ -80,22 +85,6 @@ verifier, test-author, combiner, learn-writer, advisor, judge — dispatch
80
85
  unchanged under this mode. **Never forced:** `orc-trace-writer-haiku-4-5` (it
81
86
  transcribes a packet, no reasoning) and orc-diy (its table is compile-owned).
82
87
 
83
- ## Fable 5 role-override agents (hard-gated; dispatched only when configured)
84
-
85
- *(Entirely INERT while `opus5_only: true` — that mode outranks this one.)*
86
-
87
- Used ONLY when `fable5_enabled: true` and the role is in `fable5_roles` — each
88
- replaces its default role agent with the same slice/contract. Effort defaults to
89
- `medium` and is rewritten in-place by `orc config set fable5_effort <v>`.
90
-
91
- | Agent | Model | Effort | Replaces |
92
- |-------|-------|--------|----------|
93
- | orc-analyst-fable-5 | claude-fable-5 | fable5_effort | orc-system-analyst-opus-5-high |
94
- | orc-planner-fable-5 | claude-fable-5 | fable5_effort | orc-planner-opus-5-med |
95
- | orc-advisor-fable-5 | claude-fable-5 | fable5_effort | orc-advisor-opus-5-xhigh (ultra) |
96
- | orc-judge-fable-5 | claude-fable-5 | fable5_effort | orc-judge-opus-5-xhigh (ultra) |
97
- | orc-reviewer-fable-5 | claude-fable-5 | fable5_effort | orc-reviewer-opus-5-med |
98
-
99
88
  Mini execution reuses orc-executor-sonnet-5-high. Fast-lane (orc-fast)
100
89
  execution reuses orc-executor-sonnet-4-6-high — no dedicated agent. Under
101
90
  `opus5_only` both reuse orc-executor-opus-5-low.
@@ -114,8 +103,7 @@ agent to spawn before EVERY dispatch, and reuses shipped agents:
114
103
  The only dispatch it does not re-ask is build-repair rounds 1–2, which reuse the
115
104
  executor the user already chose for that entry; round 3 asks again.
116
105
 
117
- **`opus5_only`, `fable5_enabled`/`fable5_roles`, and `rubric_bands_override` are
118
- all INERT in this lane** — they would silently collapse the user's choice. It is
106
+ **`opus5_only` and `rubric_bands_override` are both INERT in this lane** — they would silently collapse the user's choice. It is
119
107
  the one exception to `opus5_only`'s otherwise flat precedence. See
120
108
  `skills/_shared/opus5-only.md` and `skills/orc-quick/references/dispatch-gate.md`.
121
109
 
@@ -136,12 +124,12 @@ The orchestrator (main session) is NOT an agent file.
136
124
  Model IDs use the Platform/API dateless format (confirmed at
137
125
  platform.claude.com/docs/en/about-claude/models/model-ids-and-versions):
138
126
  claude-haiku-4-5, claude-sonnet-4-6, claude-sonnet-5, claude-opus-4-7,
139
- claude-opus-4-8, claude-opus-5 (the top executor band + the core fixed roles),
140
- and claude-fable-5 (the Fable 5 role-override agents).
127
+ claude-opus-4-8 and claude-opus-5 (the top executor band + the core fixed
128
+ roles).
141
129
 
142
130
  1. **Run `/agents`** to confirm Claude Code accepts these full IDs in agent
143
- frontmatter — in particular `claude-haiku-4-5` and `claude-fable-5`, the two
144
- newest ids. If it wants short aliases (opus/sonnet/haiku) or dated IDs, adjust
131
+ frontmatter — in particular `claude-haiku-4-5` and `claude-opus-5`. If it
132
+ wants short aliases (opus/sonnet/haiku) or dated IDs, adjust
145
133
  each `model:` field. The full IDs are valid at the API level but Claude Code
146
134
  may normalize differently.
147
135
  2. **Confirm `effort:` is a valid CLI frontmatter field.** If the CLI ignores
@@ -2,7 +2,7 @@
2
2
  name: orc-executor-opus-4-7-high
3
3
  description: >
4
4
  ORC executor — claude-opus-4-7, high effort. Dispatched by the ORC orchestrator to implement
5
- a single task whose score falls in the high-complexity [70,80) band. Single-role: execution only.
5
+ a single task whose score falls in the no default band — reachable via rubric_bands_override, orc diy fixed_executor, or extra_fallback_agent band. Single-role: execution only.
6
6
  Takes a task slice and implements exactly that task.
7
7
  model: claude-opus-4-7
8
8
  effort: high
@@ -2,7 +2,7 @@
2
2
  name: orc-executor-opus-4-7-med
3
3
  description: >
4
4
  ORC executor — claude-opus-4-7, medium effort. Dispatched by the ORC orchestrator to implement
5
- a single task whose score falls in the upper-mid-complexity [65,70) band. Single-role: execution only.
5
+ a single task whose score falls in the no default band — reachable via rubric_bands_override, orc diy fixed_executor, or extra_fallback_agent band. Single-role: execution only.
6
6
  Takes a task slice and implements exactly that task.
7
7
  model: claude-opus-4-7
8
8
  effort: medium
@@ -2,7 +2,7 @@
2
2
  name: orc-executor-opus-4-8-high
3
3
  description: >
4
4
  ORC executor — claude-opus-4-8, high effort. Dispatched by the ORC orchestrator to implement
5
- a single task whose score falls in the very-high-complexity [80,90) band. Single-role: execution only.
5
+ a single task whose score falls in the no default band — reachable via rubric_bands_override, orc diy fixed_executor, or extra_fallback_agent band. Single-role: execution only.
6
6
  Takes a task slice and implements exactly that task.
7
7
  model: claude-opus-4-8
8
8
  effort: high
@@ -2,7 +2,7 @@
2
2
  name: orc-executor-opus-5-high
3
3
  description: >
4
4
  ORC executor — claude-opus-5, high effort. Dispatched by the ORC orchestrator to implement
5
- a single task whose score falls in the highest-complexity [90,100] band. Single-role: execution only.
5
+ a single task whose score falls in the no default band — reachable via rubric_bands_override, orc diy fixed_executor, or extra_fallback_agent band. Single-role: execution only.
6
6
  Takes a task slice and implements exactly that task.
7
7
  model: claude-opus-5
8
8
  effort: high
@@ -2,7 +2,7 @@
2
2
  name: orc-executor-opus-5-low
3
3
  description: >
4
4
  ORC executor — claude-opus-5, low effort. Dispatched by the ORC orchestrator to implement
5
- a single task whose score falls in the opus5-only low [0,40) band. Single-role: execution only.
5
+ a single task whose score falls in the upper-complexity [65,90) band. Single-role: execution only.
6
6
  Takes a task slice and implements exactly that task.
7
7
  model: claude-opus-5
8
8
  effort: low
@@ -2,7 +2,7 @@
2
2
  name: orc-executor-opus-5-med
3
3
  description: >
4
4
  ORC executor — claude-opus-5, medium effort. Dispatched by the ORC orchestrator to implement
5
- a single task whose score falls in the opus5-only mid [40,80) band. Single-role: execution only.
5
+ a single task whose score falls in the highest-complexity [90,100] band. Single-role: execution only.
6
6
  Takes a task slice and implements exactly that task.
7
7
  model: claude-opus-5
8
8
  effort: medium