@azure-id/orc 1.6.0 → 1.7.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 (69) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README-id.md +206 -125
  3. package/README.md +274 -74
  4. package/bin/cli.js +1595 -2
  5. package/bin/mockrun-catalog.js +272 -267
  6. package/bin/verify-contracts.js +4527 -4509
  7. package/bin/verify-package.js +6 -0
  8. package/bin/webui/api.js +26 -0
  9. package/bin/webui/app.html +10 -0
  10. package/bin/webui/css/panels/knowledge.css +30 -0
  11. package/bin/webui/css/panels/rules.css +145 -0
  12. package/bin/webui/fixtures/index.js +27 -0
  13. package/bin/webui/fixtures/rules.js +1002 -0
  14. package/bin/webui/fixtures/wiki-one.js +198 -0
  15. package/bin/webui/i18n/en/knowledge.json +127 -117
  16. package/bin/webui/i18n/en/nav.json +1 -0
  17. package/bin/webui/i18n/en/rules.json +55 -0
  18. package/bin/webui/i18n/id/knowledge.json +127 -117
  19. package/bin/webui/i18n/id/nav.json +1 -0
  20. package/bin/webui/i18n/id/rules.json +55 -0
  21. package/bin/webui/js/01-i18n.js +1 -0
  22. package/bin/webui/js/panels/knowledge.js +117 -1
  23. package/bin/webui/js/panels/rules.js +351 -0
  24. package/mock-run/INDEX.md +107 -106
  25. package/mock-run/orc-rules.md +254 -0
  26. package/package.json +1 -1
  27. package/templates/commands/orc-rules.md +66 -0
  28. package/templates/commands/orc-wiki.md +23 -1
  29. package/templates/skills/_shared/README.md +61 -54
  30. package/templates/skills/_shared/phases/README.md +1 -0
  31. package/templates/skills/_shared/phases/preflight.md +20 -0
  32. package/templates/skills/_shared/phases/rules.md +154 -0
  33. package/templates/skills/_shared/return-validation.md +28 -0
  34. package/templates/skills/_shared/rules/CREDITS.md +141 -0
  35. package/templates/skills/_shared/rules/INDEX.md +107 -0
  36. package/templates/skills/_shared/rules/code.md +229 -0
  37. package/templates/skills/_shared/rules/delivery.md +114 -0
  38. package/templates/skills/_shared/rules/ui.md +139 -0
  39. package/templates/skills/_shared/rules/writing.md +223 -0
  40. package/templates/skills/context-combiner/SKILL.md +9 -1
  41. package/templates/skills/orc/SKILL.md +7 -0
  42. package/templates/skills/orc-aftermath/SKILL.md +7 -0
  43. package/templates/skills/orc-analyze/SKILL.md +7 -0
  44. package/templates/skills/orc-analyze-mini/SKILL.md +9 -1
  45. package/templates/skills/orc-boundary/SKILL.md +7 -0
  46. package/templates/skills/orc-brainstorm/SKILL.md +7 -0
  47. package/templates/skills/orc-budget/SKILL.md +7 -0
  48. package/templates/skills/orc-challenge/SKILL.md +7 -0
  49. package/templates/skills/orc-claude/SKILL.md +7 -0
  50. package/templates/skills/orc-diy/SKILL.md +7 -0
  51. package/templates/skills/orc-explain/SKILL.md +7 -0
  52. package/templates/skills/orc-export/SKILL.md +7 -0
  53. package/templates/skills/orc-fast/SKILL.md +7 -0
  54. package/templates/skills/orc-grill/SKILL.md +7 -0
  55. package/templates/skills/orc-handoff/SKILL.md +9 -1
  56. package/templates/skills/orc-learn/SKILL.md +7 -0
  57. package/templates/skills/orc-mini/SKILL.md +7 -0
  58. package/templates/skills/orc-pact/SKILL.md +7 -0
  59. package/templates/skills/orc-poly/SKILL.md +7 -0
  60. package/templates/skills/orc-pr-driver/SKILL.md +9 -1
  61. package/templates/skills/orc-pr-setup/SKILL.md +9 -1
  62. package/templates/skills/orc-quick/SKILL.md +7 -0
  63. package/templates/skills/orc-retro/SKILL.md +7 -0
  64. package/templates/skills/orc-route/SKILL.md +7 -0
  65. package/templates/skills/orc-test/SKILL.md +7 -0
  66. package/templates/skills/orc-verify/SKILL.md +7 -0
  67. package/templates/skills/orc-wiki/SKILL.md +15 -0
  68. package/templates/skills/orc-wiki/references/partial-refresh.md +68 -0
  69. package/templates/skills/orc-wiki/references/phases/phase-0.md +15 -1
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ /* panels/rules.js — orc ui client
3
+ The anti-slop rule surface. Two halves that never mix: ORC's shipped packs
4
+ (read-only, 65 rules) and this project's own ledger, which WINS on any
5
+ conflict.
6
+
7
+ The panel decides nothing. It does not compute a count, a tier, an override
8
+ or the lint's coverage — every number here came out of `orc rules --json`,
9
+ and the one write goes back through `orc rules set-all`, which is the only
10
+ writer of the ledger.
11
+
12
+ Loaded by app.html in the order its numeric prefix names. Classic
13
+ script, no import/export: an ES module import carries no query string,
14
+ and every static request here needs the per-launch session token. */
15
+
16
+
17
+ /* --------------------------------------------------------------------- RULES */
18
+
19
+ const RULE_TIER_KIND = { HARD: "bad", PURPOSE: "warn", LOCK: "" };
20
+ const RULE_PRIORITY_KIND = { P0: "bad", P1: "warn", P2: "" };
21
+
22
+ PANELS.rules = function (host) {
23
+ head(host, t("rules.title"), t("rules.sub"));
24
+ renderRules(host);
25
+ };
26
+
27
+ async function renderRules(host) {
28
+ host.replaceChildren();
29
+ section(
30
+ host,
31
+ () => read("/api/rules").then((r) => r.data),
32
+ (d) => {
33
+ const out = frag();
34
+ if (!d || !d.orc) {
35
+ const c = card(t("rules.title"));
36
+ c.append(empty(t("rules.unavailable"), t("rules.unavailableHint")));
37
+ out.append(c);
38
+ return out;
39
+ }
40
+ out.append(rulesPrecedenceCard(d));
41
+ out.append(rulesUserCard(d, host));
42
+ out.append(rulesPacksCard(d));
43
+ out.append(rulesCreditsCard(d));
44
+ out.append(rulesLintCard());
45
+ return out;
46
+ }
47
+ );
48
+ }
49
+
50
+ // CARD 1 — the ladder. Always visible, never behind a toggle, and first on the
51
+ // page: precedence is the single thing people get wrong about this surface, and
52
+ // a rule set whose order you have to go and look up is a rule set you will
53
+ // misread.
54
+ function rulesPrecedenceCard(d) {
55
+ const c = card(t("rules.precedence.title"));
56
+ c.append(el("div", "note", t("rules.precedence.lead")));
57
+
58
+ const ladder = el("div", "orule-ladder");
59
+ for (const r of d.precedence || []) {
60
+ const row = el("div", "orule-ladder-row");
61
+ row.append(el("span", "orule-rank", String(r.rank)));
62
+ // Deliberately NOT named `body`: that name is reserved for a panel
63
+ // CONTAINER, and `test/webui/render.test.js` lints every one of those for
64
+ // the `stack` class by NAME. This is a row's inner column, not a panel — so
65
+ // it takes a different name rather than a class it does not want.
66
+ const rung = el("div", "orule-ladder-body");
67
+ const top = el("div", "row-actions");
68
+ top.append(el("span", "orule-layer", r.layer));
69
+ // The CLI's own words for the scope, never a friendlier synonym.
70
+ top.append(el("span", "note", r.scope));
71
+ rung.append(top);
72
+ rung.append(el("div", "note mono orule-where", r.where));
73
+ rung.append(el("div", "note", t("rules.precedence.beats", { what: r.beats })));
74
+ row.append(rung);
75
+ ladder.append(row);
76
+ }
77
+ c.append(ladder);
78
+
79
+ // The one sentence a reader has to leave with.
80
+ c.append(el("div", "note orule-house-note", t("rules.precedence.houseScope")));
81
+
82
+ if ((d.overrides || []).length) {
83
+ const box = el("div", "orule-overrides");
84
+ box.append(el("div", "checklist-head", tn(d.overrides.length, "rules.overrides.head")));
85
+ for (const o of d.overrides) {
86
+ const row = el("div", "orule-override-row");
87
+ row.append(chip(o.id, o.known ? "warn" : "bad"));
88
+ row.append(el("span", null, o.known ? o.title : t("rules.overrides.unknownId")));
89
+ row.append(el("span", "note mono", o.line));
90
+ box.append(row);
91
+ }
92
+ // WHY the count is what it is. A number nobody can reproduce is a number
93
+ // nobody trusts.
94
+ box.append(el("div", "note", d.overrides_note));
95
+ c.append(box);
96
+ }
97
+ c.append(el("div", "note orule-boundary", d.boundary));
98
+ return c;
99
+ }
100
+
101
+ // CARD 2 — the project's own rules. This is `docRulesCard()` from the Docs
102
+ // panel, and deliberately so: that design was argued once (v0.49.5) and the
103
+ // argument holds here unchanged. A standing instruction is prose, not a form —
104
+ // nobody's real P0 fits on one line, and filing it as numbered rows is work the
105
+ // tool invented for itself.
106
+ //
107
+ // The v0.44.1 rule holds: nothing is written until Apply, the pending edit is
108
+ // NAMED, Discard renders only while dirty, and a refused write comes back in the
109
+ // CLI's own words.
110
+ function rulesUserCard(d, host) {
111
+ const c = card(t("rules.user.title"));
112
+ const u = d.user || {};
113
+ const edits = editSet(() => bar.paint());
114
+ const original = String(u.text || u.template || "");
115
+
116
+ const headRow = el("div", "row-actions");
117
+ headRow.append(chip(d.line, u.empty ? "" : "ok"));
118
+ for (const pr of d.priorities || ["P0", "P1", "P2"]) {
119
+ const n = (u.counts || {})[pr] || 0;
120
+ if (n) headRow.append(chip(pr + " " + n, RULE_PRIORITY_KIND[pr] || ""));
121
+ }
122
+ c.append(headRow);
123
+
124
+ c.append(el("div", "note", t("rules.user.wins")));
125
+ c.append(el("div", "note", t("rules.user.howto")));
126
+
127
+ const ta = el("textarea", "orule-editor");
128
+ ta.value = original;
129
+ ta.spellcheck = false;
130
+ ta.rows = 16;
131
+ ta.setAttribute("aria-label", t("rules.user.title"));
132
+ ta.addEventListener("input", () => {
133
+ if (ta.value === original) edits.drop("rules.md");
134
+ else edits.action("rules.md", "/api/rules/setAll", { text: ta.value }, t("rules.user.staged"));
135
+ });
136
+ c.append(ta);
137
+
138
+ // A user who would rather open it in their own editor should not have to go
139
+ // hunting for the path.
140
+ c.append(el("div", "note orule-path", u.file || ""));
141
+ c.append(el("div", "note", t("rules.user.turnOff")));
142
+
143
+ const bar = editBar(edits, {
144
+ onApply: async (btn) => {
145
+ await applyActions(edits, btn);
146
+ edits.clear();
147
+ renderRules(host);
148
+ },
149
+ onReset: () => renderRules(host),
150
+ onCancel: () => {
151
+ edits.clear();
152
+ renderRules(host);
153
+ },
154
+ resetLabel: t("rules.user.refresh"),
155
+ });
156
+ c.append(bar);
157
+ return c;
158
+ }
159
+
160
+ // CARD 3 — the shipped packs. READ-ONLY, and there is no control anywhere on it:
161
+ // a disabled input would be a control that lies about what it can do. 65 rows
162
+ // needs a filter, so it has one — client-side over data already fetched, so it
163
+ // never re-runs the CLI.
164
+ function rulesPacksCard(d) {
165
+ const orc = d.orc || {};
166
+ const c = card(t("rules.packs.title"), chip(t("rules.packs.readOnly"), ""));
167
+ c.append(el("div", "note", t("rules.packs.lead", { n: orc.count || 0 })));
168
+
169
+ const counts = el("div", "row-actions");
170
+ for (const p of orc.packs || [])
171
+ counts.append(chip(`${p.prefix} ${p.count}`, ""));
172
+ c.append(counts);
173
+
174
+ const controls = el("div", "row-actions orule-filters");
175
+ const search = el("input", "text-input orule-search");
176
+ search.type = "search";
177
+ search.placeholder = t("rules.packs.filter");
178
+ search.setAttribute("aria-label", t("rules.packs.filter"));
179
+ controls.append(search);
180
+ const tierSel = el("select", "text-input orule-tier");
181
+ tierSel.setAttribute("aria-label", t("rules.packs.tier"));
182
+ for (const [v, label] of [["", t("rules.packs.allTiers")], ...(d.tiers || []).map((x) => [x, x])]) {
183
+ const o = el("option", null, label);
184
+ o.value = v;
185
+ tierSel.append(o);
186
+ }
187
+ controls.append(tierSel);
188
+ c.append(controls);
189
+
190
+ const list = el("div", "orule-list");
191
+ c.append(list);
192
+ const foot = el("div", "note");
193
+ c.append(foot);
194
+
195
+ const overridden = new Set((d.overrides || []).filter((o) => o.known).map((o) => o.id));
196
+ const paint = () => {
197
+ const q = search.value.trim().toLowerCase();
198
+ const tier = tierSel.value;
199
+ list.replaceChildren();
200
+ let shown = 0;
201
+ for (const p of orc.packs || []) {
202
+ const rows = (orc.rules || []).filter(
203
+ (r) =>
204
+ r.pack === p.id &&
205
+ (!tier || r.tier === tier) &&
206
+ (!q || (r.id + " " + r.title + " " + r.body).toLowerCase().includes(q))
207
+ );
208
+ if (!rows.length) continue;
209
+ // A native <details>, so the toggle, the keyboard handling and the
210
+ // open/closed state are the browser's rather than a hand-rolled expander.
211
+ // CLOSED by default, because 65 rule bodies opened at once is a page
212
+ // nobody reads — and OPEN whenever a filter is active, because seeing what
213
+ // matched is the entire reason someone typed one.
214
+ const group = document.createElement("details");
215
+ group.className = "orule-group";
216
+ group.open = !!(q || tier);
217
+ const gh = document.createElement("summary");
218
+ gh.className = "orule-group-head";
219
+ gh.append(el("span", null, p.title));
220
+ gh.append(el("span", "note mono", p.prefix));
221
+ gh.append(el("span", "note", tn(rows.length, "rules.packs.rules")));
222
+ group.append(gh);
223
+ for (const r of rows) {
224
+ shown++;
225
+ const row = el("div", "orule-row" + (overridden.has(r.id) ? " orule-row-off" : ""));
226
+ const top = el("div", "row-actions");
227
+ top.append(chip(r.id, ""));
228
+ top.append(chip(r.tier, RULE_TIER_KIND[r.tier] || ""));
229
+ top.append(el("span", "orule-title", r.title));
230
+ // A rule the project replaced is SHOWN, struck, and labelled. Hiding it
231
+ // would make an override invisible in the one place it is explained.
232
+ if (overridden.has(r.id)) top.append(chip(t("rules.packs.off"), "warn"));
233
+ row.append(top);
234
+ if (r.body) row.append(el("div", "note orule-body", r.body));
235
+ group.append(row);
236
+ }
237
+ list.append(group);
238
+ }
239
+ foot.textContent = shown
240
+ ? t("rules.packs.showing", { shown, total: orc.count || 0 })
241
+ : t("rules.packs.noMatch");
242
+ };
243
+ search.addEventListener("input", paint);
244
+ tierSel.addEventListener("change", paint);
245
+ paint();
246
+
247
+ c.append(el("div", "note mono orule-path", orc.dir || ""));
248
+ c.append(el("div", "note", t("rules.packs.changeHow")));
249
+ // The rule TEXT is shipped content that ids point at, so it stays English in
250
+ // every locale. A translated rule is a different rule.
251
+ c.append(el("div", "note", t("rules.packs.englishOnly")));
252
+ return c;
253
+ }
254
+
255
+ // CARD 4 — credit, rendered rather than buried in a file nobody opens. These
256
+ // rules are other people's work.
257
+ function rulesCreditsCard(d) {
258
+ const c = card(t("rules.credits.title"));
259
+ c.append(el("div", "note", t("rules.credits.lead")));
260
+ const sources = (d.orc || {}).credits || [];
261
+ for (const s of sources) {
262
+ const row = el("div", "orule-credit");
263
+ const top = el("div", "row-actions");
264
+ top.append(el("span", "orule-credit-who", s.author + (s.handle ? " (@" + s.handle + ")" : "")));
265
+ if (s.license) top.append(chip(s.license, ""));
266
+ for (const p of s.packs || []) top.append(chip(p, ""));
267
+ row.append(top);
268
+ if (s.repo) {
269
+ const a = el("a", "note mono orule-credit-link", s.repo);
270
+ a.href = s.repo;
271
+ a.target = "_blank";
272
+ a.rel = "noreferrer noopener";
273
+ row.append(a);
274
+ }
275
+ row.append(el("div", "note", s.took));
276
+ if (s.read) row.append(el("div", "note", t("rules.credits.readOn", { date: s.read })));
277
+ c.append(row);
278
+ }
279
+ if (!sources.length) c.append(el("div", "note", t("rules.credits.none")));
280
+ return c;
281
+ }
282
+
283
+ // CARD 5 — the free lint. It reports; it never fixes. The coverage line is
284
+ // relayed VERBATIM, because a clean result that does not say what it could not
285
+ // check is the failure that line exists to prevent.
286
+ function rulesLintCard() {
287
+ const c = card(t("rules.lint.title"));
288
+ c.append(el("div", "note", t("rules.lint.lead")));
289
+
290
+ const row = el("div", "row-actions");
291
+ const input = el("input", "text-input orule-lint-path");
292
+ input.type = "text";
293
+ input.value = ".";
294
+ input.placeholder = t("rules.lint.pathPlaceholder");
295
+ input.setAttribute("aria-label", t("rules.lint.pathPlaceholder"));
296
+ const run = el("button", "btn btn-sm btn-primary", t("rules.lint.run"));
297
+ run.type = "button";
298
+ row.append(input);
299
+ row.append(run);
300
+ c.append(row);
301
+
302
+ const out = el("div", "orule-lint-out");
303
+ c.append(out);
304
+
305
+ run.addEventListener("click", async () => {
306
+ run.disabled = true;
307
+ out.replaceChildren(skeleton(2));
308
+ try {
309
+ const r = await read("/api/rules/lint?path=" + encodeURIComponent(input.value || "."));
310
+ const d = r.data || {};
311
+ out.replaceChildren();
312
+ if (d.ok === false) {
313
+ out.append(el("div", "note warn", d.hint || t("rules.lint.nothing")));
314
+ return;
315
+ }
316
+ const headRow = el("div", "row-actions");
317
+ headRow.append(chip(tn(d.files || 0, "rules.lint.files"), ""));
318
+ headRow.append(chip(tn(d.count || 0, "rules.lint.findings"), d.count ? "warn" : "ok"));
319
+ out.append(headRow);
320
+
321
+ let last = "";
322
+ for (const f of d.findings || []) {
323
+ if (f.file !== last) {
324
+ out.append(el("div", "note mono orule-lint-file", f.file));
325
+ last = f.file;
326
+ }
327
+ const fr = el("div", "orule-lint-row");
328
+ const top = el("div", "row-actions");
329
+ top.append(el("span", "note mono", String(f.line)));
330
+ top.append(chip(f.rule, RULE_TIER_KIND[f.tier] || ""));
331
+ top.append(el("span", null, f.title || ""));
332
+ fr.append(top);
333
+ fr.append(el("div", "note mono", f.evidence));
334
+ fr.append(el("div", "note", "→ " + f.fix));
335
+ out.append(fr);
336
+ }
337
+ if (!(d.findings || []).length) out.append(el("div", "note ok", t("rules.lint.clean")));
338
+ if ((d.suppressed || []).length)
339
+ out.append(el("div", "note warn", t("rules.lint.suppressed", { ids: d.suppressed.join(" · ") })));
340
+ const ex = ((d.exempt || {}).packs || []).length + ((d.exempt || {}).files || []).length;
341
+ if (ex) out.append(el("div", "note", tn(ex, "rules.lint.skipped")));
342
+ // VERBATIM, always, clean or not.
343
+ out.append(el("div", "note orule-lint-coverage", d.coverage || ""));
344
+ } catch (e) {
345
+ out.replaceChildren(failBox(e));
346
+ } finally {
347
+ run.disabled = false;
348
+ }
349
+ });
350
+ return c;
351
+ }
package/mock-run/INDEX.md CHANGED
@@ -1,106 +1,107 @@
1
- # Mocked runs — what each ORC lane looks like when it runs
2
-
3
- New to ORC? Start here. Every file below is a **mocked run**: the screen you
4
- would see, the questions you would be asked, and the files that would land on
5
- disk — written the way the real lane writes them.
6
-
7
- Nothing here was executed. It is documentation, and it is here because you
8
- should not have to spend tokens to find out what a command does.
9
-
10
- All of it uses **easy English**, short sentences, and the same fake project.
11
-
12
- > **Read it in the panel instead:** `orc ui` ▸ **Mocked Skill Use** — the same
13
- > documents, searchable, with a reading pane. From the terminal:
14
- > `orc mock-run list` and `orc mock-run show <slug>`.
15
-
16
- ---
17
-
18
- ## Start here
19
-
20
- | Doc | What it shows |
21
- |---|---|
22
- | [The example project](the-example-project.md) | `shopcart`, the fake project every mock uses, and how to read these files |
23
- | [A normal day](a-normal-day.md) | `/orc-pact`, `/orc-boundary`, `/orc-budget`, `/orc-aftermath` and the rest, all inside one ordinary run |
24
-
25
- ## Build a change
26
-
27
- | Doc | Lane | One line |
28
- |---|---|---|
29
- | [orc](orc.md) | `/orc` | The full pipeline: intake → plan → score → parallel waves → review → verify → ship |
30
- | [orc-ultra](orc-ultra.md) | `/orc-ultra` | The same, plus an advisor and three judgment gates. Costs the most |
31
- | [orc-mini](../templates/skills/orc-mini/examples/mini-run-mock.md) | `/orc-mini` | One executor, a smoke gate, ship |
32
- | [orc-fast](orc-fast.md) | `/orc-fast` | No analyst, no planner — the wiki and the pattern already did that work |
33
- | [orc-quick](orc-quick.md) | `/orc-quick` | Ask for anything. Look → ask once → do, and it always asks which agent |
34
- | [orc-diy](orc-diy.md) | `/orc-diy` | Your own lane, composed in the terminal and compiled |
35
-
36
- ## Decide what to build
37
-
38
- | Doc | Lane | One line |
39
- |---|---|---|
40
- | [orc-brainstorm](orc-brainstorm.md) | `/orc-brainstorm` | No idea yet: it generates the options and **you** pick |
41
- | [orc-grill](orc-grill.md) | `/orc-grill` | One vague idea, sharpened by questions — it never answers its own |
42
- | [orc-doc](orc-doc.md) | `/orc-doc` | A PRD, TSD, agreement, report or runbook — written in parts, so nothing holds it all |
43
- | [orc-plan](orc-plan.md) | `/orc-plan` | A real task plan: grounded files, dependencies, facets, test dispositions |
44
- | [orc-route](orc-route.md) | `/orc-route` | You have a plan — which lane should build it, and which cannot |
45
- | [orc-explain](orc-explain.md) | `/orc-explain` | "Wait, what?" — it says the last message again, properly |
46
- | [orc-analyze](../templates/skills/orc-analyze/examples/analyze-mock.md) | `/orc-analyze` | A document turned into code-grounded requirements |
47
- | [orc-analyze-mini](../templates/skills/orc-analyze-mini/examples/quick-analysis-mock.md) | *(inside `/orc-mini`)* | The same, single pass, much cheaper |
48
- | [context-combiner](context-combiner.md) | — | Two related analyses merged into one spec, with a 100% conservation gate |
49
- | [orc-poly](../templates/skills/orc-poly/examples/poly-run-mock.md) | `/orc-poly` | One change across two or more repos, without drift |
50
-
51
- ## Teach ORC your project
52
-
53
- | Doc | Lane | One line |
54
- |---|---|---|
55
- | [orc-wiki](../templates/skills/orc-wiki/examples/wiki-run-mock.md) | `/orc-wiki` | Scan the codebase into an evidence-anchored knowledge base |
56
- | [orc-pattern](orc-pattern.md) | `/orc-pattern` | Learn your real conventions so executors match your house style |
57
- | [orc-learn](../templates/skills/orc-learn/examples/learn-run-mock.md) | `/orc-learn` | Onboarding docs for a human, per feature |
58
- | [orc-claude](../templates/skills/orc-claude/examples/claude-run-mock.md) | `/orc-claude` | Build or refresh this repo's `CLAUDE.md` from verified facts |
59
- | [orc-export](orc-export.md) | `/orc-export` | Compile it all into a portable `AGENTS.md` so ORC is not a trap |
60
-
61
- ## Check what happened
62
-
63
- | Doc | Lane | One line |
64
- |---|---|---|
65
- | [orc-verify](../templates/skills/orc-verify/examples/verify-mock.md) | `/orc-verify` | Verify only your git-modified changes. Read-only |
66
- | [orc-challenge](orc-challenge.md) | `/orc-challenge` | Grade a finished document, then stop and make you fix it in another session |
67
- | [orc-challenge-council](orc-challenge-council.md) | `/orc-challenge` | Six more ways of looking at the same document — and you choose which ones run |
68
- | [orc-pact](orc-pact.md) | `/orc-pact` | The promises your system makes, and which are in doubt right now |
69
- | [orc-boundary](orc-boundary.md) | `/orc-boundary` | What the agent should **not** try here, and what would change that |
70
- | [orc-aftermath](orc-aftermath.md) | `/orc-aftermath` | Did what we shipped hold up. Churn is a signal, never a verdict |
71
- | [orc-budget](orc-budget.md) | `/orc-budget` | What a run costs, in the unit you are billed in |
72
- | [orc-retro](../templates/skills/orc-retro/examples/retro-mock.md) | `/orc-retro` | Mine the behavior traces into a calibration report |
73
-
74
- ## Ship and hand over
75
-
76
- | Doc | Lane | One line |
77
- |---|---|---|
78
- | [orc-pr-setup / orc-pr-driver](orc-pr-setup.md) | `/orc-pr-setup`, `/orc-pr-driver` | Split a big change into a stack of PRs, then build and merge them |
79
- | [orc-handoff](orc-handoff.md) | `/orc-handoff` | What a non-developer can safely change, graded by whether a check exists |
80
-
81
- ## Panel and terminal
82
-
83
- | Doc | One line |
84
- |---|---|
85
- | [orc-ui](orc-ui.md) | The local control panel for everything that is not ai (**video placeholder here**) |
86
- | [orc-cli](orc-cli.md) | The terminal commands: install, config, probes, run state, stats |
87
- | [orc-extra](orc-extra.md) | Run some of ORC's work on a different AI model, and still know what left your machine |
88
- | [extra-recovery](extra-recovery.md) | When that other model stops half-way: what it left on disk, whose fault it was, and how to continue |
89
- | [extra-slots](extra-slots.md) | The four lanes that never score a task: giving one JOB to a cheaper model, and what ORC says before it does |
90
-
91
- ---
92
-
93
- ## Two kinds of document
94
-
95
- - **Walkthroughs** (this folder) — written for a person, in easy English.
96
- - **Annotated examples** (`templates/skills/<skill>/examples/`) — dense, written
97
- for the model, and shipped inside your `.claude/` install. Both appear in
98
- `orc mock-run list` and in the **Mocked Skill Use** panel.
99
-
100
- ## Adding one
101
-
102
- Drop a `.md` file in this folder with a `# Title` heading and a `> one line`
103
- summary under it. It appears in `orc mock-run`, in the panel, and here — no list
104
- to update anywhere else. Reading order comes from `GROUP_OF` in
105
- [`bin/mockrun-catalog.js`](../bin/mockrun-catalog.js); a file nobody placed
106
- there still shows, under **More**.
1
+ # Mocked runs — what each ORC lane looks like when it runs
2
+
3
+ New to ORC? Start here. Every file below is a **mocked run**: the screen you
4
+ would see, the questions you would be asked, and the files that would land on
5
+ disk — written the way the real lane writes them.
6
+
7
+ Nothing here was executed. It is documentation, and it is here because you
8
+ should not have to spend tokens to find out what a command does.
9
+
10
+ All of it uses **easy English**, short sentences, and the same fake project.
11
+
12
+ > **Read it in the panel instead:** `orc ui` ▸ **Mocked Skill Use** — the same
13
+ > documents, searchable, with a reading pane. From the terminal:
14
+ > `orc mock-run list` and `orc mock-run show <slug>`.
15
+
16
+ ---
17
+
18
+ ## Start here
19
+
20
+ | Doc | What it shows |
21
+ |---|---|
22
+ | [The example project](the-example-project.md) | `shopcart`, the fake project every mock uses, and how to read these files |
23
+ | [A normal day](a-normal-day.md) | `/orc-pact`, `/orc-boundary`, `/orc-budget`, `/orc-aftermath` and the rest, all inside one ordinary run |
24
+
25
+ ## Build a change
26
+
27
+ | Doc | Lane | One line |
28
+ |---|---|---|
29
+ | [orc](orc.md) | `/orc` | The full pipeline: intake → plan → score → parallel waves → review → verify → ship |
30
+ | [orc-ultra](orc-ultra.md) | `/orc-ultra` | The same, plus an advisor and three judgment gates. Costs the most |
31
+ | [orc-mini](../templates/skills/orc-mini/examples/mini-run-mock.md) | `/orc-mini` | One executor, a smoke gate, ship |
32
+ | [orc-fast](orc-fast.md) | `/orc-fast` | No analyst, no planner — the wiki and the pattern already did that work |
33
+ | [orc-quick](orc-quick.md) | `/orc-quick` | Ask for anything. Look → ask once → do, and it always asks which agent |
34
+ | [orc-diy](orc-diy.md) | `/orc-diy` | Your own lane, composed in the terminal and compiled |
35
+
36
+ ## Decide what to build
37
+
38
+ | Doc | Lane | One line |
39
+ |---|---|---|
40
+ | [orc-brainstorm](orc-brainstorm.md) | `/orc-brainstorm` | No idea yet: it generates the options and **you** pick |
41
+ | [orc-grill](orc-grill.md) | `/orc-grill` | One vague idea, sharpened by questions — it never answers its own |
42
+ | [orc-doc](orc-doc.md) | `/orc-doc` | A PRD, TSD, agreement, report or runbook — written in parts, so nothing holds it all |
43
+ | [orc-plan](orc-plan.md) | `/orc-plan` | A real task plan: grounded files, dependencies, facets, test dispositions |
44
+ | [orc-route](orc-route.md) | `/orc-route` | You have a plan — which lane should build it, and which cannot |
45
+ | [orc-explain](orc-explain.md) | `/orc-explain` | "Wait, what?" — it says the last message again, properly |
46
+ | [orc-analyze](../templates/skills/orc-analyze/examples/analyze-mock.md) | `/orc-analyze` | A document turned into code-grounded requirements |
47
+ | [orc-analyze-mini](../templates/skills/orc-analyze-mini/examples/quick-analysis-mock.md) | *(inside `/orc-mini`)* | The same, single pass, much cheaper |
48
+ | [context-combiner](context-combiner.md) | — | Two related analyses merged into one spec, with a 100% conservation gate |
49
+ | [orc-poly](../templates/skills/orc-poly/examples/poly-run-mock.md) | `/orc-poly` | One change across two or more repos, without drift |
50
+
51
+ ## Teach ORC your project
52
+
53
+ | Doc | Lane | One line |
54
+ |---|---|---|
55
+ | [orc-rules](orc-rules.md) | `orc rules` | The anti-slop rules: 65 shipped read-only, plus your own, which win |
56
+ | [orc-wiki](../templates/skills/orc-wiki/examples/wiki-run-mock.md) | `/orc-wiki` | Scan the codebase into an evidence-anchored knowledge base |
57
+ | [orc-pattern](orc-pattern.md) | `/orc-pattern` | Learn your real conventions so executors match your house style |
58
+ | [orc-learn](../templates/skills/orc-learn/examples/learn-run-mock.md) | `/orc-learn` | Onboarding docs for a human, per feature |
59
+ | [orc-claude](../templates/skills/orc-claude/examples/claude-run-mock.md) | `/orc-claude` | Build or refresh this repo's `CLAUDE.md` from verified facts |
60
+ | [orc-export](orc-export.md) | `/orc-export` | Compile it all into a portable `AGENTS.md` so ORC is not a trap |
61
+
62
+ ## Check what happened
63
+
64
+ | Doc | Lane | One line |
65
+ |---|---|---|
66
+ | [orc-verify](../templates/skills/orc-verify/examples/verify-mock.md) | `/orc-verify` | Verify only your git-modified changes. Read-only |
67
+ | [orc-challenge](orc-challenge.md) | `/orc-challenge` | Grade a finished document, then stop and make you fix it in another session |
68
+ | [orc-challenge-council](orc-challenge-council.md) | `/orc-challenge` | Six more ways of looking at the same document — and you choose which ones run |
69
+ | [orc-pact](orc-pact.md) | `/orc-pact` | The promises your system makes, and which are in doubt right now |
70
+ | [orc-boundary](orc-boundary.md) | `/orc-boundary` | What the agent should **not** try here, and what would change that |
71
+ | [orc-aftermath](orc-aftermath.md) | `/orc-aftermath` | Did what we shipped hold up. Churn is a signal, never a verdict |
72
+ | [orc-budget](orc-budget.md) | `/orc-budget` | What a run costs, in the unit you are billed in |
73
+ | [orc-retro](../templates/skills/orc-retro/examples/retro-mock.md) | `/orc-retro` | Mine the behavior traces into a calibration report |
74
+
75
+ ## Ship and hand over
76
+
77
+ | Doc | Lane | One line |
78
+ |---|---|---|
79
+ | [orc-pr-setup / orc-pr-driver](orc-pr-setup.md) | `/orc-pr-setup`, `/orc-pr-driver` | Split a big change into a stack of PRs, then build and merge them |
80
+ | [orc-handoff](orc-handoff.md) | `/orc-handoff` | What a non-developer can safely change, graded by whether a check exists |
81
+
82
+ ## Panel and terminal
83
+
84
+ | Doc | One line |
85
+ |---|---|
86
+ | [orc-ui](orc-ui.md) | The local control panel for everything that is not ai (**video placeholder here**) |
87
+ | [orc-cli](orc-cli.md) | The terminal commands: install, config, probes, run state, stats |
88
+ | [orc-extra](orc-extra.md) | Run some of ORC's work on a different AI model, and still know what left your machine |
89
+ | [extra-recovery](extra-recovery.md) | When that other model stops half-way: what it left on disk, whose fault it was, and how to continue |
90
+ | [extra-slots](extra-slots.md) | The four lanes that never score a task: giving one JOB to a cheaper model, and what ORC says before it does |
91
+
92
+ ---
93
+
94
+ ## Two kinds of document
95
+
96
+ - **Walkthroughs** (this folder) — written for a person, in easy English.
97
+ - **Annotated examples** (`templates/skills/<skill>/examples/`) — dense, written
98
+ for the model, and shipped inside your `.claude/` install. Both appear in
99
+ `orc mock-run list` and in the **Mocked Skill Use** panel.
100
+
101
+ ## Adding one
102
+
103
+ Drop a `.md` file in this folder with a `# Title` heading and a `> one line`
104
+ summary under it. It appears in `orc mock-run`, in the panel, and here — no list
105
+ to update anywhere else. Reading order comes from `GROUP_OF` in
106
+ [`bin/mockrun-catalog.js`](../bin/mockrun-catalog.js); a file nobody placed
107
+ there still shows, under **More**.