@tacuchi/agent-workflow-cli 25.7.0 → 25.9.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 (580) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README.md +5 -1
  3. package/dist/adapters/git-cli.js +311 -24
  4. package/dist/adapters/git-cli.js.map +1 -1
  5. package/dist/adapters/node-file-system.js +48 -0
  6. package/dist/adapters/node-file-system.js.map +1 -1
  7. package/dist/application/amend-service.js +51 -14
  8. package/dist/application/amend-service.js.map +1 -1
  9. package/dist/application/branch-resolver.js +6 -3
  10. package/dist/application/branch-resolver.js.map +1 -1
  11. package/dist/application/capability/design-handler.js +124 -43
  12. package/dist/application/capability/design-handler.js.map +1 -1
  13. package/dist/application/capability/dispatcher.js +4 -1
  14. package/dist/application/capability/dispatcher.js.map +1 -1
  15. package/dist/application/capability/durable-effect.js +3 -0
  16. package/dist/application/capability/durable-effect.js.map +1 -1
  17. package/dist/application/capability/readiness.js +26 -10
  18. package/dist/application/capability/readiness.js.map +1 -1
  19. package/dist/application/capability/wrapper.js +10 -3
  20. package/dist/application/capability/wrapper.js.map +1 -1
  21. package/dist/application/check-branch-service.js +158 -19
  22. package/dist/application/check-branch-service.js.map +1 -1
  23. package/dist/application/checkpoint/markdown.js +2 -2
  24. package/dist/application/checkpoint/markdown.js.map +1 -1
  25. package/dist/application/checkpoint/state-reader.js +12 -0
  26. package/dist/application/checkpoint/state-reader.js.map +1 -1
  27. package/dist/application/checkpoint-service.js +12 -4
  28. package/dist/application/checkpoint-service.js.map +1 -1
  29. package/dist/application/checkpoint-write-service.js +91 -17
  30. package/dist/application/checkpoint-write-service.js.map +1 -1
  31. package/dist/application/claims-ledger.js +137 -11
  32. package/dist/application/claims-ledger.js.map +1 -1
  33. package/dist/application/claims-recovery.js +85 -44
  34. package/dist/application/claims-recovery.js.map +1 -1
  35. package/dist/application/database-tool-catalog.js +33 -0
  36. package/dist/application/database-tool-catalog.js.map +1 -1
  37. package/dist/application/design/consumer-document.js +2 -2
  38. package/dist/application/design/consumer-document.js.map +1 -1
  39. package/dist/application/design/design-content-gate-service.js +20 -2
  40. package/dist/application/design/design-content-gate-service.js.map +1 -1
  41. package/dist/application/design/design-gate-service.js +2 -0
  42. package/dist/application/design/design-gate-service.js.map +1 -1
  43. package/dist/application/design/design-index-service.js +4 -0
  44. package/dist/application/design/design-index-service.js.map +1 -1
  45. package/dist/application/design/design-publish-service.js +1 -4
  46. package/dist/application/design/design-publish-service.js.map +1 -1
  47. package/dist/application/design/design-record-service.js +13 -7
  48. package/dist/application/design/design-record-service.js.map +1 -1
  49. package/dist/application/design/design-resolver-service.js +22 -3
  50. package/dist/application/design/design-resolver-service.js.map +1 -1
  51. package/dist/application/design/design-simple-service.js +24 -5
  52. package/dist/application/design/design-simple-service.js.map +1 -1
  53. package/dist/application/design/digest.js +41 -0
  54. package/dist/application/design/digest.js.map +1 -0
  55. package/dist/application/dev-only-services.js +171 -27
  56. package/dist/application/dev-only-services.js.map +1 -1
  57. package/dist/application/doc-branch-ledger.js +145 -0
  58. package/dist/application/doc-branch-ledger.js.map +1 -0
  59. package/dist/application/docs-canon-service.js +1 -1
  60. package/dist/application/docs-canon-service.js.map +1 -1
  61. package/dist/application/doctor/dist-integrity.js +113 -0
  62. package/dist/application/doctor/dist-integrity.js.map +1 -0
  63. package/dist/application/doctor/hosts.js +5 -2
  64. package/dist/application/doctor/hosts.js.map +1 -1
  65. package/dist/application/doctor/prepare.js +4 -1
  66. package/dist/application/doctor/prepare.js.map +1 -1
  67. package/dist/application/doctor/provider-installation.js +39 -19
  68. package/dist/application/doctor/provider-installation.js.map +1 -1
  69. package/dist/application/doctor/provider-mcps.js +10 -2
  70. package/dist/application/doctor/provider-mcps.js.map +1 -1
  71. package/dist/application/doctor/provider-skills.js +25 -0
  72. package/dist/application/doctor/provider-skills.js.map +1 -1
  73. package/dist/application/doctor/provider-visibility.js +76 -3
  74. package/dist/application/doctor/provider-visibility.js.map +1 -1
  75. package/dist/application/doctor/provider-workspace-block.js +156 -0
  76. package/dist/application/doctor/provider-workspace-block.js.map +1 -0
  77. package/dist/application/doctor/repair-runner.js +47 -3
  78. package/dist/application/doctor/repair-runner.js.map +1 -1
  79. package/dist/application/doctor/report.js +24 -4
  80. package/dist/application/doctor/report.js.map +1 -1
  81. package/dist/application/doctor/skills-toml-migrate.js +76 -0
  82. package/dist/application/doctor/skills-toml-migrate.js.map +1 -0
  83. package/dist/application/export-catalog-check.js +200 -0
  84. package/dist/application/export-catalog-check.js.map +1 -0
  85. package/dist/application/export-service.js +716 -79
  86. package/dist/application/export-service.js.map +1 -1
  87. package/dist/application/fix-git-service.js +285 -64
  88. package/dist/application/fix-git-service.js.map +1 -1
  89. package/dist/application/flow/advance.js +241 -30
  90. package/dist/application/flow/advance.js.map +1 -1
  91. package/dist/application/flow/annul-service.js +3 -1
  92. package/dist/application/flow/annul-service.js.map +1 -1
  93. package/dist/application/flow/batch-commit.js +189 -0
  94. package/dist/application/flow/batch-commit.js.map +1 -0
  95. package/dist/application/flow/checkout-observation.js +110 -8
  96. package/dist/application/flow/checkout-observation.js.map +1 -1
  97. package/dist/application/flow/close-artifacts.js +105 -0
  98. package/dist/application/flow/close-artifacts.js.map +1 -0
  99. package/dist/application/flow/close-at-boundary.js +155 -0
  100. package/dist/application/flow/close-at-boundary.js.map +1 -0
  101. package/dist/application/flow/close-document-guidance.js +70 -0
  102. package/dist/application/flow/close-document-guidance.js.map +1 -0
  103. package/dist/application/flow/flow-service.js +49 -5
  104. package/dist/application/flow/flow-service.js.map +1 -1
  105. package/dist/application/flow/internal-actions.js +361 -80
  106. package/dist/application/flow/internal-actions.js.map +1 -1
  107. package/dist/application/flow/internal-drive.js +47 -19
  108. package/dist/application/flow/internal-drive.js.map +1 -1
  109. package/dist/application/flow/plan-entry.js +82 -0
  110. package/dist/application/flow/plan-entry.js.map +1 -0
  111. package/dist/application/flow/prove.js +32 -1
  112. package/dist/application/flow/prove.js.map +1 -1
  113. package/dist/application/flow/quick-checkouts.js +48 -0
  114. package/dist/application/flow/quick-checkouts.js.map +1 -0
  115. package/dist/application/flow/reinfer-batch.js +177 -0
  116. package/dist/application/flow/reinfer-batch.js.map +1 -0
  117. package/dist/application/flow/reopen-run.js +159 -0
  118. package/dist/application/flow/reopen-run.js.map +1 -0
  119. package/dist/application/flow/run-journey.js +11 -8
  120. package/dist/application/flow/run-journey.js.map +1 -1
  121. package/dist/application/flow/run-projection.js +16 -5
  122. package/dist/application/flow/run-projection.js.map +1 -1
  123. package/dist/application/flow/run-state-service.js +3 -1
  124. package/dist/application/flow/run-state-service.js.map +1 -1
  125. package/dist/application/flow/submit.js +731 -154
  126. package/dist/application/flow/submit.js.map +1 -1
  127. package/dist/application/generate-launch-service.js +16 -6
  128. package/dist/application/generate-launch-service.js.map +1 -1
  129. package/dist/application/git-flow-service.js +34 -3
  130. package/dist/application/git-flow-service.js.map +1 -1
  131. package/dist/application/history-publications.js +24 -0
  132. package/dist/application/history-publications.js.map +1 -1
  133. package/dist/application/history-reconcile-service.js +45 -0
  134. package/dist/application/history-reconcile-service.js.map +1 -0
  135. package/dist/application/history-table.js +61 -12
  136. package/dist/application/history-table.js.map +1 -1
  137. package/dist/application/history-update-service.js +25 -4
  138. package/dist/application/history-update-service.js.map +1 -1
  139. package/dist/application/hook-branch-check.js +25 -3
  140. package/dist/application/hook-branch-check.js.map +1 -1
  141. package/dist/application/hook-git-commit-advisor.js +3 -4
  142. package/dist/application/hook-git-commit-advisor.js.map +1 -1
  143. package/dist/application/hook-sql-mutation-guard.js +147 -12
  144. package/dist/application/hook-sql-mutation-guard.js.map +1 -1
  145. package/dist/application/hook-turn-start.js +51 -0
  146. package/dist/application/hook-turn-start.js.map +1 -0
  147. package/dist/application/host-memory/codex.js +1 -1
  148. package/dist/application/host-memory/codex.js.map +1 -1
  149. package/dist/application/hub-registry.js +135 -0
  150. package/dist/application/hub-registry.js.map +1 -0
  151. package/dist/application/local-proposal.js +72 -19
  152. package/dist/application/local-proposal.js.map +1 -1
  153. package/dist/application/mcp-host-reader.js +1 -1
  154. package/dist/application/mcp-host-reader.js.map +1 -1
  155. package/dist/application/mcp-host-writer.js +16 -10
  156. package/dist/application/mcp-host-writer.js.map +1 -1
  157. package/dist/application/merge-state-service.js +150 -34
  158. package/dist/application/merge-state-service.js.map +1 -1
  159. package/dist/application/multiroot/claude.js +17 -10
  160. package/dist/application/multiroot/claude.js.map +1 -1
  161. package/dist/application/multiroot/codex.js +17 -11
  162. package/dist/application/multiroot/codex.js.map +1 -1
  163. package/dist/application/multiroot-service.js +52 -28
  164. package/dist/application/multiroot-service.js.map +1 -1
  165. package/dist/application/parsers/execution-batches.js +64 -0
  166. package/dist/application/parsers/execution-batches.js.map +1 -0
  167. package/dist/application/parsers/phases.js +23 -2
  168. package/dist/application/parsers/phases.js.map +1 -1
  169. package/dist/application/parsers/project-block.js +146 -17
  170. package/dist/application/parsers/project-block.js.map +1 -1
  171. package/dist/application/parsers/tasks.js +16 -2
  172. package/dist/application/parsers/tasks.js.map +1 -1
  173. package/dist/application/parsers/toml.js +19 -0
  174. package/dist/application/parsers/toml.js.map +1 -0
  175. package/dist/application/paths-service.js +13 -16
  176. package/dist/application/paths-service.js.map +1 -1
  177. package/dist/application/persist-service.js +118 -5
  178. package/dist/application/persist-service.js.map +1 -1
  179. package/dist/application/plan-exec-batch-service.js +162 -22
  180. package/dist/application/plan-exec-batch-service.js.map +1 -1
  181. package/dist/application/plan-exec-decision-service.js +61 -12
  182. package/dist/application/plan-exec-decision-service.js.map +1 -1
  183. package/dist/application/plan-exec-plan-diff.js +105 -0
  184. package/dist/application/plan-exec-plan-diff.js.map +1 -0
  185. package/dist/application/plan-lint-service.js +2 -0
  186. package/dist/application/plan-lint-service.js.map +1 -1
  187. package/dist/application/plan-passes.js +41 -0
  188. package/dist/application/plan-passes.js.map +1 -0
  189. package/dist/application/preparation-receipts.js +58 -0
  190. package/dist/application/preparation-receipts.js.map +1 -0
  191. package/dist/application/project-md-upsert-service.js +191 -52
  192. package/dist/application/project-md-upsert-service.js.map +1 -1
  193. package/dist/application/project-tab-data.js +40 -10
  194. package/dist/application/project-tab-data.js.map +1 -1
  195. package/dist/application/release-data/artifacts.js +15 -7
  196. package/dist/application/release-data/artifacts.js.map +1 -1
  197. package/dist/application/release-data/bundles.js +52 -6
  198. package/dist/application/release-data/bundles.js.map +1 -1
  199. package/dist/application/release-data/common.js +2 -2
  200. package/dist/application/release-data/common.js.map +1 -1
  201. package/dist/application/release-data/rollback.js +7 -0
  202. package/dist/application/release-data/rollback.js.map +1 -0
  203. package/dist/application/release-data/sessions.js +2 -2
  204. package/dist/application/release-data/sessions.js.map +1 -1
  205. package/dist/application/release-pass-ledger.js +1 -1
  206. package/dist/application/render/history-row.js +2 -0
  207. package/dist/application/render/history-row.js.map +1 -1
  208. package/dist/application/render/project-block.js +28 -11
  209. package/dist/application/render/project-block.js.map +1 -1
  210. package/dist/application/reseal-service.js +1 -0
  211. package/dist/application/reseal-service.js.map +1 -1
  212. package/dist/application/resume-service.js +55 -8
  213. package/dist/application/resume-service.js.map +1 -1
  214. package/dist/application/retirement/apply.js +25 -7
  215. package/dist/application/retirement/apply.js.map +1 -1
  216. package/dist/application/retirement/attribution.js +121 -48
  217. package/dist/application/retirement/attribution.js.map +1 -1
  218. package/dist/application/retirement/prepare.js +17 -11
  219. package/dist/application/retirement/prepare.js.map +1 -1
  220. package/dist/application/retirement/preview.js +2 -1
  221. package/dist/application/retirement/preview.js.map +1 -1
  222. package/dist/application/self/codex-plugin.js +1 -1
  223. package/dist/application/self/codex-plugin.js.map +1 -1
  224. package/dist/application/self/host-states.js +3 -3
  225. package/dist/application/self/host-states.js.map +1 -1
  226. package/dist/application/self/install-hooks.js +1 -1
  227. package/dist/application/self/install-hooks.js.map +1 -1
  228. package/dist/application/self/install-skill.js +35 -11
  229. package/dist/application/self/install-skill.js.map +1 -1
  230. package/dist/application/self/install-targets.js +73 -2
  231. package/dist/application/self/install-targets.js.map +1 -1
  232. package/dist/application/self/mcp-config.js +19 -11
  233. package/dist/application/self/mcp-config.js.map +1 -1
  234. package/dist/application/self/opencode-plugin.js +1 -0
  235. package/dist/application/self/opencode-plugin.js.map +1 -1
  236. package/dist/application/self/uninstall.js +22 -8
  237. package/dist/application/self/uninstall.js.map +1 -1
  238. package/dist/application/semantic-operation/protocol.js +66 -5
  239. package/dist/application/semantic-operation/protocol.js.map +1 -1
  240. package/dist/application/session-archive-service.js +113 -0
  241. package/dist/application/session-archive-service.js.map +1 -0
  242. package/dist/application/session-binding-service.js +35 -0
  243. package/dist/application/session-binding-service.js.map +1 -1
  244. package/dist/application/session-close-service.js +390 -54
  245. package/dist/application/session-close-service.js.map +1 -1
  246. package/dist/application/session-create-service.js +97 -5
  247. package/dist/application/session-create-service.js.map +1 -1
  248. package/dist/application/session-custody-recorder.js +15 -12
  249. package/dist/application/session-custody-recorder.js.map +1 -1
  250. package/dist/application/session-custody-service.js +1 -0
  251. package/dist/application/session-custody-service.js.map +1 -1
  252. package/dist/application/session-narrative.js +51 -12
  253. package/dist/application/session-narrative.js.map +1 -1
  254. package/dist/application/session-pause-service.js +46 -0
  255. package/dist/application/session-pause-service.js.map +1 -0
  256. package/dist/application/session-resolver.js +36 -11
  257. package/dist/application/session-resolver.js.map +1 -1
  258. package/dist/application/session-resume-service.js +190 -20
  259. package/dist/application/session-resume-service.js.map +1 -1
  260. package/dist/application/sessions-service.js +4 -0
  261. package/dist/application/sessions-service.js.map +1 -1
  262. package/dist/application/sessions-sweep-service.js +77 -0
  263. package/dist/application/sessions-sweep-service.js.map +1 -0
  264. package/dist/application/settle-service.js +3 -1
  265. package/dist/application/settle-service.js.map +1 -1
  266. package/dist/application/skills-resolver-service.js +1 -1
  267. package/dist/application/skills-resolver-service.js.map +1 -1
  268. package/dist/application/source-add-service.js +37 -0
  269. package/dist/application/source-add-service.js.map +1 -0
  270. package/dist/application/source-boundary-policy.js +97 -8
  271. package/dist/application/source-boundary-policy.js.map +1 -1
  272. package/dist/application/source-pipeline.js +68 -0
  273. package/dist/application/source-pipeline.js.map +1 -0
  274. package/dist/application/source-remove-service.js +15 -3
  275. package/dist/application/source-remove-service.js.map +1 -1
  276. package/dist/application/sources-service.js +71 -16
  277. package/dist/application/sources-service.js.map +1 -1
  278. package/dist/application/status-service.js +55 -5
  279. package/dist/application/status-service.js.map +1 -1
  280. package/dist/application/unit-dependencies.js +100 -0
  281. package/dist/application/unit-dependencies.js.map +1 -0
  282. package/dist/application/unit-membership.js +37 -0
  283. package/dist/application/unit-membership.js.map +1 -0
  284. package/dist/application/unit-residue.js +72 -0
  285. package/dist/application/unit-residue.js.map +1 -0
  286. package/dist/application/visibility-doctor-service.js +66 -4
  287. package/dist/application/visibility-doctor-service.js.map +1 -1
  288. package/dist/application/working-branch-service.js +6 -0
  289. package/dist/application/working-branch-service.js.map +1 -1
  290. package/dist/application/workline-graph.js +1 -1
  291. package/dist/application/workline-graph.js.map +1 -1
  292. package/dist/application/workline-index-service.js +118 -17
  293. package/dist/application/workline-index-service.js.map +1 -1
  294. package/dist/application/workspace-commit-service.js +218 -0
  295. package/dist/application/workspace-commit-service.js.map +1 -0
  296. package/dist/application/workspace-init-service.js +64 -34
  297. package/dist/application/workspace-init-service.js.map +1 -1
  298. package/dist/application/workspace-local-config.js +90 -0
  299. package/dist/application/workspace-local-config.js.map +1 -0
  300. package/dist/application/workspace-materialization-service.js +52 -3
  301. package/dist/application/workspace-materialization-service.js.map +1 -1
  302. package/dist/application/workspace-migrate/apply.js +525 -4
  303. package/dist/application/workspace-migrate/apply.js.map +1 -1
  304. package/dist/application/workspace-migrate/markers.js +9 -6
  305. package/dist/application/workspace-migrate/markers.js.map +1 -1
  306. package/dist/application/workspace-migrate/plan.js +97 -5
  307. package/dist/application/workspace-migrate/plan.js.map +1 -1
  308. package/dist/application/workspace-move-service.js +270 -0
  309. package/dist/application/workspace-move-service.js.map +1 -0
  310. package/dist/application/workspace-untrack-service.js +28 -0
  311. package/dist/application/workspace-untrack-service.js.map +1 -0
  312. package/dist/application/worktree-service.js +654 -105
  313. package/dist/application/worktree-service.js.map +1 -1
  314. package/dist/cli/ascii.js +86 -0
  315. package/dist/cli/ascii.js.map +1 -0
  316. package/dist/cli/commands/add-source.js +38 -0
  317. package/dist/cli/commands/add-source.js.map +1 -0
  318. package/dist/cli/commands/amend.js +14 -2
  319. package/dist/cli/commands/amend.js.map +1 -1
  320. package/dist/cli/commands/capability.js +26 -0
  321. package/dist/cli/commands/capability.js.map +1 -1
  322. package/dist/cli/commands/check-branch.js +1 -0
  323. package/dist/cli/commands/check-branch.js.map +1 -1
  324. package/dist/cli/commands/checkpoint-read.js +1 -0
  325. package/dist/cli/commands/checkpoint-read.js.map +1 -1
  326. package/dist/cli/commands/checkpoint-write.js +4 -1
  327. package/dist/cli/commands/checkpoint-write.js.map +1 -1
  328. package/dist/cli/commands/claims.js +1 -0
  329. package/dist/cli/commands/claims.js.map +1 -1
  330. package/dist/cli/commands/code-scan.js +1 -0
  331. package/dist/cli/commands/code-scan.js.map +1 -1
  332. package/dist/cli/commands/context-budget.js +1 -0
  333. package/dist/cli/commands/context-budget.js.map +1 -1
  334. package/dist/cli/commands/context-plan.js +1 -0
  335. package/dist/cli/commands/context-plan.js.map +1 -1
  336. package/dist/cli/commands/cut-intent.js +1 -0
  337. package/dist/cli/commands/cut-intent.js.map +1 -1
  338. package/dist/cli/commands/designs.js +15 -5
  339. package/dist/cli/commands/designs.js.map +1 -1
  340. package/dist/cli/commands/dev-only.js +22 -5
  341. package/dist/cli/commands/dev-only.js.map +1 -1
  342. package/dist/cli/commands/doc-branch.js +184 -0
  343. package/dist/cli/commands/doc-branch.js.map +1 -0
  344. package/dist/cli/commands/doctor.js +9 -0
  345. package/dist/cli/commands/doctor.js.map +1 -1
  346. package/dist/cli/commands/export.js +89 -16
  347. package/dist/cli/commands/export.js.map +1 -1
  348. package/dist/cli/commands/fix-git.js +89 -13
  349. package/dist/cli/commands/fix-git.js.map +1 -1
  350. package/dist/cli/commands/flow.js +129 -13
  351. package/dist/cli/commands/flow.js.map +1 -1
  352. package/dist/cli/commands/generate-launch.js +15 -2
  353. package/dist/cli/commands/generate-launch.js.map +1 -1
  354. package/dist/cli/commands/git-flow.js +1 -0
  355. package/dist/cli/commands/git-flow.js.map +1 -1
  356. package/dist/cli/commands/history-update.js +7 -9
  357. package/dist/cli/commands/history-update.js.map +1 -1
  358. package/dist/cli/commands/history.js +14 -0
  359. package/dist/cli/commands/history.js.map +1 -0
  360. package/dist/cli/commands/hook.js +26 -5
  361. package/dist/cli/commands/hook.js.map +1 -1
  362. package/dist/cli/commands/host-doctor.js +1 -0
  363. package/dist/cli/commands/host-doctor.js.map +1 -1
  364. package/dist/cli/commands/host-memory.js +2 -9
  365. package/dist/cli/commands/host-memory.js.map +1 -1
  366. package/dist/cli/commands/index.js +18 -1
  367. package/dist/cli/commands/index.js.map +1 -1
  368. package/dist/cli/commands/mcp.js +30 -4
  369. package/dist/cli/commands/mcp.js.map +1 -1
  370. package/dist/cli/commands/merge-state.js +3 -2
  371. package/dist/cli/commands/merge-state.js.map +1 -1
  372. package/dist/cli/commands/multiroot.js +16 -0
  373. package/dist/cli/commands/multiroot.js.map +1 -1
  374. package/dist/cli/commands/persist.js +7 -5
  375. package/dist/cli/commands/persist.js.map +1 -1
  376. package/dist/cli/commands/plan.js +1 -0
  377. package/dist/cli/commands/plan.js.map +1 -1
  378. package/dist/cli/commands/plugin-cache.js +4 -0
  379. package/dist/cli/commands/plugin-cache.js.map +1 -1
  380. package/dist/cli/commands/plugin-doctor.js +3 -0
  381. package/dist/cli/commands/plugin-doctor.js.map +1 -1
  382. package/dist/cli/commands/project-md-upsert.js +8 -3
  383. package/dist/cli/commands/project-md-upsert.js.map +1 -1
  384. package/dist/cli/commands/release-data.js +12 -0
  385. package/dist/cli/commands/release-data.js.map +1 -1
  386. package/dist/cli/commands/release-pass.js +13 -3
  387. package/dist/cli/commands/release-pass.js.map +1 -1
  388. package/dist/cli/commands/remove-source.js +1 -0
  389. package/dist/cli/commands/remove-source.js.map +1 -1
  390. package/dist/cli/commands/reseal.js +1 -0
  391. package/dist/cli/commands/reseal.js.map +1 -1
  392. package/dist/cli/commands/resume-summary.js +5 -0
  393. package/dist/cli/commands/resume-summary.js.map +1 -1
  394. package/dist/cli/commands/resume.js +13 -3
  395. package/dist/cli/commands/resume.js.map +1 -1
  396. package/dist/cli/commands/retirement.js +1 -0
  397. package/dist/cli/commands/retirement.js.map +1 -1
  398. package/dist/cli/commands/self.js +39 -1
  399. package/dist/cli/commands/self.js.map +1 -1
  400. package/dist/cli/commands/session-artifacts.js +1 -0
  401. package/dist/cli/commands/session-artifacts.js.map +1 -1
  402. package/dist/cli/commands/session-close.js +185 -31
  403. package/dist/cli/commands/session-close.js.map +1 -1
  404. package/dist/cli/commands/session-create.js +4 -1
  405. package/dist/cli/commands/session-create.js.map +1 -1
  406. package/dist/cli/commands/session-pause.js +14 -0
  407. package/dist/cli/commands/session-pause.js.map +1 -0
  408. package/dist/cli/commands/session-resume.js +1 -0
  409. package/dist/cli/commands/session-resume.js.map +1 -1
  410. package/dist/cli/commands/sessions.js +16 -2
  411. package/dist/cli/commands/sessions.js.map +1 -1
  412. package/dist/cli/commands/set-branch.js +29 -4
  413. package/dist/cli/commands/set-branch.js.map +1 -1
  414. package/dist/cli/commands/set-edit-mode.js +20 -0
  415. package/dist/cli/commands/set-edit-mode.js.map +1 -0
  416. package/dist/cli/commands/set-pipeline.js +35 -0
  417. package/dist/cli/commands/set-pipeline.js.map +1 -0
  418. package/dist/cli/commands/settle.js +1 -0
  419. package/dist/cli/commands/settle.js.map +1 -1
  420. package/dist/cli/commands/skill-index.js +1 -0
  421. package/dist/cli/commands/skill-index.js.map +1 -1
  422. package/dist/cli/commands/skills.js +1 -0
  423. package/dist/cli/commands/skills.js.map +1 -1
  424. package/dist/cli/commands/sources.js +5 -0
  425. package/dist/cli/commands/sources.js.map +1 -1
  426. package/dist/cli/commands/stack.js +1 -0
  427. package/dist/cli/commands/stack.js.map +1 -1
  428. package/dist/cli/commands/status.js +36 -2
  429. package/dist/cli/commands/status.js.map +1 -1
  430. package/dist/cli/commands/tool.js +5 -21
  431. package/dist/cli/commands/tool.js.map +1 -1
  432. package/dist/cli/commands/unknown-flags.js +68 -16
  433. package/dist/cli/commands/unknown-flags.js.map +1 -1
  434. package/dist/cli/commands/visibility.js +2 -0
  435. package/dist/cli/commands/visibility.js.map +1 -1
  436. package/dist/cli/commands/workspace-commit.js +62 -0
  437. package/dist/cli/commands/workspace-commit.js.map +1 -0
  438. package/dist/cli/commands/workspace-init.js +51 -2
  439. package/dist/cli/commands/workspace-init.js.map +1 -1
  440. package/dist/cli/commands/workspace-migrate.js +31 -14
  441. package/dist/cli/commands/workspace-migrate.js.map +1 -1
  442. package/dist/cli/commands/workspace-move.js +42 -0
  443. package/dist/cli/commands/workspace-move.js.map +1 -0
  444. package/dist/cli/commands/worktree.js +5 -4
  445. package/dist/cli/commands/worktree.js.map +1 -1
  446. package/dist/cli/context-id.js +6 -0
  447. package/dist/cli/context-id.js.map +1 -1
  448. package/dist/cli/full-cli.js +555 -0
  449. package/dist/cli/full-cli.js.map +1 -0
  450. package/dist/cli/help-groups.js +108 -14
  451. package/dist/cli/help-groups.js.map +1 -1
  452. package/dist/cli/hook-stdin-cache.js +12 -0
  453. package/dist/cli/hook-stdin-cache.js.map +1 -0
  454. package/dist/cli/main.js +47 -471
  455. package/dist/cli/main.js.map +1 -1
  456. package/dist/cli/output-mode.js +11 -2
  457. package/dist/cli/output-mode.js.map +1 -1
  458. package/dist/cli/parser.js +18 -5
  459. package/dist/cli/parser.js.map +1 -1
  460. package/dist/cli/registry.js.map +1 -1
  461. package/dist/cli/render.js +30 -1
  462. package/dist/cli/render.js.map +1 -1
  463. package/dist/cli/tui/app.js +1 -1
  464. package/dist/cli/tui/app.js.map +1 -1
  465. package/dist/cli/tui/components/workspace-init-form.js +4 -1
  466. package/dist/cli/tui/components/workspace-init-form.js.map +1 -1
  467. package/dist/cli/tui/data/recommended-skills.js +2 -2
  468. package/dist/cli/tui/data/recommended-skills.js.map +1 -1
  469. package/dist/cli/tui/data/workflow-content.js +6 -1
  470. package/dist/cli/tui/data/workflow-content.js.map +1 -1
  471. package/dist/cli/tui/tabs/mcp-tab.js +4 -3
  472. package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
  473. package/dist/cli/tui/tabs/project-tab.js +7 -2
  474. package/dist/cli/tui/tabs/project-tab.js.map +1 -1
  475. package/dist/dist-manifest.json +4117 -0
  476. package/dist/domain/capability/protocol.js.map +1 -1
  477. package/dist/domain/decision-note.js +13 -0
  478. package/dist/domain/decision-note.js.map +1 -1
  479. package/dist/domain/design/artifact.js +22 -3
  480. package/dist/domain/design/artifact.js.map +1 -1
  481. package/dist/domain/design/capability.js +1 -0
  482. package/dist/domain/design/capability.js.map +1 -1
  483. package/dist/domain/design/expansion.js +1 -1
  484. package/dist/domain/design/expansion.js.map +1 -1
  485. package/dist/domain/design/maturity.js +16 -0
  486. package/dist/domain/design/maturity.js.map +1 -1
  487. package/dist/domain/design/reference.js +5 -0
  488. package/dist/domain/design/reference.js.map +1 -1
  489. package/dist/domain/doctor/operations.js +28 -2
  490. package/dist/domain/doctor/operations.js.map +1 -1
  491. package/dist/domain/effective-contract.js +3 -1
  492. package/dist/domain/effective-contract.js.map +1 -1
  493. package/dist/domain/elicitation.js +1 -1
  494. package/dist/domain/flow/answer.js +273 -130
  495. package/dist/domain/flow/answer.js.map +1 -1
  496. package/dist/domain/flow/authority.js +330 -44
  497. package/dist/domain/flow/authority.js.map +1 -1
  498. package/dist/domain/flow/batch-review.js +65 -0
  499. package/dist/domain/flow/batch-review.js.map +1 -0
  500. package/dist/domain/flow/decision-schema.js +47 -0
  501. package/dist/domain/flow/decision-schema.js.map +1 -0
  502. package/dist/domain/flow/directive.js +16 -0
  503. package/dist/domain/flow/directive.js.map +1 -1
  504. package/dist/domain/flow/execution-result.js +169 -9
  505. package/dist/domain/flow/execution-result.js.map +1 -1
  506. package/dist/domain/flow/route.js.map +1 -1
  507. package/dist/domain/flow/rules.js +5 -6
  508. package/dist/domain/flow/rules.js.map +1 -1
  509. package/dist/domain/flow/run-state.js +531 -47
  510. package/dist/domain/flow/run-state.js.map +1 -1
  511. package/dist/domain/flow/test-run-evidence.js +285 -0
  512. package/dist/domain/flow/test-run-evidence.js.map +1 -0
  513. package/dist/domain/flow/unchanged-phase.js +15 -0
  514. package/dist/domain/flow/unchanged-phase.js.map +1 -0
  515. package/dist/domain/harnesses.js +22 -6
  516. package/dist/domain/harnesses.js.map +1 -1
  517. package/dist/domain/isolation-unit.js +2 -2
  518. package/dist/domain/isolation-unit.js.map +1 -1
  519. package/dist/domain/lineage.js +7 -2
  520. package/dist/domain/lineage.js.map +1 -1
  521. package/dist/domain/obligation-correspondence.js +4 -2
  522. package/dist/domain/obligation-correspondence.js.map +1 -1
  523. package/dist/domain/plan-handoff.js +5 -0
  524. package/dist/domain/plan-handoff.js.map +1 -0
  525. package/dist/domain/proposal.js +18 -7
  526. package/dist/domain/proposal.js.map +1 -1
  527. package/dist/domain/reservation.js +5 -3
  528. package/dist/domain/reservation.js.map +1 -1
  529. package/dist/domain/retirement/proposal.js +1 -0
  530. package/dist/domain/retirement/proposal.js.map +1 -1
  531. package/dist/domain/session/custody.js +10 -6
  532. package/dist/domain/session/custody.js.map +1 -1
  533. package/dist/domain/session/narrative.js +4 -1
  534. package/dist/domain/session/narrative.js.map +1 -1
  535. package/dist/domain/skills.js +2 -0
  536. package/dist/domain/skills.js.map +1 -1
  537. package/dist/domain/sql-lexer.js +15 -2
  538. package/dist/domain/sql-lexer.js.map +1 -1
  539. package/dist/runtime/namespace-resolver.js +4 -0
  540. package/dist/runtime/namespace-resolver.js.map +1 -1
  541. package/dist/runtime/workline-marker.js +35 -8
  542. package/dist/runtime/workline-marker.js.map +1 -1
  543. package/dist/runtime/workspace-resolution.js +123 -0
  544. package/dist/runtime/workspace-resolution.js.map +1 -0
  545. package/package.json +5 -4
  546. package/skills/w/SKILL.md +3 -1
  547. package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +1 -1
  548. package/skills/w/artifacts/artifacts-core/SCRIPTS.rollback.sql +8 -0
  549. package/skills/w/artifacts/artifacts-core/SCRIPTS.sql +4 -8
  550. package/skills/w/commands/export-diagrams.md +3 -3
  551. package/skills/w/commands/export-manuals.md +6 -6
  552. package/skills/w/commands/export-reports.md +3 -3
  553. package/skills/w/commands/export-scripts.md +5 -5
  554. package/skills/w/commands/fix-git.md +12 -13
  555. package/skills/w/commands/persist.md +2 -2
  556. package/skills/w/commands/plan-exec.md +4 -2
  557. package/skills/w/commands/spec-new.md +1 -1
  558. package/skills/w/commands/workspace-init.md +2 -0
  559. package/skills/w/context/MANIFEST.json +1 -1
  560. package/skills/w/exports/export-diagrams/EXPORT.md +3 -3
  561. package/skills/w/exports/export-manuals/EXPORT.md +14 -16
  562. package/skills/w/exports/export-reports/EXPORT.md +3 -3
  563. package/skills/w/exports/export-scripts/EXPORT.md +45 -21
  564. package/skills/w/harness/HARNESS.md +5 -3
  565. package/skills/w/hooks/hooks.template.json +6 -4
  566. package/skills/w/loops/CHASSIS.md +12 -6
  567. package/skills/w/loops/CODE-POLICIES.md +7 -4
  568. package/skills/w/loops/plan-exec-loop/LOOP.md +23 -22
  569. package/skills/w/loops/plan-new-loop/LOOP.md +23 -31
  570. package/skills/w/loops/plan-refine-loop/LOOP.md +8 -2
  571. package/skills/w/loops/quick-loop/LOOP.md +6 -5
  572. package/skills/w/modules/DESIGN-REFERENCES.md +9 -11
  573. package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +4 -4
  574. package/skills/w/modules/SESSION-NUMBERING.md +2 -0
  575. package/skills/w/roles/design/CONTRACT.md +16 -7
  576. package/skills/w/roles/design/ROLE.md +4 -2
  577. package/skills/w/roles/git/ROLE.md +16 -9
  578. package/skills/w/roles/research/ROLE.md +1 -1
  579. package/skills/w/roles/sql/ROLE.md +16 -14
  580. package/skills/w/schemas/design/ui-screen.v1.schema.json +9 -0
@@ -15,12 +15,36 @@
15
15
  * directive with `ok: true` — with `ok: false` the host never calls `renderHuman`
16
16
  * and the person would never see the boundary they have to answer over.
17
17
  */
18
+ import { resolve } from "node:path";
18
19
  import { parseSemanticArtifacts } from "../../application/semantic-operation/protocol.js";
19
20
  import { COMPLETENESS_VALUES } from "../capability/descriptor.js";
20
- import { isEffectClass } from "../capability/effects.js";
21
+ import { EFFECT_CLASSES, isEffectClass } from "../capability/effects.js";
21
22
  import { CAPABILITY_OUTCOMES, } from "../capability/protocol.js";
22
- import { proposalContractOf, } from "./authority.js";
23
+ import { effectsOf, proposalContractOf, } from "./authority.js";
24
+ import { BATCH_REVIEW_CONTRACT, isBatchReview } from "./batch-review.js";
23
25
  import { STOP_LABEL, isFlowControl } from "./directive.js";
26
+ /** Preserve the first code/message while publishing every independent defect. */
27
+ function collected(entries) {
28
+ const first = entries[0];
29
+ if (first === undefined)
30
+ throw new Error("no hay violaciones para entregar");
31
+ return {
32
+ ...first.failure,
33
+ violations: entries.map((entry) => entry.violation),
34
+ };
35
+ }
36
+ function violation(failure, field, expected, received) {
37
+ return {
38
+ failure,
39
+ violation: {
40
+ code: failure.code,
41
+ field,
42
+ expected,
43
+ received: Array.isArray(received) ? "lista" : received === null ? "null" : typeof received,
44
+ message: failure.message,
45
+ },
46
+ };
47
+ }
24
48
  /**
25
49
  * Which rejections COUNT as an attempt at the boundary, and which never reached
26
50
  * it.
@@ -44,14 +68,11 @@ import { STOP_LABEL, isFlowControl } from "./directive.js";
44
68
  * raises). At an execution boundary the decision IS the result and at an
45
69
  * authoring one it IS the bytes: with neither there, there is nothing to judge,
46
70
  * and charging for it charges for the envelope.
47
- * - `evaluated` — the decision arrived and did not resolve the gap. A signal
48
- * outside the declared vocabulary, a label that is not one of the emitted
49
- * alternatives, an approval over other effects or none at all, a result about a
50
- * different invocation, an execution that did not complete or left its effect
51
- * half-applied, a scope naming sources the workspace or the plan does not, a
52
- * proposal reaching past what its row declares — and an answer that declares
53
- * nothing at all, which is the feigned convergence the chassis degrades and
54
- * exactly what the cap is for.
71
+ * - `evaluated` — the decision arrived and did not resolve the gap. An execution
72
+ * that did not complete or left its effect half-applied, a scope naming sources
73
+ * the workspace or the plan does not, a proposal reaching past what its row
74
+ * declares, or an answer that declares nothing at all. Unknown literals,
75
+ * malformed proofs, copied digests and invocations are envelope errors.
55
76
  * - `control` — a real answer that deliberately applies nothing, or the same
56
77
  * answer arriving twice. Pausing to compact, stopping the run, and a resend are
57
78
  * all decisions somebody made on purpose; charging them would make the flow
@@ -75,6 +96,7 @@ export const FLOW_ANSWER_REJECTIONS = {
75
96
  FLOW_ANSWER_MISSING: "envelope",
76
97
  FLOW_ANSWER_INVALID: "envelope",
77
98
  FLOW_ANSWER_STALE: "envelope",
99
+ WORKSPACE_MISMATCH: "envelope",
78
100
  FLOW_ANSWER_NOT_EXPECTED: "envelope",
79
101
  FLOW_RESULT_INVALID: "envelope",
80
102
  FLOW_ARTIFACTS_MISSING: "envelope",
@@ -91,71 +113,135 @@ export const FLOW_ANSWER_REJECTIONS = {
91
113
  // about is no longer the one this build emits. Nothing about the ANSWER was
92
114
  // weighed, and the next `advance` re-binds the action by itself.
93
115
  FLOW_ACTION_CHANGED: "envelope",
116
+ // A result sent for a step the CLI runs itself. Nothing about it can be weighed
117
+ // — the only credit is the driver's own run — and the way out is to run the
118
+ // action, so charging the envelope would punish choosing the wrong verb.
119
+ FLOW_INTERNAL_ACTION_EXTERNAL_RESULT: "envelope",
94
120
  FLOW_ANSWER_AMBIGUOUS: "evaluated",
95
- FLOW_SIGNAL_UNKNOWN: "evaluated",
96
- FLOW_CHOICE_UNKNOWN: "evaluated",
97
- FLOW_APPROVAL_MISSING: "evaluated",
98
- FLOW_APPROVAL_MISMATCH: "evaluated",
99
- FLOW_ACTION_MISMATCH: "evaluated",
121
+ FLOW_SIGNAL_UNKNOWN: "envelope",
122
+ FLOW_CHOICE_UNKNOWN: "envelope",
123
+ FLOW_APPROVAL_MISSING: "envelope",
124
+ FLOW_APPROVAL_MISMATCH: "envelope",
125
+ WORKSPACE_COMMIT_UNAVAILABLE: "envelope",
126
+ WORKSPACE_COMMIT_APPROVAL_INVALID: "envelope",
127
+ FLOW_ACTION_MISMATCH: "envelope",
100
128
  // The execution verdict's own vocabulary: it judges a result that WAS read.
101
129
  FLOW_EXECUTION_NOT_COMPLETED: "evaluated",
102
130
  FLOW_EVIDENCE_MISSING: "evaluated",
103
- WORKLINE_CHECKOUT_PROOF_MISSING: "evaluated",
131
+ WORKLINE_CHECKOUT_PROOF_MISSING: "envelope",
104
132
  WORKLINE_CHECKOUT_PROOF_INVALID: "evaluated",
105
- WORKLINE_CHECKOUT_PROOF_STALE: "evaluated",
133
+ WORKLINE_CHECKOUT_PROOF_SHAPE_INVALID: "envelope",
134
+ WORKLINE_CHECKOUT_PROOF_ROOT_MISMATCH: "envelope",
135
+ WORKLINE_CHECKOUT_UNOBSERVABLE: "envelope",
136
+ WORKLINE_CHECKOUT_PROOF_STALE: "envelope",
106
137
  FLOW_EFFECT_PARTIAL: "evaluated",
107
- // The scope boundary's own vocabulary. Its answer is `decisions.sources` plus
108
- // `decisions.plan`, and every one of these means the CLI read them and found
109
- // them wanting — a decision that did not resolve the gap.
138
+ // The phase validation's own: the proofs were read and they are not this
139
+ // batch's — nothing changed since its base, or they already credited another.
140
+ PLAN_EXEC_BATCH_UNCHANGED: "evaluated",
141
+ PLAN_EXEC_BATCH_STALE: "control",
142
+ PLAN_VALIDATION_ONLY_NOT_APPROVED: "evaluated",
143
+ PLAN_EXEC_PROOF_REUSED: "evaluated",
144
+ PLAN_EXEC_BATCH_REVIEW_INVALID: "evaluated",
145
+ PLAN_EXEC_BATCH_COMMIT_UNOBSERVABLE: "envelope",
146
+ PLAN_EXEC_BATCH_COMMIT_MESSAGE_INVALID: "evaluated",
147
+ PLAN_EXEC_BATCH_PATHS_REQUIRED: "evaluated",
148
+ PLAN_EXEC_BATCH_SHARED_PATH: "evaluated",
149
+ PLAN_EXEC_BATCH_PATH_NOT_OWNED: "evaluated",
150
+ PLAN_ISOLATION_INVALID: "envelope",
151
+ PLAN_TEST_RUN_NOT_EXECUTED: "evaluated",
152
+ PLAN_FINAL_PIPELINE_MISSING: "evaluated",
153
+ PLAN_PREEXISTING_FAILURES_INVALID: "evaluated",
154
+ PLAN_TEST_FAILURES_UNREADABLE: "evaluated",
155
+ PLAN_TEST_FAILURE_NEW: "evaluated",
156
+ // The scope boundary distinguishes malformed fields and unavailable documents
157
+ // from a proposed source set that the workspace or plan cannot accept.
110
158
  FLOW_SCOPE_INVALID: "evaluated",
159
+ FLOW_SCOPE_SHAPE_INVALID: "envelope",
111
160
  FLOW_SCOPE_UNKNOWN_SOURCE: "evaluated",
112
161
  FLOW_SCOPE_NOT_IN_PLAN: "evaluated",
113
- FLOW_SCOPE_PLAN_UNREADABLE: "evaluated",
162
+ FLOW_SCOPE_PLAN_UNREADABLE: "envelope",
114
163
  // The submitted scope named a plan and the CLI read it, but its location
115
164
  // violates the canonical documentation boundary.
116
- FLOW_SCOPE_PLAN_OUTSIDE_CANON: "evaluated",
117
- FLOW_HANDOFF_PLAN_MISSING: "evaluated",
118
- // El preview del arreglo llegó y no declara lo que la frontera pide: archivos,
119
- // intención y forma esperada del diff. La respuesta SE LEYÓ, así que gasta — y
120
- // la frontera anuncia la forma exacta, así que el primer intento puede traerla.
121
- FLOW_PREVIEW_INVALID: "evaluated",
122
- // The plan-exec deviation choice was syntactically admissible but its durable
123
- // consequence could not be derived or published against the live lineage.
124
- // These are evaluated rather than envelope refusals: the gate read the choice
125
- // and the workspace facts needed to act on it.
126
- FLOW_DECISION_SCOPE_MISSING: "evaluated",
127
- FLOW_DECISION_INPUT_INVALID: "evaluated",
128
- FLOW_DECISION_PLAN_UNREADABLE: "evaluated",
165
+ FLOW_SCOPE_PLAN_OUTSIDE_CANON: "envelope",
166
+ FLOW_HANDOFF_PLAN_MISSING: "envelope",
167
+ // El preview sin archivos, intención o forma del diff sigue incompleto.
168
+ FLOW_PREVIEW_INVALID: "envelope",
169
+ // The choice itself can be refused (evaluated); missing shape or an unreadable
170
+ // live baseline cannot be charged to its author.
171
+ FLOW_DECISION_SCOPE_MISSING: "envelope",
172
+ FLOW_DECISION_INPUT_INVALID: "envelope",
173
+ FLOW_DECISION_PLAN_UNREADABLE: "envelope",
129
174
  FLOW_DECISION_LINEAGE_INVALID: "evaluated",
130
- FLOW_DECISION_SPEC_UNREADABLE: "evaluated",
175
+ FLOW_DECISION_SPEC_UNREADABLE: "envelope",
131
176
  FLOW_DECISION_UNRESOLVABLE: "evaluated",
132
- FLOW_DECISION_PREPARATION_FAILED: "evaluated",
133
- FLOW_DECISION_PREVIEW_ABSENT: "evaluated",
177
+ FLOW_DECISION_PREPARATION_FAILED: "envelope",
178
+ FLOW_DECISION_PREVIEW_ABSENT: "envelope",
134
179
  // The settlement's own vocabulary. Both mean the CLI READ the declaration and
135
180
  // compared it against what the plan really owes — a declaration that answers
136
181
  // for the wrong obligations, or that leaves one unanswered.
137
182
  FLOW_SETTLEMENT_INVALID: "evaluated",
138
183
  FLOW_SETTLEMENT_INCOMPLETE: "evaluated",
139
- PLAN_SOURCE_BOUNDARY_MISSING: "evaluated",
140
- PLAN_SOURCE_UNKNOWN: "evaluated",
141
- PLAN_TASK_SOURCE_OUTSIDE_PHASE: "evaluated",
142
- PLAN_SOURCE_EXTERNAL_CLOSURE: "evaluated",
143
- PLAN_SOURCE_LOCAL_PROOF_MISSING: "evaluated",
184
+ PLAN_SOURCE_BOUNDARY_MISSING: "envelope",
185
+ PLAN_SOURCE_UNKNOWN: "envelope",
186
+ PLAN_TASK_SOURCE_OUTSIDE_PHASE: "envelope",
187
+ PLAN_SOURCE_EXTERNAL_CLOSURE: "envelope",
188
+ PLAN_SOURCE_LOCAL_PROOF_MISSING: "envelope",
144
189
  // The plan's grammar does not spend: a plan published without its lineage is
145
190
  // refused for what its header says, and fixing the header is the whole answer.
146
191
  PLAN_LINEAGE_UNSEALED: "envelope",
147
192
  // The authoring boundary's: the bytes arrived and what they would do is not
148
193
  // what the row declares, or their destination could not be read.
149
194
  FLOW_PROPOSAL_BEYOND_CONTRACT: "evaluated",
150
- FLOW_PROPOSAL_DESTINATION_UNOBSERVED: "evaluated",
151
- FLOW_PROPOSAL_BASE_UNREADABLE: "evaluated",
152
- // The adaptive route boundary read the proposal or the accepted disposition
153
- // and rejected it: malformed route data, a replacement without its agreed
154
- // validation/risk, or an attempt to make an unconfigured hard gate optional.
155
- FLOW_ROUTE_DECISION_INVALID: "evaluated",
156
- FLOW_ROUTE_PROPOSAL_INVALID: "evaluated",
157
- FLOW_ROUTE_SUBSTITUTION_INVALID: "evaluated",
195
+ FLOW_PROPOSAL_DESTINATION_UNOBSERVED: "envelope",
196
+ FLOW_PROPOSAL_BASE_UNREADABLE: "envelope",
197
+ // Route shape is free; attempting to bypass a hard gate is evaluated.
198
+ FLOW_ROUTE_DECISION_INVALID: "envelope",
199
+ FLOW_ROUTE_PROPOSAL_INVALID: "envelope",
200
+ FLOW_ROUTE_SUBSTITUTION_INVALID: "envelope",
158
201
  FLOW_ROUTE_HARD_GATE: "evaluated",
202
+ // The author's draft is a shape; a contradictory claim or a scope the
203
+ // contract refuses is content. A moved baseline or publication is state.
204
+ NOTE_NOT_OBJECT: "envelope",
205
+ NOTE_SCHEMA_UNKNOWN: "envelope",
206
+ NOTE_ID_INVALID: "envelope",
207
+ NOTE_DECISION_MISSING: "envelope",
208
+ NOTE_REASON_MISSING: "envelope",
209
+ NOTE_CONSUMERS_MISSING: "envelope",
210
+ NOTE_EVIDENCE_PRESERVED_MISSING: "envelope",
211
+ NOTE_EVIDENCE_INVALIDATED_MISSING: "envelope",
212
+ NOTE_OBLIGATIONS_MISSING: "envelope",
213
+ NOTE_OBLIGATIONS_INVALID: "envelope",
214
+ NOTE_OBLIGATION_KIND_MISSING: "envelope",
215
+ NOTE_RESUME_POINT_MISSING: "envelope",
216
+ NOTE_DATE_INVALID: "envelope",
217
+ NOTE_DIGEST_MISSING: "envelope",
218
+ NOTE_DIGEST_MISMATCH: "envelope",
219
+ NOTE_SCOPE_INVALID: "envelope",
220
+ NOTE_SUPERSEDES_INVALID: "envelope",
221
+ NOTE_ASSERTIONS_MISSING: "envelope",
222
+ NOTE_ASSERTIONS_INVALID: "envelope",
223
+ NOTE_ASSERTIONS_DUPLICATE: "envelope",
224
+ NOTE_LINEAGE_MISSING: "envelope",
225
+ NOTE_LINEAGE_INVALID: "envelope",
226
+ NOTE_LINEAGE_DIGEST_INVALID: "envelope",
227
+ NOTE_EXECUTION_STATE_MISSING: "envelope",
228
+ NOTE_INDEX_UNREADABLE: "envelope",
229
+ NOTE_INDEX_INVALID: "envelope",
230
+ NOTE_INDEX_SCHEMA_UNKNOWN: "envelope",
231
+ NOTE_ALREADY_PUBLISHED: "control",
232
+ NOTE_SUPERSEDES_ABSENT: "evaluated",
233
+ NOTE_REWRITES_BASELINE: "evaluated",
234
+ CONTRACT_BASELINE_ABSENT: "envelope",
235
+ CONTRACT_ASSERTION_ABSENT: "evaluated",
236
+ CONTRACT_OVERLAP: "evaluated",
237
+ CONTRACT_CONTRADICTION: "evaluated",
238
+ DECISION_BASE_ABSENT: "envelope",
239
+ PROPOSAL_LOCKED: "control",
240
+ PROPOSAL_BASELINE_UNSEALED: "envelope",
241
+ PROPOSAL_APPROVAL_MISMATCH: "envelope",
242
+ PROPOSAL_APPROVAL_MISSING: "envelope",
243
+ PROPOSAL_BASE_GONE: "envelope",
244
+ PROPOSAL_BASE_STALE: "envelope",
159
245
  // A compensation the run declared STILL PENDING is not a malformed answer and
160
246
  // not a failed check: it is the truthful one. The closure stays where it is
161
247
  // until the work is done, and charging an attempt for saying so would make
@@ -268,45 +354,49 @@ function semanticAnswer(body, input) {
268
354
  const proposes = proposalContractOf(input.decision);
269
355
  const declared = new Set(input.decision.signals ?? []);
270
356
  const raw = body.signals;
357
+ const issues = [];
271
358
  if (raw !== undefined && !isStringArray(raw)) {
272
- return { ok: false, failure: invalid("'signals' tiene que ser una lista de identificadores") };
359
+ issues.push(violation(invalid("'signals' tiene que ser una lista de identificadores"), "signals", "string[]", raw));
273
360
  }
274
- const signals = raw ?? [];
361
+ const signals = isStringArray(raw) ? raw : [];
275
362
  const decisions = body.decisions;
276
363
  if (decisions !== undefined && !isRecord(decisions)) {
277
- return { ok: false, failure: invalid("'decisions' tiene que ser un objeto") };
364
+ issues.push(violation(invalid("'decisions' tiene que ser un objeto"), "decisions", "objeto", decisions));
278
365
  }
279
366
  // A flow control IS an answer, including here. It used to die on the emptiness
280
367
  // check below — a semantic boundary demands signals or decisions — and
281
368
  // `FLOW_ANSWER_AMBIGUOUS` is an EVALUATED rejection, so asking to compact cost
282
369
  // an attempt at exactly the boundary somebody was trying to pause.
283
370
  const control = flowControlOf(body);
284
- const substance = checkSubstance(body, {
285
- signals,
286
- decisions,
287
- proposes: proposes !== null,
288
- control,
289
- });
371
+ const substance = issues.length > 0
372
+ ? null
373
+ : checkSubstance(body, {
374
+ decision: input.decision,
375
+ signals,
376
+ decisions,
377
+ proposes: proposes !== null,
378
+ control,
379
+ });
290
380
  if (substance !== null)
291
- return { ok: false, failure: substance };
381
+ issues.push(violation(substance, "artifacts", "respuesta con contenido para la frontera", body.artifacts));
292
382
  const artifacts = proposes === null ? EMPTY : parseArtifacts(body.artifacts, input);
293
383
  if (!Array.isArray(artifacts))
294
- return { ok: false, failure: artifacts.failure };
384
+ issues.push(violation(artifacts.failure, "artifacts", "lista de {path, content}", body.artifacts));
295
385
  for (const signal of signals) {
296
386
  if (declared.has(signal))
297
387
  continue;
298
- return {
299
- ok: false,
300
- failure: {
301
- code: "FLOW_SIGNAL_UNKNOWN",
302
- message: `'${signal}' no está en el vocabulario que esta frontera admite`,
303
- action: `declarás solo: ${[...declared].join(", ") || "(ninguna señal en esta frontera)"}`,
304
- },
388
+ const failure = {
389
+ code: "FLOW_SIGNAL_UNKNOWN",
390
+ message: `'${signal}' no está en el vocabulario que esta frontera admite`,
391
+ action: `declarás solo: ${[...declared].join(", ") || "(ninguna señal en esta frontera)"}`,
305
392
  };
393
+ issues.push(violation(failure, "signals", [...declared].join(" | ") || "ninguna", signal));
306
394
  }
307
395
  if (new Set(signals).size !== signals.length) {
308
- return { ok: false, failure: invalid("la misma señal viene declarada dos veces") };
396
+ issues.push(violation(invalid("la misma señal viene declarada dos veces"), "signals", "identificadores únicos", signals));
309
397
  }
398
+ if (issues.length > 0)
399
+ return { ok: false, failure: collected(issues) };
310
400
  return {
311
401
  ok: true,
312
402
  answer: {
@@ -318,11 +408,22 @@ function semanticAnswer(body, input) {
318
408
  // boundary has no alternatives of its own to pick from.
319
409
  choice: control,
320
410
  result: null,
321
- artifacts,
411
+ artifacts: artifacts,
322
412
  },
323
413
  };
324
414
  }
325
415
  const EMPTY = [];
416
+ function checkAnswerContract(decision, decisions, control) {
417
+ if (control !== null || decision.answer_contract !== "batch-review")
418
+ return null;
419
+ if (isRecord(decisions) && isBatchReview(decisions.review))
420
+ return null;
421
+ return {
422
+ code: "PLAN_EXEC_BATCH_REVIEW_INVALID",
423
+ message: "la revisión del lote falta o no demuestra un revisor distinto y cada corrección revisada",
424
+ action: BATCH_REVIEW_CONTRACT,
425
+ };
426
+ }
326
427
  /**
327
428
  * Whether the answer says anything the CLI can act on — and the right thing.
328
429
  *
@@ -335,6 +436,9 @@ const EMPTY = [];
335
436
  * nobody to approve them are precisely the write this contract forbids.
336
437
  */
337
438
  function checkSubstance(body, answered) {
439
+ const contract = checkAnswerContract(answered.decision, answered.decisions, answered.control);
440
+ if (contract !== null)
441
+ return contract;
338
442
  const hasArtifacts = Array.isArray(body.artifacts) && body.artifacts.length > 0;
339
443
  if (hasArtifacts && !answered.proposes) {
340
444
  return {
@@ -390,11 +494,24 @@ function parseArtifacts(raw, input) {
390
494
  }
391
495
  const parsed = parseSemanticArtifacts(raw, request);
392
496
  if (!parsed.ok) {
497
+ const individual = Array.isArray(raw)
498
+ ? raw.flatMap((entry, index) => {
499
+ const checked = parseSemanticArtifacts([entry], request);
500
+ return checked.ok
501
+ ? []
502
+ : [
503
+ violation(checked.failure, `artifacts[${index}]`, "{path: ruta permitida, content: string}", entry).violation,
504
+ ];
505
+ })
506
+ : [];
393
507
  return {
394
508
  failure: {
395
509
  code: parsed.failure.code,
396
510
  message: parsed.failure.message,
397
511
  action: parsed.failure.action,
512
+ violations: individual.length > 0
513
+ ? individual
514
+ : [violation(parsed.failure, "artifacts", "lista de {path, content}", raw).violation],
398
515
  },
399
516
  };
400
517
  }
@@ -482,7 +599,7 @@ function approvalAnswer(body, input) {
482
599
  failure: {
483
600
  code: "FLOW_APPROVAL_MISSING",
484
601
  message: "esta frontera necesita una aprobación de efecto y no llegó ninguna",
485
- action: `volvé a invocar con --approval ${input.expectedApproval ?? "<digest>"}, o respondé '${STOP_LABEL}' para no autorizarla`,
602
+ action: `volvé a invocar con --approval ${input.expectedApproval ?? "<digest>"}, o respondé '${STOP_LABEL}' para cerrar la sesión conservando lo pendiente sin autorizar ese efecto`,
486
603
  },
487
604
  };
488
605
  }
@@ -517,65 +634,58 @@ function executionAnswer(body, input) {
517
634
  if (action === null) {
518
635
  return { ok: false, failure: badResult("esta frontera no declara ninguna acción delegada") };
519
636
  }
637
+ const issues = [];
638
+ const add = (failure, field, expected, value) => {
639
+ issues.push(violation(failure, field, expected, value));
640
+ };
520
641
  const outcome = body.outcome;
521
642
  // Absent and out-of-vocabulary are DIFFERENT failures and no longer share a
522
643
  // sentence. They used to, and the sentence described only the second one.
523
644
  if (outcome === undefined) {
524
- return { ok: false, failure: badResult(missingOutcome(body)) };
645
+ add(badResult(missingOutcome(body)), "outcome", CAPABILITY_OUTCOMES.join(" | "), outcome);
525
646
  }
526
- if (typeof outcome !== "string" ||
647
+ else if (typeof outcome !== "string" ||
527
648
  !CAPABILITY_OUTCOMES.includes(outcome)) {
528
- return {
529
- ok: false,
530
- failure: badResult(`'outcome' tiene que ser uno de: ${CAPABILITY_OUTCOMES.join(", ")} — una confirmación booleana o una narración no son un resultado`),
531
- };
649
+ add(badResult(`'outcome' tiene que ser uno de: ${CAPABILITY_OUTCOMES.join(", ")} — una confirmación booleana o una narración no son un resultado`), "outcome", CAPABILITY_OUTCOMES.join(" | "), outcome);
532
650
  }
533
651
  const invocation = readInvocation(body.invocation);
534
652
  if (invocation === null) {
535
- return {
536
- ok: false,
537
- failure: {
538
- code: "FLOW_RESULT_INVALID",
539
- message: "el resultado no declara la invocación que se ejecutó",
540
- action: "devolvé 'invocation' con el programa, los argumentos y el target que corriste: sin eso, nada distingue una ejecución de una afirmación",
541
- },
542
- };
653
+ add({
654
+ code: "FLOW_RESULT_INVALID",
655
+ message: `el resultado no declara la invocación que se ejecutó: invocation espera {program: string, args: string[], target: string, input: string|null}; recibió ${Array.isArray(body.invocation) ? "lista" : typeof body.invocation}`,
656
+ action: "devolvé 'invocation' con el programa, los argumentos y el target que corriste: sin eso, nada distingue una ejecución de una afirmación",
657
+ }, "invocation", "{program, args, target, input}", body.invocation);
543
658
  }
544
- const mismatch = invocationMismatch(action.invocation, invocation);
545
- if (mismatch !== null) {
546
- return {
547
- ok: false,
548
- failure: {
659
+ else {
660
+ const mismatch = invocationMismatch(action.invocation, invocation);
661
+ if (mismatch !== null)
662
+ add({
549
663
  code: "FLOW_ACTION_MISMATCH",
550
664
  message: `el resultado corresponde a otra invocación: ${mismatch}`,
551
665
  action: `ejecutá exactamente '${[action.invocation.program, ...action.invocation.args].join(" ")}' en ${action.invocation.target} y devolvé su resultado`,
552
- },
553
- };
666
+ }, "invocation", "invocación sellada", body.invocation);
554
667
  }
555
- const read = readValidations(body.validations);
668
+ const read = readValidations(body.validations, action.evidence);
556
669
  if (!read.ok) {
557
- // The rejection lands on the half that is actually wrong: a diagnosable nested
558
- // proof is the proof's, and only a container breaking its own shape is the
559
- // envelope's. Reserving FLOW_RESULT_INVALID for the latter is the point.
560
- return {
561
- ok: false,
562
- failure: read.defect !== null
563
- ? proofShapeFailure(read.defect)
564
- : badResult(badValidations(body.validations, action.evidence)),
565
- };
670
+ issues.push(...read.issues);
566
671
  }
567
- const validations = read.validations;
568
- const effects = readLedger(body.effects);
672
+ const effects = readLedger(body.effects, outcome === "completed" ? effectsOf(input.decision) : []);
569
673
  if (effects === null) {
570
- return {
571
- ok: false,
572
- failure: badResult("'effects' tiene que traer el registro planned/approved/applied del resultado"),
573
- };
674
+ const ledger = body.effects;
675
+ const field = isRecord(ledger) && ledger.applied !== undefined ? "effects.applied" : "effects";
676
+ const unknown = isRecord(ledger) && Array.isArray(ledger.applied)
677
+ ? ledger.applied.find((effect) => !isEffectClass(effect))
678
+ : undefined;
679
+ add(badResult(unknown === undefined
680
+ ? "'effects' tiene que traer el registro planned/approved/applied del resultado"
681
+ : `'effects.applied' trae la clase ${JSON.stringify(unknown)}; las válidas son ${EFFECT_CLASSES.join(", ")}`), field, "{planned: EffectClass[], approved: EffectClass[], applied: EffectClass[]}", field === "effects" ? ledger : ledger.applied);
574
682
  }
575
683
  const output = readOutput(body.output);
576
684
  if (output === undefined) {
577
- return { ok: false, failure: badResult("'output' tiene que ser un OperationOutput o null") };
685
+ add(badResult("'output' tiene que ser un OperationOutput o null"), "output", "OperationOutput | null", body.output);
578
686
  }
687
+ if (issues.length > 0)
688
+ return { ok: false, failure: collected(issues) };
579
689
  return {
580
690
  ok: true,
581
691
  answer: {
@@ -583,7 +693,13 @@ function executionAnswer(body, input) {
583
693
  signals: [],
584
694
  decisions: {},
585
695
  choice: null,
586
- result: { outcome: outcome, invocation, output, validations, effects },
696
+ result: {
697
+ outcome: outcome,
698
+ invocation: invocation,
699
+ output: output,
700
+ validations: read.ok ? read.validations : [],
701
+ effects: effects,
702
+ },
587
703
  artifacts: EMPTY,
588
704
  },
589
705
  };
@@ -644,12 +760,12 @@ function badValidations(value, evidence) {
644
760
  const keys = Object.keys(entry);
645
761
  const seen = keys.length > 0 ? ` (trae: ${keys.join(", ")})` : " (viene vacía)";
646
762
  if (typeof entry.id !== "string")
647
- return `la validación ${index + 1} no trae 'id'${seen}`;
763
+ return `la validación ${index + 1} no trae 'id': validations[${index}].id espera string; recibió ${typeof entry.id}${seen}`;
648
764
  if (typeof entry.passed !== "boolean") {
649
- return `la validación '${entry.id}' no trae 'passed' booleano${seen}`;
765
+ return `validations[${index}].passed espera boolean; recibió ${typeof entry.passed}${seen}`;
650
766
  }
651
767
  if (entry.detail !== undefined && entry.detail !== null && typeof entry.detail !== "string") {
652
- return `la validación '${entry.id}' trae un 'detail' que no es texto: ahí va la salida real del comando`;
768
+ return `validations[${index}].detail espera string o null; recibió ${typeof entry.detail}: ahí va la salida real del comando`;
653
769
  }
654
770
  }
655
771
  return `'validations' tiene que ser ${shape}`;
@@ -661,7 +777,7 @@ function invocationMismatch(sealed, ran) {
661
777
  if (sealed.args.length !== ran.args.length || sealed.args.some((arg, i) => arg !== ran.args[i])) {
662
778
  return `argumentos '${ran.args.join(" ")}' en vez de '${sealed.args.join(" ")}'`;
663
779
  }
664
- if (sealed.target !== ran.target)
780
+ if (resolve(sealed.target) !== resolve(ran.target))
665
781
  return `target '${ran.target}' en vez de '${sealed.target}'`;
666
782
  if ((sealed.input ?? null) !== (ran.input ?? null))
667
783
  return "otro input";
@@ -681,31 +797,58 @@ function readInvocation(value) {
681
797
  return null;
682
798
  return { program: value.program, args: value.args, target: value.target, input };
683
799
  }
684
- function readValidations(value) {
800
+ function readValidations(value, evidence) {
685
801
  if (value === undefined)
686
802
  return { ok: true, validations: [] };
803
+ const bad = () => badResult(badValidations(value, evidence));
687
804
  if (!Array.isArray(value))
688
- return { ok: false, defect: null };
805
+ return {
806
+ ok: false,
807
+ issues: [violation(bad(), "validations", "lista de {id, passed, detail}", value)],
808
+ };
689
809
  const out = [];
690
- for (const entry of value) {
691
- if (!isRecord(entry))
692
- return { ok: false, defect: null };
693
- if (typeof entry.id !== "string" || typeof entry.passed !== "boolean") {
694
- return { ok: false, defect: null };
810
+ const issues = [];
811
+ const add = (failure, field, expected, received) => {
812
+ issues.push(violation(failure, field, expected, received));
813
+ };
814
+ for (const [index, entry] of value.entries()) {
815
+ if (!isRecord(entry)) {
816
+ add(bad(), `validations[${index}]`, "{id, passed, detail}", entry);
817
+ continue;
818
+ }
819
+ const field = `validations[${index}]`;
820
+ if (typeof entry.id !== "string") {
821
+ add(bad(), `${field}.id`, "string", entry.id);
822
+ }
823
+ if (typeof entry.passed !== "boolean") {
824
+ add(bad(), `${field}.passed`, "boolean", entry.passed);
695
825
  }
696
826
  const detail = entry.detail === undefined ? null : entry.detail;
697
- if (detail !== null && typeof detail !== "string")
698
- return { ok: false, defect: null };
699
- if (entry.proof === undefined) {
827
+ if (detail !== null && typeof detail !== "string") {
828
+ add(bad(), `${field}.detail`, "string | null", detail);
829
+ }
830
+ if (entry.proof === undefined || entry.proof === null) {
831
+ if (typeof entry.id !== "string" ||
832
+ typeof entry.passed !== "boolean" ||
833
+ (detail !== null && typeof detail !== "string"))
834
+ continue;
700
835
  out.push({ id: entry.id, passed: entry.passed, detail });
701
836
  continue;
702
837
  }
703
838
  const read = readCheckoutProof(entry.proof);
704
- if (!read.ok)
705
- return { ok: false, defect: read.defect };
839
+ if (!read.ok) {
840
+ const failure = proofShapeFailure(read.defect);
841
+ const suffix = read.defect.where === "proof" ? "" : `.${read.defect.where}`;
842
+ add(failure, `${field}.proof${suffix}`, read.defect.expected.join(" | "), entry.proof);
843
+ continue;
844
+ }
845
+ if (typeof entry.id !== "string" ||
846
+ typeof entry.passed !== "boolean" ||
847
+ (detail !== null && typeof detail !== "string"))
848
+ continue;
706
849
  out.push({ id: entry.id, passed: entry.passed, detail, proof: read.proof });
707
850
  }
708
- return { ok: true, validations: out };
851
+ return issues.length === 0 ? { ok: true, validations: out } : { ok: false, issues };
709
852
  }
710
853
  /** The fields each `kind` demands of its `invocation`, named once. */
711
854
  const PROOF_INVOCATION_FIELDS = {
@@ -810,17 +953,17 @@ function proofShapeFailure(defect) {
810
953
  ? `el 'proof' de kind '${defect.kind}' trae una 'invocation' que ese kind no acepta: espera ${defect.expected.join(", ")} y ${received}`
811
954
  : `el 'proof' de kind '${defect.kind ?? "(ausente)"}' no satisface la forma de su kind: espera ${defect.expected.join(", ")} (${received})`;
812
955
  return {
813
- code: "WORKLINE_CHECKOUT_PROOF_INVALID",
956
+ code: "WORKLINE_CHECKOUT_PROOF_SHAPE_INVALID",
814
957
  message,
815
958
  action: "corregí el 'proof' anidado, no la lista 'validations': un kind 'command' pide {program, args} y un 'inspection' pide {artifact} — sin 'target' ni 'input', aunque la directiva los traiga. 'aw flow prove' lo produce ya bien formado y sin gastar intento",
816
959
  };
817
960
  }
818
- function readLedger(value) {
961
+ function readLedger(value, defaultApplied = []) {
819
962
  if (!isRecord(value))
820
963
  return null;
821
964
  const planned = readEffectClasses(value.planned);
822
965
  const approved = readEffectClasses(value.approved);
823
- const applied = readEffectClasses(value.applied);
966
+ const applied = value.applied === undefined ? [...defaultApplied] : readEffectClasses(value.applied);
824
967
  if (planned === null || approved === null || applied === null)
825
968
  return null;
826
969
  return { planned, approved, applied };