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
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
Rescue the WorkflowNodeEditor quarantine by waiting for inspector fields before asserting.
- make the foreach inspector Mode assertion wait for the panel to finish rendering
- wait for the code node Source and Timeout inputs before editing them to avoid the inspector race
- remove WorkflowNodeEditor.test.tsx from the dashboard quarantine config and ledger
Files changed:
.../app/components/__tests__/WorkflowNodeEditor.test.tsx | 6 +++---
packages/dashboard/vitest.config.ts | 4 +---
scripts/lib/test-quarantine.json | 8 +-------
3 files changed, 5 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-6191
Fusion-Task-Lineage: 57fb1dcc-3e50-4ba1-8488-fcff204c1d76
Tokenize the last non-token dashboard rgba() styles and guard them with regression coverage.
- replace remaining modal, sidebar, tooltip, dependency dropdown, and refine menu raw rgba() usages in styles.css with color-mix() design tokens
- align overlay, background, and shadow treatments with existing semantic CSS variables instead of hard-coded rgba() values
- add a CSS fixture regression test that bans non-:root raw rgba() usage and verifies the converted selectors stay tokenized
Files changed:
.../__tests__/styles-css-rgba-tokenization.test.ts | 122 +++++++++++++++++++++
packages/dashboard/app/styles.css | 14 +--
2 files changed, 129 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-6190
Fusion-Task-Lineage: 478465a7-8ec4-4482-8e1c-478d86c1ac08
Extend the delete-flow regression test to cover tasks that pass through active workflow states before completion.
- move the tracked task through todo and in-progress before marking it done
- verify the delete-path close behavior still uses the linked GitHub issue after those state transitions
Files changed:
packages/dashboard/src/__tests__/github-tracking-delete.test.ts | 2 ++
1 file changed, 2 insertions(+)
Fusion-Task-Id: FN-6189
Fusion-Task-Lineage: 986497ff-c45c-4c0b-9d50-87d9f6570bf1
Add a dashboard CSS hygiene scan and align accent text colors with the CTA text token.
- add a dashboard CSS hygiene regression scan for recent component styles
- assert tokenized focus styles, mobile breakpoints, and no raw hex or rgba colors in scanned CSS
- replace hardcoded white text with var(--cta-text) in background task, pull request, task card, and task field accent surfaces
Files changed:
.../app/__tests__/css-hygiene-scan.test.ts | 191 +++++++++++++++++++++
.../app/components/BackgroundTasksIndicator.css | 2 +-
.../dashboard/app/components/PullRequestView.css | 2 +-
packages/dashboard/app/components/TaskCard.css | 2 +-
.../dashboard/app/components/TaskFieldsSection.css | 2 +-
5 files changed, 195 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-6186
Fusion-Task-Lineage: c579bcda-01f9-4495-bf59-78d1dfef816c
Improve dashboard vitest wrapper diagnostics so transient SIGTERM handling is easier to trace.
- track the last signal and reason forwarded from the heap wrapper to the vitest process group
- log when the wrapper receives SIGINT or SIGTERM and when timeout shutdown escalates
- extend wrapper tests to assert process-group leadership and emitted diagnostic stderr
Files changed:
.../scripts/__tests__/run-vitest-with-heap.test.ts | 25 +++++++++++++++++++---
.../dashboard/scripts/run-vitest-with-heap.mjs | 19 ++++++++++++----
2 files changed, 37 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-6184
Fusion-Task-Lineage: b276d88e-a22d-4fdf-a533-c4b0aa4e199d
Keep the mobile mailbox list anchored after refreshes and SSE updates.
- capture the mobile mailbox content scroll position before inbox, outbox, agent, and approval reloads
- restore the saved scroll position after refreshed mailbox data renders and wire the content container through a ref
- allow vertical scrolling in the mailbox view content area and cover the SSE refresh behavior with a mobile regression test
Files changed:
packages/dashboard/app/components/MailboxModal.css | 3 +-
packages/dashboard/app/components/MailboxView.tsx | 58 +++++++++++++++++++---
.../app/components/__tests__/MailboxView.test.tsx | 35 +++++++++++++
3 files changed, 89 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-6183
Fusion-Task-Lineage: ea8be80b-4834-4b77-96cd-254e6b0b0795
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
Keep the chat sidebar from crowding tablet chat while the software keyboard is open.
- extend mobile keyboard detection so tablet chat can react to visual viewport keyboard changes
- hide the chat sidebar and resize handle while the tablet keyboard is open, then restore prior visibility when it closes
- add regression coverage for tablet keyboard behavior plus desktop and mobile guardrails
Files changed:
packages/dashboard/app/components/ChatView.tsx | 39 +++++-
packages/dashboard/app/components/__tests__/ChatView.mobile-render.test.tsx | 139 ++++++++++++++++++++-
packages/dashboard/app/hooks/useMobileKeyboard.ts | 7 +-
3 files changed, 171 insertions(+), 14 deletions(-)
Fusion-Task-Id: FN-6178
Fusion-Task-Lineage: 7acdb76a-135f-4b9c-ab50-708eec03b2c6
Prevent the NodesView tablet overlay from letting underlying content bleed through.
- make the tablet nodes management overlay fixed, fullscreen, and scrollable with the app background
- add a regression test that asserts the tablet overlay media query and rule properties
- add a patch changeset for the published CLI package bundle
Files changed:
.changeset/fn-6179-tablet-nodes-overlay.md | 5 +++++
packages/dashboard/app/components/NodesView.css | 12 ++++++++++-
.../app/components/__tests__/NodesView.test.tsx | 23 ++++++++++++++++++++--
3 files changed, 37 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6179
Fusion-Task-Lineage: 9455b38e-c32f-4865-917a-a06c1cb38840
Adjust workflow-definition-store expectations to include the built-in PR fragment.
- expect builtin:pr-workflow in fragment-filtered workflow definition results
- allow built-in workflow entries to be either workflow or fragment kinds
- verify fragment filtering and cache regression coverage include the PR lifecycle built-in
Files changed:
packages/core/src/__tests__/workflow-definition-store.test.ts | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-6176
Fusion-Task-Lineage: fca73dec-060c-4935-9f03-67299d99983f
Harden TerminalModal mobile keyboard regression coverage against async tab setup and xterm mock issues.
- add missing xterm terminal mock methods used by mobile tab interactions
- replace anonymous constructor mock implementations with named function mocks for Terminal and FitAddon
- wait for second-session callbacks before simulating viewport and keyboard transitions in mobile tab-switch tests
Files changed:
packages/dashboard/app/components/__tests__/TerminalModal.test.tsx | 48 ++++++++++++++++++----
1 file changed, 39 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-6175
Fusion-Task-Lineage: fc95f3d6-586a-475c-a226-be1a57c88ff4
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
Move the task detail modal's GitHub tracking section to render after the prompt/spec content.
- relocate the GitHub tracking section in TaskDetailModal so it appears beneath prompt details in read mode
- preserve the existing GitHub tracking controls, status, and expand/collapse behavior while changing only section order
- add a regression test that asserts the prompt content appears before the GitHub tracking section
Files changed:
.../dashboard/app/components/TaskDetailModal.tsx | 274 ++++++++++-----------
...lModal.inline-editing-and-integrations.test.tsx | 28 +++
2 files changed, 165 insertions(+), 137 deletions(-)
Fusion-Task-Id: FN-6171
Fusion-Task-Lineage: dac8ac54-655d-4403-9e7d-6aad446da793
Make the mobile Nodes screen open as a full-screen overlay above the header and nav.
- add a mobile-only fixed fullscreen overlay style for the nodes management panel
- preserve safe-area spacing and scroll behavior while keeping the overlay above mobile navigation
- add a NodesView regression test that asserts the mobile overlay CSS contract and close control rendering
Files changed:
.changeset/fn-6170-mobile-nodes-fullscreen.md | 5 +++
packages/dashboard/app/components/NodesView.css | 11 +++++
.../app/components/__tests__/NodesView.test.tsx | 52 ++++++++++++++++++++++
3 files changed, 68 insertions(+)
Fusion-Task-Id: FN-6170
Fusion-Task-Lineage: 16995d9f-6b5e-4f15-9367-7eccbd3153d0
Open fresh tabs for follow-up script launches instead of reusing the current terminal.
- track whether an initial command arrived with modal open versus after the terminal was already active
- create a new terminal tab for later script commands, wait for that tab to become active, then send the command there
- expand TerminalModal coverage for first-open versus follow-up script execution and clarify modal-manager script handoff expectations
Files changed:
packages/dashboard/app/components/TerminalModal.tsx | 80 ++++++++++-
.../components/__tests__/TerminalModal.test.tsx | 150 ++++++++++++++++++---
.../app/hooks/__tests__/useModalManager.test.ts | 4 +-
3 files changed, 207 insertions(+), 27 deletions(-)
Fusion-Task-Id: FN-6169
Fusion-Task-Lineage: a7e57a9b-dc3a-432f-bff1-195b62555852
Handle in-review tasks with status none as retryable when execution or merge retry state is stranded.
- treat in-review tasks with status "none" plus incomplete execution or prior merge attempts as retryable across the CLI, extension, and dashboard routes
- send stranded execution retries back to todo with preserved progress and keep stranded merge retries in-review while clearing merge retry state
- add CLI, extension, and dashboard regression coverage and publish a patch changeset for @runfusion/fusion
Files changed:
.changeset/fuzzy-ravens-retry.md | 5 +
packages/cli/src/__tests__/extension.test.ts | 147 +++++++++++++++++++++
packages/cli/src/commands/__tests__/task.test.ts | 147 +++++++++++++++++++--
packages/cli/src/commands/task.ts | 59 ++++++++-
packages/cli/src/extension.ts | 39 ++++--
packages/dashboard/src/__tests__/routes-tasks-ops.test.ts | 134 +++++++++++++++++++
packages/dashboard/src/routes/register-task-workflow-routes.ts | 30 +++--
7 files changed, 528 insertions(+), 33 deletions(-)
Fusion-Task-Id: FN-6166
Fusion-Task-Lineage: cf78b180-ded4-4b6f-8e98-35e6f309e1d4
Keep the mobile workflow editor stage from stretching the canvas wrapper and shrinking the full-screen view.
- adjust the mobile editor-stage canvas wrapper flex rule to avoid consuming the full stage height
- extend the WorkflowNodeEditor mobile CSS contract test to lock the updated flex behavior
Files changed:
packages/dashboard/app/components/WorkflowNodeEditor.css | 2 +-
.../dashboard/app/components/__tests__/WorkflowNodeEditor.css.test.ts | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6162
Fusion-Task-Lineage: b09d3317-cf22-4fbf-a732-9f4829c1cfd8
Prevent mobile quick-entry action taps from being swallowed by browser touch gestures.
- apply a mobile touch-action override to quick-entry action containers and their descendants
- keep the existing mobile button sizing while removing the redundant per-button touch-action rule
- add a regression test that inspects the mobile CSS rule covering quick-entry action controls
Files changed:
.changeset/quick-entry-mobile-touch.md | 5 +++++
packages/dashboard/app/components/QuickEntryBox.css | 8 ++++----
packages/dashboard/app/components/__tests__/QuickEntryBox.test.tsx | 17 +++++++++++++++++
3 files changed, 26 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-6153
Fusion-Task-Lineage: e915bb06-2c45-4d96-b719-2b7efcf6f986
Rescue the dashboard board workflow toolbar coverage and rotate the active quarantine.
- wait for the workflow toolbar itself before asserting board workflow actions in Board.test.tsx
- remove Board.test.tsx from the dashboard vitest quarantine list
- quarantine WorkflowNodeEditor.test.tsx with an updated ledger entry for the newly observed flake
Files changed:
packages/dashboard/app/components/__tests__/Board.test.tsx | 4 ++--
packages/dashboard/vitest.config.ts | 4 +++-
scripts/lib/test-quarantine.json | 4 ++--
3 files changed, 7 insertions(+), 5 deletions(-)
Fusion-Task-Id: FN-6156
Fusion-Task-Lineage: c91c3542-fdec-426a-8e63-3edb3f5d34e5
Guard the U8 authoring workflow test against editor hydration races.
- wait for the workflow column panel before opening the Code palette
- wait for the code node to render before reading the TypeScript source textarea
- document the flake class to align this test with the existing palette-add race fix
Files changed:
.../dashboard/app/components/__tests__/WorkflowNodeEditor.test.tsx | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6157
Fusion-Task-Lineage: 4009cbb5-8217-4eae-8889-e047ec31bee3