Prevent closed quick chat FAB drags from overwriting the saved desktop panel size.
- gate desktop panel resize clamping and persistence behind the panel open state
- pass the quick chat open state into the resize hook so closed FAB moves leave saved dimensions untouched
- add a regression test covering closed-FAB dragging and reopened panel dimensions
- add a patch changeset for the published CLI package
Files changed:
.changeset/fn-5856-quick-chat-resize.md | 5 +++++
packages/dashboard/app/components/QuickChatFAB.tsx | 12 +++++------
.../app/components/__tests__/QuickChatFAB.test.tsx | 23 ++++++++++++++++++++++
3 files changed, 34 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-5856
Fusion-Task-Lineage: 3358f2b0-ae8d-468c-8e9e-71a1b5365061
Root cause: node:sqlite SIGSEGVs inside pager_write leave the B-tree
malformed in a way that still opens but fails integrity checks; large
operational-log tables widen the write window where the crash strikes.
- backup: verify every copy with PRAGMA quick_check, quarantine corrupt
copies as *.corrupt, and never rotate out the last verified-good backup
- db: add Database.recoverIfCorrupt() startup guard (wired into
TaskStore.init, disk-backed only, opt out via FUSION_DISABLE_DB_AUTORECOVER)
that rebuilds a malformed db via sqlite3 .recover, preserving the corrupt
original; also fixes the latent `.recover main` invalid-option bug that made
recoverDatabase() always fail
- db: drop lost_and_found* scratch tables on init; add pruneOperationalLogs()
- settings: add operationalLogRetentionDays (default 30, 0 = off) and prune
activityLog/agentLogEntries/runAuditEvents/agentHeartbeats during maintenance
- dashboard: expose retention in Settings -> Backups -> Database Maintenance
Tests: backup 59/59, db 135/135 (incl. real corrupt->recover->reopen),
self-healing cleanup/corruption 10/10, settings 77/77, SettingsModal 460/460.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Improve dashboard mobile log usability and make branch group cards collapsible for cleaner review workflows.
- preserve/restore AgentLogViewer scroll position when toggling mobile drawer and lock body scroll while open
- add collapse/expand state to BranchGroupCard with a summary header and hidden details when collapsed
- add regression tests for AgentLogViewer mobile scroll behavior and BranchGroupCard collapse interactions
- add a changeset and dashboard guide note for the new branch group card behavior
Files changed:
.changeset/fn-5845-branch-group-collapse.md | 5 ++
docs/dashboard-guide.md | 1 +
.../dashboard/app/components/AgentLogViewer.tsx | 21 ++++++++
.../dashboard/app/components/BranchGroupCard.css | 23 ++++++++
.../dashboard/app/components/BranchGroupCard.tsx | 63 +++++++++++++++++-----
.../components/__tests__/AgentLogViewer.test.tsx | 48 +++++++++++++++++
.../components/__tests__/BranchGroupCard.test.tsx | 18 +++++++
7 files changed, 166 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-5845
Fusion-Task-Lineage: 6a0f2967-5df8-4761-ae6c-50991f01ab78
Treat rewritten integration-branch advances as handled when the working tree is already aligned.
- Add a new `superseded` resolution for unreachable advance SHAs that remain after history rewrites while HEAD matches the local integration tip.
- Update Git status collection logic and route/API status typings to propagate the new resolution state.
- Update Git Manager modal messaging and dismiss behavior so handled `superseded` entries do not show a sync CTA.
- Extend dashboard route and modal tests, and refresh dashboard guide docs for the new classification behavior.
Files changed:
docs/dashboard-guide.md | 5 +--
packages/dashboard/app/api/legacy.ts | 2 +-
.../dashboard/app/components/GitManagerModal.tsx | 6 ++--
.../components/__tests__/GitManagerModal.test.tsx | 5 ++-
.../dashboard/src/__tests__/routes-git.test.ts | 36 ++++++++++++++++++++--
.../dashboard/src/routes/register-git-github.ts | 13 ++++++--
6 files changed, 55 insertions(+), 12 deletions(-)
Fusion-Task-Id: FN-5839
Fusion-Task-Lineage: 6b4afb73-587d-4319-8ad8-f1d5d54bc7bf
Refine merge-advance status handling so Git Manager only requests action when the checkout is truly behind.
- classify recent integration advances as reachable, orphaned, subsumed, or pending before marking them actionable
- detect subsumed advances by comparing commit patch fingerprints from recent HEAD history
- expose advance resolution metadata in API status payloads and route exports
- update Git Manager UI to count only pending actionable advances, gate Sync Working Tree visibility, and allow dismissing handled orphaned/subsumed rows
- expand dashboard tests and docs to cover stale false-positive scenarios and new resolution behavior
Files changed:
docs/dashboard-guide.md | 6 ++
packages/dashboard/app/api/legacy.ts | 1 +
.../dashboard/app/components/GitManagerModal.tsx | 45 ++++++----
.../components/__tests__/GitManagerModal.test.tsx | 63 ++++++++++++++
.../dashboard/src/__tests__/routes-git.test.ts | 97 +++++++++++++++++++++-
.../dashboard/src/routes/register-git-github.ts | 94 ++++++++++++++-------
6 files changed, 259 insertions(+), 47 deletions(-)
Fusion-Task-Id: FN-5838
Fusion-Task-Lineage: 65d1317a-7618-4fff-9875-c845474888ed
Ensure mailbox content can scroll to the latest agent-to-agent email on mobile layouts.
- Add `min-height: 0` to `.mailbox-view .mailbox-content` to keep the flex child bounded and scrollable.
- Strengthen mobile mailbox scrolling with `overflow-y: auto`, `overscroll-behavior: contain`, and `-webkit-overflow-scrolling: touch`.
- Extend MailboxView CSS tests to assert the new bounded flex and mobile scrolling rules.
Files changed:
packages/dashboard/app/components/MailboxModal.css | 4 ++++
.../app/components/__tests__/MailboxView.test.tsx | 15 +++++++++++++++
2 files changed, 19 insertions(+)
Fusion-Task-Id: FN-5836
Fusion-Task-Lineage: 41ce03bf-d788-4de9-9dc1-db8ad443048e
Ensure the message composer textarea scrolls into view during mobile keyboard interactions.
- extract a reusable textarea scroll helper guarded for missing scrollIntoView support
- subscribe to visualViewport resize for all compose modes (not only replies) and clean up listener with stable callback
- trigger textarea scrolling on focus to proactively keep the composer visible when soft keyboards open
- add tests covering visualViewport resize for new compose, existing reply flow, and focus-triggered scroll behavior
Files changed:
.../dashboard/app/components/MessageComposer.tsx | 20 ++++----
.../components/__tests__/MessageComposer.test.tsx | 56 ++++++++++++++++++++++
2 files changed, 68 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-5837
Fusion-Task-Lineage: c9fb76a2-6c5a-4d5c-b8ad-8250ed470825
Add a markdown/plain toggle to the planning summary description so users can preview formatted content before creating a task.
- add a Description header toggle that switches between editable plain textarea and rendered markdown preview
- render description preview with react-markdown and remark-gfm while preserving expand/collapse layout behavior
- add preview container styles and spacing adjustments for summary form
- add UI interaction test coverage for markdown toggle behavior and rendered heading/bold content
- document the new markdown/plain description toggle in dashboard guide
Files changed:
docs/dashboard-guide.md | 1 +
packages/dashboard/app/components/PlanningModeModal.css | 18 +++++++-
packages/dashboard/app/components/PlanningModeModal.tsx | 32 ++++++++++---
packages/dashboard/app/components/__tests__/PlanningModeModal.ui-interactions.test.tsx | 54 ++++++++++++++++++++++
4 files changed, 98 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5801
Fusion-Task-Lineage: 34972830-7d51-4fcd-bf00-3de8f5aff028
Swap the Settings modal Discord link icon to the official Discord mark and cover it with a focused regression test.
- add an inline Discord SVG icon component and use it in the Discord footer link
- remove the previous lucide MessageCircle icon import and usage
- extend SettingsModal tests to assert the Discord SVG renders and the old icon is absent
Files changed:
packages/dashboard/app/components/SettingsModal.tsx | 20 ++++++++++++++++++--
packages/dashboard/app/components/__tests__/SettingsModal.test.tsx | 3 +++
2 files changed, 21 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5793
Fusion-Task-Lineage: eebbad06-311b-4770-b739-19b33fc29e6a
Refuse AI merge landing on a checked-out dirty integration worktree by default. This prevents Fusion from stashing/restoring unrelated project-root edits into main and then marking tasks done against contaminated state.
Fusion-Task-Id: FN-5780
Relocate the Settings Help/discussions action from the header controls to the footer version area for clearer placement.
- Remove the Help button from the settings header action group and keep Star/Discord there.
- Add the Help link beside the footer version/update-check section with the same hardened external-link attributes.
- Update Settings modal styling for the new footer help placement and spacing behavior.
- Adjust Settings modal and mobile CSS tests to assert the new Help location and height contract selectors.
Files changed:
.../dashboard/app/components/SettingsModal.css | 12 ++++++++----
.../dashboard/app/components/SettingsModal.tsx | 22 +++++++++++-----------
.../components/__tests__/SettingsModal.test.tsx | 12 +++++++++++-
.../components/__tests__/settings-mobile.test.tsx | 4 ++--
4 files changed, 32 insertions(+), 18 deletions(-)
Fusion-Task-Id: FN-5781
Fusion-Task-Lineage: 90fe2f30-c2fe-438b-b486-3b6ef14e21a6
Restore the Settings header GitHub star CTA while removing its configurability.
- keep the Star on GitHub link in Settings header with refreshed split-pill styling and alignment
- reintroduce GitHub star count fetching/caching and click-tracking helpers used by the header control
- update Settings modal header-action test expectations to include the GitHub star link
- revise the changeset note to reflect removing only the showGitHubStarButton setting/toggle
Files changed:
.changeset/FN-5777-removal.md | 4 +-
packages/dashboard/app/components/SettingsModal.css | 51 ++++++++-
packages/dashboard/app/components/SettingsModal.tsx | 118 ++++++++++++++++++++-
packages/dashboard/app/components/__tests__/SettingsModal.test.tsx | 4 +-
4 files changed, 170 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5779
Fusion-Task-Lineage: f485a062-6110-4a79-b42d-70710e3ce5da
Remove the dashboard setting and UI entry points for the GitHub star prompt.
- Remove the Star on GitHub option from settings state types and schema definitions.
- Delete SettingsModal UI, handlers, and styles tied to the star button and related layout.
- Update SettingsModal tests and add a changeset documenting the patch release impact.
Files changed:
.changeset/FN-5777-removal.md | 7 ++
packages/core/src/settings-schema.ts | 1 -
packages/core/src/types.ts | 4 -
.../dashboard/app/components/SettingsModal.css | 51 +-------
.../dashboard/app/components/SettingsModal.tsx | 137 +--------------------
.../components/__tests__/SettingsModal.test.tsx | 5 +-
6 files changed, 13 insertions(+), 192 deletions(-)
Fusion-Task-Id: FN-5777
Fusion-Task-Lineage: 16367ba6-ad22-4ba0-a033-005ccc420c19
Relocate Settings version/update UI into the modal footer to reduce header crowding.
- Remove the version/update-check control block from the Settings modal header.
- Add a dedicated footer version container and keep the update-check action/result rendering there.
- Update Settings modal CSS for the new footer layout and mobile wrapping behavior.
- Extend mobile tests to verify footer placement and update-check button clickability.
Files changed:
packages/dashboard/app/components/SettingsModal.css | 25 +++++++--
packages/dashboard/app/components/SettingsModal.tsx | 64 +++++++++++-----------
packages/dashboard/app/components/__tests__/settings-mobile.test.tsx | 27 ++++++++-
3 files changed, 77 insertions(+), 39 deletions(-)
Fusion-Task-Id: FN-5765
Fusion-Task-Lineage: 97923f08-e787-4274-a4ce-8b615b909468
Add a Discord CTA in the Settings header alongside the existing GitHub star action.
- Add a Discord header action/link in SettingsModal next to the GitHub star button
- Update SettingsModal styles to support the additional header action
- Extend SettingsModal tests to cover rendering and behavior of the new Discord link
Files changed:
packages/dashboard/app/components/SettingsModal.css | 2 ++
packages/dashboard/app/components/SettingsModal.tsx | 13 ++++++++++++-
.../app/components/__tests__/SettingsModal.test.tsx | 14 +++++++++++++-
3 files changed, 27 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5763
Fusion-Task-Lineage: 758eddf8-246c-41be-9742-a9d5b4b0eb17
Keep chat scroll position stable when stale top snapshots are captured during mobile message updates.
- Capture scroll anchors from the first visible message instead of always sampling the first DOM node
- Ignore stale or likely-invalid zero-position snapshots before attempting scroll restoration
- Guard bottom anchoring from interrupting user scroll unless explicitly forced and add regression coverage for stale snapshot behavior
Files changed:
packages/dashboard/app/components/ChatView.css | 11 +++++-
packages/dashboard/app/components/ChatView.tsx | 33 +++++++++++++----
packages/dashboard/app/components/__tests__/ChatView.scroll-to-top.test.tsx | 41 ++++++++++++++++++++++
3 files changed, 78 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5757
Fusion-Task-Lineage: 4e4f6843-ba70-40da-8d16-358bdfcc7b09
Fixes typecheck failure — the new task:near-duplicate-flagged
ActivityEventType was missing from the exhaustive Record maps in
ActivityFeed and ActivityLogModal.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Stabilize the connectivity recovery first-run App test by controlling timer-driven state transitions.
- switch the retry/recovery test to `vi.useFakeTimers()` with `try/finally` cleanup
- advance timers explicitly around initial render, retry click, and post-rerender recovery window
- preserve existing assertions while removing `waitFor` timing dependence in this flow
Files changed:
packages/dashboard/app/components/__tests__/App.test.tsx | 41 ++++++++++++++--------
1 file changed, 26 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-5724
Fusion-Task-Lineage: 0dfad0d8-ccf9-4f83-af2e-1057180fe191
Reduce interaction overhead in the ChatView agent-mentions test while preserving coverage.
- Switch the test to a local instance for faster click/type interactions.
- Reuse that configured user instance for both room-scope selection and mention trigger typing.
- Replace async DOM lookup with immediate assertion once the mention header is expected to be present.
Files changed:
packages/dashboard/app/components/__tests__/ChatView.test.tsx | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-5745
Fusion-Task-Lineage: f65364d0-951e-4945-bc8b-42bf99e8a5e6
Reduce repeated async waits in PrCreateModal tests by centralizing initial-load synchronization.
- add a renderModalLoaded helper that waits for the AI title field once per test setup
- replace repeated findByDisplayValue calls with the shared helper in slow-path tests
- switch one post-load lookup from async findBy* to sync getBy* where loading is already guaranteed
Files changed:
.../components/__tests__/PrCreateModal.test.tsx | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
Fusion-Task-Id: FN-5727
Fusion-Task-Lineage: bf064b14-d625-4396-91e7-02d9eb48b9eb
Reduce runtime overhead in the GitHub Copilot authentication test by replacing slower user-event timing with deterministic timer control.
- import `act` from Testing Library to flush async state transitions explicitly
- switch the Copilot login/copy/open interactions in the target test from `userEvent.click` to `fireEvent.click`
- wrap the flow in `vi.useFakeTimers()`/`vi.useRealTimers()` and advance timers directly instead of waiting with a 5s timeout
- keep existing assertions for clipboard writes, toast feedback, GitHub link opening, and login code expiry behavior
Files changed:
.../components/__tests__/SettingsModal.test.tsx | 47 ++++++++++++++--------
1 file changed, 31 insertions(+), 16 deletions(-)
Fusion-Task-Id: FN-5726
Fusion-Task-Lineage: e9ccf2d0-d5a2-4568-abf5-7d9f7e67d643
Ensure Rooms scope reliably re-anchors to bottom on re-entry without breaking scroll preservation during refetch.
- reset stale thread anchor state when entering Rooms without an active room
- treat direct↔rooms transitions as entry events and anchor messages to bottom on entry
- keep existing scroll position when room messages are refetched in-place
- add regression tests covering room re-entry anchoring and refetch scroll preservation
Files changed:
packages/dashboard/app/components/ChatView.tsx | 14 +++-
.../app/components/__tests__/ChatView.test.tsx | 88 ++++++++++++++++++++++
2 files changed, 99 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-5720
Fusion-Task-Lineage: dde8818b-f2e5-4c55-8a4c-2c54241c2e38
Switch task base-branch selection to prefer existing branches while preserving custom entry when needed.
- fetch local git branches for TaskForm and sort common integration branches (main/master/trunk/develop) first
- render base branch as a dropdown with default and Custom… options, with fallback custom input mode and toggle back to dropdown
- update TaskForm/NewTaskModal tests for branch loading, dropdown ordering, unknown-branch fallback, and fetch failure behavior
- document the new branch dropdown + custom fallback behavior in dashboard guide branch planning rules
Files changed:
docs/dashboard-guide.md | 4 +-
packages/dashboard/app/components/TaskForm.tsx | 100 +++++++++++++++++++--
.../app/components/__tests__/NewTaskModal.test.tsx | 1 +
.../app/components/__tests__/TaskForm.test.tsx | 66 +++++++++++++-
4 files changed, 156 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-5716
Fusion-Task-Lineage: 0ed72020-d8a0-4675-92d3-9476f53a173a
Improve the mission manager mobile stacked layout so mission rows reflow cleanly.
- make stacked mission list items switch to column layout with stretched content on mobile
- make stacked mission item actions full-width and wrapping instead of cramped inline controls
- make stacked mission run controls span full width
- add mobile CSS regression assertions for stacked-body mission cards and action controls
Files changed:
packages/dashboard/app/components/MissionManager.css | 16 ++++++++++++++++
packages/dashboard/app/components/__tests__/MissionManager.mobile-css.test.ts | 13 +++++++++++++
2 files changed, 29 insertions(+)
Fusion-Task-Id: FN-5711
Fusion-Task-Lineage: 76a20899-89fe-4aa9-8871-6b64c2521a0b
Adjust mobile keyboard bar flags so Android keeps the executor footer stacked above the nav bar while iOS retains collapse behavior.
- extract mobile bar keyboard flag computation into a dedicated utility
- keep nav keyboard pinning cross-platform while limiting footer keyboard-collapse to iOS
- add focused unit tests for Android/iOS/modal/desktop keyboard flag scenarios
- update ExecutorStatusBar keyboard-open test assertion and dashboard guide keyboard behavior notes
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/App.tsx | 23 ++++---
.../__tests__/ExecutorStatusBar.test.tsx | 6 +-
.../utils/__tests__/mobileBarKeyboardFlags.test.ts | 73 ++++++++++++++++++++++
.../dashboard/app/utils/mobileBarKeyboardFlags.ts | 36 +++++++++++
5 files changed, 129 insertions(+), 11 deletions(-)
Fusion-Task-Id: FN-5707
Fusion-Task-Lineage: ed01fcb0-d814-4595-9479-5baf97326ae7