@khoavu882/doflow 2.0.0-beta.5 → 2.0.1

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 (494) hide show
  1. package/README.md +16 -16
  2. package/bin/doflow.js +22 -12
  3. package/core/.antigravity-plugin/plugin.json +1 -2
  4. package/core/.claude-plugin/plugin.json +1 -1
  5. package/core/.codex-plugin/plugin.json +1 -1
  6. package/core/.plugin/plugin.json +1 -1
  7. package/core/harnesses/claude/hooks/lib.sh +43 -24
  8. package/core/harnesses/claude/hooks/mcp-tool-guard.sh +4 -1
  9. package/core/harnesses/claude/hooks/permission-audit.sh +3 -0
  10. package/core/harnesses/claude/hooks/post-compact.sh +35 -32
  11. package/core/harnesses/claude/hooks/post-edit-lint.sh +2 -0
  12. package/core/harnesses/claude/hooks/post-shell-observe.sh +48 -0
  13. package/core/harnesses/claude/hooks/post-tool-failure.sh +3 -0
  14. package/core/harnesses/claude/hooks/pre-compact.sh +23 -27
  15. package/core/harnesses/claude/hooks/pre-implement-gate.sh +4 -1
  16. package/core/harnesses/claude/hooks/session-end.sh +23 -10
  17. package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
  18. package/core/harnesses/claude/settings/settings.json +26 -9
  19. package/core/harnesses/claude/statusline/doflow-statusline.sh +1 -0
  20. package/core/harnesses/codex/agents/core-implementer.toml +1 -0
  21. package/core/harnesses/codex/agents/delivery-lead.toml +10 -0
  22. package/core/harnesses/codex/agents/quality-guardian.toml +1 -1
  23. package/core/harnesses/codex/agents/research-writer.toml +1 -1
  24. package/core/harnesses/codex/agents/reviewer.toml +10 -0
  25. package/core/harnesses/codex/agents/spec-analyst.toml +1 -1
  26. package/core/harnesses/codex/agents/system-architect.toml +1 -1
  27. package/core/harnesses/codex/hooks/hooks.json +0 -10
  28. package/core/harnesses/codex/hooks/lib.sh +44 -25
  29. package/core/harnesses/codex/hooks/mcp-tool-guard.sh +4 -1
  30. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +3 -1
  31. package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
  32. package/core/harnesses/codex/hooks/pre-implement-gate.sh +4 -1
  33. package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
  34. package/core/harnesses/codex/hooks/subagent-audit.sh +1 -0
  35. package/core/harnesses/copilot/hooks/doflow-lib.sh +94 -0
  36. package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
  37. package/core/harnesses/copilot/hooks/doflow-pre-implement-gate.sh +9 -0
  38. package/core/harnesses/copilot/hooks/doflow-session-start.sh +9 -0
  39. package/core/harnesses/copilot/hooks/doflow-stop-check.sh +9 -0
  40. package/core/harnesses/copilot/hooks/doflow-subagent-start.sh +9 -0
  41. package/core/harnesses/copilot/hooks/doflow-subagent-stop.sh +9 -0
  42. package/core/harnesses/copilot/hooks/doflow.json +51 -0
  43. package/core/harnesses/kiro/agents/doflow.json +1 -11
  44. package/core/harnesses/kiro/hooks/doflow.json +0 -10
  45. package/core/harnesses/kiro/hooks/lib.sh +26 -6
  46. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +8 -3
  47. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +8 -3
  48. package/core/harnesses/kiro/hooks/session-start.sh +1 -0
  49. package/core/harnesses/kiro/hooks/stop-check.sh +1 -0
  50. package/core/harnesses/pi/extensions/doflow-guard.js +11 -2
  51. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +1 -2
  52. package/core/harnesses/shared/hooks/adapters/antigravity.js +1 -1
  53. package/core/harnesses/shared/hooks/bridge/bridge.sh +126 -23
  54. package/core/harnesses/shared/hooks/bridge/envelope.jq +87 -18
  55. package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
  56. package/core/harnesses/shared/hooks/bridge/respond.sh +16 -2
  57. package/core/harnesses/shared/hooks/policies/capture-failure.sh +49 -16
  58. package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
  59. package/core/harnesses/shared/hooks/policies/contract.sh +3 -0
  60. package/core/harnesses/shared/hooks/policies/deny-json.sh +20 -7
  61. package/core/harnesses/shared/hooks/policies/emission-rules.sh +37 -0
  62. package/core/harnesses/shared/hooks/policies/emission.jq +209 -0
  63. package/core/harnesses/shared/hooks/policies/emission.sh +383 -0
  64. package/core/harnesses/shared/hooks/policies/identity.sh +177 -0
  65. package/core/harnesses/shared/hooks/policies/lib.sh +63 -40
  66. package/core/harnesses/shared/hooks/policies/mcp-policy.conf +1 -1
  67. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +7 -8
  68. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +132 -57
  69. package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
  70. package/core/harnesses/shared/hooks/policies/stop-check.sh +27 -15
  71. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +6 -3
  72. package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
  73. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +60 -155
  74. package/core/harnesses/shared/hooks/stream-hook-runner.js +58 -20
  75. package/core/harnesses/shared/locator/doflow-run +2 -3
  76. package/core/registry/advice.json +3 -3
  77. package/core/registry/assets.json +55 -82
  78. package/core/registry/capabilities.json +12 -0
  79. package/core/registry/contracts.json +58 -31
  80. package/core/registry/contribution-points.json +35 -0
  81. package/core/registry/gates.json +32 -0
  82. package/core/registry/guidance-caps.json +40 -0
  83. package/core/registry/harnesses.json +1445 -366
  84. package/core/registry/intake.json +53 -0
  85. package/core/registry/lifecycle.json +599 -996
  86. package/core/registry/mcp.json +5 -1
  87. package/core/registry/models.json +7 -1
  88. package/core/registry/package-templates/README.md +19 -0
  89. package/core/registry/package-templates/agent/files/agent.md +9 -0
  90. package/core/registry/package-templates/agent/template.json +4 -0
  91. package/core/registry/package-templates/capability-provider/files/provider.json +9 -0
  92. package/core/registry/package-templates/capability-provider/template.json +11 -0
  93. package/core/registry/package-templates/debate-preset/files/preset.json +26 -0
  94. package/core/registry/package-templates/debate-preset/template.json +4 -0
  95. package/core/registry/package-templates/intake-category/files/category.json +8 -0
  96. package/core/registry/package-templates/intake-category/template.json +4 -0
  97. package/core/registry/package-templates/review-preset/files/preset.json +30 -0
  98. package/core/registry/package-templates/review-preset/template.json +4 -0
  99. package/core/registry/package-templates/skill/files/SKILL.md +8 -0
  100. package/core/registry/package-templates/skill/template.json +4 -0
  101. package/core/registry/package-templates/worker/files/worker.json +92 -0
  102. package/core/registry/package-templates/worker/template.json +11 -0
  103. package/core/registry/packages/doflow/doflow-package.json +15 -0
  104. package/core/registry/packages/doflow/presets/debate-3.json +26 -0
  105. package/core/registry/protocols.json +61 -0
  106. package/core/registry/routes.json +17 -0
  107. package/core/registry/rules.json +431 -0
  108. package/core/registry/settings.json +272 -0
  109. package/core/registry/storage.json +687 -31
  110. package/core/registry/telemetry.json +236 -0
  111. package/core/registry/transcripts.json +142 -0
  112. package/core/registry/verification.json +76 -6
  113. package/core/registry/workflows.json +55 -0
  114. package/core/shared/agent-specs/core-implementer.md +3 -0
  115. package/core/shared/agent-specs/delivery-lead.md +68 -0
  116. package/core/shared/agent-specs/quality-guardian.md +5 -1
  117. package/core/shared/agent-specs/research-writer.md +10 -3
  118. package/core/shared/agent-specs/reviewer.md +53 -0
  119. package/core/shared/agent-specs/spec-analyst.md +5 -6
  120. package/core/shared/agent-specs/system-architect.md +5 -1
  121. package/core/shared/guidance/DOFLOW_CORE.md +1 -5
  122. package/core/shared/guidance/modes/MODE_DeepResearch.md +1 -1
  123. package/core/shared/guidance/modes/MODE_Orchestration.md +4 -3
  124. package/core/shared/guidance/modes/MODE_Task_Management.md +14 -14
  125. package/core/shared/guidance/pointers/codex.md +1 -4
  126. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +30 -16
  127. package/core/shared/guidance/references/ARTIFACT_VOICE.md +3 -2
  128. package/core/shared/guidance/references/CONSTITUTION_BASE.md +17 -15
  129. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +1 -1
  130. package/core/shared/guidance/references/DOFLOW_CHAIN.md +17 -19
  131. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +7 -8
  132. package/core/shared/guidance/references/MODEL_SELECTION.md +5 -3
  133. package/core/shared/guidance/references/ORCHESTRATION.md +3 -2
  134. package/core/shared/guidance/references/WORKFLOW_HANDOFF.md +19 -1
  135. package/core/shared/guidance/rules/RULES.md +45 -0
  136. package/core/shared/scripts/doflow/bash/do-args.sh +37 -0
  137. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +4 -0
  138. package/core/shared/scripts/doflow/bash/do-git-state.sh +15 -4
  139. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +4 -0
  140. package/core/shared/scripts/doflow/bash/do-paths.sh +40 -2
  141. package/core/shared/scripts/doflow/bash/do-prereqs.sh +2 -1
  142. package/core/shared/scripts/doflow/bash/do-review-package.sh +4 -0
  143. package/core/shared/scripts/doflow/bash/do-task-brief.sh +58 -16
  144. package/core/shared/scripts/doflow/bash/render-audit.sh +26 -2
  145. package/core/shared/scripts/doflow/bash/render-diagrams.sh +1 -0
  146. package/core/shared/scripts/doflow/bash/render-puml.sh +2 -1
  147. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +49 -5
  148. package/core/shared/scripts/doflow/bin/doflow-run +152 -34
  149. package/core/shared/skills/do/SKILL.md +14 -12
  150. package/core/shared/skills/do/references/advice_calls.md +26 -0
  151. package/core/shared/skills/do/references/pm_routing.md +1 -2
  152. package/core/shared/skills/do/references/program_mode.md +31 -0
  153. package/core/shared/skills/do-brainstorm/SKILL.md +45 -97
  154. package/core/shared/skills/do-brainstorm/references/handoff_branches.md +36 -0
  155. package/core/shared/skills/do-brainstorm/references/intent_seed.md +21 -0
  156. package/core/shared/skills/do-brainstorm/references/round_log.md +17 -0
  157. package/core/shared/skills/do-code-review/SKILL.md +48 -148
  158. package/core/shared/skills/do-code-review/content-types/markdown.md +24 -2
  159. package/core/shared/skills/do-code-review/references/tools.md +90 -0
  160. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +549 -7
  161. package/core/shared/skills/do-design/SKILL.md +23 -20
  162. package/core/shared/skills/do-diagnose/SKILL.md +18 -6
  163. package/core/shared/skills/do-document/SKILL.md +12 -1
  164. package/core/shared/skills/do-document/references/deep_research.md +1 -2
  165. package/core/shared/skills/do-document/references/embedded-research.md +19 -7
  166. package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
  167. package/core/shared/skills/do-execute-plan/SKILL.md +19 -60
  168. package/core/shared/skills/do-execute-plan/references/handoff_record.md +7 -2
  169. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +13 -0
  170. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +26 -1
  171. package/core/shared/skills/do-execute-plan/references/run_position.md +16 -2
  172. package/core/shared/skills/do-execute-plan/references/scaffold.md +17 -9
  173. package/core/shared/skills/do-execute-plan/references/state_checkpoint.md +11 -0
  174. package/core/shared/skills/do-execute-plan/references/task_attempts.md +78 -24
  175. package/core/shared/skills/do-flow/SKILL.md +10 -11
  176. package/core/shared/skills/do-flow/references/task_classes.md +5 -5
  177. package/core/shared/skills/do-git/SKILL.md +4 -0
  178. package/core/shared/skills/do-implement/SKILL.md +13 -14
  179. package/core/shared/skills/do-plan/SKILL.md +34 -20
  180. package/core/shared/skills/do-test/SKILL.md +7 -4
  181. package/core/shared/templates/doflow/constitution-template.md +9 -3
  182. package/core/shared/templates/doflow/data-model-template.md +1 -1
  183. package/core/shared/templates/doflow/design-template.md +113 -16
  184. package/core/shared/templates/doflow/plan-template.md +11 -10
  185. package/core/shared/templates/doflow/question-log-template.md +14 -2
  186. package/core/shared/templates/doflow/requirement-template.md +1 -1
  187. package/core/shared/workflows/do-flow-chain.md +2 -0
  188. package/core/worker-evidence/antigravity/checks.json +14 -0
  189. package/core/worker-evidence/codex/2026-10-18-cli-check.json +107 -0
  190. package/core/worker-evidence/codex/2026-10-18-live-run-edit.json +73 -0
  191. package/core/worker-evidence/codex/2026-10-18-live-run-read-only.json +62 -0
  192. package/core/worker-evidence/codex/2026-10-24-cli-check.json +126 -0
  193. package/core/worker-evidence/codex/checks.json +38 -0
  194. package/package.json +10 -6
  195. package/src/adapters/antigravity/index.js +143 -66
  196. package/src/adapters/claude/index.js +46 -5
  197. package/src/adapters/codex/agents.js +25 -15
  198. package/src/adapters/codex/hooks.js +39 -3
  199. package/src/adapters/codex/index.js +61 -13
  200. package/src/adapters/codex/native-projection.js +6 -2
  201. package/src/adapters/copilot/index.js +58 -23
  202. package/src/adapters/copy-tree.js +291 -46
  203. package/src/adapters/guidance-manifest.js +71 -0
  204. package/src/adapters/guidance-pointer.js +19 -0
  205. package/src/adapters/hook-commands.js +6 -10
  206. package/src/adapters/index.js +1 -0
  207. package/src/adapters/kiro/index.js +23 -12
  208. package/src/adapters/opencode/index.js +8 -8
  209. package/src/adapters/pi/hooks.js +2 -1
  210. package/src/adapters/pi/index.js +14 -7
  211. package/src/adapters/resolve-source.js +26 -2
  212. package/src/cli/commands/install.js +2 -1
  213. package/src/cli/commands/reconcile.js +53 -9
  214. package/src/cli/commands/remove.js +2 -2
  215. package/src/cli/commands/rollback.js +6 -3
  216. package/src/cli/commands/self-update.js +18 -9
  217. package/src/cli/commands/status.js +22 -3
  218. package/src/cli/commands/ui.js +99 -0
  219. package/src/cli/commands/update.js +2 -1
  220. package/src/cli/index.js +337 -32
  221. package/src/cli/runtime-commands.js +220 -60
  222. package/src/cli/shared.js +0 -2
  223. package/src/helper/git.js +1 -1
  224. package/src/helper/guardrails.js +1 -1
  225. package/src/helper/marker-merge.js +31 -13
  226. package/src/helper/package-ids.js +37 -0
  227. package/src/helper/semver.js +94 -0
  228. package/src/install/backup.js +105 -15
  229. package/src/install/context.js +1 -1
  230. package/src/install/targets.js +31 -16
  231. package/src/lifecycle/coverage.js +4 -16
  232. package/src/lifecycle/hook-tier.js +160 -0
  233. package/src/lifecycle/index.js +412 -78
  234. package/src/lifecycle/retired-harnesses.js +318 -0
  235. package/src/lifecycle/view.js +35 -15
  236. package/src/registry/index.js +551 -26
  237. package/src/registry/worker-ids.js +45 -0
  238. package/src/release/build-package.js +0 -3
  239. package/src/release/docs-blocks.js +472 -0
  240. package/src/release/preflight.js +425 -0
  241. package/src/release/rehearse.js +401 -0
  242. package/src/release/release-workflow.js +733 -0
  243. package/src/release/sync-plugin-versions.js +43 -7
  244. package/src/runtime/advice/bench-gate.js +25 -0
  245. package/src/runtime/advice/cli.js +59 -16
  246. package/src/runtime/advice/client.js +32 -9
  247. package/src/runtime/advice/config.js +98 -133
  248. package/src/runtime/advice/doctor.js +1 -1
  249. package/src/runtime/advice/elevation.js +97 -0
  250. package/src/runtime/advice/endpoint-guard.js +9 -3
  251. package/src/runtime/advice/mode.js +37 -0
  252. package/src/runtime/advice/record.js +18 -5
  253. package/src/runtime/advice/registry.js +4 -1
  254. package/src/runtime/advice/shadow-config.js +229 -0
  255. package/src/runtime/advice/shadow-dispatcher.js +276 -0
  256. package/src/runtime/brief-rules.js +81 -0
  257. package/src/runtime/brief-tools.js +111 -34
  258. package/src/runtime/candidate.js +20 -11
  259. package/src/runtime/capabilities/executor.js +450 -0
  260. package/src/runtime/capabilities/loopback.js +41 -0
  261. package/src/runtime/capabilities/sanitizer.js +88 -0
  262. package/src/runtime/capability-router.js +135 -3
  263. package/src/runtime/checkouts.js +73 -11
  264. package/src/runtime/claims.js +13 -7
  265. package/src/runtime/cli.js +196 -19
  266. package/src/runtime/config-home.js +42 -0
  267. package/src/runtime/context/arbitrate.js +767 -0
  268. package/src/runtime/context/delivery-store.js +4 -6
  269. package/src/runtime/context/emission-rules.js +118 -0
  270. package/src/runtime/context/identity.js +227 -0
  271. package/src/runtime/context/pointer.js +67 -12
  272. package/src/runtime/context/primary-command.js +117 -0
  273. package/src/runtime/context/primary.js +344 -0
  274. package/src/runtime/context/summary-store.js +655 -0
  275. package/src/runtime/context-pack.js +158 -79
  276. package/src/runtime/decision-register.js +13 -4
  277. package/src/runtime/dispatch/admission.js +392 -0
  278. package/src/runtime/dispatch/attempt-end.js +274 -0
  279. package/src/runtime/dispatch/command.js +628 -0
  280. package/src/runtime/dispatch/controls.js +904 -0
  281. package/src/runtime/dispatch/envelope.js +276 -0
  282. package/src/runtime/dispatch/grants.js +310 -0
  283. package/src/runtime/dispatch/integrate.js +617 -0
  284. package/src/runtime/dispatch/loop.js +1835 -0
  285. package/src/runtime/dispatch/store.js +352 -0
  286. package/src/runtime/dispatch/verify-run.js +201 -0
  287. package/src/runtime/evidence-ledger.js +52 -7
  288. package/src/runtime/failure/capture.js +3 -1
  289. package/src/runtime/failure/cli.js +25 -9
  290. package/src/runtime/failure/home.js +57 -30
  291. package/src/runtime/failure/store.js +7 -2
  292. package/src/runtime/feature-pointer.js +174 -0
  293. package/src/runtime/feature-resolve.js +13 -2
  294. package/src/runtime/fleet/command.js +77 -0
  295. package/src/runtime/fleet/projects.js +178 -0
  296. package/src/runtime/fleet/tree.js +383 -0
  297. package/src/runtime/freshness.js +33 -3
  298. package/src/runtime/git-memo.js +46 -0
  299. package/src/runtime/guidance/ablation.js +427 -0
  300. package/src/runtime/health.js +624 -18
  301. package/src/runtime/history-compactor.js +13 -3
  302. package/src/runtime/implementation-gate.js +281 -26
  303. package/src/runtime/intake/engine.js +677 -0
  304. package/src/runtime/intake/index.js +136 -0
  305. package/src/runtime/intake/manifest.js +140 -0
  306. package/src/runtime/intake/taxonomy.js +206 -0
  307. package/src/runtime/inventory/coverage.js +1 -1
  308. package/src/runtime/inventory/index.js +1 -1
  309. package/src/runtime/inventory/precedence.js +2 -2
  310. package/src/runtime/inventory/siblings.js +6 -4
  311. package/src/runtime/knowledge/code-corpus.js +277 -0
  312. package/src/runtime/knowledge/code-lexical.js +130 -0
  313. package/src/runtime/knowledge/code-retrieval.js +307 -0
  314. package/src/runtime/knowledge/code-validation.js +106 -0
  315. package/src/runtime/knowledge/gp3-gate.js +74 -0
  316. package/src/runtime/knowledge/graph-adapter.js +288 -0
  317. package/src/runtime/knowledge/graph-fallback.js +394 -0
  318. package/src/runtime/knowledge/hybrid.js +136 -8
  319. package/src/runtime/knowledge/retrieval.js +34 -1
  320. package/src/runtime/knowledge/rtk-compress.js +77 -0
  321. package/src/runtime/knowledge/semble-bridge.py +106 -0
  322. package/src/runtime/knowledge/semble-lifecycle.js +114 -0
  323. package/src/runtime/knowledge/semble-provider.js +365 -0
  324. package/src/runtime/lifecycle/cli.js +88 -10
  325. package/src/runtime/lifecycle/event-store.js +8 -6
  326. package/src/runtime/lifecycle/followup.js +38 -7
  327. package/src/runtime/lifecycle/overview.js +26 -2
  328. package/src/runtime/lifecycle/report-store.js +8 -10
  329. package/src/runtime/lifecycle/retention.js +95 -31
  330. package/src/runtime/lifecycle/root.js +9 -1
  331. package/src/runtime/lifecycle/status.js +34 -17
  332. package/src/runtime/lifecycle/store-upkeep.js +56 -7
  333. package/src/runtime/mask.js +134 -7
  334. package/src/runtime/mcp-consultations.js +40 -6
  335. package/src/runtime/model-router.js +79 -7
  336. package/src/runtime/models/catalogue.js +191 -0
  337. package/src/runtime/models/command.js +153 -0
  338. package/src/runtime/off-words.js +12 -0
  339. package/src/runtime/outcome.js +2 -2
  340. package/src/runtime/packages/command.js +1009 -0
  341. package/src/runtime/packages/contributions.js +116 -0
  342. package/src/runtime/packages/digest.js +132 -0
  343. package/src/runtime/packages/fetch.js +182 -0
  344. package/src/runtime/packages/grants.js +192 -0
  345. package/src/runtime/packages/index-file.js +134 -0
  346. package/src/runtime/packages/instruction.js +90 -0
  347. package/src/runtime/packages/manifest.js +331 -0
  348. package/src/runtime/packages/points.js +487 -0
  349. package/src/runtime/packages/programs.js +216 -0
  350. package/src/runtime/packages/scaffold.js +277 -0
  351. package/src/runtime/packages/source.js +90 -0
  352. package/src/runtime/packages/state.js +164 -0
  353. package/src/runtime/packages/store.js +449 -0
  354. package/src/runtime/packages/tar.js +106 -0
  355. package/src/runtime/packages/view.js +406 -0
  356. package/src/runtime/plan-check.js +59 -0
  357. package/src/runtime/plan-content.js +324 -0
  358. package/src/runtime/policy-init.js +118 -0
  359. package/src/runtime/profiles/doctor.js +96 -0
  360. package/src/runtime/profiles/resolve.js +244 -0
  361. package/src/runtime/profiles/rollback.js +254 -0
  362. package/src/runtime/profiles/sampler.js +41 -0
  363. package/src/runtime/readiness-record.js +16 -11
  364. package/src/runtime/readiness.js +46 -5
  365. package/src/runtime/research-request.js +50 -25
  366. package/src/runtime/retrieval-plan.js +10 -30
  367. package/src/runtime/retrieval-record.js +75 -5
  368. package/src/runtime/review/command.js +246 -0
  369. package/src/runtime/review/dominance.js +68 -0
  370. package/src/runtime/review/findings.js +434 -0
  371. package/src/runtime/review/identity.js +255 -0
  372. package/src/runtime/review/protocol-command.js +109 -0
  373. package/src/runtime/review/protocols.js +405 -0
  374. package/src/runtime/review/resolve-protocol.js +302 -0
  375. package/src/runtime/review/start.js +530 -0
  376. package/src/runtime/roadmap/attendance.js +137 -0
  377. package/src/runtime/roadmap/facts.js +479 -0
  378. package/src/runtime/roadmap/gates.js +273 -0
  379. package/src/runtime/roadmap/loop.js +1719 -0
  380. package/src/runtime/roadmap/merge.js +390 -0
  381. package/src/runtime/roadmap/rows.js +1122 -0
  382. package/src/runtime/roadmap/seed.js +1063 -0
  383. package/src/runtime/roadmap/worktree-cleanup.js +147 -0
  384. package/src/runtime/rules-report.js +336 -0
  385. package/src/runtime/scaffold/artifacts.js +60 -9
  386. package/src/runtime/scaffold/generate.js +21 -9
  387. package/src/runtime/settings/autopilot.js +106 -0
  388. package/src/runtime/settings/cli.js +280 -0
  389. package/src/runtime/settings/config-write.js +314 -0
  390. package/src/runtime/settings/files.js +271 -0
  391. package/src/runtime/settings/legacy.js +154 -0
  392. package/src/runtime/settings/lexical.js +56 -0
  393. package/src/runtime/settings/prepared-run.js +269 -0
  394. package/src/runtime/settings/project-layers.js +118 -0
  395. package/src/runtime/settings/refs.js +288 -0
  396. package/src/runtime/settings/registry.js +553 -0
  397. package/src/runtime/settings/resolve.js +713 -0
  398. package/src/runtime/settings/shared.js +37 -0
  399. package/src/runtime/settings/worker-billing.js +107 -0
  400. package/src/runtime/settings/write.js +269 -0
  401. package/src/runtime/slot-command.js +78 -0
  402. package/src/runtime/slots.js +671 -0
  403. package/src/runtime/source-version.js +1 -0
  404. package/src/runtime/state-root.js +217 -0
  405. package/src/runtime/storage/cli.js +12 -5
  406. package/src/runtime/storage/engine.js +9 -2
  407. package/src/runtime/storage/registry.js +14 -1
  408. package/src/runtime/storage/roots.js +66 -16
  409. package/src/runtime/storage/rules.js +82 -10
  410. package/src/runtime/storage/upkeep.js +10 -2
  411. package/src/runtime/storage/work-status.js +245 -26
  412. package/src/runtime/task-attempts.js +589 -69
  413. package/src/runtime/task-classifier.js +85 -14
  414. package/src/runtime/task-graph.js +373 -0
  415. package/src/runtime/task-run.js +778 -0
  416. package/src/runtime/task-scope.js +176 -55
  417. package/src/runtime/task-sources.js +147 -0
  418. package/src/runtime/task-state.js +373 -64
  419. package/src/runtime/team/admission.js +301 -0
  420. package/src/runtime/team/envelope.js +324 -0
  421. package/src/runtime/team/review-guard.js +156 -0
  422. package/src/runtime/trace/analyze.js +427 -0
  423. package/src/runtime/trace/baseline.js +770 -0
  424. package/src/runtime/trace/ledger.js +63 -140
  425. package/src/runtime/trace/otlp-export.js +568 -0
  426. package/src/runtime/trace/otlp-map.js +481 -0
  427. package/src/runtime/trace/spans.js +745 -0
  428. package/src/runtime/trace/telemetry.js +225 -0
  429. package/src/runtime/trace/views.js +1 -0
  430. package/src/runtime/transcripts/command.js +98 -0
  431. package/src/runtime/transcripts/cursor.js +326 -0
  432. package/src/runtime/transcripts/read.js +126 -0
  433. package/src/runtime/transcripts/readers/claude-jsonl.js +74 -0
  434. package/src/runtime/transcripts/readers/codex-rollout.js +70 -0
  435. package/src/runtime/transcripts/readers/copilot-events.js +90 -0
  436. package/src/runtime/transcripts/readers/kiro-jsonl.js +77 -0
  437. package/src/runtime/transcripts/readers/pi-jsonl.js +59 -0
  438. package/src/runtime/transcripts/registry.js +161 -0
  439. package/src/runtime/transcripts/stats.js +161 -0
  440. package/src/runtime/verb-view.js +267 -0
  441. package/src/runtime/verification/check-key.js +628 -0
  442. package/src/runtime/verification/contract-runner.js +546 -11
  443. package/src/runtime/verification/engine.js +499 -54
  444. package/src/runtime/verification/impact.js +617 -0
  445. package/src/runtime/verification/inflight.js +205 -0
  446. package/src/runtime/verification/registry.js +176 -0
  447. package/src/runtime/verification/reuse.js +184 -0
  448. package/src/runtime/verification/telemetry-emit.js +254 -0
  449. package/src/runtime/verification/test-selection.js +67 -7
  450. package/src/runtime/worker/active.js +90 -0
  451. package/src/runtime/worker/cancel.js +222 -0
  452. package/src/runtime/worker/catalogue.js +122 -0
  453. package/src/runtime/worker/command.js +677 -0
  454. package/src/runtime/worker/evidence.js +288 -0
  455. package/src/runtime/worker/launch.js +256 -0
  456. package/src/runtime/worker/models.js +137 -0
  457. package/src/runtime/worker/parsers.js +218 -0
  458. package/src/runtime/worker/probes/index.js +706 -0
  459. package/src/runtime/worker/process-tree.js +415 -0
  460. package/src/runtime/worker/quota.js +43 -0
  461. package/src/runtime/worker/readiness.js +713 -0
  462. package/src/runtime/worker/run-store.js +166 -0
  463. package/src/runtime/worker/supervisor.js +541 -0
  464. package/src/runtime/worker/worktree-check.js +252 -0
  465. package/src/runtime/workflow-engine.js +5 -1
  466. package/src/runtime/workflow-orchestrator.js +610 -67
  467. package/src/runtime/worktree.js +149 -22
  468. package/src/state/index.js +1 -1
  469. package/src/state/lockfile.js +64 -10
  470. package/src/state/run-lock.js +1 -1
  471. package/types/node-commonjs.d.ts +106 -7
  472. package/core/harnesses/claude/hooks/pre-bash-guard.sh +0 -10
  473. package/core/harnesses/codex/hooks/pre-bash-guard.sh +0 -10
  474. package/core/harnesses/gemini/hooks/hooks.json +0 -77
  475. package/core/harnesses/gemini/hooks/lib.sh +0 -302
  476. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +0 -10
  477. package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
  478. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -10
  479. package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
  480. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -10
  481. package/core/harnesses/gemini/hooks/session-end.impl.sh +0 -89
  482. package/core/harnesses/gemini/hooks/session-end.sh +0 -5
  483. package/core/harnesses/gemini/hooks/session-start.sh +0 -7
  484. package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
  485. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +0 -24
  486. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +0 -91
  487. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +0 -378
  488. package/core/shared/guidance/FLAGS.md +0 -25
  489. package/core/shared/guidance/rules/RULE_01_SAFETY.md +0 -25
  490. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +0 -23
  491. package/core/shared/guidance/rules/RULE_03_QUALITY.md +0 -14
  492. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +0 -46
  493. package/src/adapters/gemini/hooks.js +0 -251
  494. package/src/adapters/gemini/index.js +0 -429
@@ -14,8 +14,12 @@
14
14
  #
15
15
  # Usage: doflow-run <verb> [args...]
16
16
  # enforcement --harness <id> --policy <id> [--profile <id>] [--json]
17
+ # context-emit --event launch|prompt|delta --cwd <dir> [--session <id>] [--harness <id>]
18
+ # [--nudge nudge|suppress|none] [--max-bytes <n>] [--task-id <id>] [--slug <slug>] [--peek] [--json]
19
+ # context-grant --summary <summaryId|pending> --to-run <id> --to-lineage <id>
20
+ # [--from-worktree <dir>] [--from-run <id>] [--from-lineage <id>] [--max-bytes <n>] [--json]
17
21
  # Every verb accepts --json. Exit 0 = success, 1 = an actionable finding, 2 = usage or
18
- # resolution error, 3 = context-pack overflow. Arguments, stdin and exit status pass through the
22
+ # resolution error, 3 = context-pack overflow or context-emit refusal. Arguments, stdin and exit status pass through the
19
23
  # dispatcher unmodified —
20
24
  # `sync-context` reads its block body from stdin, so anything that buffered or consumed it here
21
25
  # would break that verb rather than merely inconvenience it.
@@ -30,29 +34,61 @@ set -euo pipefail
30
34
  # `set -euo pipefail` never stops on it; nothing in it can reach the dispatcher's own options or
31
35
  # variables. Appends one JSON line of at most 1000 bytes (longer appends from concurrent writers can
32
36
  # interleave) and never rotates: rotation is done by the Node writers only (IC-015, DEC-019). It is
33
- # a no-op when no failure home can be resolved (HOME unset, or XDG_CONFIG_HOME relative) and while
34
- # capture is off (the `off` sentinel file wins; DOFLOW_FAILURE_CAPTURE=off|0|false|no also turns it
35
- # off). The line carries only names from DoFlow's own tables and the working directory: never an
36
- # argument, stdin or the environment.
37
+ # a no-op when there is no config home (neither XDG_CONFIG_HOME nor HOME is set to an absolute path;
38
+ # doflow_config_home below, the rule of src/runtime/config-home.ts) and while capture is off
39
+ # (DOFLOW_FAILURE_CAPTURE=off|0|false|no, the `off` sentinel file, or a `failure.capture` value other
40
+ # than "on" in <config home>/settings.json, read by doflow_lex_capture below). The line carries only
41
+ # names from DoFlow's own tables and the working directory: never an argument, stdin or the
42
+ # environment.
37
43
  # capture_failure <command> <kind> <exit status>
38
44
  CAPTURE_VERB=""
39
45
 
46
+ # BEGIN doflow-config-home v1 (rule: src/runtime/config-home.ts; checked by test/guards/settings.test.js)
47
+ doflow_config_home() {
48
+ DOFLOW_HOME=""
49
+ case "${XDG_CONFIG_HOME:-}" in
50
+ /*) DOFLOW_HOME="${XDG_CONFIG_HOME}/doflow"; return 0 ;;
51
+ [A-Za-z]:[\\/]*) case "${OSTYPE:-}" in msys*|cygwin*|win32*) DOFLOW_HOME="${XDG_CONFIG_HOME}/doflow"; return 0 ;; esac ;;
52
+ esac
53
+ case "${HOME:-}" in
54
+ /*) DOFLOW_HOME="${HOME}/.config/doflow" ;;
55
+ [A-Za-z]:[\\/]*) case "${OSTYPE:-}" in msys*|cygwin*|win32*) DOFLOW_HOME="${HOME}/.config/doflow" ;; esac ;;
56
+ esac
57
+ return 0
58
+ }
59
+ # END doflow-config-home v1
60
+
61
+ # BEGIN doflow-settings-lexical v1 (rule: src/runtime/settings/lexical.ts; checked by test/guards/settings.test.js)
62
+ doflow_lex_capture() {
63
+ local f="${1:-}" text="" rest="" d=""
64
+ local re='"failure\.capture"[[:space:]]*:[[:space:]]*("[^"]*"|[^,}"[:space:]]*)'
65
+ DOFLOW_LEX_CAPTURE=""
66
+ if [ ! -e "$f" ]; then
67
+ # Missing is no setting, unless the folder holding it cannot be searched (Node: EACCES is off).
68
+ d="${f%/*}"
69
+ if [ -n "$d" ] && [ "$d" != "$f" ] && [ -d "$d" ] && [ ! -x "$d" ]; then DOFLOW_LEX_CAPTURE="off"; fi
70
+ return 0
71
+ fi
72
+ if [ ! -f "$f" ] || [ ! -r "$f" ]; then DOFLOW_LEX_CAPTURE="off"; return 0; fi
73
+ IFS= read -r -d '' text < "$f" || true
74
+ rest="$text"
75
+ while [[ $rest =~ $re ]]; do
76
+ if [ "${BASH_REMATCH[1]}" = '"on"' ]; then DOFLOW_LEX_CAPTURE="${DOFLOW_LEX_CAPTURE:-on}"; else DOFLOW_LEX_CAPTURE="off"; fi
77
+ rest="${rest#*"${BASH_REMATCH[0]}"}"
78
+ done
79
+ return 0
80
+ }
81
+ # END doflow-settings-lexical v1
82
+
83
+
40
84
  capture_failure_write() {
41
85
  local command="${1:-}" kind="${2:-}" status="${3:-}"
42
86
  local home="" setting="" version="" candidate="" project="" harness="" at="" line="" cwd="" hp=""
43
87
  export LC_ALL=C
44
88
 
45
- if [ -n "${XDG_CONFIG_HOME:-}" ]; then
46
- case "$XDG_CONFIG_HOME" in
47
- /*) home="$XDG_CONFIG_HOME/doflow/failures" ;;
48
- *) return 0 ;;
49
- esac
50
- else
51
- case "${HOME:-}" in
52
- /*) home="$HOME/.config/doflow/failures" ;;
53
- *) return 0 ;;
54
- esac
55
- fi
89
+ doflow_config_home
90
+ [ -n "$DOFLOW_HOME" ] || return 0
91
+ home="$DOFLOW_HOME/failures"
56
92
 
57
93
  # Case-insensitive, whitespace trimmed at the ends only: the same reading the Node writer has.
58
94
  setting="$(printf '%s' "${DOFLOW_FAILURE_CAPTURE:-}" | tr '[:upper:]' '[:lower:]')" || return 0
@@ -62,6 +98,8 @@ capture_failure_write() {
62
98
  off|0|false|no) return 0 ;;
63
99
  esac
64
100
  [ -f "$home/off" ] && return 0
101
+ doflow_lex_capture "$DOFLOW_HOME/settings.json"
102
+ [ "$DOFLOW_LEX_CAPTURE" = off ] && return 0
65
103
 
66
104
  # The command is a verb the dispatcher has already matched against its own tables, or `dispatcher`.
67
105
  [[ "$command" =~ ^[a-z][a-z0-9-]{0,39}$ ]] || command="dispatcher"
@@ -114,14 +152,15 @@ capture_failure() {
114
152
 
115
153
  # After a verb ran: a status outside {0, 1, 2} is a crash worth recording (a signal, a runtime that
116
154
  # died), minus what is not DoFlow's fault (DEC-031): 127 (command not found), 130, 141 and 143
117
- # (interrupted, broken pipe, terminated), task-not-found status 3 of `task-brief`, and overflow
118
- # status 3 of `context-pack`. A Node crash exits 1 and is recorded by the CLI itself, so it is
155
+ # (interrupted, broken pipe, terminated), task-not-found status 3 of `task-brief`, overflow
156
+ # status 3 of `context-pack`, refused status 3 of `context-emit`, and over-budget status 3 of
157
+ # `context-grant`. A Node crash exits 1 and is recorded by the CLI itself, so it is
119
158
  # never counted twice.
120
159
  capture_exit_status() {
121
160
  local verb="${1:-}" status="${2:-0}"
122
161
  case "$status" in
123
162
  0|1|2|127|130|141|143) return 0 ;;
124
- 3) case "$verb" in task-brief|context-pack) return 0 ;; esac ;;
163
+ 3) case "$verb" in task-brief|context-pack|context-emit|context-grant) return 0 ;; esac ;;
125
164
  esac
126
165
  capture_failure "$verb" "exit-$status" "$status"
127
166
  return 0
@@ -165,8 +204,13 @@ resolve_config_dir() {
165
204
  dir="$(pwd -P 2>/dev/null || pwd)"
166
205
  while [ -n "$dir" ] && [ "$dir" != "/" ]; do
167
206
  if [ -d "$dir/.doflow" ]; then
168
- printf '%s' "$dir/.doflow"
169
- return 0
207
+ case "$dir/" in
208
+ */.doflow/*) ;;
209
+ *)
210
+ printf '%s' "$dir/.doflow"
211
+ return 0
212
+ ;;
213
+ esac
170
214
  fi
171
215
  dir="$(dirname "$dir")"
172
216
  done
@@ -353,7 +397,9 @@ Workflow and evidence:
353
397
  workflow resolve stages, dependencies and gates for a class
354
398
  orchestrate start/resume a run: complete stages, skip optional ones, decide gates
355
399
  research-request open, list or resolve a feature-stage research question
356
- task-attempt claim, finish, release or read the attempts on a plan's tasks
400
+ task-attempt claim, finish, release, start, pause, cancel, resume, inspect, reopen or report-usage on a plan's task attempts
401
+ worker discover, probe, describe, select, run, status or cancel an external headless worker on a claimed task
402
+ dispatch run a feature's task graph: start, step, run, submit, spawn, pause, inspect, cancel, takeover or resume
357
403
  retrieve BM25 search over the installed guidance tree (auto-refreshing index)
358
404
  model-role resolve an abstract model role to ranked, availability-annotated providers
359
405
  route resolve an information need to a healthy provider
@@ -361,14 +407,30 @@ Workflow and evidence:
361
407
  claim record or update a claim and its support state
362
408
  readiness evaluate readiness; return state and missing items
363
409
  context-pack emit the compiled context pack for a stage
410
+ context-emit decide and render one launch, prompt or delta emission (launcher entry)
411
+ context-grant grant one compacted summary to a launched run and lineage
364
412
  retrieval-plan declare the needs a stage will resolve, attempt each need, then report every declared item
365
413
  outcome record a task's terminal state with its basis, or show what was recorded
366
414
  scaffold emit the code scaffold the active feature's artifacts imply
367
415
  decision register, list or compact the active feature's decisions
416
+ intake sort, preview, undo, list or file prompt text for the feature's additional-context folder
368
417
  followup record, list, take, settle, promote or report what a feature left unfinished
369
418
  lifecycle overview, init, status, release or merged: follow-ups and feature tracking for the project
370
419
  goal add, check, link, list or close a goal and its checklist
371
420
  failure list, settle or switch off the failures DoFlow captured on this machine
421
+ roadmap session-driven autopilot runner: render or status the roadmap table
422
+ plan-check check a plan's task lines the way the task-attempt ledger reads them
423
+ review validate a feature's review/findings.json, print counts and advisories (review-package assembles the payload)
424
+ protocol print the review and debate protocol presets, or the one a run would use (read-only)
425
+ rules print the values the runtime owns for this project, each with its source (read-only)
426
+ primary resolve which harness and model the main session runs (read-only)
427
+ fleet list the projects this machine knows (read-only)
428
+ transcript read an agent's recent events, or the project's traffic (read-only)
429
+ package list the contribution points a package may fill, check a package directory, list/show packages (read-only), add/update a local package (a plan, then --plan applies it), or enable/disable/trust/exempt/revoke/verify/remove one
430
+ slot named machine-wide queue: run a command as its one holder, list or release
431
+ models synchronize, list, or inspect observed models across workers (--action sync|list|describe)
432
+ worktree remove a merged feature's worktree and branch, never by force (--action cleanup --slug <slug>)
433
+ attendance say whether a person is watching a stage (read-only; --task-id <slug> [--run <id>])
372
434
 
373
435
  Verification and recovery:
374
436
  verify compile the contract, run checks, emit the report
@@ -376,7 +438,7 @@ Verification and recovery:
376
438
  leak-scan report DoFlow-internal identifiers in shipped files
377
439
 
378
440
  Observability:
379
- trace current run trajectory
441
+ trace current run trajectory; trace spans: the span view; trace analyze: its detectors; trace export: OTLP/HTTP export
380
442
  stats aggregate run usage
381
443
  indicators per-stage and per-gate timings from the orchestration record
382
444
  discover missed opportunities in recorded runs
@@ -384,6 +446,7 @@ Observability:
384
446
  capabilities provider resolution
385
447
  enforcement verified lifecycle policy coverage
386
448
  doctor installation and provider health
449
+ config list effective settings and their origins
387
450
  storage report stored data and its retention bounds
388
451
  EOF
389
452
  }
@@ -439,12 +502,23 @@ now_ms() {
439
502
  #
440
503
  # Tracing never changes what a verb returned. Every step is failure-tolerant and the function
441
504
  # always succeeds: an unwritable state directory degrades observability, not the run.
505
+ #
506
+ # Session identity (082 IC-035, DEC-012, DEC-031, DEC-042): `run`, `lineage` and `attempt` come
507
+ # from the environment only, each written quoted when it matches identity.ts's pattern (ERE, held in
508
+ # a variable so `[[ =~ ]]` reads it unquoted, which bash 3.2 supports) and `null` otherwise. A value
509
+ # that passes holds no quote, backslash or control character, so quoting it cannot break the line.
510
+ # `[[ ]]` is a builtin: the trace starts no process beyond `mkdir` and `date` (NFR-007).
442
511
  trace_run() {
443
512
  local verb="$1" code="$2" duration="$3" argc="$4" started_at="$5"
444
513
  local runs_dir="$CONFIG_DIR/state/runs"
514
+ local id_re='^[A-Za-z0-9][A-Za-z0-9_-]{0,55}$' attempt_re='^[1-9][0-9]{0,3}$'
515
+ local run_v=null lineage_v=null attempt_v=null
516
+ if [[ "${DOFLOW_RUN_ID:-}" =~ $id_re && "${DOFLOW_RUN_ID}" != local ]]; then run_v="\"${DOFLOW_RUN_ID}\""; fi
517
+ if [[ "${DOFLOW_LINEAGE_ID:-}" =~ $id_re ]]; then lineage_v="\"${DOFLOW_LINEAGE_ID}\""; fi
518
+ if [[ "${DOFLOW_ATTEMPT:-}" =~ $attempt_re ]]; then attempt_v="\"${DOFLOW_ATTEMPT}\""; fi
445
519
  mkdir -p "$runs_dir" 2>/dev/null || return 0
446
- printf '{"timestamp":"%s","verb":"%s","exit_code":%s,"duration_ms":%s,"arg_count":%s}\n' \
447
- "$started_at" "$verb" "$code" "$duration" "$argc" \
520
+ printf '{"timestamp":"%s","verb":"%s","exit_code":%s,"duration_ms":%s,"arg_count":%s,"run":%s,"lineage":%s,"attempt":%s}\n' \
521
+ "$started_at" "$verb" "$code" "$duration" "$argc" "$run_v" "$lineage_v" "$attempt_v" \
448
522
  >>"$runs_dir/$(date -u +%Y-%m-%d).jsonl" 2>/dev/null || return 0
449
523
  return 0
450
524
  }
@@ -481,8 +555,8 @@ shell_helper_for() {
481
555
  # command list; an unbuilt verb is dispatched and the CLI answers for itself.
482
556
  is_node_verb() {
483
557
  case "$1" in
484
- classify|workflow|route|evidence|claim|readiness|context-pack|retrieval-plan|outcome|scaffold|decision|followup|lifecycle|goal|failure|verify|recover|leak-scan|\
485
- trace|stats|indicators|discover|inventory|capabilities|enforcement|doctor|orchestrate|research-request|task-attempt|retrieve|model-role|storage|brief-tools|advise) return 0 ;;
558
+ classify|workflow|route|evidence|claim|readiness|context-pack|context-emit|context-grant|retrieval-plan|outcome|scaffold|decision|intake|followup|lifecycle|goal|failure|verify|recover|leak-scan|\
559
+ trace|stats|indicators|discover|inventory|capabilities|enforcement|doctor|config|orchestrate|research-request|task-attempt|worker|dispatch|retrieve|model-role|storage|brief-tools|advise|roadmap|plan-check|review|protocol|rules|primary|fleet|transcript|package|slot|models|worktree|attendance) return 0 ;;
486
560
  *) return 1 ;;
487
561
  esac
488
562
  }
@@ -502,7 +576,7 @@ dispatch_shell() {
502
576
 
503
577
  dispatch_node() {
504
578
  local verb="$1"; shift
505
- local marker tmpfile rc first_line
579
+ local marker tmpfile outfile registry_msg rc first_line runtime_root second_line trimmed_second first_val total_errs more
506
580
  if ! resolve_node_cli; then
507
581
  if marker="$(has_doflow_marker_nearby)"; then
508
582
  fail 2 "unlinked-checkout" \
@@ -514,17 +588,40 @@ dispatch_node() {
514
588
  if [ "$NODE_CLI_KIND" = "script" ]; then
515
589
  command -v node >/dev/null 2>&1 || fail 2 "node-not-found" \
516
590
  "verb '$verb' needs node on PATH to run $NODE_CLI_PATH"
517
- case "$NODE_CLI_SOURCE" in
518
- project-runtime|global-runtime)
591
+ case "$NODE_CLI_SOURCE:$verb" in
592
+ # `slot run` streams its command's output and holds the queue for as long as the command
593
+ # runs, so its stderr is never held back for the stale-runtime check below.
594
+ *:slot)
595
+ node "$NODE_CLI_PATH" "$verb" "$@"
596
+ ;;
597
+ project-runtime:*|global-runtime:*)
519
598
  # These two sources are a *projected copy* of the runtime, not the checkout itself, so
520
599
  # they can drift out of sync with the working tree's registry. Stdout still streams
521
600
  # directly; only stderr is captured, so a version-drift crash can be told apart from a
522
601
  # verb legitimately reporting a finding (e.g. readiness's NEEDS_EVIDENCE) before either
523
602
  # reaches the caller.
524
603
  tmpfile="$(mktemp)"
525
- trap 'rm -f "$tmpfile" 2>/dev/null || true' EXIT
604
+ outfile=""
605
+ # `worker` and `dispatch` catch the registry error themselves and, under --json, report it as
606
+ # a JSON body on stdout (error "registry-invalid") with nothing on stderr; the other verbs let
607
+ # it reach stderr. Only those two have stdout held back (their --json body is a single
608
+ # document written at the end), so the same stale-runtime report can be built for them.
609
+ case "$verb" in
610
+ worker|dispatch) if [ "$wants_json" = true ]; then outfile="$(mktemp)"; fi ;;
611
+ esac
612
+ trap 'rm -f "$tmpfile" "$outfile" 2>/dev/null || true' EXIT
526
613
  rc=0
527
- node "$NODE_CLI_PATH" "$verb" "$@" 2>"$tmpfile" || rc=$?
614
+ if [ -n "$outfile" ]; then
615
+ node "$NODE_CLI_PATH" "$verb" "$@" >"$outfile" 2>"$tmpfile" || rc=$?
616
+ if [ "$rc" -eq 2 ]; then
617
+ registry_msg="$(node -e 'try{const o=JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"));if(o&&o.error==="registry-invalid"&&typeof o.message==="string")process.stdout.write(o.message)}catch{}' "$outfile" 2>/dev/null)" || registry_msg=""
618
+ if [ -n "$registry_msg" ]; then
619
+ printf '[ERROR] %s\n' "$registry_msg" >"$tmpfile"
620
+ fi
621
+ fi
622
+ else
623
+ node "$NODE_CLI_PATH" "$verb" "$@" 2>"$tmpfile" || rc=$?
624
+ fi
528
625
  if [ "$rc" -ne 0 ]; then
529
626
  first_line=""
530
627
  IFS= read -r first_line <"$tmpfile" || true
@@ -533,13 +630,34 @@ dispatch_node() {
533
630
  # anchored match against the registry loader's raw prefix never fires in practice.
534
631
  case "$first_line" in
535
632
  *"Invalid DoFlow registry:"*)
633
+ runtime_root="$(dirname "$(dirname "$NODE_CLI_PATH")")"
634
+ second_line=""
635
+ {
636
+ read -r _
637
+ IFS= read -r second_line || true
638
+ } <"$tmpfile"
639
+ second_line="${second_line%$'\r'}"
640
+ trimmed_second="${second_line#"${second_line%%[![:space:]]*}"}"
641
+ first_val="${trimmed_second#- }"
642
+ if [ -z "$first_val" ]; then
643
+ first_val="${first_line#*Invalid DoFlow registry:}"
644
+ first_val="${first_val#"${first_val%%[![:space:]]*}"}"
645
+ fi
646
+ first_val="${first_val%$'\r'}"
647
+ total_errs="$(grep -c '^[[:space:]]*- ' "$tmpfile" || true)"
648
+ case "$total_errs" in *[!0-9]*|"") total_errs=0 ;; esac
649
+ more=""
650
+ if [ "$total_errs" -gt 1 ]; then
651
+ more=" ($(( total_errs - 1 )) more)"
652
+ fi
536
653
  fail 2 "stale-runtime" \
537
- "verb '$verb' failed against $NODE_CLI_PATH, which appears out of date relative to the working checkout; reinstall or re-run the doflow installer to refresh it"
654
+ "verb '$verb' failed: the registry at $runtime_root/core/registry is invalid: $first_val$more; reinstall DoFlow if this runtime was projected from another version"
538
655
  ;;
539
656
  esac
540
657
  fi
658
+ if [ -n "$outfile" ]; then cat "$outfile"; fi
541
659
  cat "$tmpfile" >&2
542
- rm -f "$tmpfile"
660
+ rm -f "$tmpfile" "$outfile"
543
661
  trap - EXIT
544
662
  return "$rc"
545
663
  ;;
@@ -18,7 +18,7 @@ Universal command dispatcher, task decomposer, capability router, and developmen
18
18
 
19
19
  1. **Session & Command Dispatch**:
20
20
  - If invoked with no arguments or `--help`, announce DoFlow session status and display the core command reference.
21
- - If `$1` matches a known `/do-*` skill (`do-flow`, `do-brainstorm`, `do-design`, `do-plan`, `do-execute-plan`, `do-test`, `do-code-review`, `do-git`, `do-constitution`, `do-diagnose`, `do-document`, `do-implement`), forward to that skill directly.
21
+ - If `$1` matches a `/do-*` skill in the Core Command Reference table below, forward to that skill directly.
22
22
  - Otherwise, resolve the runtime seam **once** and reuse `$DOFLOW` for every later call here:
23
23
 
24
24
  ```bash
@@ -35,21 +35,25 @@ Run every command below from the project root — the walk-up starts at `$PWD`.
35
35
  ```
36
36
 
37
37
  - `/do maintain` (`$1` is `maintain`): note the start time `T`, run
38
- `doflow-run lifecycle --action overview --maintain --since T --json` (`doflow-run` is the
38
+ `doflow-run lifecycle --action overview --maintain --since T --view brief --json` (`doflow-run` is the
39
39
  `$DOFLOW` resolved above), and settle each pending item with the question tool through the
40
40
  `doflow-run followup`, `doflow-run goal` or `doflow-run failure` command its `next` lines give.
41
+ Advice on a follow-up: `references/advice_calls.md`, followup-triage.
41
42
  Rerun with the same `--since T` until nothing is pending. A product problem the user reports
42
43
  goes to `doflow-run followup --action report`; a large goal they state, to
43
44
  `doflow-run goal --action add`. It edits no source file.
45
+ - `/do program <goal>`, or an ask larger than one feature: follow `references/program_mode.md`, researching per
46
+ `../do-document/references/deep_research.md` at the tiers the guidance tree's `references/MODEL_SELECTION.md` gives.
47
+ - `/do package <idea>` or "make this a DoFlow extension/package/plugin": run `"$DOFLOW" package --action points --json`; stop if a needed point is not open. Ask up to 3 questions (what/why, id, points) via the question tool; run `"$DOFLOW" package --action new --id <id> --points <point[:local],...>`; follow `next` lines. No evidence batch; never write `grants.jsonl`, add remote sources or create a feature folder.
44
48
 
45
49
  2. **Multi-Part / Ambiguous Request Routing (`--depth`)**:
46
50
  - When a request bundles 2+ unrelated asks across different files or domains, verify referenced files exist first.
47
51
  - Decompose into independent or sequenced work packages, then propose **one task class per
48
- package** and let the runtime validate each: `"$DOFLOW" classify --task-class "<proposed>" --calling-skill do [--request <shell-escaped argument> | --request-file <file>] --json`. Prefer `--request-file`: create a temporary UTF-8 file with `mktemp`, write the verbatim request as the body of a single-quoted heredoc whose delimiter does not occur on any request line, pass only its path, and install cleanup traps plus explicit removal. Never interpolate raw request text into a shell command or word; use `--request` only as one safely shell-escaped argument, and omit the optional opinion if safe transport is unavailable. The flags are mutually exclusive.
52
+ package** and let the runtime validate each: `"$DOFLOW" classify --task-class "<proposed>" --calling-skill do (--request-file <file> | --request <shell-escaped argument>) --view brief --json`. Always pass the request. Prefer `--request-file`: create a temporary UTF-8 file with `mktemp`, write the verbatim request as the body of a single-quoted heredoc whose delimiter does not occur on any request line, pass only its path, and install cleanup traps plus explicit removal. Never interpolate raw request text into a shell command or word; use `--request` only as one safely shell-escaped argument, and omit the optional opinion if safe transport is unavailable. The flags are mutually exclusive.
49
53
 
50
54
  When the JSON carries `secondOpinion.status: "answered"` with `agrees: false`, tell the user the decision model picked a different class, in one line naming both; the verdict stands, and no other action follows from it.
51
55
 
52
- Branch on the returned `outcome` field, not the exit code.
56
+ Branch on `outcome`, not the exit code.
53
57
  - **`ACCEPTED`** — the returned `workflow` is this run's plan of record; read `stages`, `gates` and `handoff` off it rather than from memory.
54
58
  - **`REJECTED`** — **stop.** Print `message` verbatim (it already names `validClasses` and any `suggestions`), ask the user to choose from `validClasses`, then re-validate. Never substitute `feature`.
55
59
  A rejection may be about **you** rather than the class (`reason: caller-not-a-stage`). Then the fix is to propose one of the classes in `fit.hostingClasses`, or to hand the work to the skill this class names for the stage you meant — not to re-propose the same class.
@@ -64,17 +68,14 @@ Route each package to the accepted workflow's first stage. A workflow whose `sta
64
68
  that does the package's work is a misclassification — re-propose the class rather than routing the
65
69
  package under one the runtime accepted for a different kind of task.
66
70
 
71
+ Advice on a worker's tier: `references/advice_calls.md`, tier.
72
+
67
73
  - For detailed decomposition and dependency graph formatting, consult this skill's own
68
- `references/pm_routing.md`.
74
+ `references/pm_routing.md`; before dispatching agents, read the guidance tree's
75
+ `references/ORCHESTRATION.md` and `references/MODEL_SELECTION.md`.
69
76
 
70
77
  3. **Capability & Tool Selection**:
71
- - Before routing, check what recorded runs already show — run `"$DOFLOW" discover --json`
72
- (reuse `$DOFLOW` resolved in step 1). **It exits 1 when there is a finding — that is signal,
73
- not failure; never treat that exit code as an error.** When the analysis cannot be settled
74
- from the recorded metadata, `discover` reports `UNKNOWN` rather than "clear"; surface `UNKNOWN`
75
- as undetermined and never round it up to "no missed opportunities". `do` surfaces the finding
76
- to the user — it takes no automatic action on it, and no finding is ever rendered as a number,
77
- a percentage, or a confidence.
78
+ - Before routing, run `"$DOFLOW" discover --json` to check recorded runs. Exit 1 signals a finding, not an error. When metadata cannot settle the analysis, surface `UNKNOWN` as undetermined, never clear. Show findings to the user; take no automatic action. Never render findings as a number, percentage or confidence.
78
79
  - Routing an information need to a tool is unconditional, not a mode this skill can be asked
79
80
  for: whenever a search, graph, or testing need arises, query the Capability Router — run `"$DOFLOW" capabilities` (add `--json` to parse, `--check` for a deep
80
81
  smoke check), or `"$DOFLOW" route --intent <intent> --json` to resolve one need end to end. It
@@ -82,6 +83,7 @@ package under one the runtime accepted for a different kind of task.
82
83
  Ripgrep when absent, and a static table cannot know that.
83
84
  - Consult this skill's own `references/tool_matrix.md` for the intent→capability map and the two
84
85
  fallback layers. Treat the router's output as authoritative when the two disagree.
86
+ - Advice on an MCP server's trigger: `references/advice_calls.md`, mcp-need.
85
87
 
86
88
  4. **Scope & Effort Estimation (`--estimate`)**:
87
89
  - When asked for sizing, complexity, or timeline estimates, produce a range anchored against git history and file scope, stating the assumptions that set its width and the unknowns that would narrow it. Never attach a numeric or percentage certainty to the range — the assumptions are the honest expression of what is not yet known.
@@ -0,0 +1,26 @@
1
+ # Advice calls
2
+
3
+ Optional. Skip a call and its outcome call unless `status` is `answered`; on `agrees: false` say so in one line and keep your judgement. `classify` asks `task-class` itself.
4
+
5
+ ## tier
6
+
7
+ ```bash
8
+ "$DOFLOW" advise --kind tier --state "<the package>" --static "<light|standard|frontier>" --task-id "<task id>" --json
9
+ "$DOFLOW" advise --action outcome --pick-id "<pickId>" --actual "<tier used>"
10
+ ```
11
+
12
+ ## mcp-need
13
+
14
+ ```bash
15
+ "$DOFLOW" advise --kind mcp-need --server <id> --state "<the stage>" --static <yes|no> --task-id "<task id>" --json
16
+ "$DOFLOW" advise --action outcome --pick-id "<pickId>" --actual "<yes|no: server used>"
17
+ ```
18
+
19
+ ## followup-triage
20
+
21
+ No `--static`; the pick is input to the question.
22
+
23
+ ```bash
24
+ "$DOFLOW" advise --kind followup-triage --state "<its text>" --task-id "<its id>" --json
25
+ "$DOFLOW" advise --action outcome --pick-id "<pickId>" --actual "<now|later|dismiss>"
26
+ ```
@@ -7,8 +7,7 @@ Decomposition depth guidelines when `/do` processes multi-part, cross-domain req
7
7
  Produce a flat table: Part | Domain | Target Skill / Agent | Completion Gate
8
8
  - `--depth normal` (Shared context or sequence dependencies):
9
9
  Produce the shallow table plus an explicit dependency check (e.g., API contract before UI binding).
10
- - `--depth deep` (Multi-service / complex initiatives):
11
- Full Epic $\rightarrow$ Story $\rightarrow$ Task hierarchy ready for `/do-plan`.
10
+ - `--depth deep` (programme-sized: more than one feature): program mode, `program_mode.md`.
12
11
 
13
12
  ## Delegation Matrix
14
13
  - Feature discovery $\rightarrow$ `/do-brainstorm`
@@ -0,0 +1,31 @@
1
+ # Program mode
2
+
3
+ For an ask larger than one feature: research, offer roadmap shapes, hand over a checked draft. It
4
+ writes no roadmap row and edits no source.
5
+
6
+ 1. **Enter.** `/do program <goal>` enters. An ask naming more than one independently shippable
7
+ outcome may enter: name the signal in one line and ask with the question tool (program mode
8
+ first, "one feature" second) before any research. Anything else routes as before.
9
+ 2. **Contract.** Write the sub-questions the roadmap needs (users, scope edges, existing surfaces,
10
+ ordering risks), at most 6. Task id: `program-<kebab-of-goal>`.
11
+ 3. **Research.** One broad round over the whole goal, then one targeted round per sub-question, per
12
+ `../do-document/references/deep_research.md` (no report file), at most 6 sources each. Run
13
+ independent sub-questions as parallel subagents where the harness has them, else in turn, at the
14
+ tier the guidance tree's `references/MODEL_SELECTION.md` gives: `light` to scout or extract,
15
+ `standard` to research, `frontier` to judge and pick shapes. Mark each finding sourced (with its
16
+ locator) or inferred. Stop when every sub-question has an answer or a stated gap and the last
17
+ round added nothing; report the gaps. Record one evidence batch and one claim per conclusion
18
+ under this task id with SKILL.md step 5's commands, per the guidance tree's
19
+ `references/EVIDENCE_LEDGER.md`.
20
+ 4. **Shapes.** Offer two or three roadmap shapes through the question tool, recommended first: rows
21
+ in outline, order and the main trade-off. One viable shape: say why the others fell.
22
+ 5. **Draft.** Write the chosen shape as `{"schema":1,"rows":[...]}`: per row `id`, `slug`, `title`,
23
+ `class`, `needs`, a rough `writeSet`, one-line `intent`, at most 8 `acceptance` lines; nothing a
24
+ row's own chain decides later. New rows go to `agent-docs/roadmap/draft.json` with ids above the
25
+ store's highest; changes to rows not started go to `agent-docs/roadmap/draft-amend.json`. Ask
26
+ before overwriting either file.
27
+ 6. **Check.** Run `"$DOFLOW" roadmap seed --action check --draft <path> --json` per draft. Fix the
28
+ findings and re-check, at most 3 times; every row of a draft must carry the same `change`. Show
29
+ the result line, overlaps, `alone` rows and gaps. A draft with findings is not ready.
30
+ 7. **Hand over.** Show the person the `land` command `check` printed and stop. Landing is the
31
+ person's act: never run it, and never hand it to a subagent, a policy or autopilot.