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>
Six changesets were missing the opening (and in most cases closing) `---`
delimiters around their YAML frontmatter, so changeset could not parse the
package bump. Wrap each in proper `---` blocks.
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