@tacuchi/agent-workflow-cli 25.6.1 → 25.8.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 (279) hide show
  1. package/CHANGELOG.md +4398 -0
  2. package/README.md +1 -1
  3. package/dist/adapters/git-cli.js +160 -13
  4. package/dist/adapters/git-cli.js.map +1 -1
  5. package/dist/adapters/node-file-system.js +39 -2
  6. package/dist/adapters/node-file-system.js.map +1 -1
  7. package/dist/application/branch-resolver.js +34 -1
  8. package/dist/application/branch-resolver.js.map +1 -1
  9. package/dist/application/capability/readiness.js +26 -10
  10. package/dist/application/capability/readiness.js.map +1 -1
  11. package/dist/application/capability/wrapper.js +10 -3
  12. package/dist/application/capability/wrapper.js.map +1 -1
  13. package/dist/application/checkpoint-write-service.js +161 -39
  14. package/dist/application/checkpoint-write-service.js.map +1 -1
  15. package/dist/application/dates.js +12 -0
  16. package/dist/application/dates.js.map +1 -1
  17. package/dist/application/dev-only-services.js +5 -7
  18. package/dist/application/dev-only-services.js.map +1 -1
  19. package/dist/application/doctor/provider-mcps.js +1 -1
  20. package/dist/application/doctor/provider-mcps.js.map +1 -1
  21. package/dist/application/fix-git-service.js +83 -13
  22. package/dist/application/fix-git-service.js.map +1 -1
  23. package/dist/application/flow/advance.js +64 -9
  24. package/dist/application/flow/advance.js.map +1 -1
  25. package/dist/application/flow/annul-service.js +159 -0
  26. package/dist/application/flow/annul-service.js.map +1 -0
  27. package/dist/application/flow/checkout-observation.js +49 -0
  28. package/dist/application/flow/checkout-observation.js.map +1 -1
  29. package/dist/application/flow/close-at-boundary.js +144 -0
  30. package/dist/application/flow/close-at-boundary.js.map +1 -0
  31. package/dist/application/flow/flow-service.js +213 -49
  32. package/dist/application/flow/flow-service.js.map +1 -1
  33. package/dist/application/flow/internal-actions.js +87 -4
  34. package/dist/application/flow/internal-actions.js.map +1 -1
  35. package/dist/application/flow/internal-drive.js +70 -33
  36. package/dist/application/flow/internal-drive.js.map +1 -1
  37. package/dist/application/flow/reopen-run.js +152 -0
  38. package/dist/application/flow/reopen-run.js.map +1 -0
  39. package/dist/application/flow/run-journey.js +11 -8
  40. package/dist/application/flow/run-journey.js.map +1 -1
  41. package/dist/application/flow/run-projection.js +37 -10
  42. package/dist/application/flow/run-projection.js.map +1 -1
  43. package/dist/application/flow/run-state-service.js +109 -36
  44. package/dist/application/flow/run-state-service.js.map +1 -1
  45. package/dist/application/flow/submit.js +217 -188
  46. package/dist/application/flow/submit.js.map +1 -1
  47. package/dist/application/git-flow-service.js +325 -72
  48. package/dist/application/git-flow-service.js.map +1 -1
  49. package/dist/application/hook-sql-mutation-guard.js +290 -27
  50. package/dist/application/hook-sql-mutation-guard.js.map +1 -1
  51. package/dist/application/host-memory/claude-code.js +65 -0
  52. package/dist/application/host-memory/claude-code.js.map +1 -0
  53. package/dist/application/host-memory/codex.js +225 -0
  54. package/dist/application/host-memory/codex.js.map +1 -0
  55. package/dist/application/host-memory/destination.js +52 -0
  56. package/dist/application/host-memory/destination.js.map +1 -0
  57. package/dist/application/host-memory/reader.js +9 -0
  58. package/dist/application/host-memory/reader.js.map +1 -0
  59. package/dist/application/host-memory/report.js +136 -0
  60. package/dist/application/host-memory/report.js.map +1 -0
  61. package/dist/application/lifecycle-target.js +3 -1
  62. package/dist/application/lifecycle-target.js.map +1 -1
  63. package/dist/application/local-proposal.js +13 -3
  64. package/dist/application/local-proposal.js.map +1 -1
  65. package/dist/application/logging/log-events.js +22 -0
  66. package/dist/application/logging/log-events.js.map +1 -1
  67. package/dist/application/parsers/spec-relation.js +20 -7
  68. package/dist/application/parsers/spec-relation.js.map +1 -1
  69. package/dist/application/persist-service.js +45 -1
  70. package/dist/application/persist-service.js.map +1 -1
  71. package/dist/application/plan-exec-batch-service.js +47 -2
  72. package/dist/application/plan-exec-batch-service.js.map +1 -1
  73. package/dist/application/plan-lineage-seal.js +93 -0
  74. package/dist/application/plan-lineage-seal.js.map +1 -0
  75. package/dist/application/plan-lint-service.js +153 -0
  76. package/dist/application/plan-lint-service.js.map +1 -0
  77. package/dist/application/prod-consent.js +75 -0
  78. package/dist/application/prod-consent.js.map +1 -0
  79. package/dist/application/reseal-service.js +9 -3
  80. package/dist/application/reseal-service.js.map +1 -1
  81. package/dist/application/self/install-skill.js +40 -12
  82. package/dist/application/self/install-skill.js.map +1 -1
  83. package/dist/application/self/install-targets.js +73 -2
  84. package/dist/application/self/install-targets.js.map +1 -1
  85. package/dist/application/self/uninstall.js +21 -7
  86. package/dist/application/self/uninstall.js.map +1 -1
  87. package/dist/application/self/update-self.js +204 -8
  88. package/dist/application/self/update-self.js.map +1 -1
  89. package/dist/application/session-create-service.js +49 -0
  90. package/dist/application/session-create-service.js.map +1 -1
  91. package/dist/application/session-custody-recorder.js +4 -0
  92. package/dist/application/session-custody-recorder.js.map +1 -1
  93. package/dist/application/session-narrative.js +36 -0
  94. package/dist/application/session-narrative.js.map +1 -1
  95. package/dist/application/session-resolver.js +28 -9
  96. package/dist/application/session-resolver.js.map +1 -1
  97. package/dist/application/session-resume-service.js +65 -16
  98. package/dist/application/session-resume-service.js.map +1 -1
  99. package/dist/application/source-boundary-policy.js +168 -34
  100. package/dist/application/source-boundary-policy.js.map +1 -1
  101. package/dist/application/working-branch-service.js +68 -0
  102. package/dist/application/working-branch-service.js.map +1 -0
  103. package/dist/application/workline-graph.js +7 -2
  104. package/dist/application/workline-graph.js.map +1 -1
  105. package/dist/cli/ascii.js +84 -0
  106. package/dist/cli/ascii.js.map +1 -0
  107. package/dist/cli/commands/amend.js +1 -0
  108. package/dist/cli/commands/amend.js.map +1 -1
  109. package/dist/cli/commands/capability.js +15 -0
  110. package/dist/cli/commands/capability.js.map +1 -1
  111. package/dist/cli/commands/check-branch.js +1 -0
  112. package/dist/cli/commands/check-branch.js.map +1 -1
  113. package/dist/cli/commands/checkpoint-read.js +1 -0
  114. package/dist/cli/commands/checkpoint-read.js.map +1 -1
  115. package/dist/cli/commands/checkpoint-write.js +22 -9
  116. package/dist/cli/commands/checkpoint-write.js.map +1 -1
  117. package/dist/cli/commands/claims.js +1 -0
  118. package/dist/cli/commands/claims.js.map +1 -1
  119. package/dist/cli/commands/code-scan.js +1 -0
  120. package/dist/cli/commands/code-scan.js.map +1 -1
  121. package/dist/cli/commands/context-budget.js +1 -0
  122. package/dist/cli/commands/context-budget.js.map +1 -1
  123. package/dist/cli/commands/context-plan.js +1 -0
  124. package/dist/cli/commands/context-plan.js.map +1 -1
  125. package/dist/cli/commands/cut-intent.js +1 -0
  126. package/dist/cli/commands/cut-intent.js.map +1 -1
  127. package/dist/cli/commands/designs.js +1 -0
  128. package/dist/cli/commands/designs.js.map +1 -1
  129. package/dist/cli/commands/dev-only.js +4 -0
  130. package/dist/cli/commands/dev-only.js.map +1 -1
  131. package/dist/cli/commands/doctor.js +5 -0
  132. package/dist/cli/commands/doctor.js.map +1 -1
  133. package/dist/cli/commands/export.js +13 -0
  134. package/dist/cli/commands/export.js.map +1 -1
  135. package/dist/cli/commands/fix-git.js +46 -6
  136. package/dist/cli/commands/fix-git.js.map +1 -1
  137. package/dist/cli/commands/flow.js +61 -5
  138. package/dist/cli/commands/flow.js.map +1 -1
  139. package/dist/cli/commands/generate-launch.js +1 -0
  140. package/dist/cli/commands/generate-launch.js.map +1 -1
  141. package/dist/cli/commands/git-flow.js +104 -29
  142. package/dist/cli/commands/git-flow.js.map +1 -1
  143. package/dist/cli/commands/history-update.js +7 -9
  144. package/dist/cli/commands/history-update.js.map +1 -1
  145. package/dist/cli/commands/hook.js +11 -3
  146. package/dist/cli/commands/hook.js.map +1 -1
  147. package/dist/cli/commands/host-doctor.js +1 -0
  148. package/dist/cli/commands/host-doctor.js.map +1 -1
  149. package/dist/cli/commands/host-memory.js +26 -0
  150. package/dist/cli/commands/host-memory.js.map +1 -0
  151. package/dist/cli/commands/index.js +6 -0
  152. package/dist/cli/commands/index.js.map +1 -1
  153. package/dist/cli/commands/mcp.js +30 -4
  154. package/dist/cli/commands/mcp.js.map +1 -1
  155. package/dist/cli/commands/merge-state.js +1 -0
  156. package/dist/cli/commands/merge-state.js.map +1 -1
  157. package/dist/cli/commands/multiroot.js +16 -0
  158. package/dist/cli/commands/multiroot.js.map +1 -1
  159. package/dist/cli/commands/persist.js +6 -0
  160. package/dist/cli/commands/persist.js.map +1 -1
  161. package/dist/cli/commands/plan.js +51 -0
  162. package/dist/cli/commands/plan.js.map +1 -0
  163. package/dist/cli/commands/plugin-cache.js +4 -0
  164. package/dist/cli/commands/plugin-cache.js.map +1 -1
  165. package/dist/cli/commands/plugin-doctor.js +3 -0
  166. package/dist/cli/commands/plugin-doctor.js.map +1 -1
  167. package/dist/cli/commands/project-md-upsert.js +3 -0
  168. package/dist/cli/commands/project-md-upsert.js.map +1 -1
  169. package/dist/cli/commands/release-data.js +12 -0
  170. package/dist/cli/commands/release-data.js.map +1 -1
  171. package/dist/cli/commands/release-pass.js +10 -0
  172. package/dist/cli/commands/release-pass.js.map +1 -1
  173. package/dist/cli/commands/remove-source.js +1 -0
  174. package/dist/cli/commands/remove-source.js.map +1 -1
  175. package/dist/cli/commands/reseal.js +1 -0
  176. package/dist/cli/commands/reseal.js.map +1 -1
  177. package/dist/cli/commands/resume-summary.js +9 -2
  178. package/dist/cli/commands/resume-summary.js.map +1 -1
  179. package/dist/cli/commands/resume.js +1 -0
  180. package/dist/cli/commands/resume.js.map +1 -1
  181. package/dist/cli/commands/retirement.js +1 -0
  182. package/dist/cli/commands/retirement.js.map +1 -1
  183. package/dist/cli/commands/self.js +33 -0
  184. package/dist/cli/commands/self.js.map +1 -1
  185. package/dist/cli/commands/session-artifacts.js +1 -0
  186. package/dist/cli/commands/session-artifacts.js.map +1 -1
  187. package/dist/cli/commands/session-close.js +129 -30
  188. package/dist/cli/commands/session-close.js.map +1 -1
  189. package/dist/cli/commands/session-create.js +1 -0
  190. package/dist/cli/commands/session-create.js.map +1 -1
  191. package/dist/cli/commands/session-resume.js +1 -0
  192. package/dist/cli/commands/session-resume.js.map +1 -1
  193. package/dist/cli/commands/sessions.js +1 -0
  194. package/dist/cli/commands/sessions.js.map +1 -1
  195. package/dist/cli/commands/set-branch.js +41 -6
  196. package/dist/cli/commands/set-branch.js.map +1 -1
  197. package/dist/cli/commands/settle.js +1 -0
  198. package/dist/cli/commands/settle.js.map +1 -1
  199. package/dist/cli/commands/skill-index.js +1 -0
  200. package/dist/cli/commands/skill-index.js.map +1 -1
  201. package/dist/cli/commands/skills.js +1 -0
  202. package/dist/cli/commands/skills.js.map +1 -1
  203. package/dist/cli/commands/sources.js +1 -0
  204. package/dist/cli/commands/sources.js.map +1 -1
  205. package/dist/cli/commands/stack.js +1 -0
  206. package/dist/cli/commands/stack.js.map +1 -1
  207. package/dist/cli/commands/status.js +1 -0
  208. package/dist/cli/commands/status.js.map +1 -1
  209. package/dist/cli/commands/tool.js +5 -21
  210. package/dist/cli/commands/tool.js.map +1 -1
  211. package/dist/cli/commands/unknown-flags.js +67 -16
  212. package/dist/cli/commands/unknown-flags.js.map +1 -1
  213. package/dist/cli/commands/visibility.js +1 -0
  214. package/dist/cli/commands/visibility.js.map +1 -1
  215. package/dist/cli/commands/workspace-init.js +12 -0
  216. package/dist/cli/commands/workspace-init.js.map +1 -1
  217. package/dist/cli/commands/workspace-migrate.js +2 -13
  218. package/dist/cli/commands/workspace-migrate.js.map +1 -1
  219. package/dist/cli/commands/worktree.js +1 -0
  220. package/dist/cli/commands/worktree.js.map +1 -1
  221. package/dist/cli/help-groups.js +41 -0
  222. package/dist/cli/help-groups.js.map +1 -1
  223. package/dist/cli/main.js +41 -58
  224. package/dist/cli/main.js.map +1 -1
  225. package/dist/cli/output-mode.js +11 -2
  226. package/dist/cli/output-mode.js.map +1 -1
  227. package/dist/cli/parser.js +14 -5
  228. package/dist/cli/parser.js.map +1 -1
  229. package/dist/cli/registry.js.map +1 -1
  230. package/dist/cli/render.js +30 -1
  231. package/dist/cli/render.js.map +1 -1
  232. package/dist/cli/tui/components/git-flow-actions.js +65 -20
  233. package/dist/cli/tui/components/git-flow-actions.js.map +1 -1
  234. package/dist/cli/tui/tabs/project-tab.js +101 -12
  235. package/dist/cli/tui/tabs/project-tab.js.map +1 -1
  236. package/dist/domain/changelog-contract.js +172 -0
  237. package/dist/domain/changelog-contract.js.map +1 -0
  238. package/dist/domain/database-tools.js +1 -189
  239. package/dist/domain/database-tools.js.map +1 -1
  240. package/dist/domain/flow/answer.js +11 -0
  241. package/dist/domain/flow/answer.js.map +1 -1
  242. package/dist/domain/flow/authority.js +153 -14
  243. package/dist/domain/flow/authority.js.map +1 -1
  244. package/dist/domain/flow/execution-result.js +78 -7
  245. package/dist/domain/flow/execution-result.js.map +1 -1
  246. package/dist/domain/flow/journey-baseline.js +131 -0
  247. package/dist/domain/flow/journey-baseline.js.map +1 -0
  248. package/dist/domain/flow/route.js.map +1 -1
  249. package/dist/domain/flow/rules.js +5 -6
  250. package/dist/domain/flow/rules.js.map +1 -1
  251. package/dist/domain/flow/run-state.js +440 -89
  252. package/dist/domain/flow/run-state.js.map +1 -1
  253. package/dist/domain/harnesses.js +8 -1
  254. package/dist/domain/harnesses.js.map +1 -1
  255. package/dist/domain/host-memory/model.js +2 -0
  256. package/dist/domain/host-memory/model.js.map +1 -0
  257. package/dist/domain/host-memory/provenance.js +43 -0
  258. package/dist/domain/host-memory/provenance.js.map +1 -0
  259. package/dist/domain/host-memory/topic.js +26 -0
  260. package/dist/domain/host-memory/topic.js.map +1 -0
  261. package/dist/domain/lineage.js +11 -3
  262. package/dist/domain/lineage.js.map +1 -1
  263. package/dist/domain/proposal.js +7 -0
  264. package/dist/domain/proposal.js.map +1 -1
  265. package/dist/domain/session/custody.js.map +1 -1
  266. package/dist/domain/sql-lexer.js +240 -0
  267. package/dist/domain/sql-lexer.js.map +1 -0
  268. package/package.json +2 -2
  269. package/skills/w/SKILL.md +9 -9
  270. package/skills/w/commands/README.md +2 -1
  271. package/skills/w/commands/recall.md +39 -0
  272. package/skills/w/context/MANIFEST.json +4 -0
  273. package/skills/w/harness/HARNESS.md +12 -6
  274. package/skills/w/hooks/README.md +27 -16
  275. package/skills/w/loops/CHASSIS.md +16 -12
  276. package/skills/w/loops/CODE-POLICIES.md +11 -6
  277. package/skills/w/loops/plan-exec-loop/LOOP.md +9 -9
  278. package/skills/w/modules/COMPACTION.md +1 -1
  279. package/skills/w/roles/design/CONTRACT.md +10 -3
@@ -5,16 +5,17 @@
5
5
  * is the plumbing that makes the advance atomic and addressable — which session,
6
6
  * which state, one write.
7
7
  */
8
- import { MAX_BOUNDARY_ATTEMPTS, applyAttemptReconciliation, atCurrentVersion, attemptAccountingAt, checkAgainstJourney, grantAttempts, legacyRunNeedsAdoption, newRunState, normalizeAttemptChain, reconcileAttemptsAt, recoveryBlockedAt, } from "../../domain/flow/run-state.js";
8
+ import { MAX_BOUNDARY_ATTEMPTS, applyAttemptReconciliation, attemptAccountingAt, checkAgainstJourney, grantAttempts, inheritedBasesFrom, legacyRunNeedsAdoption, newRunState, normalizeAttemptChain, reconcileAttemptsAt, recoveryBlockedAt, restartInvocation, withEvent, withInheritedBases, withoutExhaustedRerun, } from "../../domain/flow/run-state.js";
9
9
  import { WORKLINE_FLOWS } from "../capability/compose.js";
10
10
  import { resolveCoreDocsCanon } from "../docs-canon-service.js";
11
- import { recordFlowAdoption } from "../session-custody-recorder.js";
11
+ import { recordFlowAdoption, recordFlowRestart } from "../session-custody-recorder.js";
12
+ import { readCustody } from "../session-custody-service.js";
12
13
  import { resolveSessionTarget } from "../session-resolver.js";
13
14
  import { advanceFlowRun, directiveFor, resolveBoundary } from "./advance.js";
14
15
  import { publishObservedCheckouts } from "./checkout-observation.js";
15
16
  import { driveInternalActions } from "./internal-drive.js";
16
17
  import { journeyForRun } from "./run-journey.js";
17
- import { applyUnderLock, locateRun } from "./run-state-service.js";
18
+ import { applyUnderLock, locateRun, readRun, restartUnderLock, } from "./run-state-service.js";
18
19
  export async function advanceFlow(fs, paths, input) {
19
20
  const canon = await resolveCoreDocsCanon(fs, paths);
20
21
  if (!canon.ok) {
@@ -29,13 +30,19 @@ export async function advanceFlow(fs, paths, input) {
29
30
  }
30
31
  // A write path: a closed line is never advanced by accident, and nothing is
31
32
  // chosen by recency — several active sessions with no association is ambiguous.
32
- const resolution = await resolveSessionTarget(fs, paths, {
33
+ const target = {
33
34
  intent: "write",
34
35
  ...(input.code !== undefined ? { code: input.code } : {}),
35
36
  ...(input.contextId !== undefined ? { contextId: input.contextId } : {}),
37
+ };
38
+ let resolution = await resolveSessionTarget(fs, paths, {
39
+ ...target,
36
40
  allowClosed: false,
37
41
  bind: true,
38
42
  });
43
+ if (resolution.outcome === "error" && resolution.code === "SESSION_CLOSED") {
44
+ resolution = await closedOnItsOwnFinalize(fs, paths, target, resolution);
45
+ }
39
46
  if (resolution.outcome !== "resolved")
40
47
  return { ok: false, session: resolution };
41
48
  const session = resolution.session.folder;
@@ -43,17 +50,26 @@ export async function advanceFlow(fs, paths, input) {
43
50
  // Read BEFORE the advance: afterwards the state file always exists, so this is
44
51
  // the only moment that can tell an adoption from an ordinary advance.
45
52
  const adopting = input.adopt && !(await fs.exists(location.statePath));
46
- let adoptedExisting = false;
47
53
  const applied = await applyUnderLock(fs, location, (current) => {
48
- const seeded = current === null
49
- ? seed(input, session)
50
- : legacyRunNeedsAdoption(current)
51
- ? adoptExisting(input, current)
52
- : current;
54
+ // A readable run older than v11 never reaches here: the lock refuses it and
55
+ // names `aw flow restart`. Continuing its cursor would invent batch limits
56
+ // the old run never declared.
57
+ const seeded = current === null ? seed(input, session) : current;
53
58
  if ("failure" in seeded)
54
59
  return { ok: false, failure: seeded.failure };
55
- if (current !== null && legacyRunNeedsAdoption(current))
56
- adoptedExisting = true;
60
+ // A `--flow` that names another flow than the run's is refused, never
61
+ // ignored: since session-create seeds the run, the first advance is exactly
62
+ // where somebody still passes `--flow … --adopt` by habit.
63
+ if (current !== null && input.flow !== undefined && input.flow !== current.flow) {
64
+ return {
65
+ ok: false,
66
+ failure: {
67
+ code: "FLOW_ADOPTION_FLOW_MISMATCH",
68
+ message: `la corrida declara '${current.flow}', no '${input.flow}'`,
69
+ action: `avanzala sin --flow, o con '--flow ${current.flow}', o elegí la sesión correcta`,
70
+ },
71
+ };
72
+ }
57
73
  const advance = advanceFlowRun({
58
74
  state: seeded,
59
75
  journey: journeyForRun(seeded),
@@ -61,11 +77,11 @@ export async function advanceFlow(fs, paths, input) {
61
77
  if (!advance.ok)
62
78
  return { ok: false, failure: advance.failure };
63
79
  return { ok: true, state: advance.state, value: advance.directive };
64
- }, { allowAbsent: input.adopt, allowLegacyAdoption: input.adopt });
80
+ }, { allowAbsent: input.adopt });
65
81
  if (!applied.ok)
66
82
  return { ok: false, failure: applied.failure };
67
83
  // What the session IS, recorded once, from the adoption that really happened.
68
- if (adopting || adoptedExisting) {
84
+ if (adopting) {
69
85
  await recordFlowAdoption({ fs, paths }, session, applied.state.flow);
70
86
  }
71
87
  // Deciding stopped at the first delegated step; executing continues past every
@@ -85,6 +101,184 @@ export async function advanceFlow(fs, paths, input) {
85
101
  directive: await publishObservedCheckouts(fs, paths, session, input.git, driven.value),
86
102
  };
87
103
  }
104
+ /**
105
+ * A closed session whose run still stands on `chassis.finalize` — or the refusal.
106
+ *
107
+ * That is the close that happened and whose run write did not: `session.close`
108
+ * already wrote the marker and the HISTORY row, and only the cursor stayed
109
+ * behind. Reopening it, which is what the refusal asks for, would undo the one
110
+ * effect that did land. So this one shape resolves, the driver re-runs the close
111
+ * — which recognizes a closed session — and the run finishes. Any other closed
112
+ * session keeps its refusal: a line somebody closed is never advanced by accident.
113
+ */
114
+ async function closedOnItsOwnFinalize(fs, paths, target, refused) {
115
+ const closed = await resolveSessionTarget(fs, paths, { ...target, allowClosed: true });
116
+ if (closed.outcome !== "resolved")
117
+ return refused;
118
+ const run = await readRun(fs, locateRun(paths, closed.session.folder));
119
+ // A run this CLI cannot continue is not finished by resolving it: its way out
120
+ // is `aw flow restart`, which needs the session open — so the reopen the
121
+ // refusal names comes first, instead of two refusals naming each other.
122
+ if (!run.ok || legacyRunNeedsAdoption(run.state))
123
+ return refused;
124
+ const standing = journeyForRun(run.state)[run.state.applied.length]?.id;
125
+ return standing === "chassis.finalize" ? closed : refused;
126
+ }
127
+ /**
128
+ * The way out of any stuck run, without touching `.flow-run.json` by hand.
129
+ *
130
+ * Under the run's lock it archives the registry and its attempt counter into a
131
+ * dated, sealed file inside the session, seeds a new run of the same flow whose
132
+ * first trace event names that archive and the cause, and records both in the
133
+ * session's custody. Then it advances the new run like any adoption. What it
134
+ * costs is the old run's answers — kept in the archive, never deleted — and in
135
+ * plan-exec the new run re-infers from the plan, so nothing validated is redone.
136
+ *
137
+ * The flow comes from the registry, then from custody's `flow_adopted`, then
138
+ * from `--flow`: what is already on record is never asked again, and a `--flow`
139
+ * that contradicts the record is refused before anything is archived.
140
+ */
141
+ export async function restartFlow(fs, paths, input) {
142
+ const target = await writableSession(fs, paths, input, "reiniciar");
143
+ if (!target.ok)
144
+ return target.result;
145
+ return reseat(fs, paths, target.session, input, {
146
+ cause: (location) => restartCause(fs, location),
147
+ events: () => [],
148
+ });
149
+ }
150
+ /** The session a run-replacing verb acts on: canon checked, open, bound. */
151
+ export async function writableSession(fs, paths, input, verb, bind = true) {
152
+ const canon = await resolveCoreDocsCanon(fs, paths);
153
+ if (!canon.ok) {
154
+ return {
155
+ ok: false,
156
+ result: {
157
+ ok: false,
158
+ failure: {
159
+ code: "DOCS_CANON_INVALID",
160
+ message: canon.error,
161
+ action: `corregí [docs] para conservar el layout documental canónico antes de ${verb}`,
162
+ },
163
+ },
164
+ };
165
+ }
166
+ const resolution = await resolveSessionTarget(fs, paths, {
167
+ intent: "write",
168
+ ...(input.code !== undefined ? { code: input.code } : {}),
169
+ ...(input.contextId !== undefined ? { contextId: input.contextId } : {}),
170
+ allowClosed: false,
171
+ bind,
172
+ });
173
+ if (resolution.outcome !== "resolved") {
174
+ return { ok: false, result: { ok: false, session: resolution } };
175
+ }
176
+ return { ok: true, session: resolution.session };
177
+ }
178
+ /**
179
+ * Archive the run, seed a new one of the same flow and advance it — the exit
180
+ * `restart` and `annul` share. The new run's first event is `restarted`; `events`
181
+ * adds what the verb itself has to say right after it.
182
+ */
183
+ export async function reseat(fs, paths, session, input, verb) {
184
+ const location = locateRun(paths, session.folder);
185
+ const recorded = await adoptedFlowOf(fs, session.path);
186
+ const restarted = await restartUnderLock(fs, location, () => verb.cause(location), (cause, archived) => {
187
+ const flow = flowToReadopt(archived.state, recorded, input.flow);
188
+ if ("failure" in flow)
189
+ return { ok: false, failure: flow.failure };
190
+ const seeded = withEvent(newRunState(flow.flow, session.folder), {
191
+ kind: "restarted",
192
+ transition: RESTART_OPERATION,
193
+ operation: RESTART_OPERATION,
194
+ archive: archived.path,
195
+ cause,
196
+ });
197
+ const traced = verb.events().reduce(withEvent, seeded);
198
+ return { ok: true, state: withInheritedBases(traced, inheritedBasesFrom(archived.state)) };
199
+ }, input.now === undefined ? {} : { at: input.now });
200
+ if (!restarted.ok)
201
+ return { ok: false, failure: restarted.failure };
202
+ await recordFlowRestart({ fs, paths }, session.folder, restarted.archive.path);
203
+ await recordFlowAdoption({ fs, paths }, session.folder, restarted.state.flow);
204
+ return advanceFlow(fs, paths, {
205
+ code: session.folder,
206
+ adopt: false,
207
+ ...(input.git === undefined ? {} : { git: input.git }),
208
+ executor: input.executor,
209
+ });
210
+ }
211
+ const RESTART_OPERATION = "flow.restart";
212
+ /**
213
+ * Why the old run could not go on, as `CODE: message` — what the trace keeps.
214
+ *
215
+ * Read with the same functions every other verb reads through, so the cause is
216
+ * the refusal the person was looking at, not a reinterpretation of it.
217
+ */
218
+ async function restartCause(fs, location) {
219
+ const read = await readRun(fs, location);
220
+ if (!read.ok)
221
+ return `${read.failure.code}: ${read.failure.message}`;
222
+ const journey = journeyForRun(read.state);
223
+ const incoherent = checkAgainstJourney(read.state, journey);
224
+ if (incoherent !== null)
225
+ return `${incoherent.code}: ${incoherent.message}`;
226
+ if (legacyRunNeedsAdoption(read.state)) {
227
+ return `FLOW_RUN_LEGACY_ADOPTION_REQUIRED: la corrida v${read.state.version} no se continúa`;
228
+ }
229
+ const error = resolveBoundary(read.state, journey).error;
230
+ return error === null
231
+ ? "FLOW_RESTART_REQUESTED: reinicio pedido"
232
+ : `${error.code}: ${error.message}`;
233
+ }
234
+ /** The flow custody recorded the last time this session adopted one, if any. */
235
+ async function adoptedFlowOf(fs, sessionPath) {
236
+ const read = await readCustody(fs, sessionPath);
237
+ if (read.status !== "present")
238
+ return null;
239
+ const adopted = read.custody.effects.filter((effect) => effect.kind === "flow_adopted");
240
+ return adopted.at(-1)?.paths[0] ?? null;
241
+ }
242
+ /** Registry, then custody, then `--flow` — and a `--flow` that contradicts them is refused. */
243
+ function flowToReadopt(archivedState, recorded, requested) {
244
+ const known = (value) => WORKLINE_FLOWS.includes(value);
245
+ const declared = flowDeclaredBy(archivedState);
246
+ const onRecord = known(declared) ? declared : known(recorded) ? recorded : null;
247
+ if (onRecord !== null && requested !== undefined && requested !== onRecord) {
248
+ return {
249
+ failure: {
250
+ code: "FLOW_ADOPTION_FLOW_MISMATCH",
251
+ message: `la corrida declara '${onRecord}', no '${requested}'`,
252
+ action: `reiniciala sin --flow, o con '--flow ${onRecord}', o elegí la sesión correcta`,
253
+ },
254
+ };
255
+ }
256
+ if (onRecord !== null)
257
+ return { flow: onRecord };
258
+ if (known(requested))
259
+ return { flow: requested };
260
+ return {
261
+ failure: {
262
+ code: "FLOW_ADOPTION_FLOW_MISSING",
263
+ message: "ni el registro ni la custodia dicen qué flow corría esta sesión",
264
+ action: `pasá --flow con uno de: ${WORKLINE_FLOWS.join(", ")}`,
265
+ },
266
+ };
267
+ }
268
+ /** The `flow` an archived registry names, even when the rest of it cannot be read. */
269
+ function flowDeclaredBy(archivedState) {
270
+ if (archivedState === null)
271
+ return null;
272
+ try {
273
+ const parsed = JSON.parse(archivedState);
274
+ return typeof parsed === "object" && parsed !== null
275
+ ? parsed.flow
276
+ : null;
277
+ }
278
+ catch {
279
+ return null;
280
+ }
281
+ }
88
282
  /**
89
283
  * Give a boundary that ran out of attempts a way back to being answerable.
90
284
  *
@@ -178,7 +372,7 @@ function recover(state, named) {
178
372
  // second answer on top of a half-applied one — and no attempt is worth that.
179
373
  const blocked = recoveryBlockedAt(state, stopped.id);
180
374
  if (blocked !== null)
181
- return refuseRecovery(stopped.id, blocked);
375
+ return refuseRecovery(state.session, stopped.id, blocked);
182
376
  // The SAME reconciliation the advance applies on its own, over the same input
183
377
  // and through the same function: two copies of this arithmetic is exactly how
184
378
  // the verb and the automatic repair would end up disagreeing about one run. It
@@ -193,9 +387,10 @@ function recover(state, named) {
193
387
  // this grant covers, so nothing is forgiven twice.
194
388
  const pending = attemptAccountingAt(reconciled, stopped.id);
195
389
  const granted = pending.spent > 0 ? grantAttempts(reconciled, stopped.id, pending.spent) : reconciled;
196
- const recovered = attemptAccountingAt(granted, stopped.id).unanswerable === null
390
+ const renumbered = attemptAccountingAt(granted, stopped.id).unanswerable === null
197
391
  ? granted
198
392
  : normalizeAttemptChain(granted);
393
+ const recovered = withoutExhaustedRerun(renumbered, stopped.id);
199
394
  const built = directiveFor(recovered, resolveBoundary(recovered, journey), []);
200
395
  if (!built.ok)
201
396
  return { ok: false, failure: built.failure };
@@ -210,12 +405,12 @@ function recover(state, named) {
210
405
  * boundary whose action was begun and never reported back is the opposite — the
211
406
  * missing thing is the verdict, and running the advance produces it.
212
407
  */
213
- function refuseRecovery(transition, blocked) {
408
+ function refuseRecovery(session, transition, blocked) {
214
409
  if (blocked.reason === "unverified") {
215
410
  return refuse("FLOW_RECOVERY_EXECUTION_UNVERIFIED", `'${transition}' dejó anotado que su acción se iba a ejecutar y nunca registró en qué terminó: nadie puede decir si tocó el mundo`, "no se devuelven intentos sobre una ejecución sin veredicto: corré 'aw flow advance' para que la acción vuelva a correr y deje su resultado, y recuperá después si hace falta");
216
411
  }
217
412
  const moved = blocked.event;
218
- return refuse("FLOW_RECOVERY_EFFECTS_APPLIED", `'${transition}' ya ejerció efectos en esta corrida (${moved.operation}): no se devuelven intentos sobre algo que ya ocurrió`, `el estado queda igual: seguí la recuperación que declara la acción de la fila, o llevá el gap a '## Open questions' — ${moved.kind === "failed" ? moved.recovery : "revisá la traza de la corrida"}`);
413
+ return refuse("FLOW_RECOVERY_EFFECTS_APPLIED", `'${transition}' ya ejerció efectos en esta corrida (${moved.operation}): no se devuelven intentos sobre algo que ya ocurrió`, `el estado queda igual. Sacá la corrida con '${restartInvocation(session)}', que archiva el registro dentro de la sesión, re-adopta su flow y lo deja en la traza; o seguí la recuperación de la fila — ${moved.kind === "failed" ? moved.recovery : "revisá la traza de la corrida"}`);
219
414
  }
220
415
  function refuse(code, message, action) {
221
416
  return { ok: false, failure: { code, message, action } };
@@ -242,35 +437,4 @@ function seed(input, session) {
242
437
  }
243
438
  return newRunState(flow, session);
244
439
  }
245
- /** Turn a readable v7–v9 state into v10 only after the caller explicitly opted in. */
246
- function adoptExisting(input, state) {
247
- if (!input.adopt) {
248
- return {
249
- failure: {
250
- code: "FLOW_RUN_LEGACY_ADOPTION_REQUIRED",
251
- message: `la corrida v${state.version} requiere adopción explícita antes de continuar`,
252
- action: `corré 'aw flow advance --code ${state.session} --flow ${state.flow} --adopt'`,
253
- },
254
- };
255
- }
256
- if (input.flow === undefined || !WORKLINE_FLOWS.includes(input.flow)) {
257
- return {
258
- failure: {
259
- code: "FLOW_ADOPTION_FLOW_MISSING",
260
- message: "adoptar una corrida existente exige confirmar su flow",
261
- action: `pasá --flow ${state.flow} junto con --adopt`,
262
- },
263
- };
264
- }
265
- if (input.flow !== state.flow) {
266
- return {
267
- failure: {
268
- code: "FLOW_ADOPTION_FLOW_MISMATCH",
269
- message: `la corrida declara '${state.flow}', no '${input.flow}'`,
270
- action: `adoptala con '--flow ${state.flow}' o elegí la sesión correcta`,
271
- },
272
- };
273
- }
274
- return atCurrentVersion(state);
275
- }
276
440
  //# sourceMappingURL=flow-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flow-service.js","sourceRoot":"","sources":["../../../src/application/flow/flow-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flow-service.js","sourceRoot":"","sources":["../../../src/application/flow/flow-service.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@
25
25
  */
26
26
  import { join } from "node:path";
27
27
  import { dispositionOf } from "../../domain/flow/route.js";
28
- import { withPlanExecBatch, withPlanExecBatchLoop, withSettlement, } from "../../domain/flow/run-state.js";
28
+ import { withPlanExecBatch, withPlanExecBatchBase, withPlanExecBatchLoop, withSettlement, } from "../../domain/flow/run-state.js";
29
29
  import { sealProposal } from "../../domain/proposal.js";
30
30
  import { obligationExit } from "../../domain/reconciliation.js";
31
31
  import { runArtifactsCommand } from "../artifacts-service.js";
@@ -44,6 +44,7 @@ import { recordPublication } from "../session-custody-recorder.js";
44
44
  import { runStatusCommand } from "../status-service.js";
45
45
  import { buildWorklineIndex } from "../workline-index-service.js";
46
46
  import { runWorktree } from "../worktree-service.js";
47
+ import { observeScopedFingerprints } from "./checkout-observation.js";
47
48
  import { projectRun } from "./run-projection.js";
48
49
  import { applyUnderLock, locateRun, readRun } from "./run-state-service.js";
49
50
  export function internalActionExecutor(deps) {
@@ -108,6 +109,10 @@ async function ensureUnits(deps, run) {
108
109
  }
109
110
  acquired.push(result);
110
111
  }
112
+ const based = await recordBatchBase(deps, run, scope.sources);
113
+ if (!based.ok) {
114
+ return refusal("worktree.ensure", `${based.failure.message} — ${based.failure.action}`, canonicalJson({ failure: based.failure, acquired }));
115
+ }
111
116
  return {
112
117
  ok: true,
113
118
  summary: `unidades de ${run.session}: ${acquired.map((unit) => `${unit.alias} → ${unit.branch}`).join(", ")}`,
@@ -116,8 +121,60 @@ async function ensureUnits(deps, run) {
116
121
  // makes of a re-entry that finds the bytes already written. Crediting nothing
117
122
  // when `created` is false would refuse the resumption this row is idempotent for.
118
123
  effects: ["local_additive"],
124
+ ...(based.state === null ? {} : { state: based.state }),
119
125
  };
120
126
  }
127
+ /** The batch this iteration walks, while it still has no base. */
128
+ function batchAwaitingBase(state) {
129
+ const iteration = state.batch_loop?.iteration ?? null;
130
+ const batch = (state.batches ?? []).find((entry) => entry.iteration === iteration);
131
+ return batch?.base === undefined ? batch : undefined;
132
+ }
133
+ /**
134
+ * Seal, on the batch this iteration walks, what each of its sources looked like
135
+ * before its work — the base it will have to have changed to be credited.
136
+ *
137
+ * Taken here because this row runs once per iteration, after the previous
138
+ * batch's close and commit: comparing against the previous CREDIT instead would
139
+ * let the plan that close published, or the review's fixes, pass as the next
140
+ * batch's work. The first batch's base is the run's start.
141
+ */
142
+ async function recordBatchBase(deps, run, sources) {
143
+ // Measuring hashes whole trees, so it happens only when a batch is waiting for
144
+ // its base; the lock below re-checks, and a run that moved fails its CAS.
145
+ const live = await readRun(deps.fs, locateRun(deps.paths, run.session));
146
+ if (live.ok && batchAwaitingBase(live.state) === undefined)
147
+ return { ok: true, state: null };
148
+ const observed = await observeScopedFingerprints(deps.fs, deps.git, deps.paths, run.session, sources);
149
+ if (!observed.ok)
150
+ return observed;
151
+ const recorded = await applyUnderLock(deps.fs, locateRun(deps.paths, run.session), (current) => {
152
+ if (current === null) {
153
+ return {
154
+ ok: false,
155
+ failure: {
156
+ code: "FLOW_RUN_ABSENT",
157
+ message: "la corrida desapareció antes de sellar la base del batch",
158
+ action: "reanudá la corrida con 'aw flow advance'",
159
+ },
160
+ };
161
+ }
162
+ const batch = batchAwaitingBase(current);
163
+ // Outside plan-exec, before any batch was inferred, or with its base already
164
+ // sealed, there is nothing to seal.
165
+ if (batch === undefined)
166
+ return { ok: true, state: current, value: null, persist: false };
167
+ // A reseated run already holds the work of the batches it re-infers: their
168
+ // base is the one the archived run sealed before that work, not today's tree.
169
+ const inherited = current.inherited_bases?.find((entry) => entry.phases.length === batch.phases.length &&
170
+ entry.phases.every((phase, index) => phase === batch.phases[index]));
171
+ const next = withPlanExecBatchBase(current, batch.id, inherited?.base ?? observed.base);
172
+ return { ok: true, state: next, value: null, persist: next !== current };
173
+ }, run.state_digest === undefined ? {} : { expectDigest: run.state_digest });
174
+ if (!recorded.ok)
175
+ return recorded;
176
+ return { ok: true, state: recorded.state };
177
+ }
121
178
  /**
122
179
  * Write the run's approved proposal — all of it, or none of it.
123
180
  *
@@ -581,10 +638,16 @@ async function closeBatch(deps, run) {
581
638
  catch {
582
639
  return refusal("plan-exec.batch-close", `no se puede leer '${run.scope.plan}'`, canonicalJson({ plan: run.scope.plan }));
583
640
  }
584
- const batch = (live.state.batches ?? []).find((current) => current.published_plan_digest === undefined);
641
+ const batch = batchToClose(live.state);
585
642
  if (batch === undefined) {
586
643
  return refusal("plan-exec.batch-close", "no hay un batch inferido para cerrar: la corrida no puede acreditar tareas que no selló antes de implementarlas", canonicalJson({ code: "PLAN_EXEC_BATCH_NOT_INFERRED", plan: run.scope.plan }));
587
644
  }
645
+ // A batch born with a base was meant to be credited at its phase validation.
646
+ // Reaching the close without that credit — an exhausted validation degraded
647
+ // past, a route that skipped it — would publish its tasks as done on no proof.
648
+ if (batch.base !== undefined && batch.credit === undefined) {
649
+ return refusal("plan-exec.batch-close", `el batch ${batch.id} no tiene acreditación: su validación de fase nunca aceptó una prueba propia del checkout de sus fuentes`, canonicalJson({ code: "PLAN_EXEC_BATCH_UNCREDITED", batch: batch.id, plan: run.scope.plan }));
650
+ }
588
651
  const phaseUpdates = phaseUpdatesForClosedBatch(text, batch);
589
652
  if (!phaseUpdates.ok) {
590
653
  return refusal("plan-exec.batch-close", `${phaseUpdates.failure.message} — ${phaseUpdates.failure.action}`, canonicalJson({ failure: phaseUpdates.failure }));
@@ -623,6 +686,26 @@ async function closeBatch(deps, run) {
623
686
  state,
624
687
  };
625
688
  }
689
+ /**
690
+ * The batch this close is about: the one still unpublished, or — on a re-entry —
691
+ * the one whose publication landed while the cursor never moved past its close.
692
+ *
693
+ * The second case is the write that failed AFTER the effect: the plan already
694
+ * carries the ticks and `validada`, the batch its after-digest, and only the run's
695
+ * cursor stayed on `batch-close`. It is found by counting the closes the cursor
696
+ * really walked, not by `batch_loop.iteration`, which after the publication
697
+ * already names the NEXT batch — or nothing, when it was the last one. The
698
+ * publisher then confirms it through its own already-applied path.
699
+ */
700
+ function batchToClose(state) {
701
+ const batches = state.batches ?? [];
702
+ const open = batches.find((batch) => batch.published_plan_digest === undefined);
703
+ if (open !== undefined)
704
+ return open;
705
+ const walked = state.applied.filter((id) => id === "plan-exec.batch-close").length;
706
+ const published = batches.filter((batch) => batch.published_plan_digest !== undefined);
707
+ return published.length > walked ? published.at(-1) : undefined;
708
+ }
626
709
  /**
627
710
  * Seal what the plan owes into the run, once the batch loop has ended.
628
711
  *
@@ -802,8 +885,8 @@ export async function planDonePrecondition(deps, path, session) {
802
885
  // And the command is READ from the projection, not spelled here. The two
803
886
  // agreed by accident: at an internal boundary the projection happens to
804
887
  // return exactly `aw flow advance --code <NNN>`. It does not have to — a
805
- // legacy run refuses a bare `advance` and needs `--flow … --adopt`, and only
806
- // the projection knows that. Synthesizing it was the third derivation this
888
+ // run older than v11 refuses a bare `advance` and needs `aw flow restart`,
889
+ // and only the projection knows that. Synthesizing it was the third derivation this
807
890
  // phase set out to remove.
808
891
  const run = await projectRun(deps.fs, deps.paths, session);
809
892
  const exit = obligationExit(plan.reconciliation, {