Collapse the Global Models pricing editor into a compact summary with a modal table for detailed edits.
- Add a View pricing table modal with escape, overlay, and close-button dismissal.
- Keep add, edit, delete, and LiteLLM fetch workflows available while showing override counts in the collapsed settings view.
- Update model pricing tests, styling, and documentation for the collapsed summary and modal editor.
Files changed:
docs/dashboard-guide.md | 2 +-
docs/settings-reference.md | 4 +-
.../settings/sections/ModelPricingSection.css | 36 +++++-
.../settings/sections/ModelPricingSection.test.tsx | 62 ++++++++-
.../settings/sections/ModelPricingSection.tsx | 144 +++++++++++++++------
5 files changed, 198 insertions(+), 50 deletions(-)
Fusion-Task-Id: FN-7049
Fusion-Task-Lineage: 9ba63354-28e7-4717-81e6-805f1f05fd97
Add a "Global Max Concurrent" slider to the footer engine menu and the
Command Center Concurrency card, and group the Scheduling settings by
Global vs Project scope so the global cap isn't mistaken for a per-project
setting (clearer on mobile).
Both sliders are backed by a single shared `useGlobalConcurrency` hook
(module-level store) so they read/write one source of truth and revalidate
after every PUT /api/global-concurrency — fixing the last-writer-wins and
stale-clobber races a per-component cache would cause. The hook treats a
fetch error as non-interactive (slider disabled, not stuck at 1), surfaces
a save-state indicator, and flushes a pending edit on menu close / unmount
so a quick drag-then-dismiss is never silently dropped.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
- Align dashboard prefix validation to 1-5 chars (was 1-10) matching CLI cap
- Fix distributed-task-id.ts fallback from KB to FN (3 occurrences)
- Move taskPrefix/defaultWorkflowId persistence outside interactive-only block
so non-interactive CLI registration also gets defaults
- Wrap both TaskStore lifecycles in try/finally to guarantee close() on error
Add workspaceMode as a first-class ProjectSettings boolean that controls
whether the project root is treated as a workspace parent (multi-repo)
or a single git repo.
- ProjectSettings type + DEFAULT_PROJECT_SETTINGS: workspaceMode?: boolean
- CLI registerProjectInteractive: when sub-repos are detected, ask the
user to confirm workspace mode instead of auto-applying
- TaskStore.updateSettings: when workspaceMode is toggled on, detect
sub-repos and persist workspace.json; when toggled off, remove it
- Dashboard SettingsModal GeneralSection: workspace mode toggle checkbox
This lets users change workspace mode per-project at any time via the
dashboard Settings or PUT /settings API.
- WorkflowNodeEditor.css.test: update selector lookups to the :not(--embedded)-scoped mobile rules (the embedded editor no longer takes over the mobile viewport).
- Memory view: add flex-shrink:0 to the description + tab bar so they don't collapse and overlap the scrolling content (regressed when the header moved to ViewHeader).
- Settings General: fix literal ''' showing in the GitHub-tracking helper copy (pre-existing FN-6771 localization bug) in the i18n source + component default.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Many loading states rendered bare "Loading…" text with no spinner
element, and a couple rendered an unstyled `loading-spinner` div with no
matching CSS (invisible). The global spin animation was never broken —
it rotates in Chromium and WebKit — so prior transform-box edits chased
a non-bug, validated only by a string-matching CSS test.
Add a shared <LoadingSpinner> (self-contained animated SVG, no
lucide-react import so it survives partial test mocks) and adopt it
across ~47 loading placeholders so every loading state shows a
consistent animated spinner. Includes a component test that asserts the
svg carries the animate-spin utility.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Resolve conflicts from main's analytics schema additions (plugin
activations, per-model token buckets) against the PR's contract-assertion
type column:
- db.ts: renumber behavioral-verification migration 124 -> 126, bump
SCHEMA_VERSION to 126 so it follows main's migrations 124/125
- core/roadmap tests: adopt main's SCHEMA_VERSION-constant assertions
instead of stale literal 124
- test-quarantine.json: keep all four quarantine entries from both sides
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Expose declared fallback model lanes in project Settings while preserving workflow-scoped persistence.
- Load the default workflow definition before rendering Project Models lane controls.\n- Show fallback model dropdowns only when the workflow declares matching provider/model settings.\n- Persist and reset fallback lane edits through the Settings modal primary Save action.\n- Update settings documentation for default-workflow and global fallback model placement.
Files changed:\n docs/settings-reference.md | 40 +++---\n .../components/__tests__/SettingsModal.test.tsx | 135 ++++++++++++++++++++-\n .../settings/sections/ProjectModelsSection.tsx | 52 +++++++-\n 3 files changed, 204 insertions(+), 23 deletions(-)
Fusion-Task-Id: FN-6508
Fusion-Task-Lineage: 18dba2f9-658a-4b82-850f-3bbeb70341d3
Persist default workflow model lane edits through the Settings modal's primary save path.
- Register a Project Models section save handler so workflow lane overrides flush before closing Settings.
- Surface typed workflow setting rejections without closing the modal or showing a success toast.
- Remove the separate workflow-model save button and update coverage/docs for the unified save behavior.
Files changed:
docs/dashboard-guide.md | 2 +-
docs/settings-reference.md | 17 +++++---
.../dashboard/app/components/SettingsModal.tsx | 11 ++++-
.../components/__tests__/SettingsModal.test.tsx | 50 ++++++++++++++++------
.../settings/sections/ProjectModelsSection.tsx | 42 ++++++++++--------
.../app/components/settings/sections/context.ts | 3 ++
6 files changed, 83 insertions(+), 42 deletions(-)
Fusion-Task-Id: FN-6225
Fusion-Task-Lineage: 98338f85-c742-46c2-8bdf-f676a6f7e32e
Prevent the settings save split from serializing custom provider definitions through the global or project patch paths.
- skip `customProviders` when building global settings patches
- skip `customProviders` when building project settings patches
- add a regression test that keeps custom providers out of both serialized patches
Files changed:
.../app/__tests__/settings-save-split.test.ts | 24 ++++++++++++++++++++++
.../app/components/settings/save-split.ts | 4 ++++
2 files changed, 28 insertions(+)
Fusion-Task-Id: FN-6205
Fusion-Task-Lineage: 84c3f42b-c621-44ff-b977-ecd3a6729e04
Prevent the settings save split from serializing custom provider definitions through the global or project patch paths.
- skip `customProviders` when building global settings patches
- skip `customProviders` when building project settings patches
- add a regression test that keeps custom providers out of both serialized patches
Files changed:
.../app/__tests__/settings-save-split.test.ts | 24 ++++++++++++++++++++++
.../app/components/settings/save-split.ts | 4 ++++
2 files changed, 28 insertions(+)
Fusion-Task-Id: FN-6205
Fusion-Task-Lineage: 84c3f42b-c621-44ff-b977-ecd3a6729e04
Convert the built-in PR lifecycle into a reusable fragment instead of a selectable task workflow.
- mark builtin:pr-workflow as a fragment and exclude fragments from default-enabled built-ins
- hide built-in fragments from the General settings workflow toggles
- update core and dashboard tests to assert fragment behavior and reject task selection of the PR lifecycle fragment
- add a changeset for the published CLI package
Files changed:
.changeset/pr-lifecycle-fragment.md | 5 +++++
.../core/src/__tests__/builtin-workflows.test.ts | 24 ++++++++++++++++------
packages/core/src/builtin-workflows.ts | 7 ++++---
packages/core/src/store.ts | 2 +-
.../__tests__/WorkflowNodeEditor.test.tsx | 3 ++-
.../settings/sections/GeneralSection.tsx | 4 +++-
6 files changed, 33 insertions(+), 12 deletions(-)
Fusion-Task-Id: FN-6137
Fusion-Task-Lineage: d959ba3b-2e50-4c9b-a1fa-161776939403
Expose default workflow model lane overrides directly in project settings.
- load and persist default workflow model lane overrides from the active project workflow
- add inline workflow lane status, reset, save, and advanced policy actions in project model settings
- add CSS contract and modal coverage for the workflow model action row spacing and placement
Files changed:
.../dashboard/app/components/SettingsModal.css | 20 ++
.../components/__tests__/SettingsModal.test.tsx | 20 +-
.../SettingsModal.workflow-model-lane-css.test.ts | 24 ++
.../settings/sections/ProjectModelsSection.tsx | 245 ++++++++++++++++++++-
4 files changed, 298 insertions(+), 11 deletions(-)
Fusion-Task-Id: FN-6027
Fusion-Task-Lineage: 981a5f01-f4b7-467e-9e2f-4ac8e4ed40fb
Keep summarization and PR metadata model selection on project settings while leaving workflow lanes on the workflow.
- restore the project summarization model lane in Project Models and replace per-phase workflow lanes with a workflow-settings redirect stub
- remove moved workflow model keys from project settings defaults/save paths and update settings docs/tests for the restored project lane behavior
- make PR metadata generation resolve its model from the title summarizer settings lane instead of task planning settings
Files changed:
docs/settings-reference.md | 4 +-
.../core/src/__tests__/settings-migration.test.ts | 18 +-
.../core/src/__tests__/settings-parity.test.ts | 17 +-
packages/core/src/__tests__/store-settings.test.ts | 54 ++--
.../core/src/__tests__/task-creation-hook.test.ts | 10 +-
packages/core/src/builtin-workflow-settings.ts | 24 --
packages/core/src/settings-schema.ts | 13 +-
.../components/__tests__/SettingsModal.test.tsx | 11 +-
.../app/components/settings/save-split.ts | 11 +-
.../settings/sections/ProjectModelsSection.tsx | 330 +++------------------
.../src/__tests__/pr-metadata-generator.test.ts | 25 +-
packages/dashboard/src/pr-metadata-generator.ts | 4 +-
12 files changed, 140 insertions(+), 381 deletions(-)
Fusion-Task-Id: FN-5994
Fusion-Task-Lineage: f7f6f1ff-5d06-4d16-b46d-644eb219e7c1
- Bump workflow model lane changeset to minor
- Clear pending workflow model edits after value reload failures
- Exclude Vite source module requests with query strings from API proxy