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