FN-6035 modeled the merge lifecycle as a branching subgraph of merge/
retry/branch-group primitives instead of a single `merge` seam, but the
linear workflow compiler still tried to lower those nodes and rejected
merge-gate's fan-out — so task creation failed with "node 'merge-gate'
branches into 2 edges — graphs with branches require the workflow
interpreter (deferred)".
Treat the merge-region primitive kinds (merge-gate, merge-attempt,
manual-merge-hold, retry-backoff, recovery-router,
branch-group-member-integration, branch-group-promotion, pr-merge) as an
engine-owned terminal boundary: exempt from the single-edge linearity
rule and never lowered to a step. Linear-prefix workflows compile to
their pre-merge step list again.
Also refresh the stale builtin-workflows assertions that referenced the
removed `merge` seam node.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
Limit the chat composer growth on tablet viewports while preserving desktop autosizing.
- Add a tablet-specific 200px max height for the chat input textarea.
- Apply the same cap in ChatView autosize calculations when tablet mode is active.
- Generalize chat input height helpers and cover the tablet cap in autosize tests.
Files changed:
packages/dashboard/app/components/ChatView.css | 9 +++++++++
packages/dashboard/app/components/ChatView.tsx | 20 +++++++++++++-------
packages/dashboard/app/components/QuickChatFAB.tsx | 4 ++--
.../__tests__/ChatView.chat-input-autosize.test.tsx | 14 ++++++++++++++
4 files changed, 38 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-6212
Fusion-Task-Lineage: b11cd658-8289-4795-8e39-7d03a1d51d41
Keep agent detail tabs usable without page-wide horizontal scrolling at tablet widths.
- Make the agent detail tabs row horizontally scrollable with hidden scrollbars and touch momentum.
- Prevent tab labels from wrapping so the tab strip can overflow within its own container.
- Add a regression test covering tablet-width tab overflow styles.
Files changed:
.../dashboard/app/components/AgentDetailView.css | 8 +++++
.../AgentDetailView.mobile-scroll.test.tsx | 34 +++++++++++++++++++++-
2 files changed, 41 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6209
Fusion-Task-Lineage: 7646bea2-b63a-460f-813b-cf9808680d46
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
Prevent the settings save split from serializing custom provider definitions through the global or project patch paths.
- skip `customProviders` when building global settings patches
- skip `customProviders` when building project settings patches
- add a regression test that keeps custom providers out of both serialized patches
Files changed:
.../app/__tests__/settings-save-split.test.ts | 24 ++++++++++++++++++++++
.../app/components/settings/save-split.ts | 4 ++++
2 files changed, 28 insertions(+)
Fusion-Task-Id: FN-6205
Fusion-Task-Lineage: 84c3f42b-c621-44ff-b977-ecd3a6729e04
Address PR #1580 feedback by preserving active same-key handoff work, cancelling stale merge/manual-hold work across re-handoffs, and avoiding stable fallback run id collisions after terminal work.
Address PR #1578 feedback by failing unwired work item dispatch without a no-op persistence path and forwarding work item attempts into merge primitive context.
Address PR #1578 feedback by deriving merge-gate routing from task/settings auto-merge policy and persisting manual-hold work items as manual-required instead of failed.
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
Prevent the settings save split from serializing custom provider definitions through the global or project patch paths.
- skip `customProviders` when building global settings patches
- skip `customProviders` when building project settings patches
- add a regression test that keeps custom providers out of both serialized patches
Files changed:
.../app/__tests__/settings-save-split.test.ts | 24 ++++++++++++++++++++++
.../app/components/settings/save-split.ts | 4 ++++
2 files changed, 28 insertions(+)
Fusion-Task-Id: FN-6205
Fusion-Task-Lineage: 84c3f42b-c621-44ff-b977-ecd3a6729e04
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>
Move Authentication into the Global settings group after General.
- remove the standalone Account header from the settings sidebar
- place Authentication immediately after Global General in the Global group
- update the section inventory comments to match the new grouping, including runtime sections
Files changed:
packages/dashboard/app/components/SettingsModal.tsx | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-6201
Fusion-Task-Lineage: 4cae66aa-43c5-4436-957b-4059915c2884
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
Handle archived task transitions consistently for linked GitHub issues.
- close tracked and source issues when archived tasks should land closed, including not_planned vs completed reasons
- reopen linked issues when archived tasks move back to done or active work resumes
- extend dashboard reconciler and state coverage to include archived tasks and source issue handling
Files changed:
.../__tests__/github-source-issue-close.test.ts | 70 +++++++++++++++++++++-
.../__tests__/github-tracking-reconciler.test.ts | 60 ++++++++++++++++++-
.../src/__tests__/github-tracking-state.test.ts | 10 +++-
.../dashboard/src/github-source-issue-close.ts | 32 ++++++----
.../dashboard/src/github-tracking-reconciler.ts | 14 +++--
packages/dashboard/src/github-tracking-state.ts | 4 ++
6 files changed, 167 insertions(+), 23 deletions(-)
Fusion-Task-Id: FN-6194
Fusion-Task-Lineage: 867527a0-6eb9-416e-b1eb-d690fa029d60
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