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
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
Prevent the chat composer from showing a right-edge scrollbar line before it reaches the autosize cap.
- set chat textarea default overflow to hidden in ChatView CSS
- add resolveChatInputOverflowY to switch overflow to auto only past the 640px cap
- apply overflow mode during composer autosize updates
- extend chat input autosize tests and docs to cover overflow behavior
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/ChatView.css | 1 +
packages/dashboard/app/components/ChatView.tsx | 5 +++++
packages/dashboard/app/components/__tests__/ChatView.chat-input-autosize.test.tsx | 9 ++++++++-
4 files changed, 15 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5706
Fusion-Task-Lineage: 4619aa30-c02f-453b-bdf2-f60f360e9372
Ensure task detail modal openings consistently register browser history so Android back swipe/button dismisses the modal from all entry paths.
- add a shared openDetailTaskWithNav callback in AppModals that opens task detail and pushes a modal close handler into navigation history
- route onboarding view-task, activity log open-task, and task-to-task detail navigation through the new history-aware opener
- extend AppModals tests with a navigation history wrapper and popstate assertions for onboarding/activity log/task-to-task flows
- document that these task detail entry points now participate in navigation history for consistent Android back behavior
Files changed:
docs/dashboard-guide.md | 1 +
packages/dashboard/app/components/AppModals.tsx | 21 ++++-
.../app/components/__tests__/AppModals.test.tsx | 101 ++++++++++++++++++++-
3 files changed, 115 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-5705
Fusion-Task-Lineage: fd0309ae-e0da-4489-95e4-c34699287e7c
Improve Mission Manager run-state UX by separating mission run controls from autopilot behavior.
- Group mission run settings in the detail view and add explicit Start mission / Stop mission / Resume mission buttons with contextual helper text.
- Humanize autopilot state labels (Off, Watching, Activating slice, Completing) and add explanatory autopilot description copy.
- Update Mission Manager styling to support the new run-settings layout and helper text blocks in list/detail views.
- Extend MissionManager tests to verify labeled run controls, endpoint wiring for start/stop/resume, and humanized autopilot badge labels.
- Update mission docs to clarify the distinction between mission run-state controls and the autopilot toggle.
Files changed:
docs/missions.md | 2 +-
packages/dashboard/app/components/MissionManager.css | 62 ++++-
packages/dashboard/app/components/MissionManager.tsx | 272 +++++++++++++--------
packages/dashboard/app/components/__tests__/MissionManager.test.tsx | 107 +++++++-
4 files changed, 330 insertions(+), 113 deletions(-)
Fusion-Task-Id: FN-5681
Fusion-Task-Lineage: 0dcac659-2eff-435b-a176-b66e7646b054
Prevent mission list descriptions from overflowing the stacked mobile layout and displacing adjacent controls.
- add a stacked-mobile MissionManager CSS rule that clamps mission description text to two lines
- apply the clamp to both the description container and nested markdown body content to preserve truncation behavior
- add a mobile CSS regression test that asserts the new clamp selectors and properties are present
Files changed:
packages/dashboard/app/components/MissionManager.css | 9 +++++++++
.../app/components/__tests__/MissionManager.mobile-css.test.ts | 9 +++++++++
2 files changed, 18 insertions(+)
Fusion-Task-Id: FN-5701
Fusion-Task-Lineage: b5f97fd3-7c9b-4c47-9165-0db3cf66c20f
Use the shared favorites hook so agent model pickers stay in sync with project favorites.
- Switch AgentDetailView config tab model favorites to use useFavorites instead of local settings update logic.
- Switch NewAgentDialog model favorites to the same shared favorites flow and remove duplicated toggle handlers.
- Extend AgentDetailView/NewAgentDialog tests and dropdown test helpers to exercise provider/model favorite toggles through the shared global settings path.
Files changed:
.../dashboard/app/components/AgentDetailView.tsx | 44 +++------------------
.../dashboard/app/components/NewAgentDialog.tsx | 45 +++-------------------
.../AgentDetailView.advanced-settings.test.tsx | 41 ++++++++++++++++++++
.../__tests__/AgentDetailView.test-helpers.ts | 25 +++++++++++-
.../components/__tests__/NewAgentDialog.test.tsx | 36 +++++++++++++++++
5 files changed, 111 insertions(+), 80 deletions(-)
Fusion-Task-Id: FN-5669
Fusion-Task-Lineage: 8ace8ea1-1c88-409c-a9ae-6b5deb391f46
Enable mission target branch to be viewed and updated from the mission edit form.
- Add `baseBranch` to mission form state and initialize it when opening edit mode.
- Include trimmed `baseBranch` in mission PATCH updates.
- Add target branch input to both MissionManager edit form render paths.
- Add MissionManager tests for pre-filling and saving edited target branch values.
Files changed:
.../dashboard/app/components/MissionManager.tsx | 24 ++++++++
.../components/__tests__/MissionManager.test.tsx | 66 ++++++++++++++++++++++
2 files changed, 90 insertions(+)
Fusion-Task-Id: FN-5665
Fusion-Task-Lineage: b25cf171-b681-4dd8-b5f4-70f0e8714774
Replace mock-only goals behavior with live API-backed create/edit/archive flows in GoalsView.
- load goals from GET /api/goals when initial goals are not injected
- add inline create form that POSTs goals and handles active-goal cap 409 errors
- add per-goal edit form that PATCHes title/description changes
- add archive/unarchive actions wired to archive endpoints with inline error handling
- refresh GoalsView docs and expand component tests for loading, CRUD, cap errors, and status transitions
Files changed:
docs/dashboard-guide.md | 18 +-
packages/dashboard/app/components/GoalsView.css | 52 ++-
packages/dashboard/app/components/GoalsView.tsx | 402 +++++++++++++++++----
packages/dashboard/app/components/__tests__/GoalsView.test.tsx | 250 +++++++++++--
4 files changed, 600 insertions(+), 122 deletions(-)
Fusion-Task-Id: FN-5649
Fusion-Task-Lineage: b787c8e3-64c5-4243-ae84-0f20f12ea09e
- Commit message: the merge agent writes a concise change-summary subject (not
just the task title), and every landed squash carries board-association
trailers — `Fusion-Task-Id: <taskId>` plus the canonical lineage trailer when
the task has a lineageId — guaranteed via an idempotent amend
(ensureTaskTrailersOnHead) even if the agent omits them.
- Verify-and-fix: the merge prompt instructs the agent to run the project's
tests / type-check / lint after resolving the merge and fix any NEW failure
the merge introduced (not pre-existing breakage) before committing.
- Editable prompt: the AI merge agent's base persona is the editable "merger"
role prompt (Settings -> Prompts); the clean-room / verification / trailer
rules are always appended so a custom prompt can't drop them.
- Reviewer model: reviewer uses the project reviewer/validator model lane
(resolveValidatorSettingsModel); the bespoke merger.reviewerModel setting is
removed.
Changeset updated to cover all AI merger changes.
Tests: trailer present on landed commit (+ lineage when set), editable-prompt
incorporation, new-breakage verification wording.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Implements graceful suppression of transient `task.json` ENOENT errors in the executor, logging a suppression signal and surfacing a banner in the UI, with test coverage for both the executor behavior and notification service. Documentation in `docs/architecture.md` and a changeset for `@runfusion/f
Fusion-Task-Id: FN-5624
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5624
Implements source issue delete handling in the task dashboard, including prompt-based user interaction for source-linked issues, new GitHub tracking state logic in `packages/dashboard/src/github-tracking-state.ts`, and corresponding test coverage, with documentation added to `docs/task-management.md
Fusion-Task-Id: FN-5618
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5618
Adds padding expansion to the PR notice block in PrPanel.css with corresponding test assertions to verify the token values, completing the FN-5619 styling pass.
Fusion-Task-Id: FN-5619
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5619
Added OpenAI Responses API as a new custom provider type, wiring `apiType: "responses"` through the core registry, engine routes, and dashboard UI with a dropdown selector; includes test coverage across the registry, routes, and component layers.
Fusion-Task-Id: FN-5601
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5601
This merge implements an OAuth relogin banner feature (FN-5595) that displays in the dashboard when OAuth tokens expire. The feature includes a new `OAuthReloginBanner` component with styling and tests, an OAuth validity logger in the engine for tracking token state, and corresponding API route inte
Fusion-Task-Id: FN-5595
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5595