@khoavu882/doflow 2.0.0-beta.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/README.md +12 -11
  2. package/bin/doflow.js +21 -11
  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/permission-audit.sh +3 -0
  9. package/core/harnesses/claude/hooks/post-compact.sh +35 -32
  10. package/core/harnesses/claude/hooks/post-edit-lint.sh +2 -0
  11. package/core/harnesses/claude/hooks/post-shell-observe.sh +48 -0
  12. package/core/harnesses/claude/hooks/post-tool-failure.sh +3 -0
  13. package/core/harnesses/claude/hooks/pre-compact.sh +23 -27
  14. package/core/harnesses/claude/hooks/session-end.sh +23 -10
  15. package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
  16. package/core/harnesses/claude/settings/settings.json +18 -0
  17. package/core/harnesses/claude/statusline/doflow-statusline.sh +1 -0
  18. package/core/harnesses/codex/agents/core-implementer.toml +1 -0
  19. package/core/harnesses/codex/agents/delivery-lead.toml +10 -0
  20. package/core/harnesses/codex/agents/quality-guardian.toml +1 -1
  21. package/core/harnesses/codex/agents/research-writer.toml +1 -1
  22. package/core/harnesses/codex/agents/reviewer.toml +10 -0
  23. package/core/harnesses/codex/agents/spec-analyst.toml +1 -1
  24. package/core/harnesses/codex/agents/system-architect.toml +1 -1
  25. package/core/harnesses/codex/hooks/lib.sh +44 -25
  26. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +3 -1
  27. package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
  28. package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
  29. package/core/harnesses/codex/hooks/subagent-audit.sh +1 -0
  30. package/core/harnesses/copilot/hooks/doflow-lib.sh +93 -0
  31. package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
  32. package/core/harnesses/copilot/hooks/doflow-pre-bash-guard.sh +9 -0
  33. package/core/harnesses/copilot/hooks/doflow-pre-implement-gate.sh +9 -0
  34. package/core/harnesses/copilot/hooks/doflow-session-start.sh +9 -0
  35. package/core/harnesses/copilot/hooks/doflow-stop-check.sh +9 -0
  36. package/core/harnesses/copilot/hooks/doflow-subagent-start.sh +9 -0
  37. package/core/harnesses/copilot/hooks/doflow-subagent-stop.sh +9 -0
  38. package/core/harnesses/copilot/hooks/doflow.json +57 -0
  39. package/core/harnesses/kiro/agents/doflow.json +1 -1
  40. package/core/harnesses/kiro/hooks/lib.sh +26 -6
  41. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +1 -0
  42. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +1 -0
  43. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +1 -0
  44. package/core/harnesses/kiro/hooks/session-start.sh +1 -0
  45. package/core/harnesses/kiro/hooks/stop-check.sh +1 -0
  46. package/core/harnesses/pi/extensions/doflow-guard.js +8 -0
  47. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +0 -1
  48. package/core/harnesses/shared/hooks/bridge/bridge.sh +102 -9
  49. package/core/harnesses/shared/hooks/bridge/envelope.jq +87 -18
  50. package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
  51. package/core/harnesses/shared/hooks/bridge/respond.sh +10 -2
  52. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +28 -14
  53. package/core/harnesses/shared/hooks/policies/capture-failure.sh +48 -15
  54. package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
  55. package/core/harnesses/shared/hooks/policies/contract.sh +3 -0
  56. package/core/harnesses/shared/hooks/policies/deny-json.sh +2 -11
  57. package/core/harnesses/shared/hooks/policies/emission-rules.sh +37 -0
  58. package/core/harnesses/shared/hooks/policies/emission.jq +209 -0
  59. package/core/harnesses/shared/hooks/policies/emission.sh +383 -0
  60. package/core/harnesses/shared/hooks/policies/identity.sh +177 -0
  61. package/core/harnesses/shared/hooks/policies/lib.sh +63 -40
  62. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +3 -2
  63. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +213 -12
  64. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +114 -38
  65. package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
  66. package/core/harnesses/shared/hooks/policies/stop-check.sh +20 -9
  67. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +5 -2
  68. package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
  69. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +60 -155
  70. package/core/harnesses/shared/hooks/stream-hook-runner.js +47 -8
  71. package/core/harnesses/shared/locator/doflow-run +2 -3
  72. package/core/registry/advice.json +3 -3
  73. package/core/registry/assets.json +55 -82
  74. package/core/registry/capabilities.json +12 -0
  75. package/core/registry/contracts.json +58 -31
  76. package/core/registry/contribution-points.json +32 -0
  77. package/core/registry/gates.json +32 -0
  78. package/core/registry/guidance-caps.json +40 -0
  79. package/core/registry/harnesses.json +1442 -363
  80. package/core/registry/lifecycle.json +485 -304
  81. package/core/registry/mcp.json +5 -1
  82. package/core/registry/models.json +7 -1
  83. package/core/registry/package-templates/README.md +19 -0
  84. package/core/registry/package-templates/agent/files/agent.md +9 -0
  85. package/core/registry/package-templates/agent/template.json +4 -0
  86. package/core/registry/package-templates/capability-provider/files/provider.json +9 -0
  87. package/core/registry/package-templates/capability-provider/template.json +11 -0
  88. package/core/registry/package-templates/debate-preset/files/preset.json +26 -0
  89. package/core/registry/package-templates/debate-preset/template.json +4 -0
  90. package/core/registry/package-templates/review-preset/files/preset.json +30 -0
  91. package/core/registry/package-templates/review-preset/template.json +4 -0
  92. package/core/registry/package-templates/skill/files/SKILL.md +8 -0
  93. package/core/registry/package-templates/skill/template.json +4 -0
  94. package/core/registry/package-templates/worker/files/worker.json +92 -0
  95. package/core/registry/package-templates/worker/template.json +11 -0
  96. package/core/registry/packages/doflow/doflow-package.json +15 -0
  97. package/core/registry/packages/doflow/presets/debate-3.json +26 -0
  98. package/core/registry/protocols.json +61 -0
  99. package/core/registry/routes.json +17 -0
  100. package/core/registry/rules.json +431 -0
  101. package/core/registry/settings.json +276 -0
  102. package/core/registry/storage.json +679 -31
  103. package/core/registry/telemetry.json +236 -0
  104. package/core/registry/transcripts.json +142 -0
  105. package/core/registry/verification.json +76 -1
  106. package/core/registry/workflows.json +55 -0
  107. package/core/shared/agent-specs/core-implementer.md +3 -0
  108. package/core/shared/agent-specs/delivery-lead.md +68 -0
  109. package/core/shared/agent-specs/quality-guardian.md +5 -1
  110. package/core/shared/agent-specs/research-writer.md +10 -3
  111. package/core/shared/agent-specs/reviewer.md +53 -0
  112. package/core/shared/agent-specs/spec-analyst.md +5 -6
  113. package/core/shared/agent-specs/system-architect.md +5 -1
  114. package/core/shared/guidance/DOFLOW_CORE.md +1 -5
  115. package/core/shared/guidance/modes/MODE_DeepResearch.md +1 -1
  116. package/core/shared/guidance/modes/MODE_Orchestration.md +4 -3
  117. package/core/shared/guidance/modes/MODE_Task_Management.md +14 -14
  118. package/core/shared/guidance/pointers/codex.md +1 -4
  119. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +30 -16
  120. package/core/shared/guidance/references/ARTIFACT_VOICE.md +3 -2
  121. package/core/shared/guidance/references/CONSTITUTION_BASE.md +17 -15
  122. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +1 -1
  123. package/core/shared/guidance/references/DOFLOW_CHAIN.md +17 -19
  124. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +7 -8
  125. package/core/shared/guidance/references/MODEL_SELECTION.md +5 -3
  126. package/core/shared/guidance/references/ORCHESTRATION.md +1 -2
  127. package/core/shared/guidance/rules/RULES.md +45 -0
  128. package/core/shared/scripts/doflow/bash/do-args.sh +37 -0
  129. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +4 -0
  130. package/core/shared/scripts/doflow/bash/do-git-state.sh +15 -4
  131. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +4 -0
  132. package/core/shared/scripts/doflow/bash/do-paths.sh +40 -2
  133. package/core/shared/scripts/doflow/bash/do-prereqs.sh +2 -1
  134. package/core/shared/scripts/doflow/bash/do-review-package.sh +4 -0
  135. package/core/shared/scripts/doflow/bash/do-task-brief.sh +58 -16
  136. package/core/shared/scripts/doflow/bash/render-audit.sh +26 -2
  137. package/core/shared/scripts/doflow/bash/render-diagrams.sh +1 -0
  138. package/core/shared/scripts/doflow/bash/render-puml.sh +2 -1
  139. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +48 -4
  140. package/core/shared/scripts/doflow/bin/doflow-run +149 -34
  141. package/core/shared/skills/do/SKILL.md +12 -10
  142. package/core/shared/skills/do/references/advice_calls.md +26 -0
  143. package/core/shared/skills/do/references/pm_routing.md +1 -2
  144. package/core/shared/skills/do/references/program_mode.md +31 -0
  145. package/core/shared/skills/do-brainstorm/SKILL.md +20 -74
  146. package/core/shared/skills/do-brainstorm/references/handoff_branches.md +35 -0
  147. package/core/shared/skills/do-brainstorm/references/intent_seed.md +21 -0
  148. package/core/shared/skills/do-brainstorm/references/round_log.md +17 -0
  149. package/core/shared/skills/do-code-review/SKILL.md +41 -144
  150. package/core/shared/skills/do-code-review/content-types/markdown.md +24 -2
  151. package/core/shared/skills/do-code-review/references/tools.md +90 -0
  152. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +549 -7
  153. package/core/shared/skills/do-design/SKILL.md +18 -17
  154. package/core/shared/skills/do-diagnose/SKILL.md +14 -4
  155. package/core/shared/skills/do-document/SKILL.md +11 -1
  156. package/core/shared/skills/do-document/references/deep_research.md +1 -2
  157. package/core/shared/skills/do-document/references/embedded-research.md +18 -6
  158. package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
  159. package/core/shared/skills/do-execute-plan/SKILL.md +15 -58
  160. package/core/shared/skills/do-execute-plan/references/handoff_record.md +7 -2
  161. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +13 -0
  162. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +26 -1
  163. package/core/shared/skills/do-execute-plan/references/run_position.md +13 -1
  164. package/core/shared/skills/do-execute-plan/references/scaffold.md +17 -9
  165. package/core/shared/skills/do-execute-plan/references/state_checkpoint.md +11 -0
  166. package/core/shared/skills/do-execute-plan/references/task_attempts.md +78 -24
  167. package/core/shared/skills/do-flow/SKILL.md +8 -9
  168. package/core/shared/skills/do-flow/references/task_classes.md +2 -2
  169. package/core/shared/skills/do-git/SKILL.md +4 -0
  170. package/core/shared/skills/do-implement/SKILL.md +4 -7
  171. package/core/shared/skills/do-plan/SKILL.md +26 -15
  172. package/core/shared/skills/do-test/SKILL.md +7 -4
  173. package/core/shared/templates/doflow/constitution-template.md +9 -3
  174. package/core/shared/templates/doflow/data-model-template.md +1 -1
  175. package/core/shared/templates/doflow/design-template.md +113 -16
  176. package/core/shared/templates/doflow/plan-template.md +11 -10
  177. package/core/shared/templates/doflow/question-log-template.md +14 -2
  178. package/core/shared/templates/doflow/requirement-template.md +1 -1
  179. package/core/worker-evidence/antigravity/checks.json +14 -0
  180. package/core/worker-evidence/codex/2026-10-18-cli-check.json +107 -0
  181. package/core/worker-evidence/codex/2026-10-18-live-run-edit.json +73 -0
  182. package/core/worker-evidence/codex/2026-10-18-live-run-read-only.json +62 -0
  183. package/core/worker-evidence/codex/2026-10-24-cli-check.json +126 -0
  184. package/core/worker-evidence/codex/checks.json +38 -0
  185. package/package.json +10 -6
  186. package/src/adapters/antigravity/index.js +143 -66
  187. package/src/adapters/claude/index.js +24 -4
  188. package/src/adapters/codex/agents.js +25 -15
  189. package/src/adapters/codex/index.js +48 -13
  190. package/src/adapters/codex/native-projection.js +6 -2
  191. package/src/adapters/copilot/index.js +58 -23
  192. package/src/adapters/copy-tree.js +290 -44
  193. package/src/adapters/guidance-manifest.js +71 -0
  194. package/src/adapters/guidance-pointer.js +19 -0
  195. package/src/adapters/hook-commands.js +6 -10
  196. package/src/adapters/index.js +1 -0
  197. package/src/adapters/kiro/index.js +23 -12
  198. package/src/adapters/opencode/index.js +8 -8
  199. package/src/adapters/pi/hooks.js +2 -1
  200. package/src/adapters/pi/index.js +14 -7
  201. package/src/adapters/resolve-source.js +26 -2
  202. package/src/cli/commands/install.js +2 -1
  203. package/src/cli/commands/reconcile.js +53 -9
  204. package/src/cli/commands/remove.js +2 -2
  205. package/src/cli/commands/rollback.js +6 -3
  206. package/src/cli/commands/self-update.js +18 -9
  207. package/src/cli/commands/status.js +21 -2
  208. package/src/cli/commands/ui.js +99 -0
  209. package/src/cli/commands/update.js +2 -1
  210. package/src/cli/index.js +322 -29
  211. package/src/cli/runtime-commands.js +209 -57
  212. package/src/cli/shared.js +0 -2
  213. package/src/helper/git.js +1 -1
  214. package/src/helper/guardrails.js +1 -1
  215. package/src/helper/marker-merge.js +31 -13
  216. package/src/helper/package-ids.js +37 -0
  217. package/src/helper/semver.js +94 -0
  218. package/src/install/backup.js +105 -15
  219. package/src/install/context.js +1 -1
  220. package/src/install/targets.js +31 -16
  221. package/src/lifecycle/coverage.js +20 -3
  222. package/src/lifecycle/hook-tier.js +160 -0
  223. package/src/lifecycle/index.js +412 -78
  224. package/src/lifecycle/retired-harnesses.js +318 -0
  225. package/src/lifecycle/view.js +35 -15
  226. package/src/registry/index.js +551 -26
  227. package/src/registry/worker-ids.js +45 -0
  228. package/src/release/build-package.js +0 -3
  229. package/src/release/docs-blocks.js +492 -0
  230. package/src/release/preflight.js +425 -0
  231. package/src/release/rehearse.js +401 -0
  232. package/src/release/release-workflow.js +733 -0
  233. package/src/release/sync-plugin-versions.js +43 -7
  234. package/src/runtime/advice/bench-gate.js +25 -0
  235. package/src/runtime/advice/cli.js +59 -16
  236. package/src/runtime/advice/client.js +32 -9
  237. package/src/runtime/advice/config.js +98 -133
  238. package/src/runtime/advice/doctor.js +1 -1
  239. package/src/runtime/advice/elevation.js +97 -0
  240. package/src/runtime/advice/endpoint-guard.js +9 -3
  241. package/src/runtime/advice/mode.js +37 -0
  242. package/src/runtime/advice/record.js +18 -5
  243. package/src/runtime/advice/registry.js +4 -1
  244. package/src/runtime/advice/shadow-config.js +229 -0
  245. package/src/runtime/advice/shadow-dispatcher.js +276 -0
  246. package/src/runtime/brief-rules.js +81 -0
  247. package/src/runtime/brief-tools.js +111 -34
  248. package/src/runtime/candidate.js +20 -11
  249. package/src/runtime/capabilities/executor.js +450 -0
  250. package/src/runtime/capabilities/loopback.js +41 -0
  251. package/src/runtime/capabilities/sanitizer.js +88 -0
  252. package/src/runtime/capability-router.js +135 -3
  253. package/src/runtime/checkouts.js +73 -11
  254. package/src/runtime/claims.js +13 -7
  255. package/src/runtime/cli.js +196 -19
  256. package/src/runtime/config-home.js +42 -0
  257. package/src/runtime/context/arbitrate.js +767 -0
  258. package/src/runtime/context/delivery-store.js +4 -6
  259. package/src/runtime/context/emission-rules.js +118 -0
  260. package/src/runtime/context/identity.js +227 -0
  261. package/src/runtime/context/primary-command.js +117 -0
  262. package/src/runtime/context/primary.js +344 -0
  263. package/src/runtime/context/summary-store.js +655 -0
  264. package/src/runtime/context-pack.js +154 -78
  265. package/src/runtime/decision-register.js +13 -4
  266. package/src/runtime/dispatch/admission.js +392 -0
  267. package/src/runtime/dispatch/attempt-end.js +274 -0
  268. package/src/runtime/dispatch/command.js +628 -0
  269. package/src/runtime/dispatch/controls.js +904 -0
  270. package/src/runtime/dispatch/envelope.js +276 -0
  271. package/src/runtime/dispatch/grants.js +310 -0
  272. package/src/runtime/dispatch/integrate.js +617 -0
  273. package/src/runtime/dispatch/loop.js +1835 -0
  274. package/src/runtime/dispatch/store.js +352 -0
  275. package/src/runtime/dispatch/verify-run.js +201 -0
  276. package/src/runtime/evidence-ledger.js +34 -7
  277. package/src/runtime/failure/capture.js +3 -1
  278. package/src/runtime/failure/cli.js +25 -9
  279. package/src/runtime/failure/home.js +57 -30
  280. package/src/runtime/failure/store.js +7 -2
  281. package/src/runtime/feature-pointer.js +174 -0
  282. package/src/runtime/feature-resolve.js +13 -2
  283. package/src/runtime/fleet/command.js +77 -0
  284. package/src/runtime/fleet/projects.js +178 -0
  285. package/src/runtime/fleet/tree.js +383 -0
  286. package/src/runtime/freshness.js +33 -3
  287. package/src/runtime/git-memo.js +46 -0
  288. package/src/runtime/guidance/ablation.js +427 -0
  289. package/src/runtime/health.js +565 -17
  290. package/src/runtime/history-compactor.js +13 -3
  291. package/src/runtime/implementation-gate.js +277 -22
  292. package/src/runtime/inventory/coverage.js +1 -1
  293. package/src/runtime/inventory/index.js +1 -1
  294. package/src/runtime/inventory/precedence.js +2 -2
  295. package/src/runtime/inventory/siblings.js +6 -4
  296. package/src/runtime/knowledge/code-corpus.js +277 -0
  297. package/src/runtime/knowledge/code-lexical.js +130 -0
  298. package/src/runtime/knowledge/code-retrieval.js +307 -0
  299. package/src/runtime/knowledge/code-validation.js +106 -0
  300. package/src/runtime/knowledge/gp3-gate.js +74 -0
  301. package/src/runtime/knowledge/graph-adapter.js +288 -0
  302. package/src/runtime/knowledge/graph-fallback.js +394 -0
  303. package/src/runtime/knowledge/hybrid.js +136 -8
  304. package/src/runtime/knowledge/retrieval.js +34 -1
  305. package/src/runtime/knowledge/rtk-compress.js +77 -0
  306. package/src/runtime/knowledge/semble-bridge.py +106 -0
  307. package/src/runtime/knowledge/semble-lifecycle.js +114 -0
  308. package/src/runtime/knowledge/semble-provider.js +365 -0
  309. package/src/runtime/lifecycle/cli.js +16 -6
  310. package/src/runtime/lifecycle/event-store.js +8 -6
  311. package/src/runtime/lifecycle/followup.js +6 -1
  312. package/src/runtime/lifecycle/overview.js +24 -1
  313. package/src/runtime/lifecycle/report-store.js +8 -10
  314. package/src/runtime/lifecycle/retention.js +95 -31
  315. package/src/runtime/lifecycle/root.js +9 -1
  316. package/src/runtime/lifecycle/status.js +34 -17
  317. package/src/runtime/lifecycle/store-upkeep.js +56 -7
  318. package/src/runtime/mask.js +134 -7
  319. package/src/runtime/mcp-consultations.js +40 -6
  320. package/src/runtime/model-router.js +79 -7
  321. package/src/runtime/models/catalogue.js +191 -0
  322. package/src/runtime/models/command.js +153 -0
  323. package/src/runtime/off-words.js +12 -0
  324. package/src/runtime/outcome.js +2 -2
  325. package/src/runtime/packages/command.js +1009 -0
  326. package/src/runtime/packages/contributions.js +116 -0
  327. package/src/runtime/packages/digest.js +132 -0
  328. package/src/runtime/packages/fetch.js +182 -0
  329. package/src/runtime/packages/grants.js +192 -0
  330. package/src/runtime/packages/index-file.js +134 -0
  331. package/src/runtime/packages/instruction.js +90 -0
  332. package/src/runtime/packages/manifest.js +331 -0
  333. package/src/runtime/packages/points.js +477 -0
  334. package/src/runtime/packages/programs.js +216 -0
  335. package/src/runtime/packages/scaffold.js +277 -0
  336. package/src/runtime/packages/source.js +90 -0
  337. package/src/runtime/packages/state.js +164 -0
  338. package/src/runtime/packages/store.js +449 -0
  339. package/src/runtime/packages/tar.js +106 -0
  340. package/src/runtime/packages/view.js +406 -0
  341. package/src/runtime/plan-check.js +59 -0
  342. package/src/runtime/plan-content.js +324 -0
  343. package/src/runtime/policy-init.js +118 -0
  344. package/src/runtime/profiles/doctor.js +96 -0
  345. package/src/runtime/profiles/resolve.js +244 -0
  346. package/src/runtime/profiles/rollback.js +254 -0
  347. package/src/runtime/profiles/sampler.js +41 -0
  348. package/src/runtime/readiness-record.js +16 -11
  349. package/src/runtime/readiness.js +46 -5
  350. package/src/runtime/research-request.js +50 -25
  351. package/src/runtime/retrieval-plan.js +10 -30
  352. package/src/runtime/retrieval-record.js +75 -5
  353. package/src/runtime/review/command.js +246 -0
  354. package/src/runtime/review/dominance.js +68 -0
  355. package/src/runtime/review/findings.js +434 -0
  356. package/src/runtime/review/identity.js +255 -0
  357. package/src/runtime/review/protocol-command.js +109 -0
  358. package/src/runtime/review/protocols.js +405 -0
  359. package/src/runtime/review/resolve-protocol.js +302 -0
  360. package/src/runtime/review/start.js +530 -0
  361. package/src/runtime/roadmap/facts.js +479 -0
  362. package/src/runtime/roadmap/gates.js +270 -0
  363. package/src/runtime/roadmap/loop.js +1636 -0
  364. package/src/runtime/roadmap/merge.js +381 -0
  365. package/src/runtime/roadmap/rows.js +1113 -0
  366. package/src/runtime/roadmap/seed.js +951 -0
  367. package/src/runtime/rules-report.js +336 -0
  368. package/src/runtime/scaffold/artifacts.js +60 -9
  369. package/src/runtime/scaffold/generate.js +21 -9
  370. package/src/runtime/settings/autopilot.js +106 -0
  371. package/src/runtime/settings/cli.js +280 -0
  372. package/src/runtime/settings/config-write.js +314 -0
  373. package/src/runtime/settings/files.js +271 -0
  374. package/src/runtime/settings/legacy.js +154 -0
  375. package/src/runtime/settings/lexical.js +56 -0
  376. package/src/runtime/settings/prepared-run.js +269 -0
  377. package/src/runtime/settings/project-layers.js +118 -0
  378. package/src/runtime/settings/refs.js +288 -0
  379. package/src/runtime/settings/registry.js +553 -0
  380. package/src/runtime/settings/resolve.js +713 -0
  381. package/src/runtime/settings/shared.js +37 -0
  382. package/src/runtime/settings/worker-billing.js +107 -0
  383. package/src/runtime/settings/write.js +269 -0
  384. package/src/runtime/slot-command.js +78 -0
  385. package/src/runtime/slots.js +671 -0
  386. package/src/runtime/source-version.js +1 -0
  387. package/src/runtime/state-root.js +217 -0
  388. package/src/runtime/storage/cli.js +12 -5
  389. package/src/runtime/storage/engine.js +9 -2
  390. package/src/runtime/storage/registry.js +14 -1
  391. package/src/runtime/storage/roots.js +66 -16
  392. package/src/runtime/storage/rules.js +82 -10
  393. package/src/runtime/storage/upkeep.js +10 -2
  394. package/src/runtime/storage/work-status.js +245 -26
  395. package/src/runtime/task-attempts.js +589 -69
  396. package/src/runtime/task-classifier.js +47 -11
  397. package/src/runtime/task-graph.js +373 -0
  398. package/src/runtime/task-run.js +778 -0
  399. package/src/runtime/task-scope.js +176 -55
  400. package/src/runtime/task-sources.js +147 -0
  401. package/src/runtime/task-state.js +374 -64
  402. package/src/runtime/team/admission.js +301 -0
  403. package/src/runtime/team/envelope.js +324 -0
  404. package/src/runtime/team/review-guard.js +156 -0
  405. package/src/runtime/trace/analyze.js +427 -0
  406. package/src/runtime/trace/baseline.js +770 -0
  407. package/src/runtime/trace/ledger.js +63 -140
  408. package/src/runtime/trace/otlp-export.js +568 -0
  409. package/src/runtime/trace/otlp-map.js +481 -0
  410. package/src/runtime/trace/spans.js +745 -0
  411. package/src/runtime/trace/telemetry.js +225 -0
  412. package/src/runtime/trace/views.js +1 -0
  413. package/src/runtime/transcripts/command.js +98 -0
  414. package/src/runtime/transcripts/cursor.js +326 -0
  415. package/src/runtime/transcripts/read.js +126 -0
  416. package/src/runtime/transcripts/readers/claude-jsonl.js +74 -0
  417. package/src/runtime/transcripts/readers/codex-rollout.js +70 -0
  418. package/src/runtime/transcripts/readers/copilot-events.js +90 -0
  419. package/src/runtime/transcripts/readers/kiro-jsonl.js +77 -0
  420. package/src/runtime/transcripts/readers/pi-jsonl.js +59 -0
  421. package/src/runtime/transcripts/registry.js +161 -0
  422. package/src/runtime/transcripts/stats.js +161 -0
  423. package/src/runtime/verification/check-key.js +628 -0
  424. package/src/runtime/verification/contract-runner.js +546 -11
  425. package/src/runtime/verification/engine.js +499 -9
  426. package/src/runtime/verification/impact.js +617 -0
  427. package/src/runtime/verification/inflight.js +205 -0
  428. package/src/runtime/verification/registry.js +176 -0
  429. package/src/runtime/verification/reuse.js +184 -0
  430. package/src/runtime/verification/telemetry-emit.js +254 -0
  431. package/src/runtime/verification/test-selection.js +67 -7
  432. package/src/runtime/worker/active.js +90 -0
  433. package/src/runtime/worker/cancel.js +222 -0
  434. package/src/runtime/worker/catalogue.js +122 -0
  435. package/src/runtime/worker/command.js +677 -0
  436. package/src/runtime/worker/evidence.js +288 -0
  437. package/src/runtime/worker/launch.js +288 -0
  438. package/src/runtime/worker/models.js +137 -0
  439. package/src/runtime/worker/parsers.js +218 -0
  440. package/src/runtime/worker/probes/index.js +706 -0
  441. package/src/runtime/worker/process-tree.js +415 -0
  442. package/src/runtime/worker/quota.js +43 -0
  443. package/src/runtime/worker/readiness.js +713 -0
  444. package/src/runtime/worker/run-store.js +166 -0
  445. package/src/runtime/worker/supervisor.js +541 -0
  446. package/src/runtime/worker/worktree-check.js +252 -0
  447. package/src/runtime/workflow-engine.js +5 -1
  448. package/src/runtime/workflow-orchestrator.js +578 -63
  449. package/src/runtime/worktree.js +149 -22
  450. package/src/state/index.js +1 -1
  451. package/src/state/lockfile.js +64 -10
  452. package/src/state/run-lock.js +1 -1
  453. package/types/node-commonjs.d.ts +106 -7
  454. package/core/harnesses/gemini/hooks/hooks.json +0 -77
  455. package/core/harnesses/gemini/hooks/lib.sh +0 -302
  456. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +0 -10
  457. package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
  458. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -10
  459. package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
  460. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -10
  461. package/core/harnesses/gemini/hooks/session-end.impl.sh +0 -89
  462. package/core/harnesses/gemini/hooks/session-end.sh +0 -5
  463. package/core/harnesses/gemini/hooks/session-start.sh +0 -7
  464. package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
  465. package/core/shared/guidance/FLAGS.md +0 -25
  466. package/core/shared/guidance/rules/RULE_01_SAFETY.md +0 -25
  467. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +0 -23
  468. package/core/shared/guidance/rules/RULE_03_QUALITY.md +0 -14
  469. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +0 -46
  470. package/src/adapters/gemini/hooks.js +0 -251
  471. package/src/adapters/gemini/index.js +0 -429
@@ -0,0 +1,274 @@
1
+ 'use strict';
2
+
3
+ // Feature 082 B.3 (IC-024, IC-008 usage; DEC-007, DEC-026, DEC-039, DEC-053): the attempt-end rule.
4
+ //
5
+ // Every way the loop ends a dispatch's 080 attempt goes through this module, so `integrate.ts` and
6
+ // `loop.ts` share one rule and `integrate.ts` never requires `loop.ts` (DEC-053). Each `*Attempt`
7
+ // function runs inside a `mutateDispatch` decide callback: it takes the store that callback holds,
8
+ // makes one in-process 080 call (`finish` or `release`, each taking the ledger lock inside it, the
9
+ // lock order of IC-006), changes the store in place and returns the callback's `{ write, result }`.
10
+ // I/O is limited to the 080 calls and one bounded read of one small file (IC-013).
11
+ // It runs no git, spawns nothing, signals nothing and waits on nothing.
12
+ //
13
+ // The repeat rule (DEC-007, DEC-026): a failure finishes 080 FAILED with `<class>: <detail>`, unless
14
+ // the task's previous finished dispatch, released ones ignored, failed with the same class; then it
15
+ // finishes BLOCKED with `<class>: repeated`, so 080 derives the task BLOCKED and admission never
16
+ // picks it again. Retries spend 080's per-task attempt budget; nothing here counts them.
17
+ //
18
+ // Usage (IC-008, DEC-039): every finish and release passes `tokens` and `basis`, so no attempt the
19
+ // loop ends is `unreported`. An 080 call that throws, or refuses, records `lastError` on the
20
+ // dispatch and changes nothing else (IC-024).
21
+ //
22
+ // Feature 106 A.2 (IC-003): the eleventh class, `quota`, releases its attempt (the task stays
23
+ // pending) and ends the dispatch `failed` with `failureClass: 'quota'`; the repeat rule skips such a
24
+ // dispatch, because it was released, not finished. Every other class is unchanged.
25
+
26
+ const { finish, release } = require('../task-attempts.js');
27
+ const { maskLine } = require('../mask.js');
28
+ const { DispatchStoreError } = require('./store.js');
29
+ const { stateDir } = require('../context/identity.js');
30
+
31
+ /** IC-024's eleven failure classes (106 IC-003 adds `quota`), each with the 080 call that ends its attempt and whether the
32
+ * worker run is then ended with `cancelRun` (outside the lock, by the caller). */
33
+ const CLASS_CALLS = Object.freeze({
34
+ conflict: Object.freeze({ call: 'finish', cancelRun: false }),
35
+ verification: Object.freeze({ call: 'finish', cancelRun: false }),
36
+ timeout: Object.freeze({ call: 'finish', cancelRun: true }),
37
+ 'worker-failure': Object.freeze({ call: 'finish', cancelRun: false }),
38
+ 'worker-denied': Object.freeze({ call: 'finish', cancelRun: false }),
39
+ 'worker-unparsed': Object.freeze({ call: 'finish', cancelRun: false }),
40
+ quota: Object.freeze({ call: 'release', cancelRun: false }), // 106 IC-003
41
+ isolation: Object.freeze({ call: 'finish', cancelRun: false }),
42
+ lost: Object.freeze({ call: 'finish', cancelRun: true }),
43
+ launch: Object.freeze({ call: 'finish', cancelRun: false }),
44
+ interrupted: Object.freeze({ call: 'release', cancelRun: false }),
45
+ });
46
+ const FAILURE_CLASSES = Object.freeze(Object.keys(CLASS_CALLS));
47
+
48
+ /** IC-024's signal column, one token per signal, to its class. */
49
+ const SIGNALS = Object.freeze({
50
+ conflict: 'conflict', // IC-018 step 4
51
+ verification: 'verification', // IC-019 not passing
52
+ deadline: 'timeout', // IC-025
53
+ 'report-failure': 'worker-failure',
54
+ 'not-exited': 'worker-failure', // only after a non-zero exit; the caller decides that
55
+ 'submit-failure': 'worker-failure', // `submit --status failure`
56
+ 'report-denied': 'worker-denied',
57
+ 'report-unparsed': 'worker-unparsed',
58
+ 'report-quota': 'quota', // 106 IC-002 / IC-003
59
+ 'outside-write': 'isolation',
60
+ 'branch-moved': 'isolation',
61
+ 'isolation-unverifiable': 'isolation',
62
+ 'group-survived': 'isolation',
63
+ 'status-unknown': 'lost', // 081 status `unknown`
64
+ 'run-refused': 'launch', // 081 run refused
65
+ 'not-started': 'launch', // `process.kind: 'not-started'`
66
+ 'driver-gone': 'interrupted', // a `claimed` dispatch whose driver is gone (IC-032)
67
+ });
68
+
69
+ /** Dispatch phases an attempt may be ended from: a token is held and the dispatch is not ended. */
70
+ const LIVE_PHASES = Object.freeze(['claimed', 'launched', 'collected', 'integrating']);
71
+ /** Dispositions recorded by a release (IC-023, IC-024, IC-031, IC-032). */
72
+ const RELEASE_DISPOSITIONS = Object.freeze(['released', 'stale', 'interrupted', 'taken-over']);
73
+ /** Dispositions recorded by an 080 finish; only these count for the repeat rule. */
74
+ const FINISHED_DISPOSITIONS = Object.freeze(['completed', 'failed']);
75
+ const DETAIL_CHARS = 200;
76
+
77
+ function usageError(message ) {
78
+ return new DispatchStoreError('usage', message);
79
+ }
80
+
81
+ /** IC-024: `{ failureClass, call, cancelRun }` for a signal token; an unknown token is a caller defect. */
82
+ function classFor(signal ) {
83
+ const failureClass = Object.hasOwn(SIGNALS, signal) ? SIGNALS[signal] : null;
84
+ if (!failureClass) throw usageError(`unknown attempt-end signal '${signal}'; known: ${Object.keys(SIGNALS).join(', ')}`);
85
+ return { failureClass, ...CLASS_CALLS[failureClass] };
86
+ }
87
+
88
+ const wholeTokens = (value ) => Number.isInteger(value) && value >= 0;
89
+
90
+ /** 081 `report.usage` is `{ tokens }` or null; an integer is read as the same thing. */
91
+ function measuredTokens(run ) {
92
+ const usage = run && run.report ? run.report.usage : null;
93
+ if (wholeTokens(usage)) return usage;
94
+ return usage && wholeTokens(usage.tokens) ? usage.tokens : null;
95
+ }
96
+
97
+ function reservationUsage(dispatch ) {
98
+ const tokens = dispatch && dispatch.reservation && wholeTokens(dispatch.reservation.tokens) ? dispatch.reservation.tokens : 0;
99
+ return { tokens, basis: 'estimated' };
100
+ }
101
+
102
+ /**
103
+ * IC-008's usage table. With a worker run whose 081 `report.usage` is known: its tokens plus every
104
+ * measured child's, `measured` only when every part is. With no worker run, the usage a
105
+ * main-session submit stored on the dispatch. Otherwise the reservation (0 with none), `estimated`.
106
+ */
107
+ function usageFor(dispatch , workerRun , children = []) {
108
+ const own = measuredTokens(workerRun);
109
+ if (own !== null) {
110
+ const parts = (children || []).map(measuredTokens);
111
+ const tokens = parts.reduce((sum , part ) => sum + (part ?? 0), own);
112
+ return { tokens, basis: parts.every((part) => part !== null) ? 'measured' : 'estimated' };
113
+ }
114
+ if (!workerRun && dispatch && dispatch.usage && wholeTokens(dispatch.usage.tokens)
115
+ && (dispatch.usage.basis === 'measured' || dispatch.usage.basis === 'estimated')) {
116
+ return { tokens: dispatch.usage.tokens, basis: dispatch.usage.basis };
117
+ }
118
+ return reservationUsage(dispatch);
119
+ }
120
+
121
+ /** `detail` masked by `maskLine` and cut to 200 characters without splitting a code point. */
122
+ function maskedDetail(detail ) {
123
+ if (detail === undefined || detail === null) return '';
124
+ const text = maskLine(String(detail)).text.replace(/\s+/g, ' ').trim();
125
+ const chars = Array.from(text);
126
+ return chars.length <= DETAIL_CHARS ? text : chars.slice(0, DETAIL_CHARS).join('');
127
+ }
128
+
129
+ /** The task's previous finished dispatch before `current`: highest 080 token below its own, released
130
+ * ones (every other release disposition, and a `quota` end, which released) ignored (DEC-007). */
131
+ function previousFinished(store , current ) {
132
+ let previous = null;
133
+ for (const other of Object.values(store.dispatches) ) {
134
+ if (other.dispatchId === current.dispatchId || other.task !== current.task || other.phase !== 'ended') continue;
135
+ if (!FINISHED_DISPOSITIONS.includes(other.disposition) || !Number.isInteger(other.token) || other.failureClass === 'quota') continue;
136
+ if (other.token >= current.token) continue;
137
+ if (!previous || other.token > previous.token) previous = other;
138
+ }
139
+ return previous;
140
+ }
141
+
142
+ /** The live dispatch `dispatchId`, or the no-write refusal for an unknown or ended one. */
143
+ function liveDispatch(store , dispatchId ) {
144
+ const dispatch = store && store.dispatches ? store.dispatches[dispatchId] : null;
145
+ if (!dispatch) return { refused: { write: false, result: { ended: false, reason: 'unknown-dispatch', dispatchId } } };
146
+ if (!LIVE_PHASES.includes(dispatch.phase)) {
147
+ return { refused: { write: false, result: { ended: false, reason: 'phase-not-allowed', dispatchId, phase: dispatch.phase } } };
148
+ }
149
+ if (!Number.isInteger(dispatch.token) || dispatch.token < 1) throw usageError(`dispatch '${dispatchId}' holds no 080 token`);
150
+ return { dispatch };
151
+ }
152
+
153
+ function contextOf(ctx ) {
154
+ if (!ctx || typeof ctx.ledgerFile !== 'string' || !Array.isArray(ctx.roots) || typeof ctx.slug !== 'string') {
155
+ throw usageError('ctx needs ledgerFile, roots and slug for the in-process 080 call');
156
+ }
157
+ return ctx;
158
+ }
159
+
160
+ /** IC-013: the served model from this dispatch's worker observation, without changing the record. */
161
+ function servedModel(dispatch , ctx ) {
162
+ const plain = (value ) => value !== null && typeof value === 'object'
163
+ && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
164
+ if (!plain(dispatch.model) || !plain(dispatch.workerIdentity)
165
+ || typeof dispatch.harness !== 'string' || dispatch.harness.length === 0
166
+ || !ctx.env || typeof ctx.env !== 'object') return null;
167
+ const { readWorkerObservation } = require('../context/primary.js');
168
+ return readWorkerObservation({
169
+ root: stateDir(ctx.env), identity: dispatch.workerIdentity, harness: dispatch.harness, fsImpl: ctx.fsImpl,
170
+ })?.model ?? null;
171
+ }
172
+
173
+ /**
174
+ * One in-process 080 call. Applied: the dispatch ends with `ended` and the 080 result. A refusal, a
175
+ * stale answer or a thrown 080 error (a `TaskAttemptError`, such as `plan-malformed`): `lastError`
176
+ * is recorded and nothing else changes (IC-024). Any other throw is a defect and propagates.
177
+ */
178
+ function call080(dispatch , name , args , ctx , ended ) {
179
+ const now = ctx.now instanceof Date ? ctx.now : new Date();
180
+ const fn = name === 'finish' ? finish : release;
181
+ let answer ;
182
+ try {
183
+ answer = fn({
184
+ file: ctx.ledgerFile, fsImpl: ctx.fsImpl, roots: ctx.roots, slug: ctx.slug,
185
+ task: dispatch.task, token: dispatch.token, env: ctx.env, cwd: ctx.cwd, now, ...args,
186
+ });
187
+ } catch (error ) {
188
+ if (!error || error.name !== 'TaskAttemptError' || typeof error.code !== 'string') throw error;
189
+ dispatch.lastError = { at: now.toISOString(), call: name, reason: error.code };
190
+ return { write: true, result: { ended: false, outcome: 'error', call: name, reason: error.code, dispatchId: dispatch.dispatchId } };
191
+ }
192
+ const applied = name === 'finish' ? answer.disposition === 'applied' : answer.disposition === 'released';
193
+ if (!applied) {
194
+ dispatch.lastError = { at: now.toISOString(), call: name, reason: answer.reason || answer.disposition };
195
+ return { write: true, result: { ended: false, outcome: answer.disposition, call: name, reason: answer.reason || null, dispatchId: dispatch.dispatchId } };
196
+ }
197
+ const served = servedModel(dispatch, ctx);
198
+ if (served !== null) dispatch.model = { ...dispatch.model, served };
199
+ Object.assign(dispatch, ended, { phase: 'ended', endedAt: now.toISOString(), usage: { tokens: args.tokens, basis: args.basis } });
200
+ return {
201
+ write: true,
202
+ result: { ended: true, dispatchId: dispatch.dispatchId, task: dispatch.task, token: dispatch.token, disposition: ended.disposition, failureClass: ended.failureClass ?? null, attempt: answer },
203
+ };
204
+ }
205
+
206
+ /**
207
+ * IC-024: ends a failed attempt by its class's 080 call. A `finish` class finishes FAILED with
208
+ * `<class>: <detail>`, or BLOCKED with `<class>: repeated` when the task's previous finished
209
+ * dispatch failed with the same class; the dispatch ends `failed` with `failureClass`. The
210
+ * `interrupted` class releases instead and ends `interrupted`; `quota` releases and ends `failed`
211
+ * (106 IC-003). `usage` defaults to `usageFor`
212
+ * over the dispatch alone; `evidenceId` (a verification's) is passed to 080 and stored.
213
+ */
214
+ function endAttempt({ store, dispatchId, failureClass, detail, usage, evidenceId, ctx } ) {
215
+ if (!Object.hasOwn(CLASS_CALLS, failureClass)) throw usageError(`unknown failure class '${failureClass}'; known: ${FAILURE_CLASSES.join(', ')}`);
216
+ const context = contextOf(ctx);
217
+ const { dispatch, refused } = liveDispatch(store, dispatchId);
218
+ if (refused) return refused;
219
+ const spent = usage || usageFor(dispatch, null, []);
220
+ const text = maskedDetail(detail);
221
+ const reason = text ? `${failureClass}: ${text}` : failureClass;
222
+ if (CLASS_CALLS[failureClass].call === 'release') {
223
+ return call080(dispatch, 'release', { reason, tokens: spent.tokens, basis: spent.basis }, context,
224
+ { disposition: failureClass === 'quota' ? 'failed' : 'interrupted', failureClass });
225
+ }
226
+ const previous = previousFinished(store, dispatch);
227
+ const repeated = Boolean(previous && previous.disposition === 'failed' && previous.failureClass === failureClass);
228
+ const ended = { disposition: 'failed', failureClass };
229
+ if (evidenceId) ended.evidenceId = evidenceId;
230
+ return call080(dispatch, 'finish', {
231
+ result: repeated ? 'BLOCKED' : 'FAILED',
232
+ reason: repeated ? `${failureClass}: repeated` : reason,
233
+ evidenceId: evidenceId || undefined,
234
+ tokens: spent.tokens, basis: spent.basis,
235
+ }, context, ended);
236
+ }
237
+
238
+ /** IC-018 step 6: finishes the attempt COMPLETED with the verification's evidence id and usage. */
239
+ function completeAttempt({ store, dispatchId, evidenceId, usage, integratedCommit, ctx } ) {
240
+ if (typeof evidenceId !== 'string' || !evidenceId) throw usageError('completeAttempt needs the evidence id of the passing verification');
241
+ const context = contextOf(ctx);
242
+ const { dispatch, refused } = liveDispatch(store, dispatchId);
243
+ if (refused) return refused;
244
+ const spent = usage || usageFor(dispatch, null, []);
245
+ const ended = { disposition: 'completed', failureClass: null, evidenceId };
246
+ if (integratedCommit !== undefined) ended.integratedCommit = integratedCommit;
247
+ return call080(dispatch, 'finish', { result: 'COMPLETED', evidenceId, tokens: spent.tokens, basis: spent.basis }, context, ended);
248
+ }
249
+
250
+ /** IC-023, IC-024, IC-031: releases the attempt with `reason` and usage, never finishing it; the
251
+ * dispatch ends with `disposition` (default `released`), which the repeat rule ignores. */
252
+ function releaseAttempt({ store, dispatchId, reason, disposition = 'released', usage, ctx } ) {
253
+ if (typeof reason !== 'string' || !reason.trim()) throw usageError('releaseAttempt needs a reason');
254
+ if (!RELEASE_DISPOSITIONS.includes(disposition)) throw usageError(`release disposition '${disposition}' is not one of ${RELEASE_DISPOSITIONS.join(', ')}`);
255
+ const context = contextOf(ctx);
256
+ const { dispatch, refused } = liveDispatch(store, dispatchId);
257
+ if (refused) return refused;
258
+ const spent = usage || usageFor(dispatch, null, []);
259
+ return call080(dispatch, 'release', { reason: maskedDetail(reason) || 'released', tokens: spent.tokens, basis: spent.basis }, context,
260
+ { disposition, failureClass: null });
261
+ }
262
+
263
+ module.exports = {
264
+ FAILURE_CLASSES,
265
+ CLASS_CALLS,
266
+ SIGNALS,
267
+ LIVE_PHASES,
268
+ RELEASE_DISPOSITIONS,
269
+ classFor,
270
+ usageFor,
271
+ endAttempt,
272
+ completeAttempt,
273
+ releaseAttempt,
274
+ };