@azure-id/orc 1.9.1 → 2.0.2

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 (224) hide show
  1. package/CHANGELOG.md +390 -0
  2. package/README-id.md +20 -36
  3. package/README.md +24 -34
  4. package/bin/build-agents.js +206 -109
  5. package/bin/cli.js +760 -62
  6. package/bin/gotcha-import.js +1081 -0
  7. package/bin/gotcha.js +1286 -0
  8. package/bin/graph-query.js +1 -1
  9. package/bin/graph.js +717 -717
  10. package/bin/habit.js +1453 -0
  11. package/bin/mockrun-catalog.js +281 -276
  12. package/bin/onboarding-content.js +4 -4
  13. package/bin/pricing.json +207 -200
  14. package/bin/run-undo.js +398 -0
  15. package/bin/trace-write.js +657 -0
  16. package/bin/verify-contracts.js +527 -81
  17. package/bin/verify-package.js +58 -11
  18. package/bin/webui/api.js +26 -0
  19. package/bin/webui/app.html +239 -232
  20. package/bin/webui/css/00-tokens.css +110 -92
  21. package/bin/webui/css/04-motion.css +249 -152
  22. package/bin/webui/css/06-responsive.css +203 -178
  23. package/bin/webui/css/panels/behaviour.css +205 -0
  24. package/bin/webui/css/panels/knowledge.css +563 -116
  25. package/bin/webui/fixtures/behaviour.js +532 -0
  26. package/bin/webui/fixtures/extra.js +2036 -2036
  27. package/bin/webui/fixtures/hookui.js +5 -5
  28. package/bin/webui/fixtures/index.js +34 -0
  29. package/bin/webui/fixtures/knowledge.js +7 -1
  30. package/bin/webui/fixtures/settings.js +305 -305
  31. package/bin/webui/fixtures/stats.js +16 -0
  32. package/bin/webui/i18n/en/behaviour.json +143 -0
  33. package/bin/webui/i18n/en/knowledge.json +117 -2
  34. package/bin/webui/i18n/en/nav.json +25 -24
  35. package/bin/webui/i18n/en/tour.json +37 -35
  36. package/bin/webui/i18n/id/behaviour.json +143 -0
  37. package/bin/webui/i18n/id/knowledge.json +117 -2
  38. package/bin/webui/i18n/id/nav.json +25 -24
  39. package/bin/webui/i18n/id/tour.json +37 -35
  40. package/bin/webui/js/01-i18n.js +155 -154
  41. package/bin/webui/js/90-tour.js +498 -494
  42. package/bin/webui/js/91-shortcuts.js +126 -126
  43. package/bin/webui/js/99-boot.js +121 -118
  44. package/bin/webui/js/panels/behaviour.js +1022 -0
  45. package/bin/webui/js/panels/knowledge.js +552 -7
  46. package/bin/webui/js/panels/overview.js +13 -4
  47. package/mock-run/INDEX.md +109 -107
  48. package/mock-run/context-combiner.md +100 -100
  49. package/mock-run/gotcha-import.md +118 -0
  50. package/mock-run/habits.md +129 -0
  51. package/mock-run/orc-budget.md +534 -534
  52. package/mock-run/orc-challenge-council.md +262 -262
  53. package/mock-run/orc-quick.md +6 -1
  54. package/mock-run/orc-ultra.md +103 -103
  55. package/package.json +1 -1
  56. package/templates/agents/MODEL-MAPPING.md +49 -49
  57. package/templates/agents/orc-advisor-opus-5-xhigh.md +50 -56
  58. package/templates/agents/orc-analyze-mini-opus-5-med.md +55 -60
  59. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +55 -58
  60. package/templates/agents/orc-challenge-advisor-opus-5-med.md +75 -75
  61. package/templates/agents/orc-challenge-contrarian-opus-5-high.md +110 -110
  62. package/templates/agents/orc-challenge-executor-opus-5-med.md +114 -114
  63. package/templates/agents/orc-challenge-expansionist-opus-5-med.md +112 -112
  64. package/templates/agents/orc-challenge-judge-opus-5-high.md +132 -132
  65. package/templates/agents/orc-challenge-outsider-opus-5-low.md +109 -109
  66. package/templates/agents/orc-challenge-principles-opus-5-high.md +109 -109
  67. package/templates/agents/orc-challenge-reader-opus-5-low.md +90 -90
  68. package/templates/agents/orc-claude-writer-opus-4-8-high.md +48 -53
  69. package/templates/agents/orc-claude-writer-opus-5-med.md +48 -55
  70. package/templates/agents/orc-context-combiner-opus-5-high.md +78 -88
  71. package/templates/agents/orc-doc-checker-opus-5-low.md +108 -108
  72. package/templates/agents/orc-doc-writer-opus-5-med.md +134 -134
  73. package/templates/agents/orc-executor-haiku-4-5.md +14 -6
  74. package/templates/agents/orc-executor-opus-4-7-high.md +14 -6
  75. package/templates/agents/orc-executor-opus-4-7-med.md +14 -6
  76. package/templates/agents/orc-executor-opus-4-8-high.md +14 -6
  77. package/templates/agents/orc-executor-opus-5-high.md +15 -7
  78. package/templates/agents/orc-executor-opus-5-low.md +15 -7
  79. package/templates/agents/orc-executor-opus-5-med.md +15 -7
  80. package/templates/agents/orc-executor-sonnet-4-6-high.md +14 -6
  81. package/templates/agents/orc-executor-sonnet-4-6-med.md +14 -6
  82. package/templates/agents/orc-executor-sonnet-5-high.md +14 -6
  83. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +1 -10
  84. package/templates/agents/orc-judge-opus-5-xhigh.md +81 -85
  85. package/templates/agents/orc-learn-writer-opus-5-low.md +67 -73
  86. package/templates/agents/orc-pattern-codifier-opus-5-med.md +58 -65
  87. package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +58 -63
  88. package/templates/agents/orc-planner-mini-opus-5-med.md +4 -7
  89. package/templates/agents/orc-planner-mini-sonnet-5-high.md +2 -3
  90. package/templates/agents/orc-planner-opus-5-med.md +157 -160
  91. package/templates/agents/orc-recon-opus-5-low.md +3 -10
  92. package/templates/agents/orc-recon-sonnet-4-6-med.md +1 -8
  93. package/templates/agents/orc-retro-opus-5-med.md +8 -10
  94. package/templates/agents/orc-retro-sonnet-5-high.md +6 -7
  95. package/templates/agents/orc-reviewer-opus-5-med.md +96 -60
  96. package/templates/agents/orc-scout-opus-5-low.md +35 -40
  97. package/templates/agents/orc-scout-sonnet-4-6-high.md +35 -39
  98. package/templates/agents/orc-system-analyst-opus-5-high.md +115 -120
  99. package/templates/agents/orc-test-author-opus-5-med.md +70 -71
  100. package/templates/agents/orc-test-designer-opus-5-high.md +158 -158
  101. package/templates/agents/orc-test-interpreter-opus-5-low.md +130 -130
  102. package/templates/agents/orc-trace-writer-haiku-4-5.md +3 -7
  103. package/templates/agents/orc-verifier-opus-5-med.md +77 -69
  104. package/templates/agents/orc-wiki-scanner-opus-4-8-high.md +74 -79
  105. package/templates/agents/orc-wiki-scanner-opus-5-med.md +74 -81
  106. package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +97 -106
  107. package/templates/commands/orc-analyze.md +13 -21
  108. package/templates/commands/orc-fast.md +10 -15
  109. package/templates/commands/orc-poly.md +12 -21
  110. package/templates/commands/orc-pr-driver.md +11 -30
  111. package/templates/commands/orc-pr-setup.md +10 -31
  112. package/templates/commands/orc-route.md +11 -41
  113. package/templates/commands/orc-test.md +5 -60
  114. package/templates/commands/orc-ultra.md +17 -17
  115. package/templates/commands/orc-verify.md +11 -11
  116. package/templates/hooks/README.md +36 -2
  117. package/templates/hooks/orc-effort-guard.js +178 -178
  118. package/templates/hooks/orc-session-hook.js +264 -0
  119. package/templates/hooks/orc-statusline.js +9 -7
  120. package/templates/skills/_shared/README.md +9 -0
  121. package/templates/skills/_shared/code-graph.md +48 -56
  122. package/templates/skills/_shared/config-precedence.md +200 -198
  123. package/templates/skills/_shared/extra-dispatch.md +1331 -1346
  124. package/templates/skills/_shared/gotchas.md +228 -177
  125. package/templates/skills/_shared/habits.md +101 -0
  126. package/templates/skills/_shared/lane-contract.md +84 -0
  127. package/templates/skills/_shared/opus5-only.md +8 -8
  128. package/templates/skills/_shared/phases/README.md +142 -83
  129. package/templates/skills/_shared/phases/analyst-gates.md +125 -136
  130. package/templates/skills/_shared/phases/execution.md +8 -14
  131. package/templates/skills/_shared/phases/house-rules.md +27 -32
  132. package/templates/skills/_shared/phases/intake.md +127 -133
  133. package/templates/skills/_shared/phases/mock-example.md +46 -56
  134. package/templates/skills/_shared/phases/plan-handoff.md +91 -97
  135. package/templates/skills/_shared/phases/planning.md +7 -17
  136. package/templates/skills/_shared/phases/preflight.md +19 -42
  137. package/templates/skills/_shared/phases/review.md +23 -27
  138. package/templates/skills/_shared/phases/rules.md +18 -42
  139. package/templates/skills/_shared/phases/scoring.md +55 -65
  140. package/templates/skills/_shared/phases/security-checklist.md +46 -50
  141. package/templates/skills/_shared/phases/security.md +45 -55
  142. package/templates/skills/_shared/phases/ship.md +6 -15
  143. package/templates/skills/_shared/phases/stop-resume.md +2 -5
  144. package/templates/skills/_shared/phases/summary.md +73 -48
  145. package/templates/skills/_shared/phases/testgen.md +41 -51
  146. package/templates/skills/_shared/phases/trace-verbs.md +433 -0
  147. package/templates/skills/_shared/phases/trace.md +136 -367
  148. package/templates/skills/_shared/phases/verify.md +62 -70
  149. package/templates/skills/_shared/phases/wave-grouping.md +128 -133
  150. package/templates/skills/_shared/phases/wiki-consult.md +10 -6
  151. package/templates/skills/_shared/read-ladder.md +2 -55
  152. package/templates/skills/_shared/return-validation.md +17 -70
  153. package/templates/skills/_shared/review-slice.md +79 -0
  154. package/templates/skills/_shared/smoke-gate.md +46 -28
  155. package/templates/skills/context-combiner/SKILL.md +16 -45
  156. package/templates/skills/context-combiner/schemas/combined-report.md +78 -78
  157. package/templates/skills/orc/README.md +2 -2
  158. package/templates/skills/orc/SKILL.md +41 -69
  159. package/templates/skills/orc/config.md +9 -9
  160. package/templates/skills/orc/examples/full-run-mock.md +73 -73
  161. package/templates/skills/orc/references/effort-and-mode.md +222 -222
  162. package/templates/skills/orc/references/pattern-gate.md +89 -89
  163. package/templates/skills/orc/references/phases/intake.md +41 -47
  164. package/templates/skills/orc/references/phases/integration.md +13 -19
  165. package/templates/skills/orc/references/preflight-report.md +10 -11
  166. package/templates/skills/orc/references/ultra-mode.md +11 -9
  167. package/templates/skills/orc/subskills/orc-execution/SKILL.md +27 -73
  168. package/templates/skills/orc/subskills/orc-execution/core.md +12 -99
  169. package/templates/skills/orc/subskills/orc-execution/subagent.md +14 -13
  170. package/templates/skills/orc/subskills/orc-planner/SKILL.md +2 -2
  171. package/templates/skills/orc/subskills/orc-planner-mini/SKILL.md +121 -121
  172. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +35 -76
  173. package/templates/skills/orc/subskills/orc-review-verify/core.md +52 -135
  174. package/templates/skills/orc/subskills/orc-review-verify/subagent.md +7 -7
  175. package/templates/skills/orc/subskills/orc-testgen/SKILL.md +34 -45
  176. package/templates/skills/orc/subskills/orc-testgen/core.md +20 -59
  177. package/templates/skills/orc/subskills/orc-testgen/subagent.md +7 -7
  178. package/templates/skills/orc-advisor/SKILL.md +56 -60
  179. package/templates/skills/orc-analyze/SKILL.md +32 -68
  180. package/templates/skills/orc-analyze/examples/analyze-mock.md +42 -42
  181. package/templates/skills/orc-analyze/schemas/report-audit.md +84 -83
  182. package/templates/skills/orc-analyze/schemas/report-prose.md +64 -63
  183. package/templates/skills/orc-analyze/schemas/report-requirement.md +78 -78
  184. package/templates/skills/orc-analyze-mini/SKILL.md +35 -70
  185. package/templates/skills/orc-challenge/README.md +142 -142
  186. package/templates/skills/orc-challenge/examples/council-full-roster.md +273 -273
  187. package/templates/skills/orc-challenge/references/council.md +315 -315
  188. package/templates/skills/orc-challenge/references/intake.md +171 -171
  189. package/templates/skills/orc-claude/SKILL.md +14 -14
  190. package/templates/skills/orc-diy/README.md +174 -143
  191. package/templates/skills/orc-diy/SKILL.md +23 -74
  192. package/templates/skills/orc-diy/references/blocks/pattern.md +18 -18
  193. package/templates/skills/orc-diy/references/flow-schema.md +1 -1
  194. package/templates/skills/orc-doc/README.md +229 -229
  195. package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +325 -325
  196. package/templates/skills/orc-doc/references/chunking.md +527 -527
  197. package/templates/skills/orc-fast/SKILL.md +45 -73
  198. package/templates/skills/orc-judge/SKILL.md +77 -82
  199. package/templates/skills/orc-learn/SKILL.md +14 -14
  200. package/templates/skills/orc-learn/examples/learn-run-mock.md +61 -61
  201. package/templates/skills/orc-mini/SKILL.md +65 -113
  202. package/templates/skills/orc-pattern/SKILL.md +27 -48
  203. package/templates/skills/orc-poly/SKILL.md +32 -61
  204. package/templates/skills/orc-pr-driver/SKILL.md +25 -51
  205. package/templates/skills/orc-pr-driver/references/green-gate.md +113 -105
  206. package/templates/skills/orc-pr-setup/SKILL.md +20 -45
  207. package/templates/skills/orc-quick/README.md +43 -2
  208. package/templates/skills/orc-quick/SKILL.md +76 -107
  209. package/templates/skills/orc-quick/references/dispatch-gate.md +16 -5
  210. package/templates/skills/orc-quick/references/gh-mode.md +48 -1
  211. package/templates/skills/orc-quick/references/look.md +3 -1
  212. package/templates/skills/orc-retro/SKILL.md +19 -18
  213. package/templates/skills/orc-retro/examples/retro-mock.md +1 -1
  214. package/templates/skills/orc-route/SKILL.md +25 -45
  215. package/templates/skills/orc-test/SKILL.md +16 -37
  216. package/templates/skills/orc-verify/SKILL.md +21 -39
  217. package/templates/skills/orc-verify/examples/verify-mock.md +33 -33
  218. package/templates/skills/orc-wait/SKILL.md +156 -163
  219. package/templates/skills/orc-wiki/references/extra.md +1 -1
  220. package/templates/skills/orc-wiki/references/phases/phase-0.md +1 -6
  221. package/templates/skills/orc-wiki/references/phases/phase-1.md +1 -6
  222. package/templates/skills/orc-wiki/references/phases/phase-2.md +1 -6
  223. package/templates/skills/orc-wiki/references/phases/phase-3.md +1 -6
  224. package/templates/skills/orc-wiki/references/phases/phase-3c.md +1 -6
@@ -1,273 +1,273 @@
1
- # Example — the full roster, and a premise challenge that moves the goal
2
-
3
- > The annotated maintainer's walkthrough for the council. Every council gate that
4
- > fires is called out. For the whole lane end to end, read
5
- > `tsd-two-iterations.md` first.
6
-
7
- The artifact is a PRD, not a TSD, and that matters: the suggestion ORC computes
8
- for a PRD includes the two lenses that never block.
9
-
10
- ---
11
-
12
- ## C1 — intake, and question 7
13
-
14
- ```
15
- > /orc-challenge docs/prd-self-serve.md
16
- ```
17
-
18
- The first six questions are unchanged (`../../_shared/phases/intake.md`). Question 7 is
19
- rendered from `orc challenge roles --kind prd --json` — **the skill never
20
- hand-lists the lenses**:
21
-
22
- ```
23
- 7 Who is on the council for this review? (judge always runs; advisor runs on a fail)
24
-
25
- ORC suggests, for a PRD:
26
- [x] cold reader can a stranger answer this document's own questions?
27
- [x] outsider what does this assume you already know?
28
- [x] principles is this even the right problem? (never blocks)
29
- [x] expansionist what upside is being missed? (never blocks)
30
- [ ] contrarian assume it has a fatal flaw, then go find it
31
- [ ] executor can this be started on Monday? where is the first step?
32
-
33
- Reply with the ones you want (or "all", or "none").
34
- Each one is one extra read-only Opus 5 dispatch per iteration.
35
- ```
36
-
37
- The user replies: **`all`**.
38
-
39
- > **GATE — rule 12.** Had the session tried to proceed without an answer,
40
- > `orc challenge init` would have refused:
41
- >
42
- > ```
43
- > ❌ --council is required and has no default. ORC SUGGESTS a roster (from the
44
- > kind and the goal); the user PICKS it. […] Suggested for --kind prd:
45
- > reader,outsider,principles,expansionist.
46
- > (a lane that picks its own council has broken this contract)
47
- > ```
48
-
49
- ```bash
50
- orc challenge init prd-self-serve \
51
- --artifact docs/prd-self-serve.md --kind prd \
52
- --goal "…" --audience "…" --done-means "…" \
53
- --template docs/templates/prd.md \
54
- --council all \
55
- --revision in-place
56
- ```
57
-
58
- ```
59
- council (v1): reader contrarian outsider executor principles expansionist → 7 dispatch(es) per iteration
60
- ```
61
-
62
- The cost is stated in **dispatches**, never in dollars — `/orc-budget`'s rule:
63
- no dollar figure without a dated price table, and this ask has no plan to price.
64
-
65
- ---
66
-
67
- ## C3 — the council, in parallel, ≤ 3 in flight
68
-
69
- Six lenses, three at a time, every one dispatched **BY NAME**. The cap is
70
- announced when it bites:
71
-
72
- ```
73
- Council: 6 lenses on the roster, dispatched 3 at a time (hard cap, no config key).
74
- wave 1 reader · contrarian · outsider
75
- wave 2 executor · principles · expansionist
76
- ```
77
-
78
- Each writes two files:
79
-
80
- ```
81
- orc/orc-challenge/prd-self-serve/iteration-01/council/
82
- reader.md reader.json R-001 … R-003
83
- contrarian.md contrarian.json C-001 … C-006
84
- outsider.md outsider.json O-001 … O-003
85
- executor.md executor.json E-001 … E-002
86
- principles.md principles.json Q-001 ← never reaches the judge
87
- expansionist.md expansionist.json X-001 … X-002 ← never reaches the judge
88
- ```
89
-
90
- The two non-finding reports are recorded separately:
91
-
92
- ```bash
93
- orc challenge note prd-self-serve --iteration 1 --from /tmp/council-note.json
94
- ```
95
-
96
- ```
97
- ✓ recorded 1 premise and 2 opportunities at iteration 1.
98
- Neither blocks. A premise challenge is resolved by a HUMAN and by nobody else.
99
- ```
100
-
101
- > **GATE — `class-mismatch`.** The first attempt put the opportunities in a
102
- > `findings[]` key, and `note` refused by name:
103
- >
104
- > ```
105
- > ❌ `orc challenge note` records OPPORTUNITIES and PREMISES only. The
106
- > expansionist and the first-principles thinker never touch the pass gate —
107
- > a findings[] key here is a class error, not a typo. Findings go through
108
- > `orc challenge record`.
109
- > ```
110
-
111
- ---
112
-
113
- ## C4 — the judge, with a slice that grew by exactly four rows
114
-
115
- ```
116
- goals: orc/orc-challenge/prd-self-serve/goals.md (frozen, v1)
117
- artifact: docs/prd-self-serve.md
118
- template: orc/orc-challenge/prd-self-serve/template.md (frozen, v1)
119
- dimensions: <skill>/references/dimensions.md (selected: D1 D2 D3 D4 D5 D7)
120
- lint: …/iteration-01/lint.json
121
- reader: …/iteration-01/council/reader.md
122
- contrarian: …/iteration-01/council/contrarian.md
123
- outsider: …/iteration-01/council/outsider.md
124
- executor: …/iteration-01/council/executor.md
125
- carry_ids: (none — first iteration)
126
- ```
127
-
128
- Still paths and ids only. **`principles.md` and `expansionist.md` are NOT
129
- there**, and that is the architecture, not an oversight.
130
-
131
- ---
132
-
133
- ## C5 — record, and the gate that makes five reviewers safe
134
-
135
- The judge's first return disposed of thirteen of the fourteen council ids.
136
-
137
- > **GATE — `council-coverage`.**
138
- >
139
- > ```
140
- > ❌ malformed verdict — council coverage is below 100% — every id the council
141
- > raised needs exactly ONE disposition (adopted | merged | rejected |
142
- > out-of-goal). Missing: O-003
143
- > ```
144
- >
145
- > `orc challenge record` read `iteration-01/council/*.json` **itself**. The judge
146
- > could not shrink the set by omitting `O-003`, because the set was never the
147
- > judge's to report.
148
-
149
- Re-recorded:
150
-
151
- ```
152
- iteration 1: FAIL — 5 blocking findings, coverage 100%
153
- reader RAN raised 3 · adopted 2 · merged 1 · rejected 0 · out-of-goal 0
154
- contrarian RAN raised 6 · adopted 4 · merged 1 · rejected 1 · out-of-goal 0
155
- outsider RAN raised 3 · adopted 1 · merged 2 · rejected 0 · out-of-goal 0
156
- executor RAN raised 2 · adopted 2 · merged 0 · rejected 0 · out-of-goal 0
157
- CHALLENGE iter=1 findings=P0:1/P1:4/P2:6 coverage=100% council=6/6 raised=R:3,C:6,O:3,E:2 adopted=9 verdict=FAIL
158
- ```
159
-
160
- Three things to notice:
161
-
162
- - **`C-002` is `C-002` in the verdict.** An adopted council finding keeps the
163
- raiser's id, forever — which is what lets the panel say *"the contrarian raised
164
- four of the six blockers"*.
165
- - **`O-001` was adopted and is marked `also found by: reader`.** The outsider and
166
- the cold reader landed on the same undefined term from opposite directions.
167
- That is `corroborated_by` — **a signal, never an automatic severity bump.**
168
- - **The two `O-` ids that were `merged`** name a real `merged_into`. `record`
169
- refuses a merge into an id that does not resolve.
170
-
171
- ---
172
-
173
- ## C8 — the stop, and the block that goes FIRST
174
-
175
- The fix brief leads with the premise challenge, because it disputes the yardstick
176
- every finding under it was measured against:
177
-
178
- ```
179
- OPEN PREMISE CHALLENGE — read this before the findings
180
-
181
- Q-001 disputes: goal
182
- "…a PRD that lets the growth team ship self-serve signup…"
183
-
184
- Reframe: the underlying job is not "describe self-serve signup"; it is
185
- "decide whether signup is self-serve at all". Three sections of this
186
- document answer the second question and are written as if the first
187
- were settled.
188
-
189
- Cheapest test: ask the growth lead whether the decision is made. One
190
- message, no rewrite.
191
-
192
- Neither resolution is automatic and ORC never picks:
193
- adopt orc challenge goals prd-self-serve --set <path> --reason "…"
194
- dismiss orc challenge premise prd-self-serve Q-001 --dismiss --reason "…"
195
- ```
196
-
197
- Then the findings, grouped by the advisor's root causes. Then, last and clearly
198
- marked **not work**:
199
-
200
- ```
201
- OPPORTUNITIES — not work, nothing here blocks
202
-
203
- X-001 the onboarding checklist generalises to every plan tier
204
- first step: list the four tiers' current checklists side by side
205
- route: /orc-brainstorm
206
-
207
- X-002 §6 is the enablement doc the support team has been asking for
208
- first step: send §6 to support and ask if it is enough on its own
209
- route: /orc-pact (they would want it committed to)
210
- ```
211
-
212
- ---
213
-
214
- ## Session 2 — the user adopts the premise, and the yardstick moves
215
-
216
- ```bash
217
- orc challenge goals prd-self-serve --set docs/goals-v2.md \
218
- --reason "Q-001 was right — the decision was never taken"
219
- ```
220
-
221
- `goals.version` → 2, iteration 1 keeps `graded_against_goal: 1`, and the
222
- iteration rail draws the version break. **That mechanism has existed since
223
- v0.47.0; the council is the first thing that can legitimately move it.**
224
-
225
- The user also narrows the roster, because the premise has been answered and the
226
- document is now a technical one:
227
-
228
- ```bash
229
- orc challenge council prd-self-serve --set contrarian,executor \
230
- --reason "the framing question is settled; what is left is completeness"
231
- ```
232
-
233
- ```
234
- ✓ council v2: contrarian executor — the framing question is settled; what is left is completeness
235
- ```
236
-
237
- > **This is safe, and here is why.** `C-002`, `O-001` and `R-003` are still open
238
- > and the outsider and the reader are no longer on the roster. **The judge
239
- > resolves every carried finding, whatever prefix it carries** (rule 13) — rule
240
- > 11 already had it re-reading the artifact from disk rather than from an account
241
- > of what changed, so it never needed the original raiser. The roster is freely
242
- > variable at zero cost to conservation.
243
-
244
- ---
245
-
246
- ## Session 3 — a lens that could not run
247
-
248
- A usage limit hit mid-batch. The orchestrator records the truth:
249
-
250
- ```json
251
- { "lens": "executor", "ran": false, "reason": "usage limit reached mid-batch" }
252
- ```
253
-
254
- ```
255
- iteration 3: FAIL — 2 blocking findings, coverage 100%
256
- contrarian RAN raised 2 · adopted 1 · merged 0 · rejected 1 · out-of-goal 0
257
- executor NOT-RUN usage limit reached mid-batch
258
- CHALLENGE iter=3 findings=P0:0/P1:2/P2:3 coverage=100% council=1/2 raised=C:2 adopted=1 verdict=FAIL
259
- ```
260
-
261
- > **GATE — `lens-silent`.** Omitting the executor entirely instead of declaring
262
- > it would have been rejected:
263
- >
264
- > ```
265
- > ❌ malformed verdict — executor is on the roster but returned neither a report
266
- > (iteration-03/council/executor.json) nor an explicit
267
- > { "lens": "executor", "ran": false, "reason": "…" }. A selected role is
268
- > never silently absent.
269
- > ```
270
-
271
- `council=1/2` in the trace line means the gap is visible to `orc stats` and to
272
- `/orc-retro`, not only in the panel — which is how a user eventually finds out
273
- whether a lens is earning its dispatch.
1
+ # Example — the full roster, and a premise challenge that moves the goal
2
+
3
+ > The annotated maintainer's walkthrough for the council. Every council gate that
4
+ > fires is called out. For the whole lane end to end, read
5
+ > `tsd-two-iterations.md` first.
6
+
7
+ The artifact is a PRD, not a TSD, and that matters: the suggestion ORC computes
8
+ for a PRD includes the two lenses that never block.
9
+
10
+ ---
11
+
12
+ ## C1 — intake, and question 7
13
+
14
+ ```
15
+ > /orc-challenge docs/prd-self-serve.md
16
+ ```
17
+
18
+ The first six questions are unchanged (`../../_shared/phases/intake.md`). Question 7 is
19
+ rendered from `orc challenge roles --kind prd --json` — **the skill never
20
+ hand-lists the lenses**:
21
+
22
+ ```
23
+ 7 Who is on the council for this review? (judge always runs; advisor runs on a fail)
24
+
25
+ ORC suggests, for a PRD:
26
+ [x] cold reader can a stranger answer this document's own questions?
27
+ [x] outsider what does this assume you already know?
28
+ [x] principles is this even the right problem? (never blocks)
29
+ [x] expansionist what upside is being missed? (never blocks)
30
+ [ ] contrarian assume it has a fatal flaw, then go find it
31
+ [ ] executor can this be started on Monday? where is the first step?
32
+
33
+ Reply with the ones you want (or "all", or "none").
34
+ Each one is one extra read-only Opus 5.5 dispatch per iteration.
35
+ ```
36
+
37
+ The user replies: **`all`**.
38
+
39
+ > **GATE — rule 12.** Had the session tried to proceed without an answer,
40
+ > `orc challenge init` would have refused:
41
+ >
42
+ > ```
43
+ > ❌ --council is required and has no default. ORC SUGGESTS a roster (from the
44
+ > kind and the goal); the user PICKS it. […] Suggested for --kind prd:
45
+ > reader,outsider,principles,expansionist.
46
+ > (a lane that picks its own council has broken this contract)
47
+ > ```
48
+
49
+ ```bash
50
+ orc challenge init prd-self-serve \
51
+ --artifact docs/prd-self-serve.md --kind prd \
52
+ --goal "…" --audience "…" --done-means "…" \
53
+ --template docs/templates/prd.md \
54
+ --council all \
55
+ --revision in-place
56
+ ```
57
+
58
+ ```
59
+ council (v1): reader contrarian outsider executor principles expansionist → 7 dispatch(es) per iteration
60
+ ```
61
+
62
+ The cost is stated in **dispatches**, never in dollars — `/orc-budget`'s rule:
63
+ no dollar figure without a dated price table, and this ask has no plan to price.
64
+
65
+ ---
66
+
67
+ ## C3 — the council, in parallel, ≤ 3 in flight
68
+
69
+ Six lenses, three at a time, every one dispatched **BY NAME**. The cap is
70
+ announced when it bites:
71
+
72
+ ```
73
+ Council: 6 lenses on the roster, dispatched 3 at a time (hard cap, no config key).
74
+ wave 1 reader · contrarian · outsider
75
+ wave 2 executor · principles · expansionist
76
+ ```
77
+
78
+ Each writes two files:
79
+
80
+ ```
81
+ orc/orc-challenge/prd-self-serve/iteration-01/council/
82
+ reader.md reader.json R-001 … R-003
83
+ contrarian.md contrarian.json C-001 … C-006
84
+ outsider.md outsider.json O-001 … O-003
85
+ executor.md executor.json E-001 … E-002
86
+ principles.md principles.json Q-001 ← never reaches the judge
87
+ expansionist.md expansionist.json X-001 … X-002 ← never reaches the judge
88
+ ```
89
+
90
+ The two non-finding reports are recorded separately:
91
+
92
+ ```bash
93
+ orc challenge note prd-self-serve --iteration 1 --from /tmp/council-note.json
94
+ ```
95
+
96
+ ```
97
+ ✓ recorded 1 premise and 2 opportunities at iteration 1.
98
+ Neither blocks. A premise challenge is resolved by a HUMAN and by nobody else.
99
+ ```
100
+
101
+ > **GATE — `class-mismatch`.** The first attempt put the opportunities in a
102
+ > `findings[]` key, and `note` refused by name:
103
+ >
104
+ > ```
105
+ > ❌ `orc challenge note` records OPPORTUNITIES and PREMISES only. The
106
+ > expansionist and the first-principles thinker never touch the pass gate —
107
+ > a findings[] key here is a class error, not a typo. Findings go through
108
+ > `orc challenge record`.
109
+ > ```
110
+
111
+ ---
112
+
113
+ ## C4 — the judge, with a slice that grew by exactly four rows
114
+
115
+ ```
116
+ goals: orc/orc-challenge/prd-self-serve/goals.md (frozen, v1)
117
+ artifact: docs/prd-self-serve.md
118
+ template: orc/orc-challenge/prd-self-serve/template.md (frozen, v1)
119
+ dimensions: <skill>/references/dimensions.md (selected: D1 D2 D3 D4 D5 D7)
120
+ lint: …/iteration-01/lint.json
121
+ reader: …/iteration-01/council/reader.md
122
+ contrarian: …/iteration-01/council/contrarian.md
123
+ outsider: …/iteration-01/council/outsider.md
124
+ executor: …/iteration-01/council/executor.md
125
+ carry_ids: (none — first iteration)
126
+ ```
127
+
128
+ Still paths and ids only. **`principles.md` and `expansionist.md` are NOT
129
+ there**, and that is the architecture, not an oversight.
130
+
131
+ ---
132
+
133
+ ## C5 — record, and the gate that makes five reviewers safe
134
+
135
+ The judge's first return disposed of thirteen of the fourteen council ids.
136
+
137
+ > **GATE — `council-coverage`.**
138
+ >
139
+ > ```
140
+ > ❌ malformed verdict — council coverage is below 100% — every id the council
141
+ > raised needs exactly ONE disposition (adopted | merged | rejected |
142
+ > out-of-goal). Missing: O-003
143
+ > ```
144
+ >
145
+ > `orc challenge record` read `iteration-01/council/*.json` **itself**. The judge
146
+ > could not shrink the set by omitting `O-003`, because the set was never the
147
+ > judge's to report.
148
+
149
+ Re-recorded:
150
+
151
+ ```
152
+ iteration 1: FAIL — 5 blocking findings, coverage 100%
153
+ reader RAN raised 3 · adopted 2 · merged 1 · rejected 0 · out-of-goal 0
154
+ contrarian RAN raised 6 · adopted 4 · merged 1 · rejected 1 · out-of-goal 0
155
+ outsider RAN raised 3 · adopted 1 · merged 2 · rejected 0 · out-of-goal 0
156
+ executor RAN raised 2 · adopted 2 · merged 0 · rejected 0 · out-of-goal 0
157
+ CHALLENGE iter=1 findings=P0:1/P1:4/P2:6 coverage=100% council=6/6 raised=R:3,C:6,O:3,E:2 adopted=9 verdict=FAIL
158
+ ```
159
+
160
+ Three things to notice:
161
+
162
+ - **`C-002` is `C-002` in the verdict.** An adopted council finding keeps the
163
+ raiser's id, forever — which is what lets the panel say *"the contrarian raised
164
+ four of the six blockers"*.
165
+ - **`O-001` was adopted and is marked `also found by: reader`.** The outsider and
166
+ the cold reader landed on the same undefined term from opposite directions.
167
+ That is `corroborated_by` — **a signal, never an automatic severity bump.**
168
+ - **The two `O-` ids that were `merged`** name a real `merged_into`. `record`
169
+ refuses a merge into an id that does not resolve.
170
+
171
+ ---
172
+
173
+ ## C8 — the stop, and the block that goes FIRST
174
+
175
+ The fix brief leads with the premise challenge, because it disputes the yardstick
176
+ every finding under it was measured against:
177
+
178
+ ```
179
+ OPEN PREMISE CHALLENGE — read this before the findings
180
+
181
+ Q-001 disputes: goal
182
+ "…a PRD that lets the growth team ship self-serve signup…"
183
+
184
+ Reframe: the underlying job is not "describe self-serve signup"; it is
185
+ "decide whether signup is self-serve at all". Three sections of this
186
+ document answer the second question and are written as if the first
187
+ were settled.
188
+
189
+ Cheapest test: ask the growth lead whether the decision is made. One
190
+ message, no rewrite.
191
+
192
+ Neither resolution is automatic and ORC never picks:
193
+ adopt orc challenge goals prd-self-serve --set <path> --reason "…"
194
+ dismiss orc challenge premise prd-self-serve Q-001 --dismiss --reason "…"
195
+ ```
196
+
197
+ Then the findings, grouped by the advisor's root causes. Then, last and clearly
198
+ marked **not work**:
199
+
200
+ ```
201
+ OPPORTUNITIES — not work, nothing here blocks
202
+
203
+ X-001 the onboarding checklist generalises to every plan tier
204
+ first step: list the four tiers' current checklists side by side
205
+ route: /orc-brainstorm
206
+
207
+ X-002 §6 is the enablement doc the support team has been asking for
208
+ first step: send §6 to support and ask if it is enough on its own
209
+ route: /orc-pact (they would want it committed to)
210
+ ```
211
+
212
+ ---
213
+
214
+ ## Session 2 — the user adopts the premise, and the yardstick moves
215
+
216
+ ```bash
217
+ orc challenge goals prd-self-serve --set docs/goals-v2.md \
218
+ --reason "Q-001 was right — the decision was never taken"
219
+ ```
220
+
221
+ `goals.version` → 2, iteration 1 keeps `graded_against_goal: 1`, and the
222
+ iteration rail draws the version break. **That mechanism has existed since
223
+ v0.47.0; the council is the first thing that can legitimately move it.**
224
+
225
+ The user also narrows the roster, because the premise has been answered and the
226
+ document is now a technical one:
227
+
228
+ ```bash
229
+ orc challenge council prd-self-serve --set contrarian,executor \
230
+ --reason "the framing question is settled; what is left is completeness"
231
+ ```
232
+
233
+ ```
234
+ ✓ council v2: contrarian executor — the framing question is settled; what is left is completeness
235
+ ```
236
+
237
+ > **This is safe, and here is why.** `C-002`, `O-001` and `R-003` are still open
238
+ > and the outsider and the reader are no longer on the roster. **The judge
239
+ > resolves every carried finding, whatever prefix it carries** (rule 13) — rule
240
+ > 11 already had it re-reading the artifact from disk rather than from an account
241
+ > of what changed, so it never needed the original raiser. The roster is freely
242
+ > variable at zero cost to conservation.
243
+
244
+ ---
245
+
246
+ ## Session 3 — a lens that could not run
247
+
248
+ A usage limit hit mid-batch. The orchestrator records the truth:
249
+
250
+ ```json
251
+ { "lens": "executor", "ran": false, "reason": "usage limit reached mid-batch" }
252
+ ```
253
+
254
+ ```
255
+ iteration 3: FAIL — 2 blocking findings, coverage 100%
256
+ contrarian RAN raised 2 · adopted 1 · merged 0 · rejected 1 · out-of-goal 0
257
+ executor NOT-RUN usage limit reached mid-batch
258
+ CHALLENGE iter=3 findings=P0:0/P1:2/P2:3 coverage=100% council=1/2 raised=C:2 adopted=1 verdict=FAIL
259
+ ```
260
+
261
+ > **GATE — `lens-silent`.** Omitting the executor entirely instead of declaring
262
+ > it would have been rejected:
263
+ >
264
+ > ```
265
+ > ❌ malformed verdict — executor is on the roster but returned neither a report
266
+ > (iteration-03/council/executor.json) nor an explicit
267
+ > { "lens": "executor", "ran": false, "reason": "…" }. A selected role is
268
+ > never silently absent.
269
+ > ```
270
+
271
+ `council=1/2` in the trace line means the gap is visible to `orc stats` and to
272
+ `/orc-retro`, not only in the panel — which is how a user eventually finds out
273
+ whether a lens is earning its dispatch.