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
Keep task detail PR and review affordances synchronized with the current project auto-merge setting.
- Thread the live auto-merge value into task detail modals and list split-pane detail views.
- Prefer the live auto-merge setting over the stale fetched modal snapshot while preserving task-level overrides.
- Cover PR and review tab behavior for auto-merge on/off and document the dashboard behavior.
- Evict flaky engine gate entries and add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-6247-automerge-off-modal-stale.md | 5 +
docs/dashboard-guide.md | 1 +
packages/dashboard/app/App.tsx | 3 +-
packages/dashboard/app/components/AppModals.tsx | 2 +
packages/dashboard/app/components/ListView.tsx | 3 +
.../dashboard/app/components/TaskDetailModal.tsx | 4 +-
.../__tests__/TaskDetailModal.create-pr.test.tsx | 171 ++++++++++++++++++++-
packages/engine/vitest.config.ts | 2 -
8 files changed, 182 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-6247
Fusion-Task-Lineage: 1321c03a-216d-4b15-bf4f-95621d68c9ae
Rescue the already-merged self-healing real-git test while quarantining a separate flaky merger AI suite.
- Call the already-merged recovery path directly in the rescued test and assert specific audit event types instead of exact total counts.
- Remove self-healing-already-merged.real-git.test.ts from the engine default quarantine list and ledger.
- Add merger-ai.test.ts to the engine default quarantine list and quarantine ledger with FN-6238 evidence.
Files changed:
.../self-healing-already-merged.real-git.test.ts | 20 +++++++++++++-------
packages/engine/vitest.config.ts | 2 +-
scripts/lib/test-quarantine.json | 10 +++++-----
3 files changed, 19 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-6238
Fusion-Task-Lineage: b04451e3-fbd3-4dee-aca2-f542d1036d20
Quarantines the flaky active-session pruning coverage without hiding the rest of merger cleanup tests.
- Move the active-session pruning scenario into its own focused test file.
- Keep the broader merger cleanup suite in the reliability project.
- Point the quarantine ledger and engine default exclude at only the isolated flaky test.
Files changed:
.../merger-ai-cleanup-active-session.test.ts | 60 ++++++++++++++++++++++
.../engine/src/__tests__/merger-ai-cleanup.test.ts | 22 ++------
packages/engine/vitest.config.ts | 2 +-
scripts/lib/test-quarantine.json | 4 +-
4 files changed, 66 insertions(+), 22 deletions(-)
Fusion-Task-Id: FN-6207
Fusion-Task-Lineage: b5e806cb-aec8-4893-83ef-d27164250a5c
Restore Pi-upgraded workspaces to keep Fusion resources accessible and recover title generation when configured models go stale.
- Mark read-only Fusion/Pi provider settings views as project-trusted so extension loading keeps working after Pi upgrades.
- Retry task title summarization with automatic model resolution when the configured provider model is missing from the Pi registry.
- Cover provider settings trust behavior and stale summarizer fallback paths with regression tests.
- Document the read-only settings trust contract and add a patch changeset.
Files changed:
.changeset/fn-6218-pi-upgrade-regressions.md | 5 +
docs/settings-reference.md | 2 +
docs/task-management.md | 2 +
.../commands/__tests__/provider-settings.test.ts | 16 ++++
packages/cli/src/commands/provider-settings.ts | 5 +
packages/core/src/__tests__/ai-summarize.test.ts | 102 +++++++++++++++++++++
packages/core/src/ai-summarize.ts | 85 ++++++++++++-----
.../src/__tests__/pi-create-fn-agent.test.ts | 32 +++++++
packages/engine/src/pi.ts | 7 +-
9 files changed, 233 insertions(+), 23 deletions(-)
Fusion-Task-Id: FN-6218
Fusion-Task-Lineage: 3d6aca32-a56a-43a0-a57b-8e6abc839ce9
The idle-worktree sweep (cleanupOrphans) and cap-enforcement sweep only
guarded isWorktreeResumeReserved (CLI resume sessions), not in-process
active sessions. scanIdleWorktrees treats a worktree as active only while
a non-done task points at it, but the executor transiently moves tasks to
done or nulls the worktree field mid-run — so a checkout backing a live
executor/merger/step/workflow session could be removed before the work
finished. Add the activeSessionRegistry.isPathActive guard to both loops,
mirroring reapUnregisteredOrphans (FN-4811/FN-5065).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move undocumented flaky engine tests into the formal quarantine path.
- add quarantine ledger entries for flaky engine test files observed under concurrent/full-suite load
- exclude the quarantined engine test files from vitest projects so they no longer run in gate and reliability pools
- remove the undocumented it.skip markers by quarantining at the file/config level instead
Files changed:
.../__tests__/merger-file-scope-invariant.test.ts | 4 ++--
.../src/__tests__/project-engine-manager.test.ts | 2 +-
packages/engine/vitest.config.ts | 10 ++++++++--
scripts/lib/test-quarantine.json | 23 +++++++++++++++++++++-
4 files changed, 33 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-6206
Fusion-Task-Lineage: 8d88725e-1e92-4a06-aaa6-be34287e613a
Update @earendil-works/pi-coding-agent and @earendil-works/pi-ai from
^0.78.0 to ^0.79.1 across cli, engine, and dashboard. This brings in
Claude Fable 5 (claude-fable-5) on the Anthropic and Amazon Bedrock
providers.
Fusion's model picker is registry-driven (/api/models -> pi ModelRegistry,
filtered by provider, not model id), so Fable surfaces automatically for
users with Anthropic or Claude CLI auth configured — no Fusion-side model
list change needed.
Verified: all core packages typecheck clean against 0.79.1; boot smoke
(fn --help, /api/health 200, clean shutdown) passes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Guarantee AI merge clean-room worktrees are pruned on merge completion and swept by task state.
- prune pre-existing same-task AI merge temp worktrees before starting a new merge and audit cleanup outcomes
- add task-aware tempdir sweep rules with a short grace period for done or archived tasks and immediate cleanup for deleted tasks
- extend merger and self-healing coverage and document the updated stale worktree policy
Files changed:
.changeset/ai-merge-cleanup-sweep.md | 5 +
docs/architecture.md | 2 +-
packages/engine/src/__tests__/merger-ai-cleanup.test.ts | 109 ++++++++++++++++++--
packages/engine/src/__tests__/self-healing-tempdir-sweep.test.ts | 112 ++++++++++++++++++++-
packages/engine/src/merger-ai.ts | 63 ++++++++++++
packages/engine/src/self-healing.ts | 26 ++++-
6 files changed, 300 insertions(+), 17 deletions(-)
Fusion-Task-Id: FN-6199
Fusion-Task-Lineage: 659cc52f-0994-4315-a187-6c865bbe3983
Restore the self-healing DB corruption test to the default engine suite.
- remove the engine vitest exclude for self-healing-db-corruption.test.ts
- clear the quarantine ledger entry for the restored test
Files changed:
packages/engine/vitest.config.ts | 1 -
scripts/lib/test-quarantine.json | 8 +-------
2 files changed, 1 insertion(+), 8 deletions(-)
Fusion-Task-Id: FN-6198
Fusion-Task-Lineage: 2466b040-956d-4138-89d5-137d1721081c
Stop the self-healing DB corruption test from leaking into unrelated tmpdir state while quarantining the known flake.
- mock node:os tmpdir usage so the test runs inside a per-test sandbox and cleans it up after each case
- add the flaky self-healing DB corruption test to the engine default exclude list
- record the quarantine entry and failure context in scripts/lib/test-quarantine.json
Files changed:
.../__tests__/self-healing-db-corruption.test.ts | 22 ++++++++++++++++++++++
packages/engine/vitest.config.ts | 1 +
scripts/lib/test-quarantine.json | 8 +++++++-
3 files changed, 30 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6195
Fusion-Task-Lineage: 60f7f6ca-d14d-42b4-b47e-0644a25e64ae
Keep AI merge commit finalization running when the task disappears during settings resolution.
- fall back to a synthetic task stub before merging effective settings in runAiAgentForCommit
- add an engine regression test covering deleted-task settings degradation
- add a patch changeset for the published CLI package
Files changed:
.changeset/fn-6193-merger-deleted-task.md | 5 +++
.../src/__tests__/merger-settings-degrade.test.ts | 43 ++++++++++++++++++++++
packages/engine/src/merger.ts | 3 +-
3 files changed, 50 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6193
Fusion-Task-Lineage: 1d63d24e-1321-450c-95c9-ffc058fd8387
Prevent rebuilt dashboard tabs from reusing stale cached assets after a deploy.
- revalidate service-worker asset requests against the network before falling back to cache and bump the cache version
- suppress repeated version-change reloads for the same remote build and cover the new behavior with dashboard tests
- update engine heartbeat test expectations for summarized task creation metadata and add the published package changeset
Files changed:
.changeset/fn-blank-page-service-worker-assets.md | 3 ++
packages/dashboard/app/__tests__/pwa.test.ts | 11 ++++++
packages/dashboard/app/__tests__/versionCheck.test.ts | 28 ++++++++++++++
packages/dashboard/app/public/sw.js | 37 +++++++++++++++++-
packages/dashboard/app/versionCheck.ts | 45 ++++++++++++++++++++++
packages/engine/src/__tests__/heartbeat-executor.test.ts | 3 +-
packages/engine/src/__tests__/heartbeat-session-prompt.test.ts | 7 +++-
7 files changed, 131 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6180
Fusion-Task-Lineage: 4f07e5f0-56c7-4241-8719-f576dfd8613e
Update the skill diagnostics test to assert against the structured logger surface that now emits the diagnostics output.
- spy on [1mpiLog.log[22m instead of [1mpiLog.warn[22m in the structured logger diagnostics test
- keep the existing [skills] and [executor] assertions while matching the current logging path
Files changed:
packages/engine/src/__tests__/pi-create-fn-agent.test.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6172
Fusion-Task-Lineage: e52023f7-6c18-435d-b2c6-bd7f7024b75f
Treat already-finalized or paused workflow-graph exits as benign instead of failure-worthy.
- log info-level benign messages when workflow graph runs end after a task is paused or has already advanced out of in-progress
- keep true in-progress graph failures on the existing failed-and-handoff path with failure logging
- add executor recovery coverage for todo, in-review, done, paused, and genuine failure cases
- add a patch changeset for the published CLI package
Files changed:
.changeset/fn-6141-benign-graph-exit.md | 5 +
.../engine/src/__tests__/executor-recovery.test.ts | 137 ++++++++++++++++++++-
packages/engine/src/executor.ts | 23 ++--
3 files changed, 150 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-6141
Fusion-Task-Lineage: 8d29159a-8d7a-4e84-b05a-fe83f6ccbb78