Fixes ~19 deterministic dashboard test failures pre-existing on origin/main
(non-blocking full-suite lane). Mix of real product fixes and stale-test
reconciliation; no appeasement (no widened timeouts, skips, or weakened
assertions).
Product CSS fixes (real regressions the guards caught):
- Info toast contrast: shadcn-custom light theme had white-on-#0284c7 (4.10,
below WCAG AA 4.5); enrolled it in the light-mode dark-text correction.
- 27 undefined CSS token references (typos/foreign tokens) renamed to canonical
defined tokens; defined the genuinely-intended --border-strong and
--right-dock-min/max-width.
- Raw rgba() box-shadow fallback tokenized to color-mix; dev-server mobile
header split into its own responsive rule.
Stale tests reconciled with intentional product changes:
- workflowColumns graduated to always-on (board-workflows unit test).
- workflow optional-steps source re-pointed to v2 optional-group nodes.
- command-center pricing docs (one doc gap filled: openai-codex:* keying).
- SetupWizardModal added detectWorkspace + workspaceMode/taskPrefix payload.
- board-mobile listener-count assertion → unmount no-throw behavior.
- CommandCenterControls / ThemeSelector: default theme relabeled "Fusion Legacy".
- ProjectOverview / WorkflowNodeEditor: header divider intentionally removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Follow-up to #1767. Safe, track-forward storage cleanup — **no history
rewrite, no force-push.**
## What
- Extend the Git LFS policy from GIFs to **documentation/marketing PNG
screenshots** (`docs/screenshots/**`, `demo/**`, top-level
`screenshots/**`) — 53 PNGs converted to LFS pointers.
- Ran `git gc --prune=now` locally: consolidated 7 packfiles → 1 and
pruned loose objects (**local `.git` 421M → 300M**; this is a
local-clone benefit, not a remote-history change).
## Deliberately excluded (stay as real blobs)
These are build/runtime assets — an LFS-less build env would otherwise
embed a 132-byte pointer stub and break them:
- `packages/dashboard/app/public/icons/*.png` — PWA manifest icons
(served)
- `packages/desktop/src/icons/*.png` — Electron app/tray icons
(packaged)
- `packages/dashboard/app/public/fonts/SymbolsNerdFontMono-Regular.ttf`
— `@font-face` source (served)
## Verified
- No runtime icon/font asset entered LFS (`git lfs ls-files` excludes
`icons/`, `fonts/`, `.ttf`).
- `docs-screenshot-links` test still passes — it checks path existence,
and LFS pointer files satisfy `existsSync`.
## Not in scope
The ~300MB of stale binary history (old GIF/PNG revisions) is only
reclaimable via a history rewrite (force-push + re-clone) — tracked
separately as Tier 2.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1768">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Workflow editing now opens in a floating window with improved drag,
sizing, and close behavior.
* Workflow switchers now pass the selected workflow into the editor, so
the chosen workflow opens directly.
* **Bug Fixes**
* Improved mobile and desktop layout behavior for the workflow editor,
including overlay sizing and scroll handling.
* Updated navigation and onboarding flows to match the latest sidebar
and empty-state behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## What
Routes `demo/assets/*.gif` through **Git LFS** and converts the 20
existing reel GIFs to LFS pointers. Adds a Git LFS setup note to
`docs/contributing.md`.
## Why
The demo reel GIFs dominate repo size: the same captures get re-shot and
re-committed, and git keeps every old blob forever (~118 MB of GIF
history backing a ~421 MB `.git`). Routing them through LFS keeps the
binaries out of the packfile so future regenerations stop bloating
history.
## Scope / blast radius
- **Track-forward only** — existing history is left intact. No
`filter-repo` rewrite, no force-push, no re-clone required.
- This does **not** shrink the current `.git` (old blobs remain in
history); it stops the bleeding going forward.
- Contributors must have `git lfs install` configured, or the GIFs
arrive as pointer stubs — documented in `docs/contributing.md`.
## Notes
- GitHub free LFS tier is 1 GB storage + 1 GB/month bandwidth; live GIFs
are ~49 MB. Worth keeping an eye on LFS bandwidth for a trafficked
public repo.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1767">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Chores**
* Added Git LFS tracking for GIFs in the demo assets folder to help keep
the repository size manageable.
* **Documentation**
* Updated contributor setup instructions with Git LFS guidance,
including installation, pulling existing large files, and how new GIFs
are handled automatically.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
The global mobile fullscreen modal rule (`.modal-lg`, `.modal:not(.confirm-dialog)`)
forced the embedded Planning shell to 100dvh, overflowing its bounded `.planning-view`
pane. `overflow:hidden` then clipped the footer action buttons and blocked scrolling.
Qualify the mobile embedded override as `.planning-view.open .planning-modal--embedded`
so it outranks the global rule, and re-pin `max-height:100%` so the inner flex scroll
chain works. Adds a CSS regression test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Extend the LFS track-forward policy from GIFs to documentation and marketing
PNG screenshots (docs/screenshots, demo, top-level screenshots). Scoped to
doc/demo dirs only; app-runtime/build images (PWA icons, Electron tray icons,
the served Nerd Font) stay as real blobs so LFS-less build envs never embed a
pointer stub. No history rewrite / force-push. Stacks on the GIF LFS change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Track demo/assets/*.gif via Git LFS and convert the 20 existing reel GIFs
to LFS pointers. Stops binary GIF regenerations from bloating .git going
forward; existing history is left intact (no rewrite/force-push).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
## What & why
`pnpm test` on `main` failed **30 tests** across 5 dashboard files. All
ran in the **non-blocking full-suite lane** (not the merge gate), so
they went unnoticed despite being deterministic. Every one is a **stale
test trailing an intentional product change** — fixes are **test-only**,
with **no product code changed** and **no appeasement** (no widened
timeouts, no `.skip`, no weakened assertions).
## Root causes & fixes
| File | Failures | Root cause | Fix |
|---|---:|---|---|
| `App.test.tsx` | 26 | Sidebar-destination tests (view switching, chat
unread, GitHub import, board branch filters) never set `leftSidebarNav:
true`; the shared `defaultSettings` keeps it `false` to preserve legacy
header-nav tests, so the sidebar never rendered. The backend-unreachable
recovery test asserted a setup wizard that **intentionally no longer
auto-opens** on zero projects (`useViewState` FNXC:Onboarding
2026-06-22-05:06) with `modelOnboardingComplete: true`. | Opt each
sidebar describe/test into `leftSidebarNav: true`; assert recovery to
the dashboard shell instead of the retired auto-wizard. |
| `board-workflows-route.test.ts` | 1 | `workflowColumns` flag
**graduated to always-on** (`isWorkflowColumnsEnabled` returns `true`;
stale persisted `false` treated as enabled) — the flag-OFF empty-shape
branch is retired. | Assert the graduation invariant (persisted `false`
→ `flagEnabled: true`). |
| `promote-route.test.ts` | 1 | Same graduation: the flag-OFF → `400`
branch is dead, so the route proceeds and 500s on the incomplete mock. |
Assert persisted `false` proceeds to the engine (no legacy 400). |
| `register-command-center-routes.auth.test.ts` | 1 |
`/command-center/tokens` now reads `modelPricingOverrides` via
`getGlobalSettingsStore()`; `MockStore` lacked it → 500. | Add the
`getGlobalSettingsStore()` stub. |
| `PlanningModeModal.initial.test.tsx` | 1 | The shared `.spin` loader
keyframe was renamed `spin` → `fusion-spinner-spin` for
collision-proofing. | Update the CSS regex to the current keyframe. |
## Verification
- All 5 files together: **161 passed / 0 failed** (`App.test.tsx`
128/128).
- ESLint on all 5 files: exit 0.
- `git diff` touches **test files only** — confirmed no product/source
file changed, and no `timeout:`/`.skip`/removed-`expect` introduced.
## Notes
- No changeset (test-only).
- Diagnosis confirmed by instrumenting `App.tsx` (reverted): after
settings load, `leftSidebarNavEnabled` flipped to `false` because the
fixture set `leftSidebarNav: false`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1765">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Dashboard navigation now consistently follows the new default sidebar
layout.
* Restored dashboard recovery flow after a backend outage so the normal
shell returns cleanly when service resumes.
* Workflow-related actions and board views now behave as enabled even
when older saved settings say otherwise.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
These deterministic failures lived in the non-blocking full-suite lane
(App.test.tsx + three API-backfill route tests + one modal test), so the
merge gate never surfaced them. All are stale tests trailing intentional
product changes — fixes are test-only; no product code and no appeasement
(no widened timeouts, no skips, no weakened assertions).
App.test.tsx (26): sidebar-destination tests (view switching, chat unread,
GitHub import, board branch filters) never opted into leftSidebarNav:true,
so with the shared defaultSettings keeping it false (to preserve legacy
header-nav tests) the sidebar never rendered. Enable leftSidebarNav per
sidebar describe/test. The backend-unreachable recovery test asserted a
setup wizard that intentionally no longer auto-opens on zero projects
(useViewState FNXC:Onboarding 2026-06-22-05:06) with modelOnboardingComplete
true — assert recovery to the dashboard shell instead.
board-workflows-route + promote-route: the workflowColumns flag graduated to
always-on (isWorkflowColumnsEnabled returns true; stale persisted false is
treated as enabled), retiring the flag-OFF 400/empty-shape branches. Update
both "flag OFF" tests to assert the graduation invariant.
register-command-center-routes.auth: the /command-center/tokens handler now
reads modelPricingOverrides via getGlobalSettingsStore(); MockStore lacked it,
yielding a 500. Add the stub.
PlanningModeModal.initial: the shared .spin loader keyframe was renamed
spin -> fusion-spinner-spin for collision-proofing; update the CSS regex.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Keep Command Center token usage surfaces mounted and updated during live analytics polling.
- Preserve existing analytics data while background polls are in flight so token surfaces revalidate without disappearing.
- Add live refresh intervals for Overview and Tokens token-usage data.
- Cover in-place token stat, chart, and model-row updates with Command Center and area tests.
- Add a patch changeset for the published Fusion package.
Files changed:
.changeset/fn-6970-command-center-token-live.md | 7 ++
.../components/command-center/CommandCenter.tsx | 4 +
.../__tests__/CommandCenter.test.tsx | 81 +++++++++++++--
.../components/command-center/areas/AreaShell.tsx | 3 +
.../components/command-center/areas/TokensArea.tsx | 4 +
.../command-center/areas/__tests__/areas.test.tsx | 111 +++++++++++++++++++--
.../command-center/areas/useAnalyticsArea.ts | 12 ++-
7 files changed, 208 insertions(+), 14 deletions(-)
Fusion-Task-Id: FN-6970
Fusion-Task-Lineage: 670bb5ac-bc7d-47d8-abed-ef6748292cc6
Dashboard Back navigation now dismisses task detail surfaces before leaving the current context.
- Add full-panel task-detail history entries that restore board/list state or the previous nested detail.
- Route modal task-detail Back handling through the same close path as explicit dismissal so deep-link cleanup runs.
- Cover board-opened, nested, and modal popstate flows and document the Back behavior.
- Add a patch changeset for the published Fusion dashboard behavior.
Files changed:
.changeset/fn-6964-dashboard-back-navigation.md | 7 ++
docs/dashboard-guide.md | 3 +-
packages/dashboard/app/App.tsx | 50 ++++++++++--
packages/dashboard/app/components/AppModals.tsx | 31 ++++++--
.../app/components/__tests__/App.test.tsx | 90 ++++++++++++++++++++++
.../app/components/__tests__/AppModals.test.tsx | 5 +-
.../app/components/dashboard/MainContent.tsx | 6 +-
.../dashboard/app/components/dashboard/types.ts | 1 -
8 files changed, 173 insertions(+), 20 deletions(-)
Fusion-Task-Id: FN-6964
Fusion-Task-Lineage: 2308b603-a6ac-4978-9a6a-a6028b9bc38c
Document why the goals schema-version test follows the exported schema constant.
- Add an FNXC note explaining that fresh database version assertions should track SCHEMA_VERSION.
- Preserve the dynamic schema-version expectation so migration bumps do not leave stale literals behind.
Files changed:
packages/core/src/__tests__/goals-schema.test.ts | 4 ++++
1 file changed, 4 insertions(+)
Fusion-Task-Id: FN-6709
Fusion-Task-Lineage: 05abc460-0816-4f31-a83c-fb0d3ae427e1
## Summary
- Switches the engine-core Vitest project from thread workers to fork
workers to avoid the Node 24/macOS libuv kqueue SIGABRT while preserving
real failure semantics.
- Adds a small policy regression test covering the gate pool, warning
behavior, and engine-core allow-list expectations.
## Test Plan
- node --test scripts/__tests__/engine-vitest-gate-policy.test.mjs
- corepack pnpm --filter @fusion/engine test:core
<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1764">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved reliability of the engine’s Vitest test execution on newer
macOS/Node setups by scoping a safer worker strategy to the core
merge-gate suite.
* Prevented configuration and gate-script changes that could otherwise
break consistent test behavior.
* **Tests**
* Added automated “gate policy” checks to validate Vitest configuration
constraints and ensure core/test-gate scripts run with the expected
command and allow-listed test patterns.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## What & why
Cuts feedback-loop wall-time on the slowest dashboard test files
(FN-5048 velocity). Profiled the velocity baseline's top offenders; all
changes are **behavior-preserving** — no assertions, timeouts, or
worker/concurrency knobs changed.
## Changes
| File | Root cause | Fix | Result (verified locally) |
|---|---|---|---|
| `SettingsModal.test.tsx` (#1, ~60.5s) | 231 tests in one sequential
worker; flat ~250ms/test | Split into 4 sibling files sharing
`SettingsModal.test-harness.tsx`; the settings project parallelizes them
across workers | shard **60.5s → ~25s** (−58%) |
| `insights-routes.test.ts` (#2, ~26.5s) | Double `TaskStore.init()` per
test; only 1 of 24 tests needs the project-b store | Lazy-init `storeB`
on first use | tests **5.78s → 3.66s** (−37%) |
| `evals-routes.test.ts` | Same double-init pattern | Same lazy `storeB`
| tests ~0.98s |
### SettingsModal split mechanics
- Test bodies moved **verbatim** — static `it()` count preserved at
**231**.
- `vi.mock` factories stay in each test file (they only apply per
module) and reference the ~61 mock fns imported from the harness.
- Shared `beforeEach`/`afterEach` registered via the harness's exported
`installSettingsModalEnv()`.
- `vitest.config.ts`: `qualityAppSettingsOnlyTests` now points at the 4
new files; bare `"SettingsModal"` dropped from
`qualityAppComponentTests`/`isolatedQualityAppComponentTests`.
## Verification
- All 4 split files green; independent run: **518 passed / 0 failed** (4
files × 2 project collections × 259 assertions). Original profile = 259
assertions / 231 `it()`s — matches.
- ESLint exit 0 on all new/changed files; `check-test-inventory
--dashboard-curated` passed.
- `insights-routes` 24/24 and `evals-routes` 7/7 pass.
## Notes
- No changeset (test-only + CI config, behavior-preserving — per
AGENTS.md).
- Stale references to the old filename remain only in generated
snapshots (`test-timings.json`, `line-count-baseline.json`,
`test-velocity-history.json`); they refresh on the next `pnpm
test:velocity` run.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1763">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Tests**
* Expanded dashboard settings coverage with focused suites for General,
Authentication, Scheduling/Merge, and Remote/Notifications.
* Added a shared SettingsModal test harness to centralize rendering,
readiness, and persistence assertions, improving reliability and
maintainability.
* Updated Evals/Insights route tests to lazily initialize and clean up
project-scoped task storage.
* Adjusted Vitest configuration to isolate the new SettingsModal shards
and prevent duplicate execution, keeping test runs faster and cleaner.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
- Exclude the 4 SettingsModal split files from the app backfill project
(greptile P1): the split dropped the bare "SettingsModal" entry from
qualityAppComponentTests, which had excluded the curated file from
backfill; without spreading qualityAppSettingsOnlyTests into
backfillAppExclude the split files matched the backfill `app/**` glob
and ran in two projects, doubling their wall-time. Now collected by
exactly one project (dashboard-app-quality-settings).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reduce feedback-loop wall-time on the slowest dashboard test files
(FN-5048 velocity), behavior-preserving — no assertions, timeouts, or
worker counts changed.
- SettingsModal.test.tsx (231 tests, ~60.5s in one sequential worker)
split into 4 sibling files sharing SettingsModal.test-harness.tsx so
the settings project parallelizes them across workers (~60.5s -> ~25s
wall). Test bodies moved verbatim; static it() count preserved at 231.
vi.mock factories stay per-file and reference the harness-exported
mock fns; shared beforeEach/afterEach via installSettingsModalEnv().
- insights-routes.test.ts: lazily init the project-b store (only 1 of 24
tests needs it) instead of a second TaskStore.init() per test
(tests 5.78s -> 3.66s).
- evals-routes.test.ts: same lazy storeB pattern.
- vitest.config.ts: point the settings-only project at the 4 new files;
drop the bare "SettingsModal" entry from the component shards.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
## Summary
Fill in proper translations for three i18n keys that were added as empty
strings to all non-English locales. Also adds the `{{mergingSuffix}}`
interpolation to `workflowSwitcher.countsAria` to match the English
catalog.
## Changes
Keys fixed across zh-CN, zh-TW, fr, es, ko:
| Key | Change |
|-----|--------|
| `dashboard.title` | Empty string -> proper translation |
| `workflowSwitcher.merging` | Empty string -> proper translation |
| `workflowSwitcher.mergingTitle` | Empty string -> proper translation |
| `workflowSwitcher.countsAria` | Added missing `{{mergingSuffix}}`
interpolation |
## Verification
- `pnpm --filter @fusion/i18n vitest run src/__tests__/parity.test.ts
src/__tests__/i18n-gate-coverage.test.ts` passes (7/7 tests)
<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1760">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added localized dashboard titles for Spanish, French, Korean,
Simplified Chinese, and Traditional Chinese.
* Added/updated workflow switcher text for the merging state, including
clearer task-count messaging and new labels in the same languages.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Three keys (dashboard.title, workflowSwitcher.merging,
workflowSwitcher.mergingTitle) were added as empty strings to all
non-en locales. Fill in proper translations and add the
{{mergingSuffix}} interpolation to workflowSwitcher.countsAria to
match the English catalog.
Locales updated: zh-CN, zh-TW, fr, es, ko
TaskStore shutdown now tears down its cached plugin store to avoid leaking plugin database handles.
- Dispose the cached PluginStore during TaskStore.close(), clear the cache, and remove listeners before closing.
- Keep close idempotent when no plugin store was created or after a prior teardown.
- Add regression coverage for direct TaskStore.close() and disk-backed harness reopen lifecycle.
Files changed:
.../src/__tests__/store-plugin-store-close.test.ts | 63 ++++++++++++++++++++++
packages/core/src/store.ts | 15 ++++++
2 files changed, 78 insertions(+)
Fusion-Task-Id: FN-7005
Fusion-Task-Lineage: fe2242d8-7004-4d29-904d-58ee77861d99
Stabilize @fusion/core tests by resetting stale plugin-store database handles and aligning fixture assertions.
- Add a PluginStore close method that disposes local and central database connections.
- Reset the lazy plugin store before the shared test harness clears global settings storage.
- Cover plugin-store reopening from the built-in workflow harness.
- Assert the runtime FN task-prefix fallback without requiring serialized defaults.
Files changed:
packages/core/src/__tests__/builtin-workflows.test.ts | 6 ++++++
packages/core/src/__tests__/store-test-helpers.ts | 8 ++++++++
packages/core/src/__tests__/test-project.test.ts | 8 +++++++-
packages/core/src/plugin-store.ts | 12 ++++++++++++
4 files changed, 33 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-7003
Fusion-Task-Lineage: ec4d6e45-61ea-4e6a-b296-3af3acf7ba4b
Remove the stale branch reattachment affordance from Task Detail while preserving self-healing as the recovery path.
- Remove unused rebind banner styles and mobile action-shell rules.
- Drop stale recoverBranchBinding mocks from TaskDetailModal tests.
- Add rendering coverage proving Task Detail and embedded content do not show reattachment affordances across missing, populated, workspace, and mobile branch states.
- Add a patch changeset for the published Fusion package.
Files changed:
.changeset/fn-6983-task-detail-rebind-warning.md | 7 ++
.../dashboard/app/components/TaskDetailModal.css | 42 +-----------
.../TaskDetailModal.create-pr-e2e.test.tsx | 1 -
.../TaskDetailModal.create-pr-integration.test.tsx | 1 -
.../__tests__/TaskDetailModal.rendering.test.tsx | 80 ++++++++++++++++++++++
.../__tests__/TaskDetailModal.test-helpers.ts | 1 -
6 files changed, 88 insertions(+), 44 deletions(-)
Fusion-Task-Id: FN-6983
Fusion-Task-Lineage: 1a45c38e-f7d0-4df7-94cf-7d1309758e0d
Ensure mobile Missions exits detail tabs back to the mission list before outer navigation.
- Track mobile detail visibility instead of selected mission IDs when adding navigation entries.
- Avoid duplicate history entries for Structure/Activity tab switches and mission refreshes.
- Cover browser back and visible Back button behavior across mobile tabs while desktop stays unchanged.
- Add a patch changeset for the published Fusion package.
Files changed:
.changeset/fn-6998-mobile-mission-back.md | 7 ++
.../dashboard/app/components/MissionManager.tsx | 35 +++++--
.../__tests__/MissionManager.swipe-back.test.tsx | 114 ++++++++++++++++++---
3 files changed, 131 insertions(+), 25 deletions(-)
Fusion-Task-Id: FN-6998
Fusion-Task-Lineage: d3dbf3b7-0195-498f-a57f-ed83c6a422e7