The settings UI displays saved API keys masked with '•' (U+2022). Saving
a provider without retyping the key echoed that mask back, and the PUT
handler persisted it as the real credential. The masked key then flowed
into an Authorization/x-api-key header, throwing "Cannot convert argument
to a ByteString ... value 8226" at request time.
Treat masked values echoed back on update as "unchanged" so the stored
key is preserved, and reject masked values on create/probe. Add tests.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The /models endpoint restricted results to providers configured in
Fusion's auth.json/models.json stores, but custom providers live in
global settings and register under customProviderRegistryKey(). Their
keys were never added to the allowlist, so their models were filtered
out before reaching the dropdowns. Add the custom provider registry
keys to the configured-providers set.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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
Keep the mobile dashboard pinned while offscreen auto-merge controls are toggled.
- Reset document horizontal scroll during mobile board stabilization and immediately after auto-merge toggles.
- Cover portrait and landscape mobile scroll realignment in the auto-merge integration test.
- Document the real-browser blank-dashboard root cause and add a patch changeset.
Files changed:
.changeset/FN-6243-mobile-auto-merge-blank.md | 5 ++
...bile-auto-merge-toggle-document-scroll-blank.md | 55 ++++++++++++++++++++++
packages/dashboard/app/components/Board.tsx | 47 ++++++++++++++++--
...-merge-toggle-blank.mobile-integration.test.tsx | 49 +++++++++++++++++++
4 files changed, 152 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-6243
Fusion-Task-Lineage: 91f74de2-667f-4732-a840-47b792288bec
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
Persist default workflow model lane edits through the Settings modal's primary save path.
- Register a Project Models section save handler so workflow lane overrides flush before closing Settings.
- Surface typed workflow setting rejections without closing the modal or showing a success toast.
- Remove the separate workflow-model save button and update coverage/docs for the unified save behavior.
Files changed:
docs/dashboard-guide.md | 2 +-
docs/settings-reference.md | 17 +++++---
.../dashboard/app/components/SettingsModal.tsx | 11 ++++-
.../components/__tests__/SettingsModal.test.tsx | 50 ++++++++++++++++------
.../settings/sections/ProjectModelsSection.tsx | 42 ++++++++++--------
.../app/components/settings/sections/context.ts | 3 ++
6 files changed, 83 insertions(+), 42 deletions(-)
Fusion-Task-Id: FN-6225
Fusion-Task-Lineage: 98338f85-c742-46c2-8bdf-f676a6f7e32e
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
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