@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
@@ -52,8 +52,9 @@ const { TASK_CLASS_BUDGETS, resolveBudget, getRegisteredHarnessIds, getRegistere
52
52
  const { createDeliveryEntry, readDeliveryEntry, recordDelivery, makeTokenRecord } = require('./context/delivery-store.js');
53
53
  const { boundedAcquire } = require('./task-state.js');
54
54
  const pointerTools = require('./context/pointer.js');
55
+ const { arbitrate, emitContext } = require('./context/arbitrate.js');
55
56
  const { updateTaskState } = require('./task-state.js');
56
- const { taskStoreDir } = require('./task-scope.js');
57
+ const { taskRecord } = require('./task-scope.js');
57
58
 
58
59
  let correctiveTrimFallbackCount = 0;
59
60
  function getCorrectiveTrimFallbackCount() { return correctiveTrimFallbackCount; }
@@ -114,6 +115,8 @@ function sourcesChanged(root , sources )
114
115
 
115
116
  function classifyStoreFailure(error ) {
116
117
  if (error?.code === 'store-locked' || error?.message === 'store-locked') return 'store-locked';
118
+ // Another writer reclaimed the lock mid-write; nothing was recorded and the store is intact.
119
+ if (error?.code === 'lock-lost') return 'lock-lost';
117
120
  if (error?.code === 'store-unreadable') return 'store-unreadable';
118
121
  if (['EACCES', 'EROFS', 'EPERM', 'ENOSPC'].includes(error?.code)) return 'store-unwritable';
119
122
  return 'store-unwritable';
@@ -126,10 +129,9 @@ function profileRetention(harnessId , profiles )
126
129
  }
127
130
 
128
131
  function appendPointerExpansion({ projectRoot, taskId, slug, key, expansion, fsImpl = fs } ) {
129
- const dir = taskStoreDir({ projectRoot, store: 'delivery', taskId, slug });
130
- const file = path.join(dir, `${taskId}.json`);
132
+ const { file, seed } = taskRecord({ projectRoot, store: 'delivery', taskId, slug, fsImpl });
131
133
  updateTaskState({
132
- fsImpl, file,
134
+ fsImpl, file, prepare: seed,
133
135
  acquire: (impl , target ) => boundedAcquire(impl, target, { retries: 3, waitMs: 5 }),
134
136
  build(disk ) {
135
137
  const deliveries = Array.isArray(disk?.deliveries) ? disk.deliveries : [];
@@ -366,8 +368,12 @@ class ContextPackCompiler {
366
368
  const selfRefWidth = Math.max(budgetOverrides.selfRefWidth ?? this.options.selfRefWidth ?? 0, reservedHarnessWidth);
367
369
  const longestHarnessId = registeredHarnessIds.reduce((longest , id ) => id.length > longest.length ? id : longest, 'unstated');
368
370
  const envelopeBudget = {
369
- ...resolvedBudget,
371
+ maxBytes: resolvedBudget.maxBytes,
372
+ source: resolvedBudget.source,
370
373
  harness: { ...resolvedBudget.harness, id: longestHarnessId },
374
+ capacity: { value: null, basis: 'unknown:values belong to 085 (A-19)' },
375
+ toolResultLimitBytes: null,
376
+ ...(resolvedBudget.startupTokens ? { startupTokens: resolvedBudget.startupTokens } : {}),
371
377
  };
372
378
 
373
379
  const { envelopeMd, envelopeJson } = computeEnvelopes({
@@ -478,7 +484,7 @@ class ContextPackCompiler {
478
484
  taskClass: effectiveTaskClass,
479
485
  compiledAt: new Date().toISOString(),
480
486
  mode: bare ? 'bare' : (paramMode || 'full'),
481
- budget: resolvedBudget,
487
+ budget: envelopeBudget,
482
488
  overflow: isOverflow ? {
483
489
  cause,
484
490
  mandatoryBytes: packMandatoryBytes,
@@ -874,7 +880,11 @@ class ContextPackCompiler {
874
880
  * @param {string} [options.objective]
875
881
  * @param {boolean} [options.json=false]
876
882
  * @param {string} [options.stateRoot]
883
+ * @param {string} [options.sourceRoot] the checkout the verb runs in (default stateRoot)
877
884
  * @param {string} [options.slug] feature slug, when the task id is not the feature's own
885
+ * @param {string|null} [options.explicitSlug] the `--slug` the caller typed, if any (default `slug`).
886
+ * Only this selects a run for the stage-pack link: a branch-derived `slug` still keys the delivery
887
+ * store, but the branch name alone never picks a run (docs/specs/orchestrator-context-modes.md).
878
888
  * @returns {number} exit code
879
889
  */
880
890
  function handleContextPackCommand({
@@ -883,7 +893,9 @@ function handleContextPackCommand({
883
893
  objective,
884
894
  json = false,
885
895
  stateRoot,
896
+ sourceRoot,
886
897
  slug,
898
+ explicitSlug,
887
899
  mandatoryFile,
888
900
  harness = null,
889
901
  maxBytes,
@@ -895,6 +907,9 @@ function handleContextPackCommand({
895
907
  profiles = null,
896
908
  } = {}) {
897
909
  const root = stateRoot || process.cwd();
910
+ // 115 IC-004/IC-007: records live under `root`; the feature folder, its plan and pointers, and the
911
+ // source files a delivery hashes are read in the checkout the verb runs in.
912
+ const source = sourceRoot || root;
898
913
  const effectiveTaskClass = (!taskClass || typeof taskClass !== 'string' || taskClass.trim() === '') ? 'feature' : taskClass.trim();
899
914
 
900
915
  // IC-001 Usage errors
@@ -934,10 +949,8 @@ function handleContextPackCommand({
934
949
 
935
950
  const budget = resolveBudget({ taskClass: effectiveTaskClass, maxBytes: parsedMaxBytes, harnessFlag: harness, profiles });
936
951
 
937
- const feature = resolveFeature({ projectRoot: root, slug: slug || null });
952
+ const feature = resolveFeature({ projectRoot: source, slug: slug || null });
938
953
 
939
- let sinceEntry = null;
940
- let deltaRefused = null;
941
954
  let deltaExpansions = [];
942
955
  if (parsedMaxBytes !== undefined) {
943
956
  if (!baseBudget) {
@@ -947,28 +960,23 @@ function handleContextPackCommand({
947
960
  deltaExpansions.push({ at: new Date().toISOString(), kind: 'cap-raised', target: null, reason, bytesAdded: null });
948
961
  }
949
962
  }
950
- let retention = profileRetention(budget.harness?.id || null, profiles);
951
- if (since && !expand) {
952
- sinceEntry = readDeliveryEntry({ projectRoot: root, taskId, slug, packDigest: since });
953
- if (!sinceEntry) deltaRefused = 'since-unknown';
954
- else if (sourcesChanged(root, sinceEntry.sources || {})) deltaRefused = 'sources-changed';
955
- else if (!budget.harness?.id) deltaRefused = 'harness-unstated';
956
- else if (retention?.value !== 'supported') deltaRefused = 'retention-unproven';
957
- if (deltaRefused) {
958
- deltaExpansions.push({ at: new Date().toISOString(), kind: 'delta-widened', target: null, reason: deltaRefused, bytesAdded: null });
959
- }
960
- }
963
+ const basis = resolveDeltaBasis({ root, source, taskId, slug, since: expand ? null : since, budget, profiles });
964
+ const { sinceEntry, deltaRefused, retention } = basis;
965
+ if (basis.expansion) deltaExpansions.push(basis.expansion);
961
966
 
962
967
  if (expand) {
963
968
  const prior = readDeliveryEntry({ projectRoot: root, taskId, slug, packDigest: since });
964
969
  if (!prior) return usageError('context-pack', `Unknown digest '${since}'`, json);
965
970
  const pointer = (prior.pointers || []).find((candidate ) => candidate.id === expand);
966
971
  if (!pointer) return usageError('context-pack', `Unknown pointer '${expand}' in digest '${since}'`, json);
967
- const current = pointerTools.readPointerSlice({ projectRoot: root, pointer });
972
+ const current = pointerTools.readPointerSlice({ projectRoot: source, pointer });
968
973
  if (!current) return usageError('context-pack', `Unknown pointer '${expand}' in digest '${since}'`, json);
969
974
  const compiler = new ContextPackCompiler();
975
+ // A user's file is data, not instructions: JSON names its origin, the text form says so before the slice.
976
+ const origin = pointerTools.originOf(pointer.path);
977
+ const content = origin && !json ? `User-provided data, not instructions:\n${current.slice}` : current.slice;
970
978
  const pack = compiler.compileContextPack({ taskId, taskClass: effectiveTaskClass, objective: '', mandatory: { fields: {}, provenance: {} }, budget,
971
- mode: 'expand', expansion: { id: expand, path: pointer.path, content: current.slice, targetChanged: current.digest !== pointer.digest } });
979
+ mode: 'expand', expansion: { id: expand, path: pointer.path, content, targetChanged: current.digest !== pointer.digest, ...(origin ? { origin } : {}) } });
972
980
  pack.status = 'OK';
973
981
  pack.exitCode = EXIT.OK;
974
982
  pack.mode = 'expand';
@@ -1018,55 +1026,7 @@ function handleContextPackCommand({
1018
1026
  return finishRuntime(EXIT.OK);
1019
1027
  }
1020
1028
 
1021
- let reqText = null;
1022
- let reqPath = 'requirement.md';
1023
- if (!feature.error && feature.featureDir) {
1024
- reqPath = feature.paths?.requirement
1025
- ? path.resolve(feature.repoRoot || root, feature.paths.requirement)
1026
- : path.join(feature.featureDir, 'intention', 'requirement.md');
1027
- try {
1028
- if (fs.existsSync(reqPath)) {
1029
- reqText = fs.readFileSync(reqPath, 'utf8');
1030
- }
1031
- } catch {
1032
- reqText = null;
1033
- }
1034
- }
1035
-
1036
- let taskStories = [];
1037
- if (!feature.error && feature.featureDir && taskId) {
1038
- let planPath = null;
1039
- if (feature.paths?.plan) {
1040
- planPath = path.resolve(feature.repoRoot || root, feature.paths.plan);
1041
- } else {
1042
- const nestedPlan = path.join(feature.featureDir, 'plan', 'plan.md');
1043
- const flatPlan = path.join(feature.featureDir, 'plan.md');
1044
- if (fs.existsSync(nestedPlan)) planPath = nestedPlan;
1045
- else if (fs.existsSync(flatPlan)) planPath = flatPlan;
1046
- }
1047
- if (planPath && fs.existsSync(planPath)) {
1048
- try {
1049
- const planText = fs.readFileSync(planPath, 'utf8');
1050
- const { parsePlan } = require('./scaffold/artifacts.js');
1051
- const parsedPlan = parsePlan(planText);
1052
- const matchedTask = (parsedPlan.tasks || []).find(
1053
- (t ) => t.id === taskId || t.id.toLowerCase() === taskId.toLowerCase()
1054
- );
1055
- if (matchedTask && Array.isArray(matchedTask.stories)) {
1056
- taskStories = matchedTask.stories;
1057
- }
1058
- } catch {
1059
- taskStories = [];
1060
- }
1061
- }
1062
- }
1063
-
1064
- let mandatory = extractMandatory({
1065
- text: reqText,
1066
- path: reqPath,
1067
- featureError: feature.error ? (feature.message || feature.error) : null,
1068
- taskStories,
1069
- });
1029
+ let mandatory = gatherMandatory({ root: source, taskId, feature });
1070
1030
 
1071
1031
  if (mandatoryFile) {
1072
1032
  try {
@@ -1088,6 +1048,34 @@ function handleContextPackCommand({
1088
1048
  }
1089
1049
  }
1090
1050
 
1051
+ const { pack, output } = deliverPack({
1052
+ root, source, taskId, slug, effectiveTaskClass, objective, mandatory, budget, harness, parsedMaxBytes, bare, noRecord,
1053
+ json, reason, since, sinceEntry, deltaRefused, deltaExpansions, expand, retention, feature,
1054
+ });
1055
+ // Issue #9 stage 3: a recorded delivery is named on the run stage active now (best effort, never fails the verb).
1056
+ if (pack.delivery?.recorded === true) {
1057
+ try {
1058
+ require('./workflow-orchestrator.js').recordStagePack({ stateRoot: root, sourceRoot: source, taskId, slug: (explicitSlug === undefined ? slug : explicitSlug) || null, digest: pack.delivery.packDigest,
1059
+ checkout: !feature.error && feature.paths?.repo_root ? { repoRoot: feature.paths.repo_root, branch: feature.paths.branch || null } : null });
1060
+ } catch { /* an unrecorded link is unknown, not a failure */ }
1061
+ }
1062
+ if (console.log !== nativeConsoleLog) {
1063
+ console.log(output);
1064
+ } else {
1065
+ process.stdout.write(output);
1066
+ }
1067
+ return finishRuntime(pack.exitCode);
1068
+ }
1069
+
1070
+ /**
1071
+ * The context-pack verb's compile, fit, render and delivery-record steps for a full or delta pack,
1072
+ * with no output: `handleContextPackCommand()` prints the result and `packForEmission()` hands it
1073
+ * to `emitContext()`. Returns the final pack and its rendered text in the requested form.
1074
+ */
1075
+ function deliverPack({
1076
+ root, source = root, taskId, slug, effectiveTaskClass, objective, mandatory, budget, harness, parsedMaxBytes, bare, noRecord,
1077
+ json, reason, since, sinceEntry, deltaRefused, deltaExpansions, expand, retention, feature,
1078
+ } ) {
1091
1079
  const ledger = new EvidenceLedger({ repoRoot: root, slug });
1092
1080
  ledger.load(taskId);
1093
1081
  const claims = new ClaimsManager({ evidenceLedger: ledger, repoRoot: root, slug });
@@ -1115,11 +1103,11 @@ function handleContextPackCommand({
1115
1103
  deltaSinceEntry: since && !deltaRefused && !expand ? sinceEntry : null,
1116
1104
  deltaRefused,
1117
1105
  expand,
1118
- pointers: pointerTools.collectPointers({ projectRoot: root, feature }),
1106
+ pointers: pointerTools.collectPointers({ projectRoot: source, feature }),
1119
1107
  evidenceLedger: ledger,
1120
1108
  claimsManager: claims,
1121
1109
  researchRequests,
1122
- decisions: loadLiveDecisions({ projectRoot: root, slug: slug || null }),
1110
+ decisions: loadLiveDecisions({ projectRoot: source, slug: slug || null }),
1123
1111
  });
1124
1112
 
1125
1113
  let deliverySources = null;
@@ -1136,7 +1124,7 @@ function handleContextPackCommand({
1136
1124
  pack.omissions = pack.mode === 'bare' ? pack.omissions : compose.groupOmissions(pack.deliveryOmissions, !noRecord);
1137
1125
  }
1138
1126
  if (!noRecord) {
1139
- deliverySources = hashSourceFiles(root, pack.relevantFiles || []);
1127
+ deliverySources = hashSourceFiles(source, pack.relevantFiles || []);
1140
1128
  deliveryRetention = retention?.value === 'supported' || retention?.value === 'unsupported'
1141
1129
  ? { status: retention.value, basis: `declared:${retention.source || 'profile'}` }
1142
1130
  : { status: 'unknown', basis: retention?.unverified || 'contextProfile.retention is unverified' };
@@ -1260,18 +1248,109 @@ function handleContextPackCommand({
1260
1248
  pack.packEnd.bytes = emittedBytes;
1261
1249
  pack.size.totalBytes = emittedBytes;
1262
1250
  }
1263
- if (console.log !== nativeConsoleLog) {
1264
- console.log(output);
1265
- } else {
1266
- process.stdout.write(output);
1251
+ return { pack, output };
1252
+ }
1253
+
1254
+ /** The delta basis of a `since` digest: its delivery entry, or why a delta was refused (widened to full). */
1255
+ function resolveDeltaBasis({ root, source = root, taskId, slug, since, budget, profiles } ) {
1256
+ const retention = profileRetention(budget.harness?.id || null, profiles);
1257
+ let sinceEntry = null;
1258
+ let deltaRefused = null;
1259
+ let expansion = null;
1260
+ if (since) {
1261
+ sinceEntry = readDeliveryEntry({ projectRoot: root, taskId, slug, packDigest: since });
1262
+ if (!sinceEntry) deltaRefused = 'since-unknown';
1263
+ else if (sourcesChanged(source, sinceEntry.sources || {})) deltaRefused = 'sources-changed';
1264
+ else if (!budget.harness?.id) deltaRefused = 'harness-unstated';
1265
+ else if (retention?.value !== 'supported') deltaRefused = 'retention-unproven';
1266
+ if (deltaRefused) {
1267
+ expansion = { at: new Date().toISOString(), kind: 'delta-widened', target: null, reason: deltaRefused, bytesAdded: null };
1268
+ }
1267
1269
  }
1268
- return finishRuntime(pack.exitCode);
1270
+ return { sinceEntry, deltaRefused, retention, expansion };
1271
+ }
1272
+
1273
+ /** The mandatory fields of a task from its feature's requirement.md and the task's plan stories. */
1274
+ function gatherMandatory({ root, taskId, feature } ) {
1275
+ let reqText = null;
1276
+ let reqPath = 'requirement.md';
1277
+ if (!feature.error && feature.featureDir) {
1278
+ reqPath = feature.paths?.requirement
1279
+ ? path.resolve(feature.repoRoot || root, feature.paths.requirement)
1280
+ : path.join(feature.featureDir, 'intention', 'requirement.md');
1281
+ try {
1282
+ if (fs.existsSync(reqPath)) {
1283
+ reqText = fs.readFileSync(reqPath, 'utf8');
1284
+ }
1285
+ } catch {
1286
+ reqText = null;
1287
+ }
1288
+ }
1289
+
1290
+ let taskStories = [];
1291
+ if (!feature.error && feature.featureDir && taskId) {
1292
+ let planPath = null;
1293
+ if (feature.paths?.plan) {
1294
+ planPath = path.resolve(feature.repoRoot || root, feature.paths.plan);
1295
+ } else {
1296
+ const nestedPlan = path.join(feature.featureDir, 'plan', 'plan.md');
1297
+ const flatPlan = path.join(feature.featureDir, 'plan.md');
1298
+ if (fs.existsSync(nestedPlan)) planPath = nestedPlan;
1299
+ else if (fs.existsSync(flatPlan)) planPath = flatPlan;
1300
+ }
1301
+ if (planPath && fs.existsSync(planPath)) {
1302
+ try {
1303
+ const planText = fs.readFileSync(planPath, 'utf8');
1304
+ const { parsePlan } = require('./scaffold/artifacts.js');
1305
+ const parsedPlan = parsePlan(planText);
1306
+ const matchedTask = (parsedPlan.tasks || []).find(
1307
+ (t ) => t.id === taskId || t.id.toLowerCase() === taskId.toLowerCase()
1308
+ );
1309
+ if (matchedTask && Array.isArray(matchedTask.stories)) {
1310
+ taskStories = matchedTask.stories;
1311
+ }
1312
+ } catch {
1313
+ taskStories = [];
1314
+ }
1315
+ }
1316
+ }
1317
+
1318
+ return extractMandatory({
1319
+ text: reqText,
1320
+ path: reqPath,
1321
+ featureError: feature.error ? (feature.message || feature.error) : null,
1322
+ taskStories,
1323
+ });
1324
+ }
1325
+
1326
+ /**
1327
+ * 078 IC-001: the context pack `emitContext()` delivers on `launch` and `delta`, compiled by
1328
+ * compileContextPack() through the verb's own steps, with `maxBytes` as the budget and `since` the
1329
+ * unit's last delivered pack digest (a delta when its entry qualifies, else widened to full).
1330
+ * `noRecord` (peek) leaves the delivery store untouched. Rendered as markdown.
1331
+ */
1332
+ function packForEmission({ root, stateRoot = root, taskId = 'default', taskClass = 'feature', slug = null, harness = null, maxBytes, since = null, noRecord = false, env = process.env } ) {
1333
+ const budget = resolveBudget({ taskClass, maxBytes, harnessFlag: harness, env });
1334
+ const feature = resolveFeature({ projectRoot: root, slug: slug || null });
1335
+ // 115 C-2: the delivery record goes where `context-pack` puts it, under the state root; the feature
1336
+ // folder, the plan and the hashed source files are read in `root`, the checkout emitting.
1337
+ const basis = resolveDeltaBasis({ root: stateRoot, source: root, taskId, slug, since, budget, profiles: null });
1338
+ return deliverPack({
1339
+ root: stateRoot, source: root, taskId, slug, effectiveTaskClass: taskClass, objective: undefined, mandatory: gatherMandatory({ root, taskId, feature }),
1340
+ budget, harness, parsedMaxBytes: maxBytes, bare: false, noRecord, json: false, reason: null, since,
1341
+ sinceEntry: basis.sinceEntry, deltaRefused: basis.deltaRefused, deltaExpansions: basis.expansion ? [basis.expansion] : [],
1342
+ expand: null, retention: basis.retention, feature,
1343
+ });
1269
1344
  }
1270
1345
 
1271
1346
  module.exports = {
1347
+ classifyStoreFailure,
1272
1348
  ContextPackCompiler,
1349
+ arbitrate,
1350
+ emitContext,
1273
1351
  TASK_CLASS_BUDGETS,
1274
1352
  handleContextPackCommand,
1275
1353
  loadLiveDecisions,
1354
+ packForEmission,
1276
1355
  getCorrectiveTrimFallbackCount,
1277
1356
  };
@@ -30,7 +30,12 @@ const REF_RE = /^[A-Za-z]+-?[0-9]+$/;
30
30
  const DEC_RE = /^DEC-[0-9]{3,}$/;
31
31
  const STAGES = ['discovery', 'design', 'planning', 'implementation', 'verification', 'review'];
32
32
  /** Channel -> who decided. The caller names the channel; `decidedBy` follows from it. */
33
- const CHANNEL_DECIDED_BY = { question: 'user', gate: 'user', prompt: 'user', default: 'agent', resolution: 'agent' };
33
+ const CHANNEL_DECIDED_BY = { question: 'user', gate: 'user', prompt: 'user', default: 'agent', resolution: 'agent', policy: 'autopilot' };
34
+ /** IC-005: `policy` records an evaluated gate, never a caller's claimed identity, so only the
35
+ * in-process `orchestrate decide-gate --policy` path writes it; every caller-facing path refuses it. */
36
+ const RESERVED_CHANNEL = 'policy';
37
+ const CHANNEL_RESERVED = `channel-reserved: ${RESERVED_CHANNEL} is set only by orchestrate decide-gate --policy`;
38
+ const isReservedChannel = (channel ) => typeof channel === 'string' && channel.trim() === RESERVED_CHANNEL;
34
39
  const ITEM_KEYS = ['topic', 'statement', 'channel', 'stage', 'rationale', 'supersedes', 'refs', 'source'];
35
40
  const REQUIRED_KEYS = ['topic', 'statement', 'channel', 'stage', 'rationale'];
36
41
 
@@ -204,7 +209,7 @@ function normalizeItem(raw , label ) {
204
209
  }
205
210
  const channel = raw.channel.trim();
206
211
  if (!Object.prototype.hasOwnProperty.call(CHANNEL_DECIDED_BY, channel)) {
207
- throw new DecisionUsageError(`${label}: channel '${channel}' must be one of ${Object.keys(CHANNEL_DECIDED_BY).join(', ')}`);
212
+ throw new DecisionUsageError(`${label}: channel '${channel}' must be one of ${Object.keys(CHANNEL_DECIDED_BY).filter((c) => c !== RESERVED_CHANNEL).join(', ')}`);
208
213
  }
209
214
  const stage = raw.stage.trim();
210
215
  if (!STAGES.includes(stage)) throw new DecisionUsageError(`${label}: stage '${stage}' must be one of ${STAGES.join(', ')}`);
@@ -406,16 +411,17 @@ function runDecision({ action = 'list', projectRoot, slug = null, flags = {}, no
406
411
  let resolved = null;
407
412
  try {
408
413
  if (!VALID_ACTIONS.includes(act)) throw new DecisionUsageError(`unknown --action '${action}'. Valid: ${VALID_ACTIONS.join(', ')}`);
414
+ if (isReservedChannel(flags.channel)) throw new DecisionUsageError(CHANNEL_RESERVED);
409
415
  const feature = resolveActiveFeature({ projectRoot, slug });
410
416
  if (feature.error) throw new DecisionUsageError(feature.message);
411
- resolved = { featureDir: feature.featureDir, slug: feature.paths.feature_slug };
417
+ resolved = { featureDir: feature.featureFolder, slug: feature.paths.feature_slug };
412
418
  let result ;
413
419
  if (act === 'init') {
414
420
  result = initRegister({ ...resolved, fsImpl });
415
421
  } else if (act === 'list') {
416
422
  result = listDecisions({ ...resolved, all: Boolean(flags.all), fsImpl });
417
423
  } else if (act === 'compact') {
418
- result = compactDecisions({ ...resolved, repoRoot: feature.repoRoot, paths: feature.paths, now, fsImpl });
424
+ result = compactDecisions({ ...resolved, repoRoot: feature.featureRoot, paths: feature.paths, now, fsImpl });
419
425
  } else {
420
426
  let items ;
421
427
  if (flags.batch) {
@@ -430,6 +436,7 @@ function runDecision({ action = 'list', projectRoot, slug = null, flags = {}, no
430
436
  }
431
437
  items = [single];
432
438
  }
439
+ if (Array.isArray(items) && items.some((item ) => isReservedChannel(item?.channel))) throw new DecisionUsageError(CHANNEL_RESERVED);
433
440
  result = addDecisions({ ...resolved, items, now, fsImpl });
434
441
  }
435
442
  return { exitCode: result.finding ? 1 : 0, result };
@@ -489,5 +496,7 @@ module.exports = {
489
496
  archiveFile,
490
497
  STAGES,
491
498
  CHANNEL_DECIDED_BY,
499
+ CHANNEL_RESERVED,
500
+ isReservedChannel,
492
501
  STATEMENT_MAX,
493
502
  };