@azure-id/orc 1.9.2 → 2.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 (228) hide show
  1. package/CHANGELOG.md +722 -0
  2. package/README-id.md +56 -42
  3. package/README.md +58 -41
  4. package/bin/build-agents.js +125 -29
  5. package/bin/clear-logs.js +620 -0
  6. package/bin/cli.js +1873 -180
  7. package/bin/fix.js +459 -0
  8. package/bin/gotcha-import.js +1081 -0
  9. package/bin/gotcha.js +1566 -0
  10. package/bin/graph-query.js +1 -1
  11. package/bin/graph.js +717 -717
  12. package/bin/habit.js +1538 -0
  13. package/bin/mockrun-catalog.js +284 -276
  14. package/bin/onboarding-content.js +2 -1
  15. package/bin/pricing.json +28 -21
  16. package/bin/run-undo.js +398 -0
  17. package/bin/trace-write.js +869 -0
  18. package/bin/verify-contracts.js +627 -100
  19. package/bin/verify-package.js +68 -10
  20. package/bin/webui/api.js +151 -6
  21. package/bin/webui/app.html +239 -232
  22. package/bin/webui/css/00-tokens.css +110 -92
  23. package/bin/webui/css/04-motion.css +87 -0
  24. package/bin/webui/css/06-responsive.css +203 -178
  25. package/bin/webui/css/panels/behaviour.css +205 -0
  26. package/bin/webui/css/panels/hookui.css +79 -0
  27. package/bin/webui/fixtures/behaviour.js +562 -0
  28. package/bin/webui/fixtures/extra.js +9 -9
  29. package/bin/webui/fixtures/flow.js +81 -81
  30. package/bin/webui/fixtures/hookui.js +506 -431
  31. package/bin/webui/fixtures/index.js +66 -3
  32. package/bin/webui/fixtures/knowledge.js +9 -3
  33. package/bin/webui/fixtures/maintenance.js +123 -42
  34. package/bin/webui/fixtures/rules.js +1007 -1002
  35. package/bin/webui/fixtures/settings.js +6 -7
  36. package/bin/webui/fixtures/stats.js +25 -6
  37. package/bin/webui/fixtures/wait.js +98 -97
  38. package/bin/webui/i18n/en/behaviour.json +156 -0
  39. package/bin/webui/i18n/en/hookui.json +290 -194
  40. package/bin/webui/i18n/en/maintenance.json +71 -52
  41. package/bin/webui/i18n/en/nav.json +25 -24
  42. package/bin/webui/i18n/en/settings.json +60 -60
  43. package/bin/webui/i18n/en/tour.json +37 -35
  44. package/bin/webui/i18n/id/behaviour.json +156 -0
  45. package/bin/webui/i18n/id/hookui.json +290 -194
  46. package/bin/webui/i18n/id/maintenance.json +71 -52
  47. package/bin/webui/i18n/id/nav.json +25 -24
  48. package/bin/webui/i18n/id/settings.json +60 -60
  49. package/bin/webui/i18n/id/tour.json +37 -35
  50. package/bin/webui/js/01-i18n.js +155 -154
  51. package/bin/webui/js/05-banners.js +181 -172
  52. package/bin/webui/js/06-edit.js +193 -183
  53. package/bin/webui/js/90-tour.js +498 -494
  54. package/bin/webui/js/91-shortcuts.js +126 -126
  55. package/bin/webui/js/99-boot.js +121 -118
  56. package/bin/webui/js/panels/behaviour.js +1087 -0
  57. package/bin/webui/js/panels/hookui.js +2196 -1691
  58. package/bin/webui/js/panels/maintenance.js +336 -235
  59. package/bin/webui/js/panels/settings.js +726 -719
  60. package/mock-run/INDEX.md +110 -107
  61. package/mock-run/extra-slots.md +1 -1
  62. package/mock-run/gotcha-import.md +118 -0
  63. package/mock-run/habits.md +129 -0
  64. package/mock-run/orc-aftermath.md +392 -392
  65. package/mock-run/orc-budget.md +29 -33
  66. package/mock-run/orc-cli.md +200 -200
  67. package/mock-run/orc-explain.md +86 -86
  68. package/mock-run/orc-extra.md +389 -392
  69. package/mock-run/orc-fix.md +87 -0
  70. package/mock-run/orc-pattern.md +112 -112
  71. package/mock-run/orc-quick.md +6 -1
  72. package/mock-run/orc.md +157 -157
  73. package/package.json +1 -1
  74. package/templates/agents/MODEL-MAPPING.md +37 -34
  75. package/templates/agents/orc-advisor-opus-5-xhigh.md +1 -7
  76. package/templates/agents/orc-analyze-mini-opus-5-med.md +1 -6
  77. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +2 -5
  78. package/templates/agents/{orc-claude-writer-opus-4-8-high.md → orc-claude-writer-opus-5-low.md} +48 -53
  79. package/templates/agents/orc-context-combiner-opus-5-high.md +1 -11
  80. package/templates/agents/orc-executor-haiku-4-5.md +14 -6
  81. package/templates/agents/orc-executor-opus-4-7-high.md +14 -6
  82. package/templates/agents/orc-executor-opus-4-7-med.md +14 -6
  83. package/templates/agents/orc-executor-opus-4-8-high.md +14 -6
  84. package/templates/agents/orc-executor-opus-5-high.md +14 -6
  85. package/templates/agents/orc-executor-opus-5-low.md +14 -6
  86. package/templates/agents/orc-executor-opus-5-med.md +14 -6
  87. package/templates/agents/orc-executor-sonnet-4-6-high.md +14 -6
  88. package/templates/agents/orc-executor-sonnet-4-6-med.md +14 -6
  89. package/templates/agents/orc-executor-sonnet-5-high.md +15 -7
  90. package/templates/agents/orc-executor-sonnet-5-low.md +155 -0
  91. package/templates/agents/orc-executor-sonnet-5-med.md +155 -0
  92. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +1 -10
  93. package/templates/agents/orc-judge-opus-5-xhigh.md +5 -9
  94. package/templates/agents/orc-learn-writer-opus-5-low.md +1 -7
  95. package/templates/agents/orc-pattern-codifier-opus-5-med.md +1 -8
  96. package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +58 -63
  97. package/templates/agents/orc-planner-mini-opus-5-med.md +1 -4
  98. package/templates/agents/orc-planner-mini-sonnet-5-high.md +2 -3
  99. package/templates/agents/orc-planner-opus-5-med.md +1 -4
  100. package/templates/agents/orc-recon-opus-5-low.md +1 -8
  101. package/templates/agents/orc-recon-sonnet-4-6-med.md +1 -8
  102. package/templates/agents/orc-retro-opus-5-med.md +6 -8
  103. package/templates/agents/orc-retro-sonnet-5-high.md +7 -8
  104. package/templates/agents/orc-reviewer-opus-5-low.md +96 -0
  105. package/templates/agents/orc-scout-opus-5-low.md +1 -6
  106. package/templates/agents/orc-scout-sonnet-4-6-high.md +35 -39
  107. package/templates/agents/orc-system-analyst-opus-5-high.md +1 -6
  108. package/templates/agents/orc-test-author-opus-5-med.md +4 -5
  109. package/templates/agents/orc-trace-writer-haiku-4-5.md +3 -7
  110. package/templates/agents/orc-verifier-opus-5-med.md +16 -8
  111. package/templates/agents/{orc-wiki-scanner-opus-4-8-high.md → orc-wiki-scanner-opus-5-low.md} +74 -79
  112. package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +97 -106
  113. package/templates/commands/orc-analyze.md +13 -21
  114. package/templates/commands/orc-fast.md +10 -15
  115. package/templates/commands/orc-fix.md +18 -0
  116. package/templates/commands/orc-poly.md +12 -21
  117. package/templates/commands/orc-pr-driver.md +11 -30
  118. package/templates/commands/orc-pr-setup.md +10 -31
  119. package/templates/commands/orc-route.md +11 -41
  120. package/templates/commands/orc-test.md +5 -60
  121. package/templates/commands/orc-wiki.md +64 -64
  122. package/templates/hooks/README.md +109 -7
  123. package/templates/hooks/orc-session-hook.js +339 -0
  124. package/templates/hooks/orc-statusline-render.js +317 -23
  125. package/templates/hooks/orc-statusline.js +165 -50
  126. package/templates/hooks/orc-subagent-line.js +23 -5
  127. package/templates/hooks/orc-weather-fetch.js +123 -0
  128. package/templates/skills/_shared/README.md +9 -0
  129. package/templates/skills/_shared/code-graph.md +47 -55
  130. package/templates/skills/_shared/config-precedence.md +3 -1
  131. package/templates/skills/_shared/extra-dispatch.md +78 -93
  132. package/templates/skills/_shared/gotchas.md +248 -177
  133. package/templates/skills/_shared/habits.md +101 -0
  134. package/templates/skills/_shared/lane-contract.md +84 -0
  135. package/templates/skills/_shared/opus5-only.md +14 -14
  136. package/templates/skills/_shared/phases/README.md +142 -83
  137. package/templates/skills/_shared/phases/analyst-gates.md +10 -21
  138. package/templates/skills/_shared/phases/execution.md +8 -14
  139. package/templates/skills/_shared/phases/house-rules.md +27 -32
  140. package/templates/skills/_shared/phases/intake.md +127 -133
  141. package/templates/skills/_shared/phases/mock-example.md +46 -56
  142. package/templates/skills/_shared/phases/plan-handoff.md +91 -97
  143. package/templates/skills/_shared/phases/planning.md +7 -17
  144. package/templates/skills/_shared/phases/preflight.md +19 -42
  145. package/templates/skills/_shared/phases/review.md +24 -28
  146. package/templates/skills/_shared/phases/rules.md +18 -42
  147. package/templates/skills/_shared/phases/scoring.md +55 -65
  148. package/templates/skills/_shared/phases/security-checklist.md +46 -50
  149. package/templates/skills/_shared/phases/security.md +45 -55
  150. package/templates/skills/_shared/phases/ship.md +6 -15
  151. package/templates/skills/_shared/phases/stop-resume.md +2 -5
  152. package/templates/skills/_shared/phases/summary.md +73 -48
  153. package/templates/skills/_shared/phases/testgen.md +41 -51
  154. package/templates/skills/_shared/phases/trace-verbs.md +447 -0
  155. package/templates/skills/_shared/phases/trace.md +66 -297
  156. package/templates/skills/_shared/phases/verify.md +62 -70
  157. package/templates/skills/_shared/phases/wave-grouping.md +128 -133
  158. package/templates/skills/_shared/phases/wiki-consult.md +10 -6
  159. package/templates/skills/_shared/read-ladder.md +2 -55
  160. package/templates/skills/_shared/return-validation.md +17 -70
  161. package/templates/skills/_shared/review-slice.md +106 -0
  162. package/templates/skills/_shared/smoke-gate.md +46 -28
  163. package/templates/skills/_shared/wait.md +1 -0
  164. package/templates/skills/context-combiner/SKILL.md +15 -44
  165. package/templates/skills/orc/README.md +2 -2
  166. package/templates/skills/orc/SKILL.md +35 -63
  167. package/templates/skills/orc/config.md +25 -27
  168. package/templates/skills/orc/examples/full-run-mock.md +2 -1
  169. package/templates/skills/orc/references/effort-and-mode.md +17 -17
  170. package/templates/skills/orc/references/pattern-gate.md +89 -89
  171. package/templates/skills/orc/references/phases/intake.md +41 -47
  172. package/templates/skills/orc/references/phases/integration.md +13 -19
  173. package/templates/skills/orc/references/preflight-report.md +11 -12
  174. package/templates/skills/orc/references/ultra-mode.md +9 -7
  175. package/templates/skills/orc/schemas/checkpoint.md +122 -122
  176. package/templates/skills/orc/subskills/orc-execution/SKILL.md +27 -73
  177. package/templates/skills/orc/subskills/orc-execution/core.md +12 -99
  178. package/templates/skills/orc/subskills/orc-execution/subagent.md +14 -13
  179. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +12 -53
  180. package/templates/skills/orc/subskills/orc-review-verify/core.md +52 -135
  181. package/templates/skills/orc/subskills/orc-review-verify/subagent.md +7 -7
  182. package/templates/skills/orc/subskills/orc-testgen/SKILL.md +11 -22
  183. package/templates/skills/orc/subskills/orc-testgen/core.md +20 -59
  184. package/templates/skills/orc/subskills/orc-testgen/subagent.md +7 -7
  185. package/templates/skills/orc-advisor/SKILL.md +56 -60
  186. package/templates/skills/orc-analyze/SKILL.md +33 -67
  187. package/templates/skills/orc-analyze/schemas/report-audit.md +2 -1
  188. package/templates/skills/orc-analyze/schemas/report-prose.md +2 -1
  189. package/templates/skills/orc-analyze-mini/SKILL.md +35 -70
  190. package/templates/skills/orc-claude/SKILL.md +14 -14
  191. package/templates/skills/orc-claude/examples/claude-run-mock.md +65 -65
  192. package/templates/skills/orc-diy/README.md +31 -0
  193. package/templates/skills/orc-diy/SKILL.md +27 -78
  194. package/templates/skills/orc-diy/references/blocks/pattern.md +18 -18
  195. package/templates/skills/orc-fast/SKILL.md +49 -75
  196. package/templates/skills/orc-fix/SKILL.md +110 -0
  197. package/templates/skills/orc-judge/SKILL.md +77 -82
  198. package/templates/skills/orc-mini/SKILL.md +64 -112
  199. package/templates/skills/orc-mini/examples/mini-run-mock.md +4 -2
  200. package/templates/skills/orc-pattern/SKILL.md +27 -48
  201. package/templates/skills/orc-poly/SKILL.md +32 -61
  202. package/templates/skills/orc-pr-driver/SKILL.md +25 -51
  203. package/templates/skills/orc-pr-driver/references/green-gate.md +113 -105
  204. package/templates/skills/orc-pr-setup/SKILL.md +20 -45
  205. package/templates/skills/orc-quick/README.md +44 -3
  206. package/templates/skills/orc-quick/SKILL.md +77 -108
  207. package/templates/skills/orc-quick/references/dispatch-gate.md +18 -6
  208. package/templates/skills/orc-quick/references/gh-mode.md +50 -1
  209. package/templates/skills/orc-quick/references/look.md +3 -1
  210. package/templates/skills/orc-retro/SKILL.md +20 -19
  211. package/templates/skills/orc-retro/examples/retro-mock.md +17 -17
  212. package/templates/skills/orc-route/SKILL.md +25 -45
  213. package/templates/skills/orc-test/SKILL.md +16 -37
  214. package/templates/skills/orc-verify/SKILL.md +14 -32
  215. package/templates/skills/orc-wait/SKILL.md +156 -163
  216. package/templates/skills/orc-wiki/README.md +325 -325
  217. package/templates/skills/orc-wiki/SKILL.md +195 -195
  218. package/templates/skills/orc-wiki/examples/wiki-run-mock.md +37 -37
  219. package/templates/skills/orc-wiki/references/extra.md +2 -2
  220. package/templates/skills/orc-wiki/references/partial-refresh.md +276 -271
  221. package/templates/skills/orc-wiki/references/phases/phase-0.md +2 -7
  222. package/templates/skills/orc-wiki/references/phases/phase-1.md +1 -6
  223. package/templates/skills/orc-wiki/references/phases/phase-2.md +4 -9
  224. package/templates/skills/orc-wiki/references/phases/phase-3.md +1 -6
  225. package/templates/skills/orc-wiki/references/phases/phase-3c.md +4 -8
  226. package/templates/agents/orc-claude-writer-opus-5-med.md +0 -55
  227. package/templates/agents/orc-reviewer-opus-5-med.md +0 -60
  228. package/templates/agents/orc-wiki-scanner-opus-5-med.md +0 -81
@@ -38,8 +38,7 @@ const CONTRACTS = [
38
38
  "agents/orc-challenge-outsider-opus-5-low.md",
39
39
  "agents/orc-challenge-principles-opus-5-high.md",
40
40
  "agents/orc-challenge-reader-opus-5-low.md",
41
- "agents/orc-claude-writer-opus-4-8-high.md",
42
- "agents/orc-claude-writer-opus-5-med.md",
41
+ "agents/orc-claude-writer-opus-5-low.md",
43
42
  "agents/orc-context-combiner-opus-5-high.md",
44
43
  "agents/orc-doc-checker-opus-5-low.md",
45
44
  "agents/orc-doc-writer-opus-5-med.md",
@@ -53,6 +52,8 @@ const CONTRACTS = [
53
52
  "agents/orc-executor-sonnet-4-6-high.md",
54
53
  "agents/orc-executor-sonnet-4-6-med.md",
55
54
  "agents/orc-executor-sonnet-5-high.md",
55
+ "agents/orc-executor-sonnet-5-low.md",
56
+ "agents/orc-executor-sonnet-5-med.md",
56
57
  "agents/orc-judge-opus-5-xhigh.md",
57
58
  "agents/orc-learn-writer-opus-5-low.md",
58
59
  "agents/orc-pattern-codifier-opus-5-med.md",
@@ -64,15 +65,14 @@ const CONTRACTS = [
64
65
  "agents/orc-recon-sonnet-4-6-med.md",
65
66
  "agents/orc-retro-opus-5-med.md",
66
67
  "agents/orc-retro-sonnet-5-high.md",
67
- "agents/orc-reviewer-opus-5-med.md",
68
+ "agents/orc-reviewer-opus-5-low.md",
68
69
  "agents/orc-scout-opus-5-low.md",
69
70
  "agents/orc-scout-sonnet-4-6-high.md",
70
71
  "agents/orc-system-analyst-opus-5-high.md",
71
72
  "agents/orc-test-author-opus-5-med.md",
72
73
  "agents/orc-trace-writer-haiku-4-5.md",
73
74
  "agents/orc-verifier-opus-5-med.md",
74
- "agents/orc-wiki-scanner-opus-4-8-high.md",
75
- "agents/orc-wiki-scanner-opus-5-med.md",
75
+ "agents/orc-wiki-scanner-opus-5-low.md",
76
76
  "agents/orc-wiki-scanner-sonnet-5-high.md",
77
77
  "hooks/orc-trace.js",
78
78
  "skills/_shared/extra-dispatch.md",
@@ -107,14 +107,10 @@ const CONTRACTS = [
107
107
  "skills/orc/README.md",
108
108
  "skills/orc/SKILL.md",
109
109
  "skills/orc/schemas/checkpoint.md",
110
- "skills/orc/subskills/orc-execution/SKILL.md",
111
- "skills/orc/subskills/orc-execution/core.md",
112
110
  "skills/orc/subskills/orc-planner-mini/SKILL.md",
113
- "skills/orc/subskills/orc-review-verify/SKILL.md",
114
- "skills/orc/subskills/orc-review-verify/core.md",
115
- "skills/orc/subskills/orc-testgen/core.md",
116
111
  // v1.8.0 — the graph noter reports its model like every other role.
117
112
  "agents/orc-graph-noter-sonnet-4-6-med.md",
113
+ "skills/_shared/phases/trace-verbs.md",
118
114
  ],
119
115
  },
120
116
  {
@@ -131,14 +127,14 @@ const CONTRACTS = [
131
127
  "agents/orc-executor-sonnet-4-6-high.md",
132
128
  "agents/orc-executor-sonnet-4-6-med.md",
133
129
  "agents/orc-executor-sonnet-5-high.md",
130
+ "agents/orc-executor-sonnet-5-low.md",
131
+ "agents/orc-executor-sonnet-5-med.md",
134
132
  "skills/_shared/return-validation.md",
135
133
  "skills/orc-fast/SKILL.md",
136
134
  "skills/orc-quick/SKILL.md",
137
135
  "skills/orc/README.md",
138
136
  "skills/orc/SKILL.md",
139
137
  "skills/orc/references/pattern-gate.md",
140
- "skills/orc/subskills/orc-execution/SKILL.md",
141
- "skills/orc/subskills/orc-execution/core.md",
142
138
  "skills/_shared/phases/execution.md",
143
139
  ],
144
140
  },
@@ -156,13 +152,14 @@ const CONTRACTS = [
156
152
  "agents/orc-executor-sonnet-4-6-high.md",
157
153
  "agents/orc-executor-sonnet-4-6-med.md",
158
154
  "agents/orc-executor-sonnet-5-high.md",
155
+ "agents/orc-executor-sonnet-5-low.md",
156
+ "agents/orc-executor-sonnet-5-med.md",
159
157
  "skills/_shared/extra-dispatch.md",
160
158
  "skills/orc-fast/SKILL.md",
161
159
  "skills/orc-mini/SKILL.md",
162
160
  "skills/orc-quick/SKILL.md",
163
161
  "skills/_shared/phases/execution.md",
164
162
  "skills/_shared/phases/house-rules.md",
165
- "skills/orc/subskills/orc-execution/SKILL.md",
166
163
  "skills/orc/subskills/orc-execution/core.md",
167
164
  ],
168
165
  },
@@ -170,6 +167,10 @@ const CONTRACTS = [
170
167
  name: "rules_card slice field (v1.7.1 — the anti-slop card rides every dispatch slice, not only the preflight line)",
171
168
  token: "rules_card",
172
169
  files: [
170
+ // v2.0.0 W5a — the ONE review slice (`_shared/review-slice.md`).
171
+ "skills/_shared/review-slice.md",
172
+ "skills/orc/subskills/orc-review-verify/core.md",
173
+ "agents/orc-reviewer-opus-5-low.md",
173
174
  "agents/orc-executor-haiku-4-5.md",
174
175
  "agents/orc-executor-opus-4-7-high.md",
175
176
  "agents/orc-executor-opus-4-7-med.md",
@@ -180,12 +181,13 @@ const CONTRACTS = [
180
181
  "agents/orc-executor-sonnet-4-6-high.md",
181
182
  "agents/orc-executor-sonnet-4-6-med.md",
182
183
  "agents/orc-executor-sonnet-5-high.md",
184
+ "agents/orc-executor-sonnet-5-low.md",
185
+ "agents/orc-executor-sonnet-5-med.md",
183
186
  "skills/_shared/extra-dispatch.md",
184
187
  "skills/_shared/phases/execution.md",
185
188
  "skills/_shared/phases/rules.md",
186
189
  "skills/orc/SKILL.md",
187
190
  "skills/orc/references/preflight-report.md",
188
- "skills/orc/subskills/orc-execution/SKILL.md",
189
191
  "skills/orc/subskills/orc-execution/core.md",
190
192
  "skills/orc-fast/SKILL.md",
191
193
  "skills/orc-mini/SKILL.md",
@@ -196,6 +198,8 @@ const CONTRACTS = [
196
198
  name: "validation_gate[] flow (codify -> slice -> review -> verify)",
197
199
  token: "validation_gate",
198
200
  files: [
201
+ // v2.0.0 W5a — the ONE review slice (`_shared/review-slice.md`).
202
+ "skills/_shared/review-slice.md",
199
203
  "agents/orc-executor-haiku-4-5.md",
200
204
  "agents/orc-executor-opus-4-7-high.md",
201
205
  "agents/orc-executor-opus-4-7-med.md",
@@ -206,17 +210,17 @@ const CONTRACTS = [
206
210
  "agents/orc-executor-sonnet-4-6-high.md",
207
211
  "agents/orc-executor-sonnet-4-6-med.md",
208
212
  "agents/orc-executor-sonnet-5-high.md",
213
+ "agents/orc-executor-sonnet-5-low.md",
214
+ "agents/orc-executor-sonnet-5-med.md",
209
215
  "agents/orc-pattern-codifier-opus-5-med.md",
210
216
  "agents/orc-pattern-codifier-sonnet-5-high.md",
211
- "agents/orc-reviewer-opus-5-med.md",
217
+ "agents/orc-reviewer-opus-5-low.md",
212
218
  "agents/orc-verifier-opus-5-med.md",
213
219
  "skills/orc-pattern/SKILL.md",
214
220
  "skills/orc-pattern/schemas/pattern-doc.md",
215
221
  "skills/orc/SKILL.md",
216
222
  "skills/orc/references/pattern-gate.md",
217
- "skills/orc/subskills/orc-execution/SKILL.md",
218
223
  "skills/orc/subskills/orc-execution/core.md",
219
- "skills/orc/subskills/orc-review-verify/SKILL.md",
220
224
  "skills/orc/subskills/orc-review-verify/core.md",
221
225
  "skills/_shared/phases/verify.md",
222
226
  ],
@@ -235,10 +239,10 @@ const CONTRACTS = [
235
239
  "agents/orc-executor-sonnet-4-6-high.md",
236
240
  "agents/orc-executor-sonnet-4-6-med.md",
237
241
  "agents/orc-executor-sonnet-5-high.md",
242
+ "agents/orc-executor-sonnet-5-low.md",
243
+ "agents/orc-executor-sonnet-5-med.md",
238
244
  "skills/_shared/return-validation.md",
239
245
  "skills/_shared/phases/execution.md",
240
- "skills/orc/subskills/orc-execution/SKILL.md",
241
- "skills/orc/subskills/orc-execution/core.md",
242
246
  ],
243
247
  },
244
248
  {
@@ -258,6 +262,8 @@ const CONTRACTS = [
258
262
  "agents/orc-executor-sonnet-4-6-high.md",
259
263
  "agents/orc-executor-sonnet-4-6-med.md",
260
264
  "agents/orc-executor-sonnet-5-high.md",
265
+ "agents/orc-executor-sonnet-5-low.md",
266
+ "agents/orc-executor-sonnet-5-med.md",
261
267
  "skills/_shared/return-validation.md",
262
268
  "skills/orc-fast/SKILL.md",
263
269
  "skills/orc-mini/SKILL.md",
@@ -266,8 +272,6 @@ const CONTRACTS = [
266
272
  "skills/orc/README.md",
267
273
  "skills/_shared/phases/execution.md",
268
274
  "skills/orc/examples/full-run-mock.md",
269
- "skills/orc/subskills/orc-execution/SKILL.md",
270
- "skills/orc/subskills/orc-execution/core.md",
271
275
  ],
272
276
  },
273
277
  {
@@ -301,9 +305,8 @@ const CONTRACTS = [
301
305
  name: "findings evidence-or-advisory rule (v0.7.0 — unanchored => AUTO-P3)",
302
306
  token: "AUTO-P3",
303
307
  files: [
304
- "agents/orc-reviewer-opus-5-med.md",
308
+ "agents/orc-reviewer-opus-5-low.md",
305
309
  "agents/orc-verifier-opus-5-med.md",
306
- "skills/orc/subskills/orc-review-verify/SKILL.md",
307
310
  "skills/orc/subskills/orc-review-verify/core.md",
308
311
  "skills/orc-verify/SKILL.md",
309
312
  ],
@@ -312,11 +315,9 @@ const CONTRACTS = [
312
315
  name: "P0-P3 severity enum (findings shape)",
313
316
  token: "P0|P1|P2|P3",
314
317
  files: [
315
- "agents/orc-reviewer-opus-5-med.md",
318
+ "agents/orc-reviewer-opus-5-low.md",
316
319
  "agents/orc-verifier-opus-5-med.md",
317
320
  "skills/orc-quick/SKILL.md",
318
- "skills/orc/subskills/orc-review-verify/SKILL.md",
319
- "skills/orc/subskills/orc-review-verify/core.md",
320
321
  ],
321
322
  },
322
323
  {
@@ -327,7 +328,7 @@ const CONTRACTS = [
327
328
  name: "EXTRA trace verb — substitution continuation (v0.50.0)",
328
329
  token: "EXTRA substitution",
329
330
  binFiles: ["bin/cli.js"],
330
- files: ["skills/_shared/phases/trace.md"],
331
+ files: ["skills/_shared/phases/trace-verbs.md"],
331
332
  },
332
333
  {
333
334
  // The additive tail on SCORE and DISPATCH. One token, two sides: the
@@ -338,7 +339,7 @@ const CONTRACTS = [
338
339
  "hooks/orc-trace.js",
339
340
  "skills/_shared/extra-dispatch.md",
340
341
  "skills/_shared/phases/execution.md",
341
- "skills/_shared/phases/trace.md",
342
+ "skills/_shared/phases/trace-verbs.md",
342
343
  "skills/_shared/phases/scoring.md",
343
344
  ],
344
345
  },
@@ -356,7 +357,6 @@ const CONTRACTS = [
356
357
  "skills/orc-doc/SKILL.md",
357
358
  "skills/orc-fast/SKILL.md",
358
359
  "skills/orc-quick/references/dispatch-gate.md",
359
- "skills/orc-quick/SKILL.md",
360
360
  "skills/orc-wiki/references/phases/phase-2.md",
361
361
  "skills/orc-wiki/references/extra.md",
362
362
  ],
@@ -368,7 +368,7 @@ const CONTRACTS = [
368
368
  name: "a slot dispatch's band is `slot:<slot>` (v0.55.0)",
369
369
  token: "slot:<slot>",
370
370
  binFiles: ["bin/cli.js"],
371
- files: ["skills/_shared/extra-dispatch.md", "skills/_shared/phases/trace.md"],
371
+ files: ["skills/_shared/extra-dispatch.md", "skills/_shared/phases/trace-verbs.md"],
372
372
  },
373
373
  // ── v0.54.0 — RECOVERY. A failure is a POSITION, not a blank page ────────
374
374
  {
@@ -479,7 +479,7 @@ const CONTRACTS = [
479
479
  name: "the resume trace verb, composed once (v0.54.0)",
480
480
  token: "EXTRA resume",
481
481
  binFiles: ["bin/cli.js"],
482
- files: ["skills/_shared/extra-dispatch.md", "skills/_shared/phases/trace.md"],
482
+ files: ["skills/_shared/extra-dispatch.md", "skills/_shared/phases/trace-verbs.md"],
483
483
  },
484
484
  {
485
485
  // v1.0.0 W5 — same shape, same reason: a demotion that leaves no line
@@ -488,7 +488,7 @@ const CONTRACTS = [
488
488
  name: "the demotion trace verb, composed once (v1.0.0)",
489
489
  token: "EXTRA demote",
490
490
  binFiles: ["bin/cli.js"],
491
- files: ["skills/_shared/extra-dispatch.md", "skills/_shared/phases/trace.md"],
491
+ files: ["skills/_shared/extra-dispatch.md", "skills/_shared/phases/trace-verbs.md"],
492
492
  },
493
493
  {
494
494
  // The trigger's own sentence. It is the half a "simplification" would
@@ -548,6 +548,8 @@ const CONTRACTS = [
548
548
  "skills/orc-explain/SKILL.md",
549
549
  "skills/orc-export/SKILL.md",
550
550
  "skills/orc-fast/SKILL.md",
551
+ // v2.1.0 W6 — the rider lane joins the table.
552
+ "skills/orc-fix/SKILL.md",
551
553
  "skills/orc-grill/SKILL.md",
552
554
  "skills/orc-learn/SKILL.md",
553
555
  "skills/orc-mini/SKILL.md",
@@ -686,7 +688,7 @@ const CONTRACTS = [
686
688
  "skills/_shared/phases/analyst-gates.md",
687
689
  "skills/_shared/phases/plan-handoff.md",
688
690
  "skills/orc/references/preflight-report.md",
689
- "skills/_shared/phases/trace.md",
691
+ "skills/_shared/phases/trace-verbs.md",
690
692
  "skills/orc/schemas/planning-output.md",
691
693
  "skills/orc/subskills/orc-planner-mini/SKILL.md",
692
694
  "skills/orc/subskills/orc-planner/SKILL.md",
@@ -726,6 +728,8 @@ const CONTRACTS = [
726
728
  name: "GATE trace verb (v0.9.0 — deterministic exit-gate pass/bounce lines)",
727
729
  token: "`GATE",
728
730
  files: [
731
+ "skills/_shared/phases/summary.md",
732
+ "skills/_shared/smoke-gate.md",
729
733
  "agents/orc-retro-opus-5-med.md",
730
734
  "agents/orc-retro-sonnet-5-high.md",
731
735
  "skills/_shared/phases/analyst-gates.md",
@@ -753,6 +757,7 @@ const CONTRACTS = [
753
757
  "skills/orc/references/preflight-report.md",
754
758
  "skills/orc/references/ultra-mode.md",
755
759
  "skills/orc/subskills/orc-pr/stack-gate.md",
760
+ "skills/_shared/phases/trace-verbs.md",
756
761
  ],
757
762
  },
758
763
  {
@@ -769,6 +774,7 @@ const CONTRACTS = [
769
774
  "skills/_shared/phases/trace.md",
770
775
  "skills/orc/references/ultra-mode.md",
771
776
  "skills/orc/schemas/checkpoint.md",
777
+ "skills/_shared/phases/trace-verbs.md",
772
778
  ],
773
779
  },
774
780
  {
@@ -829,6 +835,8 @@ const CONTRACTS = [
829
835
  "skills/orc-challenge/SKILL.md",
830
836
  "skills/orc-pattern/SKILL.md",
831
837
  "skills/orc/subskills/orc-planner/SKILL.md",
838
+ // v2.0.2 (eval D9): the session hook's narration guard quotes the rule.
839
+ "hooks/orc-session-hook.js",
832
840
  ],
833
841
  },
834
842
  {
@@ -903,6 +911,9 @@ const CONTRACTS = [
903
911
  token: ".current",
904
912
  files: [
905
913
  "skills/orc-test/SKILL.md",
914
+ // v2.1.0 W6: /orc-fix states that it never WRITES the pointer — `orc fix
915
+ // record` only reads it to find the host run.
916
+ "skills/orc-fix/SKILL.md",
906
917
  "agents/orc-trace-writer-haiku-4-5.md",
907
918
  "hooks/orc-trace.js",
908
919
  // v1.6.0: the read gate READS the pointer to decide whether an ORC run
@@ -913,6 +924,9 @@ const CONTRACTS = [
913
924
  // writes its hint counters beside the run it names. A graph hint outside
914
925
  // an ORC run would be context nobody asked ORC for.
915
926
  "hooks/orc-graph-hook.js",
927
+ // v2.0.0 W6c: the session hook READS the pointer — the bell and the
928
+ // compact line both say nothing unless an ORC run is open.
929
+ "hooks/orc-session-hook.js",
916
930
  // v1.2.1: the statusline READS the pointer to decide which run `status:`
917
931
  // is about. "The newest file" would be a different, wrong answer during
918
932
  // a lane suspend, when two traces are live and only one is the run.
@@ -956,6 +970,7 @@ const CONTRACTS = [
956
970
  "skills/orc/subskills/orc-planner/SKILL.md",
957
971
  "skills/_shared/phases/preflight.md",
958
972
  "skills/_shared/phases/ship.md",
973
+ "skills/_shared/phases/trace-verbs.md",
959
974
  ],
960
975
  },
961
976
  {
@@ -979,6 +994,30 @@ const CONTRACTS = [
979
994
  "skills/orc-pact/references/gate.md",
980
995
  "skills/orc/SKILL.md",
981
996
  "skills/_shared/phases/trace.md",
997
+ "skills/_shared/phases/trace-verbs.md",
998
+ ],
999
+ },
1000
+ {
1001
+ // v2.0.0 T21 — the CLI holds the trace pen. The command renders the .txt
1002
+ // AND the .jsonl from ONE packet; the Haiku writer above is the fallback on
1003
+ // exit ≠ 0. Pinned to the protocol, its detail, the writer (which names
1004
+ // itself the fallback), the two spines that named the writer, and the CLI.
1005
+ name: "trace write command (v2.0.0 T21 — the CLI writes the trace pair)",
1006
+ token: "orc trace write --packet -",
1007
+ binFiles: ["bin/cli.js", "bin/trace-write.js"],
1008
+ files: [
1009
+ "agents/orc-trace-writer-haiku-4-5.md",
1010
+ "skills/orc/SKILL.md",
1011
+ "skills/orc-test/SKILL.md",
1012
+ // v2.0.0 W3 — quick and mini pipe their packets to the CLI too.
1013
+ "skills/orc-mini/SKILL.md",
1014
+ "skills/orc-quick/SKILL.md",
1015
+ // v2.0.0 W3c — and fast (its two packets carry the `ASK` events).
1016
+ "skills/orc-fast/SKILL.md",
1017
+ "skills/_shared/phases/trace.md",
1018
+ "skills/_shared/phases/trace-verbs.md",
1019
+ // v2.0.2 (eval D9): the narration guard names the command.
1020
+ "hooks/orc-session-hook.js",
982
1021
  ],
983
1022
  },
984
1023
  {
@@ -1015,6 +1054,7 @@ const CONTRACTS = [
1015
1054
  // only refine it — so a rename of this verb would silently blank the one
1016
1055
  // segment on line 2 that changes minute to minute.
1017
1056
  "hooks/orc-statusline.js",
1057
+ "skills/_shared/phases/trace-verbs.md",
1018
1058
  ],
1019
1059
  },
1020
1060
  {
@@ -1032,6 +1072,7 @@ const CONTRACTS = [
1032
1072
  "skills/_shared/phases/trace.md",
1033
1073
  "skills/orc/schemas/checkpoint.md",
1034
1074
  "skills/_shared/phases/preflight.md",
1075
+ "skills/_shared/phases/trace-verbs.md",
1035
1076
  ],
1036
1077
  },
1037
1078
  {
@@ -1040,8 +1081,7 @@ const CONTRACTS = [
1040
1081
  binFiles: ["bin/cli.js"],
1041
1082
  files: [
1042
1083
  "hooks/README.md",
1043
- "agents/orc-wiki-scanner-opus-4-8-high.md",
1044
- "agents/orc-wiki-scanner-opus-5-med.md",
1084
+ "agents/orc-wiki-scanner-opus-5-low.md",
1045
1085
  "agents/orc-wiki-scanner-sonnet-5-high.md",
1046
1086
  "commands/orc-export.md",
1047
1087
  "commands/orc-wiki.md",
@@ -1093,14 +1133,16 @@ const CONTRACTS = [
1093
1133
  token: "wiki-meta.json",
1094
1134
  binFiles: ["bin/cli.js"],
1095
1135
  files: [
1136
+ // v2.0.0 W5a — the ONE review slice (`_shared/review-slice.md`).
1137
+ "skills/_shared/review-slice.md",
1096
1138
  "hooks/orc-statusline.js",
1097
1139
  "skills/_shared/detecting-artifacts.md",
1098
1140
  "skills/orc-challenge/references/cycle-state.md",
1099
1141
  "skills/orc-fast/SKILL.md",
1100
1142
  "skills/orc-learn/SKILL.md",
1101
- "skills/orc-mini/SKILL.md",
1143
+ // v2.0.0 Q10: orc-mini and orc-poly left — they read the tier from
1144
+ // `orc wiki status --json` → `.tier`, never the manifest by hand.
1102
1145
  "skills/orc-pact/SKILL.md",
1103
- "skills/orc-poly/SKILL.md",
1104
1146
  "skills/orc-poly/examples/poly-run-mock.md",
1105
1147
  "skills/orc-quick/SKILL.md",
1106
1148
  "skills/orc-wiki/README.md",
@@ -1464,7 +1506,7 @@ const CONTRACTS = [
1464
1506
  "skills/orc-challenge/examples/council-full-roster.md",
1465
1507
  "skills/orc-challenge/examples/tsd-two-iterations.md",
1466
1508
  "skills/orc-challenge/references/council.md",
1467
- "skills/_shared/phases/trace.md",
1509
+ "skills/_shared/phases/trace-verbs.md",
1468
1510
  ],
1469
1511
  binFiles: ["bin/cli.js"],
1470
1512
  },
@@ -1588,7 +1630,7 @@ const CONTRACTS = [
1588
1630
  binFiles: ["bin/cli.js"],
1589
1631
  files: [
1590
1632
  "skills/_shared/phases/ship.md",
1591
- "skills/_shared/phases/trace.md",
1633
+ "skills/_shared/phases/trace-verbs.md",
1592
1634
  ],
1593
1635
  },
1594
1636
  {
@@ -1602,7 +1644,6 @@ const CONTRACTS = [
1602
1644
  "skills/orc-fast/SKILL.md",
1603
1645
  "skills/orc-learn/SKILL.md",
1604
1646
  "skills/orc-learn/references/refresh.md",
1605
- "skills/orc-mini/SKILL.md",
1606
1647
  "skills/orc-poly/SKILL.md",
1607
1648
  "skills/orc-poly/examples/poly-run-mock.md",
1608
1649
  "skills/orc-poly/references/gather.md",
@@ -1663,8 +1704,7 @@ const CONTRACTS = [
1663
1704
  name: "wiki pointer-block marker (owned by orc-wiki; orc-claude byte-preserves it)",
1664
1705
  token: "ORC-WIKI:START",
1665
1706
  files: [
1666
- "agents/orc-claude-writer-opus-4-8-high.md",
1667
- "agents/orc-claude-writer-opus-5-med.md",
1707
+ "agents/orc-claude-writer-opus-5-low.md",
1668
1708
  "skills/orc-claude/SKILL.md",
1669
1709
  "skills/orc-claude/references/refresh.md",
1670
1710
  "skills/orc-wiki/references/claude-md-injection.md",
@@ -1712,8 +1752,7 @@ const CONTRACTS = [
1712
1752
  token: "covered_files",
1713
1753
  files: [
1714
1754
  "agents/orc-learn-writer-opus-5-low.md",
1715
- "agents/orc-wiki-scanner-opus-4-8-high.md",
1716
- "agents/orc-wiki-scanner-opus-5-med.md",
1755
+ "agents/orc-wiki-scanner-opus-5-low.md",
1717
1756
  "agents/orc-wiki-scanner-sonnet-5-high.md",
1718
1757
  "skills/orc-learn/references/refresh.md",
1719
1758
  "skills/orc-learn/references/template-knowledge.md",
@@ -1759,7 +1798,7 @@ const CONTRACTS = [
1759
1798
  "skills/orc-poly/examples/poly-run-mock.md",
1760
1799
  "skills/orc-quick/SKILL.md",
1761
1800
  "skills/orc/SKILL.md",
1762
- "skills/_shared/phases/trace.md",
1801
+ "skills/_shared/phases/trace-verbs.md",
1763
1802
  "skills/_shared/phases/wiki-consult.md",
1764
1803
  "skills/_shared/phases/planning.md",
1765
1804
  ],
@@ -1773,7 +1812,7 @@ const CONTRACTS = [
1773
1812
  token: "`CROSSLINK ",
1774
1813
  files: [
1775
1814
  "skills/_shared/phases/planning.md",
1776
- "skills/_shared/phases/trace.md",
1815
+ "skills/_shared/phases/trace-verbs.md",
1777
1816
  "skills/_shared/phases/wiki-consult.md",
1778
1817
  ],
1779
1818
  },
@@ -1793,7 +1832,7 @@ const CONTRACTS = [
1793
1832
  "skills/orc-fast/SKILL.md",
1794
1833
  "skills/orc-mini/SKILL.md",
1795
1834
  "skills/orc-pattern/SKILL.md",
1796
- "skills/orc-quick/SKILL.md",
1835
+ "skills/orc-quick/references/dispatch-gate.md",
1797
1836
  "skills/orc-retro/SKILL.md",
1798
1837
  "skills/orc-wiki/SKILL.md",
1799
1838
  "skills/orc-wiki/references/partial-refresh.md",
@@ -1818,13 +1857,10 @@ const CONTRACTS = [
1818
1857
  "agents/orc-graph-noter-sonnet-4-6-med.md",
1819
1858
  "skills/_shared/code-graph.md",
1820
1859
  "agents/orc-analyze-mini-opus-5-med.md",
1821
- "agents/orc-claude-writer-opus-5-med.md",
1822
1860
  "agents/orc-pattern-codifier-opus-5-med.md",
1823
1861
  "agents/orc-planner-mini-opus-5-med.md",
1824
1862
  "agents/orc-retro-opus-5-med.md",
1825
1863
  "agents/orc-scout-opus-5-low.md",
1826
- "agents/orc-wiki-scanner-opus-5-med.md",
1827
- "agents/orc-wiki-scanner-sonnet-5-high.md",
1828
1864
  "commands/orc-pattern.md",
1829
1865
  "skills/_shared/drift-recovery.md",
1830
1866
  "skills/_shared/extra-dispatch.md",
@@ -1842,7 +1878,6 @@ const CONTRACTS = [
1842
1878
  "skills/orc-mini/SKILL.md",
1843
1879
  "skills/orc-pattern/SKILL.md",
1844
1880
  "skills/orc-quick/README.md",
1845
- "skills/orc-quick/SKILL.md",
1846
1881
  "skills/orc-quick/references/dispatch-gate.md",
1847
1882
  "skills/orc-retro/SKILL.md",
1848
1883
  "skills/orc-wiki/SKILL.md",
@@ -1856,7 +1891,7 @@ const CONTRACTS = [
1856
1891
  "skills/orc/references/effort-and-mode.md",
1857
1892
  "skills/orc/references/pattern-gate.md",
1858
1893
  "skills/orc/references/preflight-report.md",
1859
- "skills/_shared/phases/trace.md",
1894
+ "skills/_shared/phases/trace-verbs.md",
1860
1895
  "skills/orc/references/ultra-mode.md",
1861
1896
  "skills/_shared/config-precedence.md",
1862
1897
  "skills/_shared/phases/planning.md",
@@ -1867,7 +1902,7 @@ const CONTRACTS = [
1867
1902
  token: "`CONFIG ",
1868
1903
  files: [
1869
1904
  "skills/_shared/phases/planning.md",
1870
- "skills/_shared/phases/trace.md",
1905
+ "skills/_shared/phases/trace-verbs.md",
1871
1906
  ],
1872
1907
  },
1873
1908
  {
@@ -1908,7 +1943,7 @@ const CONTRACTS = [
1908
1943
  "skills/_shared/phases/plan-handoff.md",
1909
1944
  "skills/_shared/phases/planning.md",
1910
1945
  "skills/_shared/phases/scoring.md",
1911
- "skills/_shared/phases/trace.md",
1946
+ "skills/_shared/phases/trace-verbs.md",
1912
1947
  "skills/_shared/phases/wave-grouping.md",
1913
1948
  "skills/orc-mini/SKILL.md",
1914
1949
  "skills/orc-mini/references/complexity.md",
@@ -1949,7 +1984,6 @@ const CONTRACTS = [
1949
1984
  "skills/_shared/phases/planning.md",
1950
1985
  "skills/_shared/phases/wiki-consult.md",
1951
1986
  "skills/orc-fast/SKILL.md",
1952
- "skills/orc-mini/SKILL.md",
1953
1987
  "skills/orc-wiki/references/phases/phase-1.md",
1954
1988
  "skills/orc-wiki/references/crosslink.md",
1955
1989
  "skills/orc-wiki/references/staleness.md",
@@ -2003,11 +2037,12 @@ const CONTRACTS = [
2003
2037
  "hooks/orc-statusline.js",
2004
2038
  "skills/orc-diy/README.md",
2005
2039
  "skills/orc-diy/SKILL.md",
2006
- // v1.0.0 W13 — read-ladder.md rule 5 names this artifact to explain why
2007
- // orc-diy reads its phases at `compile-time` and never during a run.
2008
- "skills/_shared/read-ladder.md",
2009
2040
  "skills/orc-diy/references/compile.md",
2010
2041
  "skills/orc-diy/references/flow-schema.md",
2042
+ // v1.0.0 W13 — the partial-read rule 5 names this artifact to explain why
2043
+ // orc-diy reads its phases at `compile-time` and never during a run.
2044
+ // v2.0.0 T6 — the rule moved from read-ladder.md to phases/README.md.
2045
+ "skills/_shared/phases/README.md",
2011
2046
  ],
2012
2047
  },
2013
2048
  {
@@ -2075,7 +2110,6 @@ const CONTRACTS = [
2075
2110
  token: "crosslink/needs.json",
2076
2111
  files: [
2077
2112
  "skills/orc-fast/SKILL.md",
2078
- "skills/orc-mini/SKILL.md",
2079
2113
  "skills/orc-wiki/README.md",
2080
2114
  "skills/orc-wiki/SKILL.md",
2081
2115
  "skills/orc-wiki/references/crosslink-compile.md",
@@ -2083,7 +2117,6 @@ const CONTRACTS = [
2083
2117
  "skills/orc-wiki/schemas/crosslink-tag.md",
2084
2118
  "skills/_shared/phases/planning.md",
2085
2119
  "skills/_shared/phases/wiki-consult.md",
2086
- "skills/orc/subskills/orc-execution/SKILL.md",
2087
2120
  "skills/orc/subskills/orc-execution/core.md",
2088
2121
  ],
2089
2122
  },
@@ -2099,7 +2132,7 @@ const CONTRACTS = [
2099
2132
  "skills/orc-wiki/references/staleness.md",
2100
2133
  "skills/orc-wiki/schemas/crosslink-tag.md",
2101
2134
  "skills/_shared/phases/wiki-consult.md",
2102
- "skills/orc/subskills/orc-execution/SKILL.md",
2135
+ "skills/orc/subskills/orc-execution/core.md",
2103
2136
  ],
2104
2137
  },
2105
2138
  {
@@ -2133,8 +2166,7 @@ const CONTRACTS = [
2133
2166
  token: "crosslink_provided",
2134
2167
  binFiles: ["bin/cli.js"],
2135
2168
  files: [
2136
- "agents/orc-wiki-scanner-opus-4-8-high.md",
2137
- "agents/orc-wiki-scanner-opus-5-med.md",
2169
+ "agents/orc-wiki-scanner-opus-5-low.md",
2138
2170
  "agents/orc-wiki-scanner-sonnet-5-high.md",
2139
2171
  "skills/orc-wiki/README.md",
2140
2172
  "skills/orc-wiki/SKILL.md",
@@ -2151,8 +2183,7 @@ const CONTRACTS = [
2151
2183
  name: "crosslink per-scan-task emission (v0.24.0 — always-on; scan agent returns crosslink_tags | none)",
2152
2184
  token: "crosslink_tags",
2153
2185
  files: [
2154
- "agents/orc-wiki-scanner-opus-4-8-high.md",
2155
- "agents/orc-wiki-scanner-opus-5-med.md",
2186
+ "agents/orc-wiki-scanner-opus-5-low.md",
2156
2187
  "agents/orc-wiki-scanner-sonnet-5-high.md",
2157
2188
  "skills/orc-wiki/SKILL.md",
2158
2189
  "skills/orc-wiki/references/phases/phase-2.md",
@@ -2356,7 +2387,7 @@ const CONTRACTS = [
2356
2387
  "skills/orc-fast/SKILL.md",
2357
2388
  "skills/orc-mini/SKILL.md",
2358
2389
  "skills/orc/config.md",
2359
- "skills/_shared/phases/trace.md",
2390
+ "skills/_shared/phases/trace-verbs.md",
2360
2391
  "skills/orc/references/ultra-mode.md",
2361
2392
  "skills/_shared/phases/wave-grouping.md",
2362
2393
  "skills/_shared/phases/ship.md",
@@ -2396,6 +2427,8 @@ const CONTRACTS = [
2396
2427
  "agents/orc-executor-sonnet-4-6-high.md",
2397
2428
  "agents/orc-executor-sonnet-4-6-med.md",
2398
2429
  "agents/orc-executor-sonnet-5-high.md",
2430
+ "agents/orc-executor-sonnet-5-low.md",
2431
+ "agents/orc-executor-sonnet-5-med.md",
2399
2432
  "agents/orc-planner-mini-opus-5-med.md",
2400
2433
  "agents/orc-planner-mini-sonnet-5-high.md",
2401
2434
  "agents/orc-planner-opus-5-med.md",
@@ -2409,7 +2442,6 @@ const CONTRACTS = [
2409
2442
  "skills/orc/references/preflight-report.md",
2410
2443
  "skills/_shared/phases/wave-grouping.md",
2411
2444
  "skills/orc/schemas/planning-output.md",
2412
- "skills/orc/subskills/orc-execution/SKILL.md",
2413
2445
  "skills/orc/subskills/orc-execution/core.md",
2414
2446
  "skills/orc/subskills/orc-planner-mini/SKILL.md",
2415
2447
  "skills/orc/subskills/orc-planner/SKILL.md",
@@ -2431,16 +2463,16 @@ const CONTRACTS = [
2431
2463
  "agents/orc-executor-sonnet-4-6-high.md",
2432
2464
  "agents/orc-executor-sonnet-4-6-med.md",
2433
2465
  "agents/orc-executor-sonnet-5-high.md",
2466
+ "agents/orc-executor-sonnet-5-low.md",
2467
+ "agents/orc-executor-sonnet-5-med.md",
2434
2468
  "agents/orc-verifier-opus-5-med.md",
2435
2469
  "skills/_shared/return-validation.md",
2436
2470
  "skills/_shared/phases/execution.md",
2437
2471
  "skills/_shared/phases/verify.md",
2438
2472
  "skills/orc-mini/SKILL.md",
2439
2473
  "skills/orc/config.md",
2440
- "skills/_shared/phases/trace.md",
2441
- "skills/orc/subskills/orc-execution/SKILL.md",
2474
+ "skills/_shared/phases/trace-verbs.md",
2442
2475
  "skills/orc/subskills/orc-execution/core.md",
2443
- "skills/orc/subskills/orc-review-verify/SKILL.md",
2444
2476
  "skills/orc/subskills/orc-review-verify/core.md",
2445
2477
  ],
2446
2478
  },
@@ -2459,10 +2491,10 @@ const CONTRACTS = [
2459
2491
  "agents/orc-executor-sonnet-4-6-high.md",
2460
2492
  "agents/orc-executor-sonnet-4-6-med.md",
2461
2493
  "agents/orc-executor-sonnet-5-high.md",
2494
+ "agents/orc-executor-sonnet-5-low.md",
2495
+ "agents/orc-executor-sonnet-5-med.md",
2462
2496
  "skills/_shared/return-validation.md",
2463
2497
  "skills/_shared/phases/execution.md",
2464
- "skills/orc/subskills/orc-execution/SKILL.md",
2465
- "skills/orc/subskills/orc-execution/core.md",
2466
2498
  ],
2467
2499
  },
2468
2500
  {
@@ -2472,7 +2504,6 @@ const CONTRACTS = [
2472
2504
  files: [
2473
2505
  "agents/orc-verifier-opus-5-med.md",
2474
2506
  "skills/_shared/phases/verify.md",
2475
- "skills/orc/subskills/orc-review-verify/SKILL.md",
2476
2507
  "skills/orc/subskills/orc-review-verify/core.md",
2477
2508
  ],
2478
2509
  },
@@ -2486,7 +2517,7 @@ const CONTRACTS = [
2486
2517
  "skills/orc-mini/SKILL.md",
2487
2518
  "skills/orc-retro/SKILL.md",
2488
2519
  "skills/orc/SKILL.md",
2489
- "skills/_shared/phases/trace.md",
2520
+ "skills/_shared/phases/trace-verbs.md",
2490
2521
  ],
2491
2522
  },
2492
2523
  {
@@ -2550,6 +2581,8 @@ const CONTRACTS = [
2550
2581
  "skills/orc/README.md",
2551
2582
  "skills/orc/SKILL.md",
2552
2583
  "skills/orc/config.md",
2584
+ // v2.0.0 W6c: the session hook's compact line names the run folder.
2585
+ "hooks/orc-session-hook.js",
2553
2586
  ],
2554
2587
  },
2555
2588
  // ── Stacked pull requests (v0.37.0) ──────────────────────────────────────
@@ -2673,6 +2706,8 @@ const CONTRACTS = [
2673
2706
  name: "code graph contract (v1.8.0 — _shared/code-graph.md)",
2674
2707
  token: "code-graph.md",
2675
2708
  files: [
2709
+ // v2.0.0 W5a — the ONE review slice (`_shared/review-slice.md`).
2710
+ "skills/_shared/review-slice.md",
2676
2711
  "skills/_shared/README.md",
2677
2712
  "skills/_shared/code-graph.md",
2678
2713
  "skills/_shared/opus5-only.md",
@@ -2681,7 +2716,7 @@ const CONTRACTS = [
2681
2716
  "skills/_shared/phases/preflight.md",
2682
2717
  "skills/_shared/phases/review.md",
2683
2718
  "skills/_shared/phases/ship.md",
2684
- "skills/_shared/phases/trace.md",
2719
+ "skills/_shared/phases/trace-verbs.md",
2685
2720
  "skills/_shared/phases/wiki-consult.md",
2686
2721
  "skills/_shared/read-ladder.md",
2687
2722
  "skills/_shared/return-validation.md",
@@ -2729,10 +2764,14 @@ const CONTRACTS = [
2729
2764
  "agents/orc-executor-sonnet-4-6-high.md",
2730
2765
  "agents/orc-executor-sonnet-4-6-med.md",
2731
2766
  "agents/orc-executor-sonnet-5-high.md",
2767
+ "agents/orc-executor-sonnet-5-low.md",
2768
+ "agents/orc-executor-sonnet-5-med.md",
2732
2769
  "agents/orc-recon-opus-5-low.md",
2733
2770
  "agents/orc-recon-sonnet-4-6-med.md",
2734
2771
  "skills/_shared/code-graph.md",
2735
2772
  "skills/_shared/phases/execution.md",
2773
+ // v2.0.0 T11: the mini `none is an answer` paragraph moved here from its spine.
2774
+ "skills/_shared/phases/wiki-consult.md",
2736
2775
  "skills/_shared/read-ladder.md",
2737
2776
  "skills/_shared/return-validation.md",
2738
2777
  "skills/orc-mini/SKILL.md",
@@ -2749,6 +2788,8 @@ const CONTRACTS = [
2749
2788
  name: "graph brief answer (v1.9.1 — --brief on every --json read a lane makes)",
2750
2789
  token: "--brief",
2751
2790
  files: [
2791
+ // v2.0.0 W5a — the ONE review slice (`_shared/review-slice.md`).
2792
+ "skills/_shared/review-slice.md",
2752
2793
  "agents/orc-executor-haiku-4-5.md",
2753
2794
  "agents/orc-executor-opus-4-7-high.md",
2754
2795
  "agents/orc-executor-opus-4-7-med.md",
@@ -2759,6 +2800,8 @@ const CONTRACTS = [
2759
2800
  "agents/orc-executor-sonnet-4-6-high.md",
2760
2801
  "agents/orc-executor-sonnet-4-6-med.md",
2761
2802
  "agents/orc-executor-sonnet-5-high.md",
2803
+ "agents/orc-executor-sonnet-5-low.md",
2804
+ "agents/orc-executor-sonnet-5-med.md",
2762
2805
  "agents/orc-recon-opus-5-low.md",
2763
2806
  "agents/orc-recon-sonnet-4-6-med.md",
2764
2807
  "skills/_shared/code-graph.md",
@@ -2769,7 +2812,7 @@ const CONTRACTS = [
2769
2812
  "skills/_shared/phases/review.md",
2770
2813
  "skills/_shared/phases/ship.md",
2771
2814
  // trace.md names the call each trace verb is copied from.
2772
- "skills/_shared/phases/trace.md",
2815
+ "skills/_shared/phases/trace-verbs.md",
2773
2816
  "skills/_shared/read-ladder.md",
2774
2817
  "skills/orc/SKILL.md",
2775
2818
  "skills/orc-fast/SKILL.md",
@@ -2786,7 +2829,7 @@ const CONTRACTS = [
2786
2829
  // would drift from the CLI's grammar the first time either side moved.
2787
2830
  name: "graph blast line (v1.9.1 — changes computes the blast radius, the lane prints it)",
2788
2831
  token: "blast_line",
2789
- files: ["skills/orc-mini/SKILL.md", "skills/orc-quick/SKILL.md"],
2832
+ files: ["skills/_shared/phases/summary.md", "skills/orc-mini/SKILL.md", "skills/orc-quick/SKILL.md"],
2790
2833
  binFiles: ["bin/graph-signals.js"],
2791
2834
  },
2792
2835
  {
@@ -2796,7 +2839,7 @@ const CONTRACTS = [
2796
2839
  token: "--complexity",
2797
2840
  files: [
2798
2841
  "skills/_shared/code-graph.md",
2799
- "skills/_shared/phases/trace.md",
2842
+ "skills/_shared/phases/trace-verbs.md",
2800
2843
  "skills/orc-mini/SKILL.md",
2801
2844
  "skills/orc-mini/references/complexity.md",
2802
2845
  ],
@@ -2872,6 +2915,8 @@ const CONTRACTS = [
2872
2915
  "agents/orc-executor-sonnet-4-6-high.md",
2873
2916
  "agents/orc-executor-sonnet-4-6-med.md",
2874
2917
  "agents/orc-executor-sonnet-5-high.md",
2918
+ "agents/orc-executor-sonnet-5-low.md",
2919
+ "agents/orc-executor-sonnet-5-med.md",
2875
2920
  "agents/orc-recon-opus-5-low.md",
2876
2921
  "agents/orc-recon-sonnet-4-6-med.md",
2877
2922
  "skills/_shared/code-graph.md",
@@ -2899,8 +2944,9 @@ const CONTRACTS = [
2899
2944
  "agents/orc-executor-sonnet-4-6-high.md",
2900
2945
  "agents/orc-executor-sonnet-4-6-med.md",
2901
2946
  "agents/orc-executor-sonnet-5-high.md",
2947
+ "agents/orc-executor-sonnet-5-low.md",
2948
+ "agents/orc-executor-sonnet-5-med.md",
2902
2949
  "skills/_shared/return-validation.md",
2903
- "skills/orc/subskills/orc-execution/core.md",
2904
2950
  ],
2905
2951
  },
2906
2952
  {
@@ -2911,7 +2957,8 @@ const CONTRACTS = [
2911
2957
  name: "reproduce-first trace verb (v1.9.0 — REPRO red|green)",
2912
2958
  token: "REPRO",
2913
2959
  files: [
2914
- "skills/_shared/phases/trace.md",
2960
+ "skills/_shared/gotchas.md",
2961
+ "skills/_shared/phases/trace-verbs.md",
2915
2962
  "skills/orc-quick/SKILL.md",
2916
2963
  "skills/orc-quick/references/defect.md",
2917
2964
  ],
@@ -2999,7 +3046,7 @@ const CONTRACTS = [
2999
3046
  files: [
3000
3047
  "skills/_shared/code-graph.md",
3001
3048
  "skills/_shared/phases/planning.md",
3002
- "skills/_shared/phases/trace.md",
3049
+ "skills/_shared/phases/trace-verbs.md",
3003
3050
  "skills/orc-diy/references/flow-schema.md",
3004
3051
  "skills/orc-mini/SKILL.md",
3005
3052
  "skills/orc-quick/SKILL.md",
@@ -3015,7 +3062,7 @@ const CONTRACTS = [
3015
3062
  token: "GRAPH-MAP",
3016
3063
  files: [
3017
3064
  "skills/_shared/phases/planning.md",
3018
- "skills/_shared/phases/trace.md",
3065
+ "skills/_shared/phases/trace-verbs.md",
3019
3066
  "skills/orc-mini/examples/mini-run-mock.md",
3020
3067
  ],
3021
3068
  binFiles: ["bin/cli.js"],
@@ -3035,7 +3082,7 @@ const CONTRACTS = [
3035
3082
  // The verb lives in the trace table and in the phase that emits it.
3036
3083
  name: "graph gain line (v1.8.2 — GRAPH-GAIN, one line at ship, copied verbatim)",
3037
3084
  token: "GRAPH-GAIN",
3038
- files: ["skills/_shared/phases/ship.md", "skills/_shared/phases/trace.md"],
3085
+ files: ["skills/_shared/phases/ship.md", "skills/_shared/phases/trace-verbs.md"],
3039
3086
  binFiles: ["bin/cli.js"],
3040
3087
  },
3041
3088
  {
@@ -3076,6 +3123,8 @@ const CONTRACTS = [
3076
3123
  "agents/orc-executor-sonnet-4-6-high.md",
3077
3124
  "agents/orc-executor-sonnet-4-6-med.md",
3078
3125
  "agents/orc-executor-sonnet-5-high.md",
3126
+ "agents/orc-executor-sonnet-5-low.md",
3127
+ "agents/orc-executor-sonnet-5-med.md",
3079
3128
  "agents/orc-recon-opus-5-low.md",
3080
3129
  "agents/orc-recon-sonnet-4-6-med.md",
3081
3130
  "skills/_shared/README.md",
@@ -3091,7 +3140,6 @@ const CONTRACTS = [
3091
3140
  "skills/orc-quick/references/look.md",
3092
3141
  "skills/orc-wiki/SKILL.md",
3093
3142
  "skills/orc/SKILL.md",
3094
- "skills/orc/subskills/orc-execution/core.md",
3095
3143
  // v1.6.0 — the ENFORCEMENT half. The ladder was advisory prose in three
3096
3144
  // places and enforced in none; this hook is the layer that can refuse.
3097
3145
  // It cites the ladder by name because its two carve-outs ARE the
@@ -3130,7 +3178,9 @@ const CONTRACTS = [
3130
3178
  {
3131
3179
  name: "gotchas artifact location (repair memory)",
3132
3180
  token: ".claude/orc/gotchas.md",
3181
+ // v2.0.0 Q10: the statusline hook counts `## G-` headings in this file.
3133
3182
  files: [
3183
+ "hooks/orc-statusline.js",
3134
3184
  "skills/_shared/README.md",
3135
3185
  "skills/_shared/gotchas.md",
3136
3186
  "skills/_shared/phases/execution.md",
@@ -3146,6 +3196,8 @@ const CONTRACTS = [
3146
3196
  name: "gotcha_recorded return field (repair-loop capture)",
3147
3197
  token: "gotcha_recorded",
3148
3198
  files: [
3199
+ // v2.0.0 W5a — the ONE review slice (`_shared/review-slice.md`).
3200
+ "skills/_shared/phases/review.md",
3149
3201
  "agents/orc-executor-haiku-4-5.md",
3150
3202
  "agents/orc-executor-opus-4-7-high.md",
3151
3203
  "agents/orc-executor-opus-4-7-med.md",
@@ -3156,14 +3208,14 @@ const CONTRACTS = [
3156
3208
  "agents/orc-executor-sonnet-4-6-high.md",
3157
3209
  "agents/orc-executor-sonnet-4-6-med.md",
3158
3210
  "agents/orc-executor-sonnet-5-high.md",
3159
- "agents/orc-reviewer-opus-5-med.md",
3211
+ "agents/orc-executor-sonnet-5-low.md",
3212
+ "agents/orc-executor-sonnet-5-med.md",
3213
+ "agents/orc-reviewer-opus-5-low.md",
3160
3214
  "agents/orc-verifier-opus-5-med.md",
3161
3215
  "skills/_shared/gotchas.md",
3162
3216
  "skills/_shared/return-validation.md",
3163
3217
  "skills/_shared/phases/execution.md",
3164
3218
  "skills/orc-mini/SKILL.md",
3165
- "skills/orc/subskills/orc-execution/core.md",
3166
- "skills/orc/subskills/orc-review-verify/core.md",
3167
3219
  ],
3168
3220
  },
3169
3221
  {
@@ -3457,7 +3509,7 @@ const CONTRACTS = [
3457
3509
  "skills/orc-doc/examples/orc-doc-prd-run.md",
3458
3510
  // v0.49.2 — the doc lane's DISPATCH tail names the section FILE, which is
3459
3511
  // the only thing that makes `orc doc cost` per-section honest.
3460
- "skills/_shared/phases/trace.md",
3512
+ "skills/_shared/phases/trace-verbs.md",
3461
3513
  ],
3462
3514
  binFiles: ["bin/cli.js"],
3463
3515
  },
@@ -3614,7 +3666,7 @@ const CONTRACTS = [
3614
3666
  "skills/orc-doc/references/chunking.md",
3615
3667
  // The DISPATCH tail that makes per-section attribution honest is defined
3616
3668
  // there, so the command's name has to move with it.
3617
- "skills/_shared/phases/trace.md",
3669
+ "skills/_shared/phases/trace-verbs.md",
3618
3670
  "skills/orc-doc/README.md",
3619
3671
  "commands/orc-doc.md",
3620
3672
  ],
@@ -3646,8 +3698,12 @@ const CONTRACTS = [
3646
3698
  token: "orc lane calls",
3647
3699
  files: [
3648
3700
  "skills/orc-test/SKILL.md",
3649
- "skills/_shared/read-ladder.md",
3701
+ // v2.0.0 T3 — the full catalogue rules, read only on exit ≠ 0.
3702
+ "skills/_shared/lane-contract.md",
3650
3703
  "skills/_shared/phases/preflight.md",
3704
+ // v2.0.0 T12 — code-graph.md §3 lists the graph calls and points here
3705
+ // for their exit codes instead of a second copy of LANE_CALLS.
3706
+ "skills/_shared/code-graph.md",
3651
3707
  // v1.0.0 W14 — every lane that makes a catalogued call carries the
3652
3708
  // `## Calls` contract. orc-advisor and orc-judge make none, so they
3653
3709
  // have no block: an empty pointer is worse than no pointer.
@@ -3680,9 +3736,297 @@ const CONTRACTS = [
3680
3736
  "skills/orc-verify/SKILL.md",
3681
3737
  "skills/orc-wiki/SKILL.md",
3682
3738
  "skills/orc/SKILL.md",
3739
+ "skills/_shared/phases/README.md",
3683
3740
  ],
3684
3741
  binFiles: ["bin/cli.js"],
3685
3742
  },
3743
+ {
3744
+ // v2.0.0 T3 — the six boilerplate blocks of the coding-lane spines (Calls ·
3745
+ // Config · Rules · Behavior trace · Phases · Waiting) hold their COMMON text
3746
+ // once, in `_shared/lane-contract.md`. It is NOT a PHASE_FILES row on
3747
+ // purpose: a lane reads it only when a CLI call exits ≠ 0, which is exactly
3748
+ // when `orc lane phases` cannot tell it where the file is. So the spine names
3749
+ // the file itself, and this row is the reachability check — every coding
3750
+ // spine points at it, and no other spine does until it is converted too.
3751
+ name: "the lane contract is read only on exit ≠ 0 (v2.0.0 T3)",
3752
+ token: "lane-contract.md",
3753
+ files: [
3754
+ "skills/_shared/README.md",
3755
+ "skills/_shared/config-precedence.md",
3756
+ "skills/_shared/lane-contract.md",
3757
+ "skills/context-combiner/SKILL.md",
3758
+ "skills/orc-analyze-mini/SKILL.md",
3759
+ "skills/orc-analyze/SKILL.md",
3760
+ "skills/orc-diy/SKILL.md",
3761
+ "skills/orc-fast/SKILL.md",
3762
+ "skills/orc-mini/SKILL.md",
3763
+ "skills/orc-pattern/SKILL.md",
3764
+ "skills/orc-poly/SKILL.md",
3765
+ "skills/orc-pr-driver/SKILL.md",
3766
+ "skills/orc-pr-setup/SKILL.md",
3767
+ "skills/orc-quick/SKILL.md",
3768
+ "skills/orc-route/SKILL.md",
3769
+ "skills/orc-test/SKILL.md",
3770
+ "skills/orc-verify/SKILL.md",
3771
+ "skills/orc/SKILL.md",
3772
+ ],
3773
+ },
3774
+ {
3775
+ // v2.0.0 W5a — the ONE review slice. Read ON DEMAND, only when a review
3776
+ // dispatch is about to be built; not a PHASE_FILES row, so this row is the
3777
+ // reachability check: every surface that builds a review (or, in
3778
+ // orc-pr-driver, only its gotcha card) points at the one file.
3779
+ name: "the one review slice every lane builds (v2.0.0 W5a)",
3780
+ token: "review-slice.md",
3781
+ files: [
3782
+ "skills/_shared/README.md",
3783
+ "skills/_shared/gotchas.md",
3784
+ "skills/_shared/phases/review.md",
3785
+ "skills/orc/subskills/orc-review-verify/core.md",
3786
+ "skills/orc/references/ultra-mode.md",
3787
+ "skills/orc-mini/SKILL.md",
3788
+ "skills/orc-quick/references/dispatch-gate.md",
3789
+ "skills/orc-pr-driver/references/green-gate.md",
3790
+ ],
3791
+ },
3792
+ // v2.0.0 W5a — the review v2 contract tokens. Each is pinned to the EXACT
3793
+ // files that carry it, so a lane that grows its own copy of a field fails.
3794
+ {
3795
+ name: "gotcha_card — the reviewer / verifier / judge card field (v2.0.0 W5a)",
3796
+ token: "gotcha_card",
3797
+ files: [
3798
+ "agents/orc-judge-opus-5-xhigh.md",
3799
+ "agents/orc-reviewer-opus-5-low.md",
3800
+ "agents/orc-verifier-opus-5-med.md",
3801
+ "skills/_shared/README.md",
3802
+ "skills/_shared/gotchas.md",
3803
+ "skills/_shared/review-slice.md",
3804
+ "skills/orc-pr-driver/references/green-gate.md",
3805
+ "skills/orc/references/ultra-mode.md",
3806
+ "skills/orc/subskills/orc-review-verify/core.md",
3807
+ ],
3808
+ },
3809
+ {
3810
+ name: "tool_findings[] — the R1 free check's output, never re-reported (v2.0.0 W5a)",
3811
+ token: "tool_findings",
3812
+ files: [
3813
+ "agents/orc-judge-opus-5-xhigh.md",
3814
+ "agents/orc-reviewer-opus-5-low.md",
3815
+ "agents/orc-verifier-opus-5-med.md",
3816
+ "skills/_shared/README.md",
3817
+ "skills/_shared/review-slice.md",
3818
+ "skills/orc/references/ultra-mode.md",
3819
+ "skills/orc/subskills/orc-review-verify/core.md",
3820
+ ],
3821
+ },
3822
+ {
3823
+ name: "pre_existing — a finding outside diff_ranges never gates (v2.0.0 W5a)",
3824
+ token: "pre_existing",
3825
+ files: [
3826
+ "agents/orc-reviewer-opus-5-low.md",
3827
+ "skills/_shared/phases/summary.md",
3828
+ "skills/_shared/review-slice.md",
3829
+ ],
3830
+ },
3831
+ {
3832
+ // The line `orc gotcha quality` reads; TRACE_VERBS holds its grammar.
3833
+ name: "FINDING-OUTCOME — the review-close outcome line (v2.0.0 W5a)",
3834
+ token: "FINDING-OUTCOME",
3835
+ files: [
3836
+ "skills/_shared/gotchas.md",
3837
+ "skills/_shared/phases/summary.md",
3838
+ "skills/_shared/phases/trace-verbs.md",
3839
+ "skills/_shared/review-slice.md",
3840
+ "skills/orc-quick/references/dispatch-gate.md",
3841
+ "skills/orc/examples/full-run-mock.md",
3842
+ // v2.1.0 (E21 D8) — the review guard reads it (a clean review is quiet).
3843
+ "hooks/orc-session-hook.js",
3844
+ ],
3845
+ binFiles: ["bin/cli.js"],
3846
+ },
3847
+ {
3848
+ name: "orc gotcha card — the reviewer card call (v2.0.0 W5a)",
3849
+ token: "orc gotcha card",
3850
+ files: [
3851
+ "agents/orc-verifier-opus-5-med.md",
3852
+ "skills/_shared/review-slice.md",
3853
+ "skills/orc-pr-driver/references/green-gate.md",
3854
+ // v2.0.2 (eval D13): the session hook hands the card to reviewers.
3855
+ "hooks/orc-session-hook.js",
3856
+ "hooks/README.md",
3857
+ ],
3858
+ binFiles: ["bin/gotcha.js"],
3859
+ },
3860
+ {
3861
+ name: "orc gotcha filter — the after-filter call, never removes a P0/P1 (v2.0.0 W5a)",
3862
+ token: "orc gotcha filter",
3863
+ files: ["agents/orc-reviewer-opus-5-low.md", "skills/_shared/review-slice.md"],
3864
+ binFiles: ["bin/gotcha.js"],
3865
+ },
3866
+ {
3867
+ // The one recording call (`_shared/gotchas.md` §10) and the file only the CLI writes.
3868
+ name: "orc gotcha observe — the one recording call (v2.0.0 W5a)",
3869
+ token: "orc gotcha observe",
3870
+ files: [
3871
+ "skills/_shared/gotchas.md",
3872
+ // v2.1.0 W6 (DE-13) — §3 step 6 stores the reviewed ranges.
3873
+ "skills/_shared/review-slice.md",
3874
+ "skills/orc-mini/examples/mini-run-mock.md",
3875
+ "skills/orc-quick/references/dispatch-gate.md",
3876
+ "skills/orc/examples/full-run-mock.md",
3877
+ // v2.1.0 (E21 D7) — the narration guard names it when a lane wrote its
3878
+ // trace lines by hand and the observe reminder never ran.
3879
+ "hooks/orc-session-hook.js",
3880
+ ],
3881
+ binFiles: ["bin/gotcha.js"],
3882
+ },
3883
+ // v2.0.0 W6a — the importers, the review-step sync (DE-29) and the two
3884
+ // read-only `gh` reads. Each call is pinned to the exact files that name it.
3885
+ {
3886
+ name: "orc gotcha sync — at every review step, before the card (v2.0.0 W6a, DE-29)",
3887
+ token: "orc gotcha sync",
3888
+ files: ["skills/_shared/review-slice.md", "skills/orc-pr-driver/references/green-gate.md"],
3889
+ binFiles: ["bin/gotcha.js", "bin/gotcha-import.js"],
3890
+ },
3891
+ {
3892
+ name: "orc gotcha import — Sonar / SARIF issues as a quick request (v2.0.0 W6a, Q4)",
3893
+ token: "orc gotcha import",
3894
+ files: ["skills/orc-quick/references/gh-mode.md", "skills/orc-quick/README.md"],
3895
+ binFiles: ["bin/gotcha.js", "bin/gotcha-import.js"],
3896
+ },
3897
+ {
3898
+ // DE-14: the token is read from the environment only — never a config key.
3899
+ name: "SONAR_TOKEN — the Sonar token lives in the environment only (v2.0.0 W6a, DE-14)",
3900
+ token: "SONAR_TOKEN",
3901
+ files: ["skills/orc-quick/references/gh-mode.md", "skills/orc-quick/README.md"],
3902
+ binFiles: ["bin/cli.js", "bin/gotcha-import.js"],
3903
+ },
3904
+ {
3905
+ name: "orc pr threads — the unresolved review threads via GraphQL (v2.0.0 W6a, Q1)",
3906
+ token: "orc pr threads",
3907
+ files: ["skills/orc-quick/references/gh-mode.md", "skills/orc-quick/README.md"],
3908
+ binFiles: ["bin/cli.js", "bin/gotcha-import.js"],
3909
+ },
3910
+ {
3911
+ name: "orc ci failed — failing CI steps, flaky named (v2.0.0 W6a, Q3)",
3912
+ token: "orc ci failed",
3913
+ files: ["skills/orc-quick/references/gh-mode.md", "skills/orc-quick/README.md"],
3914
+ binFiles: ["bin/gotcha-import.js"],
3915
+ },
3916
+ // v2.0.0 W6b — the undo that cannot eat a user edit (Q2), the flaky
3917
+ // classifier (Q5), the one end-of-run card (Q6) and questions per run (Q7).
3918
+ {
3919
+ name: "orc run snapshot — the pre-run tree, at the run-start pointer step (v2.0.0 W6b, Q2)",
3920
+ token: "orc run snapshot --run",
3921
+ // eval E1/E2 (27-09-2026): quick took the snapshot in 3 of 8 runs — its own Q0 step names it.
3922
+ files: ["skills/_shared/phases/trace.md", "skills/orc-quick/SKILL.md"],
3923
+ binFiles: ["bin/cli.js", "bin/run-undo.js"],
3924
+ },
3925
+ {
3926
+ name: "orc undo — PRINTS the revert of ONLY the run's own files, never `git checkout -- .` (v2.0.0 W6b, Q2)",
3927
+ token: "orc undo --run",
3928
+ files: ["skills/_shared/phases/summary.md", "skills/orc-quick/README.md"],
3929
+ binFiles: ["bin/cli.js", "bin/run-undo.js"],
3930
+ },
3931
+ {
3932
+ // 08 Q2 / S6: nothing runs by itself — the undo prints, `--apply` runs it.
3933
+ name: "orc undo --apply — the undo is print-only by default (v2.0.0 W6b, Q2)",
3934
+ token: "`--apply` runs",
3935
+ files: ["skills/_shared/phases/summary.md", "skills/orc-quick/README.md"],
3936
+ binFiles: ["bin/run-undo.js"],
3937
+ },
3938
+ // v2.1.0 W7 — the "never auto-deleted" promise is GONE. Every copy names the
3939
+ // command and the opt-in sweep, so a copy that still promises the opposite
3940
+ // fails here (06-clear-logs-spec §7).
3941
+ {
3942
+ name: "orc clear logs --apply — traces are kept until the command or the opt-in sweep (v2.1.0 W7)",
3943
+ token: "orc clear logs --apply",
3944
+ files: ["skills/_shared/phases/trace.md", "skills/_shared/phases/trace-verbs.md", "skills/orc/config.md"],
3945
+ binFiles: ["bin/cli.js", "bin/clear-logs.js"],
3946
+ },
3947
+ {
3948
+ name: "log_retention_auto — the FINISH sweep switch, named beside the command (v2.1.0 W7)",
3949
+ token: "log_retention_auto",
3950
+ files: ["skills/_shared/phases/trace.md", "skills/_shared/phases/trace-verbs.md", "skills/orc/config.md"],
3951
+ binFiles: ["bin/cli.js", "bin/clear-logs.js", "bin/trace-write.js"],
3952
+ },
3953
+ {
3954
+ name: "logs-rollup.json — the pruned runs `orc stats` still counts (v2.1.0 W7, DE-19 a)",
3955
+ token: "logs-rollup.json",
3956
+ files: [],
3957
+ binFiles: ["bin/cli.js", "bin/clear-logs.js"],
3958
+ },
3959
+ {
3960
+ name: "orc ci flaky — the ONE flaky classifier, before any repair round (v2.0.0 W6b, Q5)",
3961
+ token: "orc ci flaky",
3962
+ files: ["skills/_shared/smoke-gate.md"],
3963
+ binFiles: ["bin/gotcha-import.js"],
3964
+ },
3965
+ {
3966
+ name: "§Flaky — every test step that repairs points at the one rule (v2.0.0 W6b, Q5)",
3967
+ token: "§Flaky",
3968
+ files: ["skills/_shared/smoke-gate.md", "skills/_shared/phases/verify.md", "skills/orc-quick/SKILL.md"],
3969
+ },
3970
+ {
3971
+ name: "GATE flaky — the trace line of a flaky run (v2.0.0 W6b, Q5)",
3972
+ token: "GATE flaky",
3973
+ files: ["skills/_shared/smoke-gate.md", "skills/_shared/phases/summary.md"],
3974
+ binFiles: ["bin/gotcha-import.js"],
3975
+ },
3976
+ {
3977
+ // ONE template (08 Q6). /orc and /orc-diy reach it from the summary phase's
3978
+ // own layers; the three lanes with no summary phase point from the spine.
3979
+ name: "§End-of-run card — every coding lane ends in the one card (v2.0.0 W6b, Q6)",
3980
+ token: "§End-of-run card",
3981
+ files: [
3982
+ "skills/_shared/phases/summary.md",
3983
+ "skills/orc-fast/SKILL.md",
3984
+ "skills/orc-mini/SKILL.md",
3985
+ "skills/orc-quick/SKILL.md",
3986
+ ],
3987
+ },
3988
+ {
3989
+ name: "questions{} — `orc stats` measures the questions per run (v2.0.0 W6b, Q7)",
3990
+ token: "questions{}",
3991
+ files: ["skills/_shared/habits.md"],
3992
+ binFiles: ["bin/habit.js"],
3993
+ },
3994
+ {
3995
+ name: "observations.jsonl — the raw layer, written by the CLI only (v2.0.0 W5a)",
3996
+ token: ".claude/orc/observations.jsonl",
3997
+ files: ["skills/_shared/gotchas.md"],
3998
+ binFiles: ["bin/gotcha.js"],
3999
+ },
4000
+ {
4001
+ // v2.0.0 W3 — the lane side of habits is held ONCE, in `_shared/habits.md`,
4002
+ // and read ON DEMAND: only when `orc lane config` answers with a `habits{}`
4003
+ // block (`habits` is observe or propose). Under `habits: off` (the default)
4004
+ // no lane opens it. Like lane-contract.md it is not a PHASE_FILES row, so
4005
+ // this row is the reachability check: every spine that marks a `(H <qid>)`
4006
+ // question points at it.
4007
+ name: "the habits contract is read only when habits{} is present (v2.0.0 W3)",
4008
+ token: "habits.md",
4009
+ files: [
4010
+ "skills/_shared/README.md",
4011
+ "skills/_shared/habits.md",
4012
+ "skills/orc-mini/SKILL.md",
4013
+ "skills/orc-quick/SKILL.md",
4014
+ "skills/orc-quick/references/dispatch-gate.md",
4015
+ // v2.0.0 W3c — the rest of the lanes that mark a question, and the Phase
4016
+ // 8 completion report that carries the one run-end proposal.
4017
+ "skills/orc-diy/SKILL.md",
4018
+ "skills/orc-wait/SKILL.md",
4019
+ "skills/orc-analyze/SKILL.md",
4020
+ "skills/_shared/phases/ship.md",
4021
+ // v2.1.0 W6 — /orc-fix marks `fix.f1.class` (class never).
4022
+ "skills/orc-fix/SKILL.md",
4023
+ // v2.1.0 (A4) — /orc-fast wrote no ASK: the pointer now lives in its F0
4024
+ // config step, the step that reads `habits{}`.
4025
+ "skills/orc-fast/SKILL.md",
4026
+ // eval E2 (27-09-2026): the pointer moved to the step that reads the answer.
4027
+ "skills/_shared/phases/preflight.md",
4028
+ ],
4029
+ },
3686
4030
  {
3687
4031
  // v1.0.0 W10 — the partial-read discipline. The sentence that stops pillar 2
3688
4032
  // from making the payload SLOWER: a manifest of pointers read whole is more
@@ -3690,7 +4034,6 @@ const CONTRACTS = [
3690
4034
  name: "a pointer declares how much of it to read (v1.0.0 W10)",
3691
4035
  token: "on-phase",
3692
4036
  files: [
3693
- "skills/_shared/read-ladder.md",
3694
4037
  "skills/_shared/phases/README.md",
3695
4038
  "skills/orc/SKILL.md",
3696
4039
  ],
@@ -3707,9 +4050,15 @@ const CONTRACTS = [
3707
4050
  "skills/orc-test/SKILL.md",
3708
4051
  "skills/_shared/README.md",
3709
4052
  "skills/_shared/config-precedence.md",
4053
+ // v2.0.0 T3 — both config forms and the exit ≠ 0 fallback, once.
4054
+ "skills/_shared/lane-contract.md",
4055
+ // v2.0.0 W3 — the `habits{}` block rides in the same answer.
4056
+ "skills/_shared/habits.md",
3710
4057
  "skills/_shared/extra-dispatch.md",
3711
4058
  "skills/context-combiner/SKILL.md",
3712
4059
  "skills/orc-aftermath/SKILL.md",
4060
+ // v2.1.0 W6 — reads `log_dir` (the host trace), so the short pointer.
4061
+ "skills/orc-fix/SKILL.md",
3713
4062
  "skills/orc-analyze-mini/SKILL.md",
3714
4063
  "skills/orc-analyze/SKILL.md",
3715
4064
  "skills/orc-boundary/SKILL.md",
@@ -3796,6 +4145,30 @@ const CONTRACTS = [
3796
4145
  files: ["agents/orc-test-interpreter-opus-5-low.md", "skills/_shared/live-target.md"],
3797
4146
  binFiles: ["bin/cli.js"],
3798
4147
  },
4148
+ // v2.0.0 T16 — read the SECTION, not the file. Every lane reads
4149
+ // return-validation.md §1–§3 on a return, then ONLY the § of each field the
4150
+ // slice carried; the spines and the file header name the § numbers. So the
4151
+ // § headings are ANCHORS: a renumbered or renamed one is a pointer into
4152
+ // nothing. One row per anchor, each pinned to the one file that owns it.
4153
+ ...[
4154
+ "## 0. Is the previous attempt still ALIVE?",
4155
+ "## 1. Contract shape",
4156
+ "## 2. Claimed-vs-actual model",
4157
+ "## 2b. A FOREIGN return",
4158
+ "## 3. Honest-status rules",
4159
+ "## 4. Pattern attestation",
4160
+ "## 5. TDD attestation",
4161
+ "## 5b. Wiki attestation",
4162
+ "## 5b.1 Graph attestation",
4163
+ "## 5c. Rules attestation",
4164
+ "## 5d. Reproduce-first attestation",
4165
+ "## 6. Worktree delta",
4166
+ "## 7. Gotcha capture",
4167
+ ].map((token) => ({
4168
+ name: `return-validation.md § anchor (v2.0.0 T16): ${token}`,
4169
+ token,
4170
+ files: ["skills/_shared/return-validation.md"],
4171
+ })),
3799
4172
  ];
3800
4173
 
3801
4174
  // Spine size budgets (v0.19.0). These SKILL.md files are ALWAYS loaded when
@@ -3804,6 +4177,13 @@ const CONTRACTS = [
3804
4177
  // them. Detail belongs in load-on-demand references/ (free until the phase
3805
4178
  // fires). A new feature that would blow a budget lands as a reference + a
3806
4179
  // pointer, not as spine prose. Raising a budget is a deliberate, reviewed act.
4180
+ //
4181
+ // v2.0.0 (DE-21): `maxBytes` is a second cap, in LF bytes (CRLF counts as LF, so
4182
+ // a Windows checkout measures the same). 16 384 B is about 4k tokens: a coding
4183
+ // spine at or under it survives compaction WHOLE (the 5 000-token re-attach
4184
+ // rule). If a spine cannot fit without losing a rule, move the rule to a
4185
+ // reference loaded at its phase — never raise this cap.
4186
+ const CODING_SPINE_BYTES = 16384;
3807
4187
  const BUDGETS = [
3808
4188
  // v0.28.0: deliberate raise 335→350 — the run-integrity work adds inline
3809
4189
  // trace imperatives to every phase body (fix for SPAWN/RETURN-only traces),
@@ -3905,7 +4285,11 @@ const BUDGETS = [
3905
4285
  // v1.0.0 W11: 532→535. The preflight section gained the three-line pointer at
3906
4286
  // `_shared/phases/preflight.md`; W12 turns this spine into a manifest and the
3907
4287
  // budget comes down properly then.
3908
- { file: "skills/orc/SKILL.md", maxLines: 535 },
4288
+ // v2.0.0 W1 (T14): 535→240 — the promised come-down, finally. T3 moved the
4289
+ // lane contract, trace, phases and wait blocks to _shared/lane-contract.md and
4290
+ // the phase files; the spine is 231 lines. The byte cap is DE-21: 16 KB (LF)
4291
+ // per coding spine, so every spine survives compaction whole.
4292
+ { file: "skills/orc/SKILL.md", maxLines: 240, maxBytes: CODING_SPINE_BYTES },
3909
4293
  // v0.33.0: deliberate raises 264→289 / 197→219 / 171→179 — orc-wiki gains the
3910
4294
  // crosslink-compile entry branch, the delta-refresh default (impact probe),
3911
4295
  // and the orientation/atlas assemble steps (detail in references/); mini
@@ -3971,7 +4355,10 @@ const BUDGETS = [
3971
4355
  // affected-tests-first smoke gate and the `none is an answer` record. The
3972
4356
  // arithmetic (how to count, why each threshold is that number, the
3973
4357
  // graph_facts shape) lives in references/complexity.md.
3974
- { file: "skills/orc-mini/SKILL.md", maxLines: 280 },
4358
+ // v2.0.0 W1 (T11/T14): 280→240 — the mock-example, still-enforces, wiki and
4359
+ // Phase T restatements now point at their one home (_shared/drift-recovery.md,
4360
+ // phases/wiki-consult.md, phases/testgen.md). 235 lines, 16 342 B.
4361
+ { file: "skills/orc-mini/SKILL.md", maxLines: 240, maxBytes: CODING_SPINE_BYTES },
3975
4362
  // v0.39.0: deliberate raises 195→201 / 179→182 — the analyst gains hard rules
3976
4363
  // 2b (a source it did not author is FOREIGN input) and 4a (the read ladder);
3977
4364
  // fast gains the ladder as a slice line. Both are hard rules by nature: they
@@ -4006,7 +4393,9 @@ const BUDGETS = [
4006
4393
  // a reference the slice-builder never loads is not applied (the hard-rule-13
4007
4394
  // precedent). Six lines: the assembler, the precedence order, the preflight
4008
4395
  // line and the three return fields. Everything else is _shared/phases/rules.md.
4009
- { file: "skills/orc-analyze/SKILL.md", maxLines: 260 },
4396
+ // v2.0.0 W1 (T11/T14): 260→235 — the `Mini variant` restatement is gone
4397
+ // (orc-analyze-mini owns it). 229 lines.
4398
+ { file: "skills/orc-analyze/SKILL.md", maxLines: 235, maxBytes: CODING_SPINE_BYTES },
4010
4399
  // v0.40.0: deliberate raise 182→187 — gotchas as an explicit NON-gate. It has
4011
4400
  // to be stated where the two prerequisites are stated, or a later reader adds
4012
4401
  // a third gate and breaks the lane's entire premise.
@@ -4033,7 +4422,9 @@ const BUDGETS = [
4033
4422
  // line and the three return fields. Everything else is _shared/phases/rules.md.
4034
4423
  // v1.8.0 W9: deliberate raise 230→240 — the F0 code-graph step (e.), for the
4035
4424
  // same measured reason as orc-mini's raise: a lengthened line was skipped.
4036
- { file: "skills/orc-fast/SKILL.md", maxLines: 240 },
4425
+ // v2.0.0 W1 (T11/T14): 240→215 — mock example and still-enforces point at
4426
+ // their one home. 211 lines.
4427
+ { file: "skills/orc-fast/SKILL.md", maxLines: 215, maxBytes: CODING_SPINE_BYTES },
4037
4428
  // v1.9.0: a FIRST pin for the quick spine, at 325. It had none, and it grew
4038
4429
  // to 379 lines. W1 trimmed it to 298 by moving the step table, the gate menu,
4039
4430
  // the repair-loop example and the doc shape into references/ and README.md;
@@ -4041,7 +4432,27 @@ const BUDGETS = [
4041
4432
  // the blast-radius line and the one-call cache update. 325 is where that
4042
4433
  // lands plus nothing — a spine that grows past its own references has moved
4043
4434
  // prose the wrong way.
4044
- { file: "skills/orc-quick/SKILL.md", maxLines: 325 },
4435
+ // v2.0.0 W1 (T11/T13/T14): 325→300 — the inert-key paragraph points at
4436
+ // references/dispatch-gate.md rule 4, and the example CLI lines are gone (the
4437
+ // CLI prints them). 296 lines, 16 288 B.
4438
+ { file: "skills/orc-quick/SKILL.md", maxLines: 300, maxBytes: CODING_SPINE_BYTES },
4439
+ // v2.0.0 W1 (T14): FIRST pins, at the line count after the W1 trims + 5.
4440
+ // They had no budget, so nothing stopped them growing. orc-wait is not a
4441
+ // coding spine and carries no byte cap.
4442
+ { file: "skills/orc-test/SKILL.md", maxLines: 228, maxBytes: CODING_SPINE_BYTES },
4443
+ { file: "skills/orc-poly/SKILL.md", maxLines: 235, maxBytes: CODING_SPINE_BYTES },
4444
+ { file: "skills/context-combiner/SKILL.md", maxLines: 209, maxBytes: CODING_SPINE_BYTES },
4445
+ { file: "skills/orc-pr-setup/SKILL.md", maxLines: 205, maxBytes: CODING_SPINE_BYTES },
4446
+ { file: "skills/orc-pr-driver/SKILL.md", maxLines: 188, maxBytes: CODING_SPINE_BYTES },
4447
+ { file: "skills/orc-route/SKILL.md", maxLines: 183, maxBytes: CODING_SPINE_BYTES },
4448
+ { file: "skills/orc-wait/SKILL.md", maxLines: 169 },
4449
+ // v2.1.0 W6 — a rider, but it writes code in the no-run case (DE-12 c), so
4450
+ // the coding cap applies. Target ≤ 6 KB.
4451
+ { file: "skills/orc-fix/SKILL.md", maxLines: 130, maxBytes: CODING_SPINE_BYTES },
4452
+ { file: "skills/orc-pattern/SKILL.md", maxLines: 142, maxBytes: CODING_SPINE_BYTES },
4453
+ { file: "skills/orc-diy/SKILL.md", maxLines: 101, maxBytes: CODING_SPINE_BYTES },
4454
+ { file: "skills/orc-analyze-mini/SKILL.md", maxLines: 114, maxBytes: CODING_SPINE_BYTES },
4455
+ { file: "skills/orc-verify/SKILL.md", maxLines: 100, maxBytes: CODING_SPINE_BYTES },
4045
4456
  ];
4046
4457
 
4047
4458
  function walk(dir, out) {
@@ -4098,9 +4509,11 @@ for (const c of CONTRACTS) {
4098
4509
 
4099
4510
  for (const b of BUDGETS) {
4100
4511
  const p = path.join(ROOT, b.file);
4101
- let lines;
4512
+ let lines, bytes;
4102
4513
  try {
4103
- lines = fs.readFileSync(p, "utf8").split("\n").length;
4514
+ const text = fs.readFileSync(p, "utf8");
4515
+ lines = text.split("\n").length;
4516
+ bytes = Buffer.byteLength(text.replace(/\r\n/g, "\n"), "utf8");
4104
4517
  } catch (_) {
4105
4518
  failures++;
4106
4519
  console.error(`\n❌ spine budget: templates/${b.file} is missing.`);
@@ -4115,6 +4528,14 @@ for (const b of BUDGETS) {
4115
4528
  `the trigger + contract tokens + pointer in the spine.`
4116
4529
  );
4117
4530
  }
4531
+ if (b.maxBytes && bytes > b.maxBytes) {
4532
+ failures++;
4533
+ console.error(
4534
+ `\n❌ spine byte budget exceeded: templates/${b.file} is ${bytes} bytes (LF) ` +
4535
+ `(budget ${b.maxBytes}).\n A coding spine must survive compaction whole — ` +
4536
+ `move detail into a references/ file loaded at its phase; never raise the cap.`
4537
+ );
4538
+ }
4118
4539
  }
4119
4540
 
4120
4541
  // ── The two-way registry lint (C.3) ────────────────────────────────────────
@@ -4266,6 +4687,38 @@ for (const b of BUDGETS) {
4266
4687
  "code_graph_hooks",
4267
4688
  // v1.8.2 W2 — the ignore globs, read by the CLI behind the same calls.
4268
4689
  "code_graph_ignore",
4690
+ // v2.0.0 W2 — the habits master key, the `code_graph` answer: `orc lane
4691
+ // config` resolves it and hands a lane its `habits{}` block, so no spine
4692
+ // reads the key. An empty lanes[] here is an ANSWER.
4693
+ "habits",
4694
+ // v2.0.0 W2 — the three offer keys a habit can answer. W3 wires the lanes
4695
+ // that read them (DE-7: orc-mini, orc-fast, orc-quick), and each then LEAVES
4696
+ // this list — the check below fails until it does.
4697
+ "review_before_push",
4698
+ "mini_tdd",
4699
+ "quick_update_tests",
4700
+ // v2.0.0 W4 — operating keys of the gotchas ENGINE, the `code_graph_card_budget`
4701
+ // answer: `orc gotcha card`, `import` and `sync` read them, never a spine.
4702
+ "gotcha_card_budget",
4703
+ "gotcha_sync_hours",
4704
+ "sonar_url",
4705
+ "sonar_project",
4706
+ "sonar_org",
4707
+ // v2.0.0 W6c — `notify` is an operating key of the SESSION HOOK, the
4708
+ // `read_gate` answer: orc-session-hook.js reads the raw key off the file.
4709
+ // `rules_card_compact` is read by `rulesSlice()` behind `orc rules slice`,
4710
+ // never by a spine (a lane never picks its own card). Both are ANSWERS.
4711
+ "notify",
4712
+ "rules_card_compact",
4713
+ // v2.1.0 W7 — operating keys of `orc clear logs` and of the FINISH sweep
4714
+ // inside `orc trace write`. The CLI reads both; no spine ever reads the
4715
+ // retention age or the sweep switch, exactly as no spine reads
4716
+ // `extra_timeout_s`. An empty lanes[] here is an ANSWER.
4717
+ "log_retention_days",
4718
+ "log_retention_auto",
4719
+ // v2.1.0 W8 — a WRITE-THROUGH key: its value lives in settings.json
4720
+ // (statusLine.refreshInterval) and Claude Code reads it, never a lane.
4721
+ "statusline_refresh",
4269
4722
  ]);
4270
4723
  for (const e of metaEntries) {
4271
4724
  if (!e.lanes) {
@@ -4652,7 +5105,7 @@ for (const b of BUDGETS) {
4652
5105
  "orc was updated",
4653
5106
  "orc is installed",
4654
5107
  "orc and orc-mini",
4655
- "orc lane calls", // the catalogue's own reader, named in read-ladder.md
5108
+ "orc lane calls", // the catalogue's own reader, named in _shared/phases/README.md (v2.0.0 T6)
4656
5109
  ]);
4657
5110
  const catalogued = new Set(Object.values(CALLS).map((c) => prefixOf(c.cmd)));
4658
5111
  for (const [call, lanes] of Object.entries(measured)) {
@@ -4875,6 +5328,23 @@ for (const b of BUDGETS) {
4875
5328
  // context-combiner point at trace.md to describe it and never run it.
4876
5329
  for (const [id, def] of Object.entries(FILES)) {
4877
5330
  const base = def.file.split("/").pop();
5331
+ // v2.0.0 T1 — an ON-DEMAND file is reached through the phase file named
5332
+ // in `via`, which every one of its readers already reads. So the pointer
5333
+ // must be in THAT file, and every reader must be a reader of it too.
5334
+ if (def.via) {
5335
+ const viaDef = FILES[def.via];
5336
+ if (!viaDef) {
5337
+ errs.push(`phase "${id}" names via "${def.via}", which is not a PHASE_FILES entry`);
5338
+ continue;
5339
+ }
5340
+ const viaAbs = path.join(skillsDir, viaDef.file);
5341
+ if (fs.existsSync(viaAbs) && !fs.readFileSync(viaAbs, "utf8").includes(base))
5342
+ errs.push(`phase "${id}" is reached via ${viaDef.file}, but that file never names ${base}`);
5343
+ for (const lane of PHASES[id] || [])
5344
+ if (!(PHASES[def.via] || []).includes(lane))
5345
+ errs.push(`LANE_PHASES["${id}"] names "${lane}", which does not read "${def.via}" — the only road to ${base}`);
5346
+ continue;
5347
+ }
4878
5348
  for (const lane of PHASES[id] || []) {
4879
5349
  const dir = path.join(skillsDir, lane);
4880
5350
  if (!fs.existsSync(dir)) continue;
@@ -4917,7 +5387,7 @@ for (const b of BUDGETS) {
4917
5387
  if (!r.heading && !r.layers)
4918
5388
  errs.push(`LANE_OWN_PHASES["${lane}"] phase "${r.id}" declares neither a heading nor layers — nothing tells the lane where to read it`);
4919
5389
  if (r.heading) {
4920
- // /orc-doc rule 2 and read-ladder.md rule 2: a section anchor is a
5390
+ // /orc-doc rule 2 and the partial-read rule 2 (_shared/phases/README.md): a section anchor is a
4921
5391
  // HEADING, never a line number. Assert the heading really is there,
4922
5392
  // verbatim — a renamed heading is a pointer into nothing.
4923
5393
  if (r.read !== "section")
@@ -5005,6 +5475,63 @@ for (const b of BUDGETS) {
5005
5475
  }
5006
5476
  }
5007
5477
 
5478
+ // 2c. v2.0.0 T1 — THE TRACE VERB REGISTRY, three ways. `TRACE_VERBS` in
5479
+ // bin/cli.js is the data; `_shared/phases/trace-verbs.md` is its table for
5480
+ // a human; every `trace_verbs` (PHASE_FILES, LANE_OWN_PHASES) and
5481
+ // `spine_verbs` (LANE_TRACE) entry plus TRACE_ALWAYS_VERBS is a CLAIM that
5482
+ // a phase emits that verb. A claimed verb the registry lacks FAILS (the
5483
+ // lane would be handed no grammar for it); a registry verb missing from
5484
+ // the table FAILS; a table verb missing from the registry FAILS; and a row
5485
+ // whose grammar, emitter, meaning or owner disagrees FAILS.
5486
+ {
5487
+ let VERBS = null, ALWAYS = null;
5488
+ try {
5489
+ VERBS = new Function("return " + cliText.match(/const TRACE_VERBS = \{[\s\S]*?\n\};/)[0].replace(/^const TRACE_VERBS = /, "").replace(/;$/, ""))();
5490
+ ALWAYS = new Function("return " + cliText.match(/const TRACE_ALWAYS_VERBS = \[[\s\S]*?\];/)[0].replace(/^const TRACE_ALWAYS_VERBS = /, "").replace(/;$/, ""))();
5491
+ } catch (e) {
5492
+ errs.push("could not parse TRACE_VERBS / TRACE_ALWAYS_VERBS from bin/cli.js: " + e.message);
5493
+ }
5494
+ const tablePath = path.join(skillsDir, "_shared", "phases", "trace-verbs.md");
5495
+ if (VERBS && !fs.existsSync(tablePath)) errs.push("_shared/phases/trace-verbs.md is missing — TRACE_VERBS has no human table");
5496
+ if (VERBS && fs.existsSync(tablePath)) {
5497
+ const unesc = (s) => s.replace(/\\\|/g, "|");
5498
+ const table = {};
5499
+ for (const line of fs.readFileSync(tablePath, "utf8").split(/\r?\n/)) {
5500
+ const m = /^\| `(.+?)` \| (.+?) \| (.+) \| `([^`]+)` \|$/.exec(line);
5501
+ if (!m) continue;
5502
+ const grammar = unesc(m[1]);
5503
+ const verb = grammar.split(" ")[0];
5504
+ if (table[verb]) errs.push(`trace-verbs.md has two rows for ${verb}`);
5505
+ table[verb] = { grammar, emitter: m[2], meaning: unesc(m[3]), owner: m[4] };
5506
+ }
5507
+ for (const [v, d] of Object.entries(VERBS)) {
5508
+ const row = table[v];
5509
+ if (!row) {
5510
+ errs.push(`TRACE_VERBS has ${v}, but trace-verbs.md has no row for it`);
5511
+ continue;
5512
+ }
5513
+ for (const k of ["grammar", "emitter", "meaning", "owner"])
5514
+ if (row[k] !== d[k]) errs.push(`trace-verbs.md row ${v}: ${k} ${JSON.stringify(row[k])} ≠ TRACE_VERBS ${JSON.stringify(d[k])}`);
5515
+ if (!d.grammar.startsWith(v + " ") && d.grammar !== v)
5516
+ errs.push(`TRACE_VERBS.${v}.grammar does not start with the verb`);
5517
+ const ownerAbs = path.join(ROOT, d.owner.startsWith("agents/") || d.owner.startsWith("hooks/") ? d.owner : path.join("skills", d.owner));
5518
+ if (!fs.existsSync(ownerAbs)) errs.push(`TRACE_VERBS.${v}.owner names ${d.owner}, which does not exist`);
5519
+ }
5520
+ for (const v of Object.keys(table))
5521
+ if (!VERBS[v]) errs.push(`trace-verbs.md has a row for ${v}, which TRACE_VERBS does not declare — the set is CLOSED`);
5522
+ }
5523
+ if (VERBS) {
5524
+ const claims = [];
5525
+ for (const v of ALWAYS || []) claims.push(["TRACE_ALWAYS_VERBS", v]);
5526
+ for (const [id, def] of Object.entries(FILES || {})) for (const v of def.trace_verbs || []) claims.push([`PHASE_FILES["${id}"].trace_verbs`, v]);
5527
+ for (const [lane, rows] of Object.entries(OWN || {}))
5528
+ for (const r of rows) for (const v of r.trace_verbs || []) claims.push([`LANE_OWN_PHASES["${lane}"] phase "${r.id}"`, v]);
5529
+ for (const [lane, t] of Object.entries(TRACE || {})) for (const v of t.spine_verbs || []) claims.push([`LANE_TRACE["${lane}"].spine_verbs`, v]);
5530
+ for (const [where, v] of claims)
5531
+ if (!VERBS[v]) errs.push(`${where} lists ${v}, which TRACE_VERBS does not declare — a lane would get no grammar for it`);
5532
+ }
5533
+ }
5534
+
5008
5535
  if (errs.length) {
5009
5536
  failures++;
5010
5537
  console.error("\n❌ phase library drift:");