@azure-id/orc 0.55.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 (449) hide show
  1. package/CHANGELOG.md +2017 -0
  2. package/README-id.md +521 -0
  3. package/README.md +485 -0
  4. package/bin/build-agents.js +86 -0
  5. package/bin/cli.js +29050 -0
  6. package/bin/mockrun-catalog.js +267 -0
  7. package/bin/onboarding-content.js +172 -0
  8. package/bin/pricing.json +200 -0
  9. package/bin/providers.json +437 -0
  10. package/bin/ui.js +95 -0
  11. package/bin/verify-contracts.js +3277 -0
  12. package/bin/verify-package.js +498 -0
  13. package/bin/webui/api.js +1163 -0
  14. package/bin/webui/app.html +198 -0
  15. package/bin/webui/css/00-tokens.css +92 -0
  16. package/bin/webui/css/01-base.css +42 -0
  17. package/bin/webui/css/02-shell.css +103 -0
  18. package/bin/webui/css/03-components.css +462 -0
  19. package/bin/webui/css/04-motion.css +91 -0
  20. package/bin/webui/css/05-tour.css +100 -0
  21. package/bin/webui/css/06-responsive.css +108 -0
  22. package/bin/webui/css/panels/boundary.css +26 -0
  23. package/bin/webui/css/panels/challenge.css +151 -0
  24. package/bin/webui/css/panels/crosslink.css +194 -0
  25. package/bin/webui/css/panels/docs.css +254 -0
  26. package/bin/webui/css/panels/experiment.css +23 -0
  27. package/bin/webui/css/panels/extra.css +536 -0
  28. package/bin/webui/css/panels/flow.css +177 -0
  29. package/bin/webui/css/panels/handoff.css +67 -0
  30. package/bin/webui/css/panels/knowledge.css +86 -0
  31. package/bin/webui/css/panels/learn.css +154 -0
  32. package/bin/webui/css/panels/maintenance.css +55 -0
  33. package/bin/webui/css/panels/mockrun.css +268 -0
  34. package/bin/webui/css/panels/overview.css +100 -0
  35. package/bin/webui/css/panels/pact.css +43 -0
  36. package/bin/webui/css/panels/runs.css +105 -0
  37. package/bin/webui/css/panels/settings.css +227 -0
  38. package/bin/webui/css/panels/stats.css +87 -0
  39. package/bin/webui/fixtures/boundary.js +92 -0
  40. package/bin/webui/fixtures/challenge.js +825 -0
  41. package/bin/webui/fixtures/crosslink.js +31 -0
  42. package/bin/webui/fixtures/docs.js +982 -0
  43. package/bin/webui/fixtures/extra.js +1934 -0
  44. package/bin/webui/fixtures/flow.js +81 -0
  45. package/bin/webui/fixtures/handoff.js +35 -0
  46. package/bin/webui/fixtures/index.js +486 -0
  47. package/bin/webui/fixtures/knowledge.js +291 -0
  48. package/bin/webui/fixtures/maintenance.js +42 -0
  49. package/bin/webui/fixtures/mockrun.js +36 -0
  50. package/bin/webui/fixtures/pact.js +111 -0
  51. package/bin/webui/fixtures/runs.js +109 -0
  52. package/bin/webui/fixtures/settings.js +78 -0
  53. package/bin/webui/fixtures/shell.js +48 -0
  54. package/bin/webui/fixtures/stats.js +104 -0
  55. package/bin/webui/i18n/TERMS.md +134 -0
  56. package/bin/webui/i18n/en/banner.json +29 -0
  57. package/bin/webui/i18n/en/boundary.json +20 -0
  58. package/bin/webui/i18n/en/challenge.json +106 -0
  59. package/bin/webui/i18n/en/common.json +69 -0
  60. package/bin/webui/i18n/en/crosslink.json +69 -0
  61. package/bin/webui/i18n/en/docs.json +175 -0
  62. package/bin/webui/i18n/en/experiment.json +17 -0
  63. package/bin/webui/i18n/en/extra.json +313 -0
  64. package/bin/webui/i18n/en/flow.json +30 -0
  65. package/bin/webui/i18n/en/handoff.json +37 -0
  66. package/bin/webui/i18n/en/knowledge.json +141 -0
  67. package/bin/webui/i18n/en/learn.json +16 -0
  68. package/bin/webui/i18n/en/maintenance.json +52 -0
  69. package/bin/webui/i18n/en/mockrun.json +19 -0
  70. package/bin/webui/i18n/en/nav.json +19 -0
  71. package/bin/webui/i18n/en/overview.json +89 -0
  72. package/bin/webui/i18n/en/pact.json +36 -0
  73. package/bin/webui/i18n/en/runs.json +51 -0
  74. package/bin/webui/i18n/en/settings.json +49 -0
  75. package/bin/webui/i18n/en/stats.json +69 -0
  76. package/bin/webui/i18n/en/tour.json +33 -0
  77. package/bin/webui/i18n/id/banner.json +29 -0
  78. package/bin/webui/i18n/id/boundary.json +20 -0
  79. package/bin/webui/i18n/id/challenge.json +106 -0
  80. package/bin/webui/i18n/id/common.json +70 -0
  81. package/bin/webui/i18n/id/crosslink.json +69 -0
  82. package/bin/webui/i18n/id/docs.json +175 -0
  83. package/bin/webui/i18n/id/experiment.json +17 -0
  84. package/bin/webui/i18n/id/extra.json +313 -0
  85. package/bin/webui/i18n/id/flow.json +30 -0
  86. package/bin/webui/i18n/id/handoff.json +37 -0
  87. package/bin/webui/i18n/id/knowledge.json +141 -0
  88. package/bin/webui/i18n/id/learn.json +16 -0
  89. package/bin/webui/i18n/id/maintenance.json +52 -0
  90. package/bin/webui/i18n/id/mockrun.json +19 -0
  91. package/bin/webui/i18n/id/nav.json +19 -0
  92. package/bin/webui/i18n/id/overview.json +89 -0
  93. package/bin/webui/i18n/id/pact.json +36 -0
  94. package/bin/webui/i18n/id/runs.json +51 -0
  95. package/bin/webui/i18n/id/settings.json +49 -0
  96. package/bin/webui/i18n/id/stats.json +69 -0
  97. package/bin/webui/i18n/id/tour.json +33 -0
  98. package/bin/webui/js/00-core.js +115 -0
  99. package/bin/webui/js/01-i18n.js +149 -0
  100. package/bin/webui/js/02-ui.js +211 -0
  101. package/bin/webui/js/03-md.js +286 -0
  102. package/bin/webui/js/04-router.js +51 -0
  103. package/bin/webui/js/05-banners.js +172 -0
  104. package/bin/webui/js/06-edit.js +183 -0
  105. package/bin/webui/js/90-tour.js +488 -0
  106. package/bin/webui/js/91-shortcuts.js +126 -0
  107. package/bin/webui/js/99-boot.js +118 -0
  108. package/bin/webui/js/panels/boundary.js +104 -0
  109. package/bin/webui/js/panels/challenge.js +781 -0
  110. package/bin/webui/js/panels/crosslink.js +654 -0
  111. package/bin/webui/js/panels/docs.js +1338 -0
  112. package/bin/webui/js/panels/experiment.js +98 -0
  113. package/bin/webui/js/panels/extra.js +3011 -0
  114. package/bin/webui/js/panels/flow.js +297 -0
  115. package/bin/webui/js/panels/handoff.js +169 -0
  116. package/bin/webui/js/panels/knowledge.js +890 -0
  117. package/bin/webui/js/panels/learn.js +220 -0
  118. package/bin/webui/js/panels/maintenance.js +235 -0
  119. package/bin/webui/js/panels/mockrun.js +227 -0
  120. package/bin/webui/js/panels/overview.js +447 -0
  121. package/bin/webui/js/panels/pact.js +189 -0
  122. package/bin/webui/js/panels/runs.js +416 -0
  123. package/bin/webui/js/panels/settings.js +573 -0
  124. package/bin/webui/js/panels/stats.js +378 -0
  125. package/bin/webui/serve.js +557 -0
  126. package/mock-run/INDEX.md +106 -0
  127. package/mock-run/a-normal-day.md +587 -0
  128. package/mock-run/context-combiner.md +100 -0
  129. package/mock-run/extra-recovery.md +330 -0
  130. package/mock-run/extra-slots.md +177 -0
  131. package/mock-run/media/README.md +43 -0
  132. package/mock-run/orc-aftermath.md +392 -0
  133. package/mock-run/orc-boundary.md +356 -0
  134. package/mock-run/orc-brainstorm.md +177 -0
  135. package/mock-run/orc-budget.md +534 -0
  136. package/mock-run/orc-challenge-council.md +262 -0
  137. package/mock-run/orc-challenge.md +416 -0
  138. package/mock-run/orc-cli.md +200 -0
  139. package/mock-run/orc-diy.md +129 -0
  140. package/mock-run/orc-doc.md +448 -0
  141. package/mock-run/orc-explain.md +86 -0
  142. package/mock-run/orc-export.md +423 -0
  143. package/mock-run/orc-extra.md +392 -0
  144. package/mock-run/orc-fast.md +106 -0
  145. package/mock-run/orc-grill.md +151 -0
  146. package/mock-run/orc-handoff.md +480 -0
  147. package/mock-run/orc-pact.md +421 -0
  148. package/mock-run/orc-pattern.md +112 -0
  149. package/mock-run/orc-plan.md +108 -0
  150. package/mock-run/orc-pr-setup.md +126 -0
  151. package/mock-run/orc-quick.md +113 -0
  152. package/mock-run/orc-route.md +93 -0
  153. package/mock-run/orc-ui.md +125 -0
  154. package/mock-run/orc-ultra.md +103 -0
  155. package/mock-run/orc.md +157 -0
  156. package/mock-run/the-example-project.md +55 -0
  157. package/package.json +39 -0
  158. package/templates/agents/MODEL-MAPPING.md +168 -0
  159. package/templates/agents/orc-advisor-fable-5.md +50 -0
  160. package/templates/agents/orc-advisor-opus-5-xhigh.md +56 -0
  161. package/templates/agents/orc-analyst-fable-5.md +115 -0
  162. package/templates/agents/orc-analyze-mini-opus-5-med.md +60 -0
  163. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +58 -0
  164. package/templates/agents/orc-challenge-advisor-opus-5-med.md +75 -0
  165. package/templates/agents/orc-challenge-contrarian-opus-5-high.md +110 -0
  166. package/templates/agents/orc-challenge-executor-opus-5-med.md +114 -0
  167. package/templates/agents/orc-challenge-expansionist-opus-5-med.md +112 -0
  168. package/templates/agents/orc-challenge-judge-opus-5-high.md +132 -0
  169. package/templates/agents/orc-challenge-outsider-opus-5-low.md +109 -0
  170. package/templates/agents/orc-challenge-principles-opus-5-high.md +109 -0
  171. package/templates/agents/orc-challenge-reader-opus-5-low.md +90 -0
  172. package/templates/agents/orc-claude-writer-opus-4-8-high.md +53 -0
  173. package/templates/agents/orc-claude-writer-opus-5-med.md +55 -0
  174. package/templates/agents/orc-context-combiner-opus-5-high.md +88 -0
  175. package/templates/agents/orc-doc-checker-opus-5-low.md +108 -0
  176. package/templates/agents/orc-doc-writer-opus-5-med.md +134 -0
  177. package/templates/agents/orc-executor-haiku-4-5.md +113 -0
  178. package/templates/agents/orc-executor-opus-4-7-high.md +114 -0
  179. package/templates/agents/orc-executor-opus-4-7-med.md +114 -0
  180. package/templates/agents/orc-executor-opus-4-8-high.md +114 -0
  181. package/templates/agents/orc-executor-opus-5-high.md +114 -0
  182. package/templates/agents/orc-executor-opus-5-low.md +114 -0
  183. package/templates/agents/orc-executor-opus-5-med.md +114 -0
  184. package/templates/agents/orc-executor-sonnet-4-6-high.md +114 -0
  185. package/templates/agents/orc-executor-sonnet-4-6-med.md +114 -0
  186. package/templates/agents/orc-executor-sonnet-5-high.md +114 -0
  187. package/templates/agents/orc-judge-fable-5.md +79 -0
  188. package/templates/agents/orc-judge-opus-5-xhigh.md +85 -0
  189. package/templates/agents/orc-learn-writer-opus-5-low.md +73 -0
  190. package/templates/agents/orc-pattern-codifier-opus-5-med.md +65 -0
  191. package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +63 -0
  192. package/templates/agents/orc-planner-fable-5.md +152 -0
  193. package/templates/agents/orc-planner-mini-opus-5-med.md +69 -0
  194. package/templates/agents/orc-planner-mini-sonnet-5-high.md +67 -0
  195. package/templates/agents/orc-planner-opus-5-med.md +160 -0
  196. package/templates/agents/orc-retro-opus-5-med.md +73 -0
  197. package/templates/agents/orc-retro-sonnet-5-high.md +72 -0
  198. package/templates/agents/orc-reviewer-fable-5.md +57 -0
  199. package/templates/agents/orc-reviewer-opus-5-med.md +60 -0
  200. package/templates/agents/orc-scout-opus-5-low.md +40 -0
  201. package/templates/agents/orc-scout-sonnet-4-6-high.md +39 -0
  202. package/templates/agents/orc-system-analyst-opus-5-high.md +120 -0
  203. package/templates/agents/orc-test-author-opus-5-med.md +71 -0
  204. package/templates/agents/orc-trace-writer-haiku-4-5.md +107 -0
  205. package/templates/agents/orc-verifier-opus-5-med.md +69 -0
  206. package/templates/agents/orc-wiki-scanner-opus-4-8-high.md +79 -0
  207. package/templates/agents/orc-wiki-scanner-opus-5-med.md +81 -0
  208. package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +106 -0
  209. package/templates/commands/orc-aftermath.md +49 -0
  210. package/templates/commands/orc-analyze.md +21 -0
  211. package/templates/commands/orc-boundary.md +46 -0
  212. package/templates/commands/orc-brainstorm.md +51 -0
  213. package/templates/commands/orc-budget.md +54 -0
  214. package/templates/commands/orc-challenge.md +58 -0
  215. package/templates/commands/orc-claude.md +14 -0
  216. package/templates/commands/orc-diy.md +13 -0
  217. package/templates/commands/orc-doc.md +128 -0
  218. package/templates/commands/orc-explain.md +20 -0
  219. package/templates/commands/orc-export.md +46 -0
  220. package/templates/commands/orc-fast.md +15 -0
  221. package/templates/commands/orc-grill.md +40 -0
  222. package/templates/commands/orc-handoff.md +52 -0
  223. package/templates/commands/orc-learn.md +17 -0
  224. package/templates/commands/orc-mini.md +12 -0
  225. package/templates/commands/orc-pact.md +44 -0
  226. package/templates/commands/orc-pattern.md +15 -0
  227. package/templates/commands/orc-plan.md +22 -0
  228. package/templates/commands/orc-poly.md +21 -0
  229. package/templates/commands/orc-pr-driver.md +30 -0
  230. package/templates/commands/orc-pr-setup.md +31 -0
  231. package/templates/commands/orc-quick.md +33 -0
  232. package/templates/commands/orc-retro.md +17 -0
  233. package/templates/commands/orc-route.md +41 -0
  234. package/templates/commands/orc-ultra.md +17 -0
  235. package/templates/commands/orc-verify.md +11 -0
  236. package/templates/commands/orc-wiki.md +42 -0
  237. package/templates/commands/orc.md +16 -0
  238. package/templates/hooks/orc-effort-guard.js +178 -0
  239. package/templates/hooks/orc-statusline.js +305 -0
  240. package/templates/hooks/orc-trace.js +471 -0
  241. package/templates/hooks/orc-update-lib.js +125 -0
  242. package/templates/skills/_shared/README.md +50 -0
  243. package/templates/skills/_shared/detecting-artifacts.md +90 -0
  244. package/templates/skills/_shared/drift-recovery.md +98 -0
  245. package/templates/skills/_shared/extra-dispatch.md +1051 -0
  246. package/templates/skills/_shared/fable5-override.md +56 -0
  247. package/templates/skills/_shared/fallback-handoff.md +42 -0
  248. package/templates/skills/_shared/gh-stack-commands.md +65 -0
  249. package/templates/skills/_shared/gotchas.md +177 -0
  250. package/templates/skills/_shared/interview.md +144 -0
  251. package/templates/skills/_shared/lane-suspend.md +82 -0
  252. package/templates/skills/_shared/opus5-only.md +131 -0
  253. package/templates/skills/_shared/pr-templates.md +106 -0
  254. package/templates/skills/_shared/read-ladder.md +54 -0
  255. package/templates/skills/_shared/return-validation.md +145 -0
  256. package/templates/skills/_shared/smoke-gate.md +28 -0
  257. package/templates/skills/_shared/stack-plan.md +135 -0
  258. package/templates/skills/_shared/untrusted-input.md +63 -0
  259. package/templates/skills/context-combiner/SKILL.md +187 -0
  260. package/templates/skills/context-combiner/schemas/combined-report.md +78 -0
  261. package/templates/skills/context-combiner/schemas/combined-requirement-spec.md +87 -0
  262. package/templates/skills/orc/README.md +150 -0
  263. package/templates/skills/orc/SKILL.md +526 -0
  264. package/templates/skills/orc/config.md +389 -0
  265. package/templates/skills/orc/examples/full-run-mock.md +73 -0
  266. package/templates/skills/orc/references/analyst-gates.md +124 -0
  267. package/templates/skills/orc/references/effort-and-mode.md +224 -0
  268. package/templates/skills/orc/references/house-rules.md +20 -0
  269. package/templates/skills/orc/references/intake.md +120 -0
  270. package/templates/skills/orc/references/log-protocol.md +39 -0
  271. package/templates/skills/orc/references/pattern-gate.md +89 -0
  272. package/templates/skills/orc/references/plan-handoff.md +84 -0
  273. package/templates/skills/orc/references/preflight-report.md +220 -0
  274. package/templates/skills/orc/references/security-checklist.md +39 -0
  275. package/templates/skills/orc/references/stop-and-resume.md +160 -0
  276. package/templates/skills/orc/references/trace-protocol.md +314 -0
  277. package/templates/skills/orc/references/ultra-mode.md +123 -0
  278. package/templates/skills/orc/references/wave-grouping.md +121 -0
  279. package/templates/skills/orc/references/wiki-consult.md +177 -0
  280. package/templates/skills/orc/schemas/checkpoint.md +122 -0
  281. package/templates/skills/orc/schemas/intent-spec.md +42 -0
  282. package/templates/skills/orc/schemas/planning-output.md +279 -0
  283. package/templates/skills/orc/subskills/orc-checkpoint/SKILL.md +55 -0
  284. package/templates/skills/orc/subskills/orc-execution/SKILL.md +72 -0
  285. package/templates/skills/orc/subskills/orc-execution/core.md +151 -0
  286. package/templates/skills/orc/subskills/orc-execution/subagent.md +13 -0
  287. package/templates/skills/orc/subskills/orc-planner/SKILL.md +264 -0
  288. package/templates/skills/orc/subskills/orc-planner-mini/SKILL.md +121 -0
  289. package/templates/skills/orc/subskills/orc-pr/SKILL.md +51 -0
  290. package/templates/skills/orc/subskills/orc-pr/pr.md +22 -0
  291. package/templates/skills/orc/subskills/orc-pr/stack-gate.md +108 -0
  292. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +76 -0
  293. package/templates/skills/orc/subskills/orc-review-verify/core.md +135 -0
  294. package/templates/skills/orc/subskills/orc-review-verify/subagent.md +7 -0
  295. package/templates/skills/orc/subskills/orc-testgen/SKILL.md +45 -0
  296. package/templates/skills/orc/subskills/orc-testgen/core.md +59 -0
  297. package/templates/skills/orc/subskills/orc-testgen/subagent.md +7 -0
  298. package/templates/skills/orc-advisor/SKILL.md +60 -0
  299. package/templates/skills/orc-aftermath/SKILL.md +136 -0
  300. package/templates/skills/orc-aftermath/references/report.md +95 -0
  301. package/templates/skills/orc-analyze/SKILL.md +220 -0
  302. package/templates/skills/orc-analyze/examples/analyze-mock.md +42 -0
  303. package/templates/skills/orc-analyze/references/branching.md +51 -0
  304. package/templates/skills/orc-analyze/references/deep-mode.md +27 -0
  305. package/templates/skills/orc-analyze/references/thin-input.md +77 -0
  306. package/templates/skills/orc-analyze/schemas/report-audit.md +83 -0
  307. package/templates/skills/orc-analyze/schemas/report-prose.md +63 -0
  308. package/templates/skills/orc-analyze/schemas/report-requirement.md +78 -0
  309. package/templates/skills/orc-analyze/schemas/requirement-spec.md +77 -0
  310. package/templates/skills/orc-analyze-mini/SKILL.md +112 -0
  311. package/templates/skills/orc-analyze-mini/examples/quick-analysis-mock.md +31 -0
  312. package/templates/skills/orc-boundary/SKILL.md +208 -0
  313. package/templates/skills/orc-boundary/references/card.md +78 -0
  314. package/templates/skills/orc-boundary/references/gate.md +113 -0
  315. package/templates/skills/orc-brainstorm/SKILL.md +339 -0
  316. package/templates/skills/orc-brainstorm/references/brainstorm-doc.md +133 -0
  317. package/templates/skills/orc-brainstorm/references/lenses.md +152 -0
  318. package/templates/skills/orc-budget/SKILL.md +225 -0
  319. package/templates/skills/orc-budget/references/corpus.md +87 -0
  320. package/templates/skills/orc-challenge/README.md +142 -0
  321. package/templates/skills/orc-challenge/SKILL.md +255 -0
  322. package/templates/skills/orc-challenge/examples/code-module.md +110 -0
  323. package/templates/skills/orc-challenge/examples/council-full-roster.md +273 -0
  324. package/templates/skills/orc-challenge/examples/tsd-two-iterations.md +213 -0
  325. package/templates/skills/orc-challenge/references/conservation.md +107 -0
  326. package/templates/skills/orc-challenge/references/council.md +315 -0
  327. package/templates/skills/orc-challenge/references/cycle-state.md +185 -0
  328. package/templates/skills/orc-challenge/references/dimensions.md +121 -0
  329. package/templates/skills/orc-challenge/references/fix-brief.md +130 -0
  330. package/templates/skills/orc-challenge/references/intake.md +171 -0
  331. package/templates/skills/orc-challenge/references/kinds.md +44 -0
  332. package/templates/skills/orc-challenge/references/plain-english.md +98 -0
  333. package/templates/skills/orc-challenge/references/rubric.md +109 -0
  334. package/templates/skills/orc-challenge/references/sealed-slice.md +97 -0
  335. package/templates/skills/orc-challenge/references/verdict-doc.md +154 -0
  336. package/templates/skills/orc-claude/SKILL.md +199 -0
  337. package/templates/skills/orc-claude/examples/claude-run-mock.md +65 -0
  338. package/templates/skills/orc-claude/references/refresh.md +76 -0
  339. package/templates/skills/orc-claude/references/template.md +109 -0
  340. package/templates/skills/orc-diy/README.md +142 -0
  341. package/templates/skills/orc-diy/SKILL.md +70 -0
  342. package/templates/skills/orc-diy/references/blocks/analyze.md +24 -0
  343. package/templates/skills/orc-diy/references/blocks/execution.md +42 -0
  344. package/templates/skills/orc-diy/references/blocks/extra.md +55 -0
  345. package/templates/skills/orc-diy/references/blocks/header.md +55 -0
  346. package/templates/skills/orc-diy/references/blocks/mock-example.md +22 -0
  347. package/templates/skills/orc-diy/references/blocks/pattern.md +18 -0
  348. package/templates/skills/orc-diy/references/blocks/planning.md +34 -0
  349. package/templates/skills/orc-diy/references/blocks/review.md +18 -0
  350. package/templates/skills/orc-diy/references/blocks/scoring.md +16 -0
  351. package/templates/skills/orc-diy/references/blocks/security.md +25 -0
  352. package/templates/skills/orc-diy/references/blocks/ship.md +25 -0
  353. package/templates/skills/orc-diy/references/blocks/summary.md +18 -0
  354. package/templates/skills/orc-diy/references/blocks/testgen.md +17 -0
  355. package/templates/skills/orc-diy/references/blocks/trace.md +28 -0
  356. package/templates/skills/orc-diy/references/blocks/verify.md +25 -0
  357. package/templates/skills/orc-diy/references/blocks/wiki.md +26 -0
  358. package/templates/skills/orc-diy/references/compile.md +59 -0
  359. package/templates/skills/orc-diy/references/flow-schema.md +100 -0
  360. package/templates/skills/orc-diy/references/locked-blocks.md +37 -0
  361. package/templates/skills/orc-doc/README.md +229 -0
  362. package/templates/skills/orc-doc/SKILL.md +444 -0
  363. package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +325 -0
  364. package/templates/skills/orc-doc/references/chunking.md +527 -0
  365. package/templates/skills/orc-doc/references/gates.md +311 -0
  366. package/templates/skills/orc-doc/references/generation-rules.md +122 -0
  367. package/templates/skills/orc-doc/references/house-rules.md +170 -0
  368. package/templates/skills/orc-doc/references/import-targets.md +40 -0
  369. package/templates/skills/orc-doc/references/plain-language.md +66 -0
  370. package/templates/skills/orc-doc/references/portable-markdown.md +74 -0
  371. package/templates/skills/orc-doc/references/resume-protocol.md +228 -0
  372. package/templates/skills/orc-doc/references/templates/collaboration.md +118 -0
  373. package/templates/skills/orc-doc/references/templates/prd.md +133 -0
  374. package/templates/skills/orc-doc/references/templates/report.md +102 -0
  375. package/templates/skills/orc-doc/references/templates/tsd.md +122 -0
  376. package/templates/skills/orc-doc/references/templates/workflow.md +112 -0
  377. package/templates/skills/orc-explain/SKILL.md +57 -0
  378. package/templates/skills/orc-export/SKILL.md +154 -0
  379. package/templates/skills/orc-fast/SKILL.md +188 -0
  380. package/templates/skills/orc-grill/SKILL.md +207 -0
  381. package/templates/skills/orc-grill/references/grill-doc.md +105 -0
  382. package/templates/skills/orc-handoff/SKILL.md +204 -0
  383. package/templates/skills/orc-handoff/references/handoff-log.md +67 -0
  384. package/templates/skills/orc-handoff/references/surfaces.md +88 -0
  385. package/templates/skills/orc-judge/SKILL.md +82 -0
  386. package/templates/skills/orc-learn/SKILL.md +156 -0
  387. package/templates/skills/orc-learn/examples/learn-run-mock.md +61 -0
  388. package/templates/skills/orc-learn/references/deepen.md +70 -0
  389. package/templates/skills/orc-learn/references/refresh.md +65 -0
  390. package/templates/skills/orc-learn/references/template-knowledge.md +83 -0
  391. package/templates/skills/orc-learn/references/template-learning.md +67 -0
  392. package/templates/skills/orc-mini/SKILL.md +226 -0
  393. package/templates/skills/orc-mini/examples/mini-run-mock.md +50 -0
  394. package/templates/skills/orc-pact/SKILL.md +218 -0
  395. package/templates/skills/orc-pact/references/gate.md +70 -0
  396. package/templates/skills/orc-pact/references/ledger.md +99 -0
  397. package/templates/skills/orc-pattern/SKILL.md +124 -0
  398. package/templates/skills/orc-pattern/references/INDEX.md +73 -0
  399. package/templates/skills/orc-pattern/references/be-django.md +80 -0
  400. package/templates/skills/orc-pattern/references/be-express.md +82 -0
  401. package/templates/skills/orc-pattern/references/be-fastapi.md +107 -0
  402. package/templates/skills/orc-pattern/references/be-go.md +96 -0
  403. package/templates/skills/orc-pattern/references/be-nestjs.md +86 -0
  404. package/templates/skills/orc-pattern/references/be-postgres.md +98 -0
  405. package/templates/skills/orc-pattern/references/fe-a11y.md +36 -0
  406. package/templates/skills/orc-pattern/references/fe-angular.md +87 -0
  407. package/templates/skills/orc-pattern/references/fe-nextjs.md +65 -0
  408. package/templates/skills/orc-pattern/references/fe-perf.md +39 -0
  409. package/templates/skills/orc-pattern/references/fe-react.md +83 -0
  410. package/templates/skills/orc-pattern/references/fe-vue.md +75 -0
  411. package/templates/skills/orc-pattern/schemas/pattern-doc.md +62 -0
  412. package/templates/skills/orc-poly/SKILL.md +216 -0
  413. package/templates/skills/orc-poly/examples/poly-run-mock.md +51 -0
  414. package/templates/skills/orc-poly/references/gather.md +70 -0
  415. package/templates/skills/orc-poly/references/poly-spec.md +84 -0
  416. package/templates/skills/orc-pr-driver/README.md +349 -0
  417. package/templates/skills/orc-pr-driver/SKILL.md +167 -0
  418. package/templates/skills/orc-pr-driver/references/conflict-playbook.md +78 -0
  419. package/templates/skills/orc-pr-driver/references/green-gate.md +105 -0
  420. package/templates/skills/orc-pr-driver/references/orc-run-split.md +99 -0
  421. package/templates/skills/orc-pr-setup/README.md +436 -0
  422. package/templates/skills/orc-pr-setup/SKILL.md +184 -0
  423. package/templates/skills/orc-pr-setup/references/certainty-gate.md +66 -0
  424. package/templates/skills/orc-pr-setup/references/layer-taxonomy.md +67 -0
  425. package/templates/skills/orc-quick/README.md +423 -0
  426. package/templates/skills/orc-quick/SKILL.md +306 -0
  427. package/templates/skills/orc-quick/references/context-doc.md +114 -0
  428. package/templates/skills/orc-quick/references/dispatch-gate.md +163 -0
  429. package/templates/skills/orc-quick/references/gh-mode.md +127 -0
  430. package/templates/skills/orc-retro/SKILL.md +222 -0
  431. package/templates/skills/orc-retro/examples/retro-mock.md +171 -0
  432. package/templates/skills/orc-route/SKILL.md +165 -0
  433. package/templates/skills/orc-verify/SKILL.md +86 -0
  434. package/templates/skills/orc-verify/examples/verify-mock.md +33 -0
  435. package/templates/skills/orc-wiki/README.md +325 -0
  436. package/templates/skills/orc-wiki/SKILL.md +322 -0
  437. package/templates/skills/orc-wiki/examples/wiki-run-mock.md +37 -0
  438. package/templates/skills/orc-wiki/references/claude-md-injection.md +61 -0
  439. package/templates/skills/orc-wiki/references/crosslink-compile.md +39 -0
  440. package/templates/skills/orc-wiki/references/crosslink-kinds.md +57 -0
  441. package/templates/skills/orc-wiki/references/crosslink.md +284 -0
  442. package/templates/skills/orc-wiki/references/extra.md +79 -0
  443. package/templates/skills/orc-wiki/references/integrity-check.md +86 -0
  444. package/templates/skills/orc-wiki/references/orientation.md +51 -0
  445. package/templates/skills/orc-wiki/references/partial-refresh.md +203 -0
  446. package/templates/skills/orc-wiki/references/pattern-prewarm.md +19 -0
  447. package/templates/skills/orc-wiki/references/staleness.md +288 -0
  448. package/templates/skills/orc-wiki/schemas/crosslink-tag.md +166 -0
  449. package/templates/skills/orc-wiki/schemas/wiki-doc.md +120 -0
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ /* panels/flow.js — orc ui client
3
+ The compiled DIY pipeline. The stepper renders `orc diy show --json`'s steps[]
4
+ and NOTHING else — never a phase list derived here.
5
+
6
+ Loaded by app.html in the order its numeric prefix names. Classic
7
+ script, no import/export: an ES module import carries no query string,
8
+ and every static request here needs the per-launch session token. */
9
+
10
+ /* ==================================================================== FLOW == */
11
+
12
+ PANELS.flow = function (host) {
13
+ head(host, t("flow.title"), t("flow.sub"));
14
+ const body = el("div", "stack");
15
+ host.append(body);
16
+ renderFlow(body);
17
+ };
18
+
19
+ async function renderFlow(body) {
20
+ body.replaceChildren(skeleton(6));
21
+ const d = (await read("/api/diy")).data;
22
+ const out = frag();
23
+
24
+ const compile = el("button", "btn btn-sm btn-primary", t("flow.compile"));
25
+ compile.type = "button";
26
+ compile.addEventListener("click", async () => {
27
+ const r = await post("/api/diy/compile", {});
28
+ toast(r.command, r.ok ? "ok" : "bad", r.output);
29
+ renderFlow(body);
30
+ });
31
+
32
+ // The Overview's "worth doing" row for a STALE flow deep-links to this panel,
33
+ // so the recompile button is the first thing on it. `#diy-gate` is the anchor.
34
+ const gate = card(t("flow.gate"), d.configured ? compile : null);
35
+ gate.id = "diy-gate";
36
+ const chipRow = el("div", "row-actions");
37
+ chipRow.append(chip(d.state, d.state === "READY" ? "ok" : d.state === "STALE" ? "warn" : ""));
38
+ gate.append(chipRow);
39
+ gate.append(el("div", "note", d.reason));
40
+ for (const trigger of d.triggers || []) gate.append(el("div", "note", "• " + trigger));
41
+ if (!d.configured) gate.append(el("div", "note", t("flow.bootstrap")));
42
+ out.append(gate);
43
+
44
+ // Directly below the gate, configured or not: the flow's SHAPE is the first
45
+ // decision, and picking a shipped starting point is how the terminal composer
46
+ // opens. It was the one DIY question the panel could not answer.
47
+ out.append(presetCard(d, body));
48
+
49
+ if (d.configured) {
50
+ out.append(stepperCard(d));
51
+
52
+ for (const e of d.errors || []) out.append(bannerLine(e, true));
53
+ for (const w of d.warnings || []) out.append(bannerLine(w, false));
54
+
55
+ const keys = card(t("flow.keys"));
56
+ keys.id = "flow-keys";
57
+ keys.append(el("div", "note", t("flow.keysNote")));
58
+
59
+ // Batched, exactly like Settings (v0.44.1). Recompiling is already a second
60
+ // step after a key change, so writing each key the instant you touch it
61
+ // bought nothing and cost a full re-render per key.
62
+ let bar = null;
63
+ const edits = editSet(() => {
64
+ if (bar) bar.paint();
65
+ for (const row of keys.querySelectorAll(".setting[data-key]")) {
66
+ row.classList.toggle("staged", edits.map.has(row.dataset.key));
67
+ }
68
+ });
69
+
70
+ for (const k of d.keys) {
71
+ const row = el("div", "setting");
72
+ row.dataset.key = k.key; // the stepper jumps here when you click a phase
73
+ const left = el("div");
74
+ const name = el("div", "setting-name");
75
+ name.append(document.createTextNode(k.key));
76
+ if (k.is_set) name.append(el("span", "dot"));
77
+ left.append(name, el("div", "setting-desc", k.desc || ""));
78
+ const right = el("div", "setting-control");
79
+ const current = String(k.value === "" ? "" : k.value);
80
+ const stage = (value) => edits.set(k.key, String(value), current);
81
+
82
+ // A flow key is a CLOSED SET, so it gets a dropdown carrying every legal
83
+ // value — `orc diy set` would reject anything else anyway, and a text box
84
+ // that only ever accepts a handful of words is a memory test with a
85
+ // rejection at the end of it. The list is the CLI's `options`; the panel
86
+ // holds no copy of what a key accepts.
87
+ if (k.options && k.options.length) {
88
+ const sel = el("select", "select-input");
89
+ // A value outside its own option list still has to be SHOWN — an unset
90
+ // fixed_executor is exactly that. It leads, and it is disabled, so the
91
+ // dropdown reports the state without offering it back as a choice the
92
+ // validator would refuse.
93
+ if (!k.options.some((o) => String(o) === current)) {
94
+ const ph = el("option", null, current === "" ? t("flow.unset") : current);
95
+ ph.value = current;
96
+ ph.disabled = true;
97
+ sel.append(ph);
98
+ }
99
+ for (const opt of k.options) {
100
+ const o = el("option", null, String(opt));
101
+ o.value = String(opt);
102
+ sel.append(o);
103
+ }
104
+ sel.value = current;
105
+ sel.addEventListener("change", () => stage(sel.value));
106
+ right.append(sel);
107
+ } else {
108
+ // Free text (flow_name is a slug) — validation is the CLI's exit code.
109
+ const input = el("input", "text-input");
110
+ input.value = current;
111
+ input.addEventListener("input", () => stage(input.value));
112
+ right.append(input);
113
+ }
114
+ row.append(left, right);
115
+ keys.append(row);
116
+ }
117
+
118
+ // The bar is the LAST thing in the keys card, which is where the user asked
119
+ // for it. Reset here is `orc diy init --force`: the CLI has no "put every
120
+ // key back to its default" for a flow — `orc diy reset` DELETES the config
121
+ // and unconfigures the lane, which is a different, larger thing.
122
+ bar = editBar(edits, {
123
+ resetLabel: t("edits.resetFlow"),
124
+ onApply: async (btn) => {
125
+ await applyEdits(edits, { set: "/api/diy/set" }, btn);
126
+ renderFlow(body);
127
+ },
128
+ onReset: () => confirmPreset(d.presets.find((p) => !p.name) || { name: "", changes: {} }, d, body),
129
+ onCancel: () => renderFlow(body),
130
+ });
131
+ keys.append(bar);
132
+ out.append(keys);
133
+
134
+ if (d.score_table) {
135
+ const st = card(t("flow.table"));
136
+ st.append(el("div", "note", t("flow.tableNote")));
137
+ const sc = el("div", "scroll-x");
138
+ sc.append(el("pre", "block", d.score_table));
139
+ st.append(sc);
140
+ out.append(st);
141
+ }
142
+ const paths = card(t("flow.files"));
143
+ // config / compiled / lock are the artifact names in the DIY contract.
144
+ paths.append(kvList([["config", d.paths.config], ["compiled", d.paths.compiled], ["lock", d.paths.lock]]));
145
+ out.append(paths);
146
+ }
147
+
148
+ body.replaceChildren(out);
149
+ }
150
+
151
+ function bannerLine(text, bad) {
152
+ const b = el("div", "banner" + (bad ? " banner-bad" : ""));
153
+ b.append(el("div", null, text));
154
+ return b;
155
+ }
156
+
157
+ // THE PRESETS (v0.44.0). `orc diy` opens by asking which shape to start from —
158
+ // full-lane defaults or one of the shipped presets — and that question had no
159
+ // answer in this panel at all: a flow could be tuned key by key here, but never
160
+ // STARTED from a known-good shape.
161
+ //
162
+ // It is a REPLACEMENT, not a merge: `orc diy init --force` rewrites the config
163
+ // file, which is what the terminal does too. So every row names the keys the
164
+ // preset actually changes, the exact command is on the row before you click it,
165
+ // and applying it goes through a confirmation that says what is lost.
166
+ //
167
+ // A row you are ALREADY ON says so and drops its button (v0.44.1). The match is
168
+ // the CLI's — `presets[].active` — and it deliberately ignores `flow_name`, so
169
+ // renaming `solo-fast` to `solo` does not make the panel forget which shape the
170
+ // flow came from. Offering "use this" for the thing already in use is a button
171
+ // whose only possible effect is to overwrite your config with itself.
172
+ function presetCard(d, body) {
173
+ const c = card(t("flow.presets"));
174
+ c.id = "diy-presets";
175
+ c.append(el("div", "note", d.configured ? t("flow.presetsNoteConfigured") : t("flow.presetsNote")));
176
+
177
+ for (const p of d.presets || []) {
178
+ const row = el("div", "preset-row" + (p.active ? " preset-active" : ""));
179
+ const left = el("div");
180
+ const head = el("div", "preset-head");
181
+ // Preset names and their key=value diffs are CLI data — never translated.
182
+ head.append(el("div", "setting-name", p.name || t("flow.presetDefaults")));
183
+ if (p.active) head.append(chip(t("flow.presetInUse"), "ok"));
184
+ left.append(head);
185
+ const changed = Object.entries(p.changes || {});
186
+ left.append(
187
+ el("div", "setting-desc", changed.length ? changed.map(([k, v]) => `${k}=${v}`).join(" · ") : t("flow.presetDefaultsDesc"))
188
+ );
189
+ left.append(el("div", "action-cmd", presetCommand(p)));
190
+ // The match ignores flow_name, so say so on the row that matched — a chip
191
+ // reading "in use" beside a flow called something else is otherwise just
192
+ // confusing.
193
+ if (p.active) left.append(el("div", "note", t("flow.presetInUseNote")));
194
+ row.append(left);
195
+
196
+ if (!p.active) {
197
+ const use = el("button", "btn btn-sm", t("flow.presetUse"));
198
+ use.type = "button";
199
+ use.addEventListener("click", () => confirmPreset(p, d, body));
200
+ row.append(use);
201
+ }
202
+ c.append(row);
203
+ }
204
+ return c;
205
+ }
206
+
207
+ const presetCommand = (p) => "orc diy init --force" + (p.name ? " --preset " + p.name : "");
208
+
209
+ function confirmPreset(p, d, body) {
210
+ const b = el("div", "stack stack-sm");
211
+ b.append(el("div", null, p.name ? t("flow.presetConfirm", { name: p.name }) : t("flow.presetConfirmDefaults")));
212
+ b.append(el("div", "action-cmd", presetCommand(p)));
213
+ if (p.changes && Object.keys(p.changes).length) {
214
+ b.append(kvList(Object.entries(p.changes).map(([k, v]) => [k, String(v)])));
215
+ }
216
+ // Overwriting a flow you tuned by hand is the only way this can hurt, so it
217
+ // is said plainly rather than implied by the word "force" in the command.
218
+ if (d.configured) b.append(bannerLine(t("flow.presetOverwrite"), true));
219
+
220
+ modal({
221
+ title: t("flow.presetTitle"),
222
+ body: b,
223
+ actions: [
224
+ { label: t("common.cancel"), onClick: (c) => c() },
225
+ {
226
+ label: t("flow.presetApply"),
227
+ cls: d.configured ? "btn-danger" : "btn-primary",
228
+ onClick: async (close) => {
229
+ close();
230
+ const r = await post("/api/diy/preset", { name: p.name });
231
+ toast(r.command, r.ok ? "ok" : "bad", r.output);
232
+ renderFlow(body);
233
+ },
234
+ },
235
+ ],
236
+ });
237
+ }
238
+
239
+ // THE FLOW STEPPER (v0.43.7). A compiled DIY flow is a pipeline, and a column
240
+ // of key/value rows is the one shape that never shows you a pipeline. Every
241
+ // step here comes from `orc diy show --json`'s `steps[]`, which the CLI derives
242
+ // from the SAME array `orc diy compile` stitches with — the panel draws the
243
+ // order, it never decides it.
244
+ //
245
+ // A phase you switched OFF keeps its slot and turns RED. Removing it would make
246
+ // "I turned review off" and "this flow has no review phase" look identical, and
247
+ // it would make the rail change width every time you flip a key.
248
+ //
249
+ // The sweep LOOPS (v0.44.0). It was one-shot on the reasoning that motion above
250
+ // a form is a distraction; in use the opposite complaint arrived — the one thing
251
+ // on the panel that says "these run in this order" said it once, before you had
252
+ // finished reading the card, and there was no way to see it again short of a
253
+ // recompile. The loop is a long, mostly-idle cycle: a single pulse travels the
254
+ // rail and the rail is at rest for the rest of it, so it reads as a heartbeat
255
+ // rather than a flashing sign. `prefers-reduced-motion` removes it entirely.
256
+ function stepperCard(d) {
257
+ const on = d.steps.filter((s) => s.on).length;
258
+ const c = card(t("flow.pipeline"), chip(t("flow.pipelinePhases", { on, total: d.steps.length }), "info"));
259
+ c.append(el("div", "note", t("flow.pipelineNote")));
260
+
261
+ const scroll = el("div", "scroll-x");
262
+ const rail = el("div", "stepper");
263
+ d.steps.forEach((s, i) => {
264
+ if (i) {
265
+ const link = el("div", "step-link");
266
+ link.append(el("span", "step-flow"));
267
+ link.style.setProperty("--d", i * 90 + "ms");
268
+ rail.append(link);
269
+ }
270
+ // A step is a button only when there is a key to jump to; a keyless phase
271
+ // (intake, trace, execute) has nothing to edit, so it is not offered as one.
272
+ const step = el(s.key ? "button" : "div", "step" + (s.on ? "" : " step-off"));
273
+ if (s.key) {
274
+ step.type = "button";
275
+ step.title = t("flow.stepJump", { key: s.key });
276
+ step.addEventListener("click", () => jumpToKey(s.key));
277
+ }
278
+ step.style.setProperty("--d", i * 90 + "ms");
279
+ // label / value / key come from the CLI — never translated.
280
+ step.append(el("span", "step-name", s.label));
281
+ step.append(el("span", "step-note", s.on ? s.note || "on" : "off"));
282
+ rail.append(step);
283
+ });
284
+ scroll.append(rail);
285
+ c.append(scroll);
286
+ return c;
287
+ }
288
+
289
+ function jumpToKey(key) {
290
+ const row = document.querySelector('#flow-keys .setting[data-key="' + key + '"]');
291
+ if (!row) return;
292
+ row.scrollIntoView({ behavior: "smooth", block: "center" });
293
+ row.classList.remove("linked-hi");
294
+ void row.offsetWidth; // restart the highlight when the same step is clicked twice
295
+ row.classList.add("linked-hi");
296
+ setTimeout(() => row.classList.remove("linked-hi"), 1600);
297
+ }
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ /* panels/handoff.js — orc ui client
3
+ The lane for somebody who does not read code. A RED surface gets NO BUTTON AT
4
+ ALL — not a disabled one.
5
+
6
+ Loaded by app.html in the order its numeric prefix names. Classic
7
+ script, no import/export: an ES module import carries no query string,
8
+ and every static request here needs the per-launch session token. */
9
+
10
+ /* ----------------------------------------------------------------- SELF-SERVE
11
+ This panel changes what `orc ui` IS: until now a config tool for a developer,
12
+ now also a tool for somebody who does not read code, will never open a
13
+ terminal, and may not read English first. It inherits EVERY Maintenance rule
14
+ with no exceptions, and adds one of its own: a RED surface gets NO BUTTON AT
15
+ ALL — not a disabled one. A disabled button invites a support question; a
16
+ reason and a person to ask answers it. */
17
+
18
+ const GRADE_DOT = { green: "🟢", amber: "🟡", red: "🔴" };
19
+ const GRADE_KIND = { green: "ok", amber: "warn", red: "bad" };
20
+ // Same rule as COST_UNIT_KEY_OF: full keys, never `"handoff.grade." + g`.
21
+ const GRADE_LABEL_KEY = { green: "handoff.grade.green", amber: "handoff.grade.amber", red: "handoff.grade.red" };
22
+
23
+ PANELS.handoff = function (host) {
24
+ head(host, t("handoff.title"), t("handoff.sub"));
25
+ const body = el("div", "stack");
26
+ host.append(body);
27
+ renderHandoff(body);
28
+ };
29
+
30
+ async function renderHandoff(body) {
31
+ body.replaceChildren(skeleton(5));
32
+ const res = await read("/api/handoff").catch(() => ({ data: null }));
33
+ const d = res.data;
34
+ const out = frag();
35
+
36
+ if (!d || !d.surfaces || !d.surfaces.length) {
37
+ const c = card(t("handoff.title"));
38
+ c.append(empty(t("handoff.none"), t("handoff.noneHint")));
39
+ c.append(laneCommand("/orc-handoff", t("handoff.cmdMapWhy")));
40
+ out.append(c);
41
+ body.replaceChildren(out);
42
+ return;
43
+ }
44
+
45
+ const sum = card(t("handoff.summary"));
46
+ const chips = el("div", "row-actions");
47
+ for (const g of ["green", "amber", "red"])
48
+ chips.append(chip(`${GRADE_DOT[g]} ${(d.counts || {})[g] || 0}`, GRADE_KIND[g]));
49
+ sum.append(chips);
50
+ sum.append(el("div", "note", t("handoff.gradeExplain")));
51
+ if (!d.write_enabled) sum.append(el("div", "note warn", t("handoff.writesOff")));
52
+ out.append(sum);
53
+
54
+ for (const s of d.surfaces) {
55
+ const c = card(null);
56
+ const headRow = el("div", "row-actions");
57
+ headRow.append(chip(`${GRADE_DOT[s.grade]} ${t(GRADE_LABEL_KEY[s.grade])}`, GRADE_KIND[s.grade]));
58
+ headRow.append(el("span", "mono", s.file));
59
+ if (!s.exists) headRow.append(chip(t("handoff.missing"), "bad"));
60
+ c.append(headRow);
61
+ c.append(el("div", "promise", s.what));
62
+
63
+ if (s.grade === "red") {
64
+ // NO BUTTON AT ALL. Not a disabled one.
65
+ c.append(el("div", "note bad", t("handoff.redWhy", { why: s.reason || "" })));
66
+ if (s.ask) c.append(el("div", "note", t("handoff.redAsk", { who: s.ask })));
67
+ } else {
68
+ c.append(
69
+ kvList([
70
+ [t("handoff.field.check"), s.check || t("handoff.field.checkManual")],
71
+ [t("handoff.field.undo"), s.revert],
72
+ ])
73
+ );
74
+ if (s.grade === "amber") c.append(el("div", "note warn", t("handoff.amberNote")));
75
+ if (d.write_enabled && s.exists) {
76
+ const act = el("div", "row-actions");
77
+ const b = el("button", "btn btn-sm", t("handoff.change"));
78
+ b.type = "button";
79
+ b.addEventListener("click", () => editSurface(s, body));
80
+ act.append(b);
81
+ c.append(act);
82
+ }
83
+ }
84
+ out.append(c);
85
+ }
86
+ out.append(laneCommand("/orc-handoff", t("handoff.cmdDoWhy")));
87
+ body.replaceChildren(out);
88
+ }
89
+
90
+ // Preview then apply, the undo command BEFORE the write, one mutation at a time,
91
+ // the exact command always visible. Every one of these is a Maintenance rule this
92
+ // panel inherits rather than re-decides.
93
+ function editSurface(s, body) {
94
+ const b = frag();
95
+ b.append(el("p", null, t("handoff.editIntro", { file: s.file })));
96
+
97
+ const keyIn = el("input", "input");
98
+ keyIn.type = "text";
99
+ keyIn.placeholder = t("handoff.keyPlaceholder");
100
+ const valIn = el("input", "input");
101
+ valIn.type = "text";
102
+ valIn.placeholder = t("handoff.valuePlaceholder");
103
+ const form = el("div", "form");
104
+ form.append(el("label", null, t("handoff.keyLabel")), keyIn);
105
+ form.append(el("label", null, t("handoff.valueLabel")), valIn);
106
+ b.append(form);
107
+ b.append(el("div", "note", t("handoff.noNewKeys")));
108
+
109
+ // The undo command, BEFORE the write. This is the whole consent step.
110
+ const undo = el("div", "undo-box");
111
+ undo.append(el("div", "undo-head", t("handoff.undoFirst")));
112
+ undo.append(el("pre", "cmd", s.revert));
113
+ b.append(undo);
114
+
115
+ const cmdBox = el("pre", "cmd", `orc handoff set ${s.id} <key> <value>`);
116
+ b.append(el("div", "note", t("handoff.willRun")));
117
+ b.append(cmdBox);
118
+ const sync = () => {
119
+ cmdBox.textContent = `orc handoff set ${s.id} ${keyIn.value || "<key>"} ${valIn.value || "<value>"}`;
120
+ };
121
+ keyIn.addEventListener("input", sync);
122
+ valIn.addEventListener("input", sync);
123
+ if (s.check) b.append(el("div", "note", t("handoff.thenCheck", { check: s.check })));
124
+
125
+ modal({
126
+ title: t("handoff.editTitle", { file: s.file }),
127
+ body: b,
128
+ actions: {
129
+ [t("common.cancel")]: null,
130
+ [t("handoff.applyChange")]: async () => {
131
+ if (!keyIn.value || !valIn.value) return toast(t("handoff.needBoth"), "bad");
132
+ const r = await post("/api/handoff/set", { id: s.id, key: keyIn.value, value: valIn.value });
133
+ // AMBER applies, then shows the manual check as a TASK — never a pass.
134
+ if (r.ok && s.grade === "amber") toast(t("handoff.amberApplied"), "warn", s.check || "");
135
+ else toast(r.ok ? t("handoff.applied") : t("handoff.failed"), r.ok ? "ok" : "bad", r.output);
136
+ renderHandoff(body);
137
+ },
138
+ },
139
+ });
140
+ }
141
+
142
+ /* ================================================================ CHALLENGE = */
143
+ /*
144
+ THE PANEL DERIVES NOTHING. Not the state word, not the iteration order, not
145
+ the pass decision, not the convergence numbers, not the expected revision
146
+ path. It draws `orc challenge … --json`. (The Flow-stepper rule: a second
147
+ idea of the pipeline is exactly the drift this panel exists to make
148
+ impossible.)
149
+
150
+ THE FREE/PAID LINE, made visible rather than hidden: `lint`, `accept`,
151
+ `rebut`, `report` and copying a prompt are deterministic and cost no model
152
+ tokens, so each is a real BUTTON. Running an ITERATION costs model tokens, so
153
+ it is a copy-able command and there is no route for it at all.
154
+ */
155
+
156
+ const CH_STATE_KIND = {
157
+ "AWAITING-JUDGE": "info",
158
+ "AWAITING-FIX": "warn",
159
+ "AWAITING-RECHECK": "info",
160
+ PASSED: "ok",
161
+ "STALE-PASS": "warn",
162
+ "MISSING-REVISION": "warn",
163
+ TAMPERED: "bad",
164
+ };
165
+ // The ONE actionable state gets the ONE attention-seeking animation, and
166
+ // nothing else does.
167
+ const CH_PULSE = "AWAITING-RECHECK";
168
+ const CH_SEV_KIND = { P0: "bad", P1: "warn", P2: "info", P3: "" };
169
+ const CH_DIM_KIND = { CHECKED: "ok", "NOT-CHECKED": "warn", "NOT-SELECTED": "" };