Fusion Agent
26f2a2080a
FN-207: contain lifecycle moves within valid workflow paths
Contain task lifecycle movement within the workflow graph so cards cannot wander between columns.
- Enforce directional transition and containment policies across task, recovery, merge, and workspace flows.
- Centralize lifecycle move execution, provenance, reason logging, and live-column rebound handling.
- Add regression, forbidden-path, remediation-placement, and workspace reuse coverage.
Files changed:
.changeset/fn-207-lifecycle-containment.md | 7 +
AGENTS.md | 2 +
docs/architecture.md | 1 +
docs/workflow-steps.md | 2 +
.../__tests__/lifecycle-direction-policy.test.ts | 88 ++++++
.../lifecycle-move-provenance-emit.test.ts | 107 +++++++
.../__tests__/remediation-step-placement.test.ts | 51 ++++
packages/core/src/index.gate.ts | 11 +-
packages/core/src/index.ts | 21 +-
packages/core/src/store.ts | 25 +-
packages/core/src/task-store/lifecycle-ops.ts | 21 +-
packages/core/src/task-store/moves.ts | 28 +-
.../core/src/task-store/remediation-step-ops.ts | 19 +-
.../core/src/tasks/remediation-step-placement.ts | 43 +++
.../src/workflows/workflow-lifecycle-direction.ts | 167 +++++++++++
.../src/workflows/workflow-lifecycle-traits.ts | 32 +++
.../src/workflows/workflow-transition-policy.ts | 56 +++-
.../auto-recovery-branch-worktree.test.ts | 25 +-
.../executor-browser-verification.test.ts | 6 +-
...ecutor-execution-policy-renamed-columns.test.ts | 19 +-
.../__tests__/executor-graph-requeue-gate.test.ts | 16 +-
.../src/__tests__/executor-step-session.test.ts | 20 +-
.../__tests__/fix-steps-from-failed-gates.test.ts | 66 ++++-
.../__tests__/lifecycle-containment-resume.test.ts | 142 +++++++++
.../__tests__/lifecycle-forbidden-paths.test.ts | 319 +++++++++++++++++++++
.../__tests__/lifecycle-move-legibility.test.ts | 157 ++++++++++
.../__tests__/lifecycle-move-reason-census.test.ts | 101 +++++++
.../__tests__/merger-ai-renamed-columns.test.ts | 28 +-
packages/engine/src/__tests__/merger-ai.test.ts | 22 +-
.../merger-finalize-unproven.real-git.test.ts | 26 +-
.../auto-revive-and-watchdog.test.ts | 10 +-
.../merge-node-paused-abort-retryable.test.ts | 14 +-
.../worktree-incomplete-session-start.test.ts | 13 +-
.../engine/src/__tests__/replan-target.test.ts | 48 +++-
.../__tests__/restart-recovery-coordinator.test.ts | 9 +-
.../__tests__/review-history-preservation.test.ts | 32 ++-
.../src/__tests__/reviewer-workspace.test.ts | 6 +-
.../src/__tests__/self-healing-trait-rekey.test.ts | 15 +-
packages/engine/src/__tests__/self-healing.test.ts | 163 ++++++++++-
.../verification-failure-named-remediation.test.ts | 54 ++--
.../workflow-graph-optional-step-fix.test.ts | 62 +++-
.../workflow-merge-rebound-live-e2e.pg.test.ts | 2 +-
.../engine/src/__tests__/workspace-merger.test.ts | 6 +-
.../workspace-node-worktree-reuse.test.ts | 188 ++++++++++++
.../src/auto-recovery-handlers/branch-worktree.ts | 28 +-
.../src/auto-recovery-handlers/contamination.ts | 30 +-
.../engine/src/execution/lifecycle-move-log.ts | 77 +++++
packages/engine/src/execution/lifecycle-move.ts | 63 ++++
packages/engine/src/execution/replan-target.ts | 51 +++-
.../executor/append-review-remediation-steps.ts | 72 ++++-
...block-outer-dispatch-when-ephemeral-disabled.ts | 1 +
.../src/executor/bounce-verification-failure.ts | 53 ++--
.../engine/src/executor/completion-finalization.ts | 1 +
.../engine/src/executor/create-task-done-tool.ts | 29 +-
.../src/executor/dependency-dispatch-gate.ts | 1 +
.../executor/ensure-graph-custom-node-worktree.ts | 19 +-
.../engine/src/executor/handle-graph-failure.ts | 7 +-
.../engine/src/executor/recover-completed-task.ts | 4 +-
.../request-pre-merge-optional-step-fix.ts | 40 ++-
.../src/executor/required-artifact-recovery.ts | 7 +-
.../src/executor/review-convergence-ladder.ts | 5 +-
.../route-graph-failure-to-execution-resume.ts | 28 +-
.../engine/src/executor/run-graph-custom-node.ts | 30 +-
packages/engine/src/executor/run-implementation.ts | 6 +-
.../engine/src/executor/workflow-rerun-bounce.ts | 54 ++--
.../engine/src/executor/workflow-rerun-watchdog.ts | 6 +-
.../src/healing/restart-recovery-coordinator.ts | 30 +-
packages/engine/src/merge/merger-ai.ts | 66 +++--
packages/engine/src/merger.ts | 46 +--
.../__tests__/notification-service.test.ts | 13 +-
packages/engine/src/project-engine.ts | 7 +-
.../src/recovery/foreign-only-contamination.ts | 30 +-
packages/engine/src/scheduler.ts | 4 +-
packages/engine/src/self-healing.ts | 120 +++++---
.../self-healing/auto-recover-worktree-session.ts | 32 ++-
.../engine/src/workflow-column-boundary-hooks.ts | 1 +
.../workflow-node-runners/parse-steps-runner.ts | 10 +-
scripts/lib/lifecycle-column-census-baseline.json | 3 +-
78 files changed, 2750 insertions(+), 474 deletions(-)
Fusion-Task-Id: FN-207
Fusion-Task-Lineage: a64a49f7-e06b-4b33-94c6-d43a4b027610
Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 05:12:39 +00:00
..
2026-08-27 21:35:30 +00:00
2026-08-28 05:12:39 +00:00
2026-06-03 17:36:35 -07:00
2026-07-31 00:27:41 -07:00
2026-04-27 08:21:48 -07:00
2026-05-12 07:47:11 -07:00
2026-07-13 19:07:58 -07:00
2026-07-14 23:18:55 -07:00
2026-08-15 16:59:37 -07:00
2026-07-08 04:24:30 -07:00
2026-07-15 08:44:11 -07:00
2026-07-14 23:18:55 -07:00
2026-07-27 21:09:51 -07:00
2026-06-23 23:30:32 -07:00
2026-08-15 07:19:29 -07:00
2026-06-25 23:34:08 -07:00
2026-08-09 15:58:54 -07:00
2026-07-31 19:03:08 -07:00
2026-08-21 19:31:08 -07:00
2026-08-23 01:36:12 +00:00
2026-07-31 00:03:02 -07:00
2026-07-13 07:10:14 -07:00
2026-07-31 21:34:25 -07:00
2026-08-23 18:59:37 -07:00
2026-07-25 06:22:23 -07:00
2026-07-16 10:13:49 -07:00
2026-05-23 19:51:36 -07:00
2026-07-19 14:08:51 -07:00
2026-07-14 08:16:42 -07:00
2026-06-14 15:29:35 -07:00
2026-08-12 14:07:30 -07:00
2026-07-31 01:43:58 -07:00
2026-08-18 22:10:59 -07:00
2026-08-09 06:01:02 -07:00
2026-08-23 15:43:00 -07:00
2026-07-19 15:53:07 -07:00
2026-08-11 05:23:02 -07:00
2026-07-31 18:52:12 -07:00
2026-06-14 15:29:35 -07:00
2026-04-27 08:21:48 -07:00
2026-06-13 19:22:00 -07:00
2026-08-11 17:04:28 -07:00
2026-07-20 00:18:53 -07:00
2026-08-10 12:09:20 -07:00
2026-04-27 08:21:48 -07:00
2026-08-04 08:57:30 -07:00
2026-07-10 13:26:23 -07:00
2026-08-19 21:14:31 -07:00
2026-04-27 08:21:48 -07:00
2026-08-19 21:14:31 -07:00
2026-08-22 19:16:00 -07:00
2026-06-19 20:47:32 -07:00
2026-06-18 16:47:09 -07:00
2026-08-01 16:57:49 -07:00
2026-08-11 11:29:30 -10:00
2026-06-16 18:03:41 -07:00
2026-08-19 18:44:29 -07:00
2026-08-16 20:17:12 -07:00
2026-08-19 10:10:39 -07:00
2026-08-16 21:09:58 -07:00
2026-08-16 22:47:53 -07:00
2026-08-23 01:36:12 +00:00
2026-07-14 23:18:55 -07:00
2026-07-30 23:59:54 -07:00
2026-07-31 00:36:21 -07:00
2026-07-31 00:03:02 -07:00
2026-07-13 19:07:58 -07:00
2026-04-27 08:21:48 -07:00
2026-08-03 12:16:32 -07:00
2026-07-14 23:18:55 -07:00
2026-06-24 19:25:44 -07:00
2026-08-22 19:21:31 -07:00
2026-08-25 21:42:36 +00:00
2026-06-21 10:53:08 -07:00
2026-08-04 09:21:07 -07:00
2026-05-27 21:31:12 -07:00
2026-03-30 23:56:01 -07:00
2026-03-26 01:03:16 -04:00
2026-07-15 08:44:11 -07:00
2026-07-14 23:18:55 -07:00
2026-04-27 08:21:48 -07:00
2026-06-30 08:04:12 -07:00
2026-04-29 08:15:38 -07:00
2026-07-19 00:10:02 -07:00
2026-07-03 07:47:03 -07:00
2026-08-19 05:23:41 -07:00
2026-06-25 17:04:30 -07:00
2026-08-18 08:08:24 -07:00
2026-08-18 08:08:24 -07:00
2026-05-03 05:47:11 -07:00
2026-07-15 14:41:05 -07:00
2026-08-11 03:06:02 -07:00
2026-07-17 22:45:57 -07:00
2026-07-17 23:18:40 -07:00
2026-06-19 05:13:39 -07:00