Allow the chat composer to recognize live CLI sessions as steerable agent sessions.
- Pass live CLI session state from the task detail modal into the chat tab.\n- Keep paused and user-paused tasks blocked even when a CLI session exists.\n- Cover live, ended, and missing CLI session states in chat composer tests.\n\nFiles changed:\n packages/dashboard/app/components/TaskChatTab.tsx | 18 +++--\n .../dashboard/app/components/TaskDetailModal.tsx | 22 ++++--\n .../app/components/__tests__/TaskChatTab.test.tsx | 92 ++++++++++++++++++++--\n 3 files changed, 111 insertions(+), 21 deletions(-)
Fusion-Task-Id: FN-6338
Fusion-Task-Lineage: 7229c059-e094-4be3-bfba-b15d8c5069f9
Self-healing now resumes stranded assigned in-progress work when an agent has no active run or execution.
- Add a self-healing pass that groups stale assigned in-progress tasks by durable agent and calls the executor resume seam without moving tasks backward.
- Emit run-audit telemetry for reattached orphaned executions and wire the resume hook through the in-process runtime.
- Cover grace windows, pause/active-run/active-execution guards, task filtering, and registration order with engine tests.
- Document the recovery behavior and add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-6336-reattach-orphaned-executions.md | 5 +
docs/agents.md | 2 +
docs/architecture.md | 2 +
...lf-healing-reattach-orphaned-executions.test.ts | 217 +++++++++++++++++++++
packages/engine/src/run-audit.ts | 1 +
packages/engine/src/runtimes/in-process-runtime.ts | 1 +
packages/engine/src/self-healing.ts | 122 ++++++++++++
7 files changed, 350 insertions(+)
Fusion-Task-Id: FN-6336
Fusion-Task-Lineage: 6d8519b9-d8b0-4726-9b45-bfa445b7883e
Stabilize the checkout leasing AgentStore regression test setup.
- Recreate the nested checkout-leasing AgentStore with an in-memory database after replacing the TaskStore.
- Keep the disk-backed TaskStore for persistence assertions while avoiding a shared disk-backed AgentStore database lifecycle.
- Let the top-level cleanup own AgentStore closure to avoid double-closing in the nested hook.
Files changed:
packages/core/src/__tests__/agent-store.test.ts | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-6312
Fusion-Task-Lineage: a7f95ba4-fe8b-4367-9f65-6696b1a3867a
Reliably settles task-detail chat transcripts to the latest output after load and reactivation.
- Add a bounded animation-frame settle loop that re-pins populated transcripts while late layout growth occurs.
- Cancel pending settle frames on cleanup to avoid stale scroll writes after unmount or rerender.
- Cover async transcript height growth and settle-loop cleanup in TaskChatTab tests.
- Add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-6337-chat-scroll-settle.md | 5 +
packages/dashboard/app/components/TaskChatTab.tsx | 52 +++++++++-
.../app/components/__tests__/TaskChatTab.test.tsx | 108 +++++++++++++++++++++
3 files changed, 163 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-6337
Fusion-Task-Lineage: d31de363-7ee6-4098-ac43-991dc33192e4
The embedded desktop local runtime used process.cwd() as its data root.
When a packaged build is launched from a desktop launcher or file manager
(notably the Linux AppImage), cwd is `/` or the read-only squashfs mount
point, so creating `<cwd>/.fusion/fusion.db` failed with EACCES/EROFS and
the runtime never started ("Couldn't start local Fusion").
Resolve the root from the user's home directory instead, so data lives in
`~/.fusion` (consistent with the CLI), with a `FUSION_HOME` override.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Refine task chat transcripts so collapsed tool groups summarize real invocations and expand into paired call/result details.
- Count tool calls by invocation instead of raw tool log rows.
- Show deduped tool names, overflow counts, and error badges in collapsed summaries.
- Pair tool calls with their result or error details when expanded.
- Cover the grouped summary behavior with dashboard tests and documentation.
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/TaskChatTab.css | 36 +++++--
packages/dashboard/app/components/TaskChatTab.tsx | 116 +++++++++++++++++----
.../app/components/__tests__/TaskChatTab.test.tsx | 105 ++++++++++++++++---
4 files changed, 213 insertions(+), 46 deletions(-)
Fusion-Task-Id: FN-6332
Fusion-Task-Lineage: 7c14b76c-dcaa-4227-8393-cb24f99b765d
Resolve conflicts from main's FN-6232 single-source triage prompt refactor:
- Drop the inline FAST_TRIAGE_SYSTEM_PROMPT const removed by main; the fast
triage prompt now lives in agent-prompts.ts (planning-fast seam).
- Migrate the PR's no-commit/operational-routing heuristic edits into the
fast block of agent-prompts.ts (standard block already carried them).
- Point triage tests at FAST_PLANNING_PROMPT/TRIAGE_POLICY_PROMPT instead of
the removed const.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Document the repository-local Beads issue workflow for contributors.
- Add the bd ready/claim/create/close/sync workflow with expected outcomes.
- Document Beads issue types and priority levels.
- Clarify that local Beads tracking is separate from the Fusion storage evaluation.
Files changed:
docs/contributing.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
Fusion-Task-Id: FN-6330
Fusion-Task-Lineage: 9a56def0-40bf-4e61-8582-4bb66e382a3a
Close plugin-store migration test database handles so migration cleanup does not hang.
- Close legacy project database handles after seeding plugin rows.
- Close central and local database handles after idempotency assertions.
- Preserve the migration coverage while preventing open handles from delaying test teardown.
Files changed:
packages/core/src/__tests__/plugin-store.test.ts | 86 ++++++++++++++----------
1 file changed, 49 insertions(+), 37 deletions(-)
Fusion-Task-Id: FN-6317
Fusion-Task-Lineage: 36f6a1da-6ec8-4dae-89a4-6caf1e566def
Keep the mobile board layout stable while Quick Chat owns the keyboard viewport.
- Treat fullscreen mobile overlays as suppressors for App-level footer hiding.
- Pass Quick Chat mobile open state into the shared keyboard flag helper.
- Cover iOS, Android, modal, and non-mobile keyboard flag behavior.
- Document the Quick Chat mobile keyboard board-shift root cause and fix.
Files changed:
.../quick-chat-mobile-keyboard-board-shift.md | 58 ++++++++++++++++++++++
packages/dashboard/app/App.tsx | 4 +-
.../utils/__tests__/mobileBarKeyboardFlags.test.ts | 57 ++++++++++++++++++++-
.../dashboard/app/utils/mobileBarKeyboardFlags.ts | 10 +++-
4 files changed, 126 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6329
Fusion-Task-Lineage: f7c37252-c0ea-44f0-b4e3-5aa2022cf7bc
Clarify and cover the settings scopes response shape including workflow settings.
- Document that GET /api/settings/scopes returns workflowSettings with global and project scopes.
- Assert workflowSettings is always a non-null object for default and project-scoped route tests.
- Preserve exact workflow setting payload coverage when workflow overrides are present.
Files changed:
docs/settings-reference.md | 2 +-
packages/dashboard/src/__tests__/routes-settings.test.ts | 11 +++++++++++
2 files changed, 12 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6322
Fusion-Task-Lineage: 08796f9d-be99-46a1-8326-251a8d79dda4
Refine Chat active-state styling by dropping edge highlights while preserving active tints.
- Remove the scope-tab active bottom underline shadow.
- Remove the active chat-row left border and compensating padding offset.
- Add CSS contract coverage to prevent the removed desktop and mobile highlights from returning.
Files changed:
packages/dashboard/app/components/ChatView.css | 3 --
.../app/components/__tests__/ChatView.test.tsx | 47 ++++++++++++++++++++++
2 files changed, 47 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6309
Fusion-Task-Lineage: e6645f38-a77c-4426-900b-71334d2145a9
Keep the App test suite aligned with the mobile scroll lock hook exports.\n\n- Add a vi.fn() mock for useMobileKeyboardViewportLock in the existing useMobileScrollLock module mock.\n- Preserve the iOS and lock-state mocks used by App test coverage.\n\nFiles changed:\n packages/dashboard/app/components/__tests__/App.test.tsx | 1 +\n 1 file changed, 1 insertion(+)
Fusion-Task-Id: FN-6323
Fusion-Task-Lineage: cc257afe-2ab7-4e97-b04f-2ccae28eaf38
Quarantine unrelated engine test flakes so the gate avoids known unstable fixtures.
- Add the soft-delete blocker residue reliability test to the quarantine ledger and reliability interaction exclusions.
- Add the bubblewrap sandbox backend test to the quarantine ledger and engine-core exclusions.
Files changed:
packages/engine/vitest.config.ts | 6 +++++-
scripts/lib/test-quarantine.json | 10 ++++++++++
2 files changed, 15 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6319
Fusion-Task-Lineage: 9a47ae20-76b8-47d8-8858-f4fe51ea807e
Task Chat can now steer active assigned sessions while tasks are being reviewed or merged.
- Permit composer steering for in-review reviewing, merging, merging-fix, and fixing statuses when an agent is assigned or checked out.
- Keep paused, user-paused, unassigned, todo, and done tasks disabled with clearer active-session messaging.
- Cover in-review steering and disabled-session states in TaskChatTab tests and update dashboard documentation.
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/TaskChatTab.tsx | 13 +++--
.../app/components/__tests__/TaskChatTab.test.tsx | 61 ++++++++++++++++++++--
3 files changed, 67 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-6314
Fusion-Task-Lineage: 42c0f4f7-58f5-4e0c-837f-9f4b7c497fa3