Keep triage planning from advancing or continuing work after a task is paused.
- Abort active triage sessions and reviewer subagents when task updates mark the task paused.
- Skip approved-spec recovery and final approved-spec transitions while a task remains paused.
- Add regression coverage for paused planning, pause-driven aborts, and published package changeset metadata.
Files changed:
.changeset/pause-triage-planning.md | 5 +
.../src/__tests__/triage-pause-abort.test.ts | 237 +++++++++++++++++++++
packages/engine/src/triage.ts | 57 +++++
3 files changed, 299 insertions(+)
Fusion-Task-Id: FN-6361
Fusion-Task-Lineage: 33d849d5-1461-49ae-9fe0-be98b534ac35
Stabilize the cli-agent re-entry regression test by awaiting the original run after the replacement session succeeds.
- Keep the first cli-agent run promise instead of dropping it with void.
- Assert the active task session still points at the first PTY before simulating re-entry.
- Kill and await the first session at the end so no hub or store work outlives teardown.
Files changed:
packages/engine/src/__tests__/cli-agent-executor.test.ts | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6341
Fusion-Task-Lineage: 3e365f21-0d05-496a-adec-aa782aa83503
Reconcile the FN-352 no-commit coordination guard skip with main's
independently-landed FN-424 work. Both branches added a no_commits
guard bypass at the same fn_task_done call site:
- FN-352 (this branch): getNoCommitEligibilityReason(task) covering
Review Level 1 coordination prompts with board-only scope and
explicit no-source intent (e.g. "Do not change product source").
- FN-424 (main): evaluatePromptDerivedNoCommitEligibility(...) plus
non-blocking audit logging of the skip.
Their prompt phrase-matching differs, so neither alone satisfies the
merged test file. Resolved by OR-ing both eligibility checks and
wrapping the skip in main's audit-logging block. Both helpers still
refuse the contradictory implementation+coordination prompt.
All 18 executor-task-done-invariant tests pass; engine typecheck clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Self-healing now resumes stranded assigned in-progress work when an agent has no active run or execution.
- Add a self-healing pass that groups stale assigned in-progress tasks by durable agent and calls the executor resume seam without moving tasks backward.
- Emit run-audit telemetry for reattached orphaned executions and wire the resume hook through the in-process runtime.
- Cover grace windows, pause/active-run/active-execution guards, task filtering, and registration order with engine tests.
- Document the recovery behavior and add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-6336-reattach-orphaned-executions.md | 5 +
docs/agents.md | 2 +
docs/architecture.md | 2 +
...lf-healing-reattach-orphaned-executions.test.ts | 217 +++++++++++++++++++++
packages/engine/src/run-audit.ts | 1 +
packages/engine/src/runtimes/in-process-runtime.ts | 1 +
packages/engine/src/self-healing.ts | 122 ++++++++++++
7 files changed, 350 insertions(+)
Fusion-Task-Id: FN-6336
Fusion-Task-Lineage: 6d8519b9-d8b0-4726-9b45-bfa445b7883e
Resolve conflicts from main's FN-6232 single-source triage prompt refactor:
- Drop the inline FAST_TRIAGE_SYSTEM_PROMPT const removed by main; the fast
triage prompt now lives in agent-prompts.ts (planning-fast seam).
- Migrate the PR's no-commit/operational-routing heuristic edits into the
fast block of agent-prompts.ts (standard block already carried them).
- Point triage tests at FAST_PLANNING_PROMPT/TRIAGE_POLICY_PROMPT instead of
the removed const.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Quarantine unrelated engine test flakes so the gate avoids known unstable fixtures.
- Add the soft-delete blocker residue reliability test to the quarantine ledger and reliability interaction exclusions.
- Add the bubblewrap sandbox backend test to the quarantine ledger and engine-core exclusions.
Files changed:
packages/engine/vitest.config.ts | 6 +++++-
scripts/lib/test-quarantine.json | 10 ++++++++++
2 files changed, 15 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6319
Fusion-Task-Lineage: 9a47ae20-76b8-47d8-8858-f4fe51ea807e
Move frontend UX criteria out of triage self-instructions and into deterministic workflow policy.
- Add a shared frontend UX policy helper that matches frontend file scopes and injects the byte-equivalent checklist idempotently.
- Apply the policy during triage finalization and persist the updated PROMPT.md when applicable.
- Replace the legacy prompt-based injection instructions with a pointer to the deterministic policy.
- Cover path matching, insertion behavior, and checklist parity with focused core tests.
- Add a minor changeset for the published Fusion package.
Files changed:
.changeset/fn-6237-frontend-ux-policy.md | 5 +
.../core/src/__tests__/frontend-ux-policy.test.ts | 119 +++++++++++++++++
packages/core/src/agent-prompts.ts | 29 +---
packages/core/src/frontend-ux-policy.ts | 148 +++++++++++++++++++++
packages/core/src/index.ts | 1 +
packages/engine/src/triage.ts | 19 ++-
6 files changed, 291 insertions(+), 30 deletions(-)
Fusion-Task-Id: FN-6237
Fusion-Task-Lineage: 7ac95064-9ec6-4760-8609-20c35075aca1
Stabilize the self-healing dirty worktree recovery test by avoiding timer and async cleanup races.
- Force real timers for branch conflict reclaim tests.
- Provide explicit integration branch settings and dispatcher behavior for the recovery path.
- Use synchronous fixture setup and cleanup around the recovery patch assertion.
Files changed:
packages/engine/src/__tests__/self-healing.test.ts | 77 +++++++++++++---------
1 file changed, 46 insertions(+), 31 deletions(-)
Fusion-Task-Id: FN-6280
Fusion-Task-Lineage: ef93f14a-1d16-4cca-ac6d-3cfd7249ca21
Ensure assigned agents resume task work even when their heartbeat loop is idle.
- add deferred assignment refiring when an agent is assigned work without an active heartbeat run
- track in-process runtime activity so scheduled work is not double-started
- cover idle, active, and concurrent heartbeat assignment paths with scheduler and runtime tests
- document the deferred assignment wake-up behavior and add a changeset
Files changed:
.changeset/fn-6284-deferred-assignment-refire.md | 5 +
docs/agents.md | 2 +
docs/architecture.md | 1 +
.../src/__tests__/heartbeat-scheduler.test.ts | 174 ++++++++++++++++++++-
packages/engine/src/agent-heartbeat.ts | 109 ++++++++++++-
.../runtimes/__tests__/in-process-runtime.test.ts | 24 +++
packages/engine/src/runtimes/in-process-runtime.ts | 3 +
7 files changed, 311 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-6284
Fusion-Task-Lineage: cf8a9abe-163e-45c6-961a-095891e45ea5
Deduplicate self-healing log entries for queued tasks that remain blocked by the same active file-scope overlap.
- Track the last active overlap blocker logged per task and skip duplicate preserved-queued log entries across self-healing passes.
- Clear the memo when blockers change, resolve, or the manager stops so legitimate future recoveries are still logged.
- Cover unchanged blockers, blocker changes, resolved blockers, stop/reset behavior, and FN-5488 stale-blockedBy preservation with regression tests.
Files changed:
packages/engine/src/__tests__/self-healing.test.ts | 123 +++++++++++++++++++++
packages/engine/src/self-healing.ts | 61 ++++++++--
2 files changed, 177 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-6276
Fusion-Task-Lineage: 169d4402-ec4e-4fa9-8225-2f545c11a3f7