Make runAiMerge (the FN-5633 clean-room AI merge path, already the default)
the sole merge path; soft-deprecate the legacy aiMergeTask pipeline. Phase 0
of the workspace-mode master plan — a standalone merge-consolidation refactor
that lands first so downstream workspace work targets one merge function.
U1 — collapse the dispatch: project-engine.ts now calls runAiMerge
unconditionally; the two direct callers that bypassed the dispatch
(dashboard.ts onMergeImpl in --no-engine mode, task.ts runTaskMerge /
`fn task merge`) now route to runAiMerge too. Export runAiMerge from
@fusion/engine.
U2 — soft-deprecate: aiMergeTask is @deprecated (body retained for a later
deletion pass; shared helpers runAiMerge imports, e.g.
captureSingleCommitLandedMetadata, left intact). merger.mode "deterministic"
is annotated deprecated and made inert (type + field kept — published
@runfusion/fusion surface); the dispatch logs a one-time deprecation warning
and routes to runAiMerge. Changeset added (minor).
U3 — R7 workspace merge-boundary guard: shared @fusion/core predicate
assertNotWorkspaceTaskMerge(task) rejects tasks with populated
workspaceWorktrees at all four merge entry points (dispatch, store.mergeTask,
onMergeImpl, runTaskMerge) with an error naming master-plan U6. Covers the
window until per-repo merge support lands; U6 removes it.
U4 — deterministic-mode blast-radius audit: no production project, CI config,
or seeded setting pins merger.mode "deterministic"; only four engine tests
used it to drive the dispatch to aiMergeTask as a mockable seam — migrated to
mock runAiMerge instead. Other module-level aiMergeTask mocks were dead under
the default "ai" mode or test aiMergeTask directly (body retained), so they
are unaffected.
Also removes an unused acquireWorkspaceRepoWorktree import inherited from the
foundation branch (executor.ts) that was failing lint; master-plan U1 re-adds
it with its per-repo usage.
Merge gate green: lint, typecheck (29 projects), build, test:gate
(649 + 58), plus the migrated (114) and new predicate (4) tests.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Document the expanded Shadcn theme workflow across dashboard customization docs.
- Note that the Command Center overview selector exposes the same Shadcn variants as Settings → Appearance.
- Add the DashboardTheming FNXC requirement note for the expanded Shadcn family, custom preset, and accent-following sidebar behavior.
- Describe sidebar active and resize accents following the selected theme token.
Files changed:
docs/dashboard-guide.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6840
Fusion-Task-Lineage: 2f87dc23-7a37-4ed6-9418-7bd06b2ecd82
Expose the board quick-add planning handoffs from the New Task dialog.
- Wire New Task modal actions through AppModals to open Planning Mode and Subtask Breakdown.
- Reset and close the dialog without discard confirmation when handing off the typed description.
- Cover the dialog affordance parity, trimmed handoff payloads, and disabled empty-description state.
- Document the Plan and Subtask quick-add buttons in the dashboard guide.
Files changed:
docs/dashboard-guide.md | 2 +
packages/dashboard/app/App.tsx | 2 +
packages/dashboard/app/components/AppModals.tsx | 6 ++
packages/dashboard/app/components/NewTaskModal.tsx | 41 ++++++++----
.../app/components/__tests__/NewTaskModal.test.tsx | 77 +++++++++++++++++++++-
5 files changed, 113 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-6879
Fusion-Task-Lineage: 9e4b499d-8175-4172-afeb-fe70845241c0
Introduce the `optional-group` node kind and `WorkflowOptionalGroupConfig`
(defaultOn + single-pass template subgraph), validated by mirroring the loop
template rules: non-empty template, single entry/exit, no nested groups, no
rework edges (single-pass guarantee), no template/top-level id collisions,
boolean defaultOn. Foundation for graph-native optional steps; additive and
inert until producers/consumers land in later units. Includes the plan.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Keep auxiliary Secrets and Todos navigation anchored to the right dock instead of the left sidebar.\n\n- Remove Secrets and Todos entries and unused icons from LeftSidebarNav.\n- Update sidebar tests to assert those shortcuts are omitted while other routes still work.\n- Refresh dashboard navigation docs for right-dock Todos and Secrets placement.\n\nFiles changed:\n docs/dashboard-guide.md | 6 +++---\n packages/dashboard/app/components/LeftSidebarNav.tsx | 11 ++++-------\n .../app/components/__tests__/LeftSidebarNav.test.tsx | 8 +++-----\n 3 files changed, 10 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-6889
Fusion-Task-Lineage: de135281-a9a8-4583-8251-e78a6b28122e
Restore Command Center Activity line charts so their plotted geometry fills the rendered chart box without distorting point markers.
- Measure the rendered SVG dimensions and use them as the line chart viewBox so paths span wide desktop and mobile layouts.
- Preserve safe bounded geometry for zero, single-point, NaN, and resized chart states.
- Update Command Center chart tests and dashboard rendering guidance for the fill-width/circular-marker invariant.
Files changed:
docs/dashboard-guide.md | 2 +-
.../command-center/__tests__/charts.test.tsx | 71 ++++++++++++++---
.../command-center/areas/__tests__/areas.test.tsx | 35 ++++++---
.../components/command-center/charts/LineChart.tsx | 89 ++++++++++++++++++----
.../components/command-center/charts/charts.css | 4 +-
5 files changed, 164 insertions(+), 37 deletions(-)
Fusion-Task-Id: FN-6883
Fusion-Task-Lineage: 71c19a62-1a76-455d-92cb-9c22d0613881
Document the Command Center pricing contract for maintainers and users.
- Explain that estimated token costs are derived at read time from the maintained pricing table and are not persisted billing truth.\n- Document pricingAsOf, stale low-confidence, unknown-model unavailable, and provider coverage maintenance expectations.\n- Add a documentation contract test to keep the dashboard and architecture guides aligned.
Files changed:\n docs/architecture.md | 2 ++\n docs/dashboard-guide.md | 3 +-\n .../__tests__/command-center-pricing-docs.test.ts | 35 ++++++++++++++++++++++\n 3 files changed, 39 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6874
Fusion-Task-Lineage: 04606ae1-4870-479a-afb6-8a24675fe66b
Add a tablet and desktop right dock for overflow dashboard views while preserving mobile navigation behavior.
- Route the non-mobile More views affordance into a resizable right dock with expand-to-modal support.
- Add an overflow view registry and controller to render auxiliary dashboard views in the dock.
- Make the right dock default-on in settings alongside the default left sidebar, with explicit opt-outs for legacy tests.
- Cover right dock behavior, navigation fallbacks, and overflow registry entries with focused tests and docs.
Files changed:
docs/dashboard-guide.md | 10 +
packages/dashboard/app/App.tsx | 15 +-
.../mobile-feature-access-regression.test.tsx | 78 +++++
packages/dashboard/app/components/Header.tsx | 66 ++++-
packages/dashboard/app/components/RightDock.css | 165 +++++++++++
packages/dashboard/app/components/RightDock.tsx | 234 +++++++++++++++
.../app/components/RightDockExpandModal.tsx | 70 +++++
.../dashboard/app/components/SettingsModal.tsx | 17 +-
.../app/components/__tests__/Header.test.tsx | 70 +++++
.../app/components/__tests__/RightDock.test.tsx | 202 +++++++++++++
.../__tests__/navigation-history.test.tsx | 2 +-
.../__tests__/overflowViewRegistry.test.tsx | 67 +++++
.../app/components/overflowViewRegistry.tsx | 314 +++++++++++++++++++++
.../app/components/useRightDockController.tsx | 126 +++++++++
14 files changed, 1408 insertions(+), 28 deletions(-)
Fusion-Task-Id: FN-6845
Fusion-Task-Lineage: 3cb04264-cf7a-43e1-b774-678ff3cb325b
Prevent task chat from showing idle guidance while planner sessions are actively working.
- Treat triage/planning task states as active steering sessions when they are not queued, paused, or blocked.\n- Keep queued, awaiting, failed, and paused states on idle guidance even in active columns.\n- Cover inline and expanded planning chat surfaces across empty, populated, and loading transcripts.\n- Update the dashboard guide to document planning and live session bridge steering behavior.\n\nFiles changed:\n docs/dashboard-guide.md | 2 +-\n packages/dashboard/app/components/TaskChatTab.tsx | 24 +++++++---\n .../app/components/__tests__/TaskChatTab.test.tsx | 51 +++++++++++++++++++---\n 3 files changed, 66 insertions(+), 11 deletions(-)
Fusion-Task-Id: FN-6866
Fusion-Task-Lineage: 48c57515-40fa-40c1-ae3b-fec0690bba75
Clarify that desktop CLI launches with the local AI engine by default.\n\n- Document fn desktop as engine-on by default, matching dashboard startup behavior.\n- Clarify --paused keeps the engine process running with automation disabled.\n- Note that desktop has no --no-engine mode and update desktop README launch steps.\n\nFiles changed:\n docs/cli-reference.md | 12 ++++++++++--\n packages/desktop/README.md | 15 +++++++++++----\n 2 files changed, 21 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-6852
Fusion-Task-Lineage: 3ae2ea10-ede1-4cc5-a3b5-71f692b2a9ac
Stabilize changed-test runs by giving the engine affected Vitest lane its own memory envelope.
- Split @fusion/engine out from other scoped affected-package Vitest runs.
- Apply a capped heap and single-worker settings to the isolated engine lane while preserving watchdog timing.
- Cover the partitioning and environment behavior with script tests and document the envelope.
Files changed:
docs/testing.md | 3 +++
scripts/__tests__/test-changed.test.mjs | 45 +++++++++++++++++++++++++++++++++
scripts/test-changed.mjs | 40 ++++++++++++++++++++++++++---
3 files changed, 84 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-6854
Fusion-Task-Lineage: 144acf15-4ccb-4974-b06c-99cdcc2814dd
Left sidebar navigation now defaults on for non-mobile project screens while preserving an explicit opt-out.
- Treat an unset leftSidebarNav flag as enabled in the App desktop/tablet gate.
- Show the Settings experimental toggle checked by default and save false when users opt out.
- Extend regression coverage across unset/true/false flag states, desktop/tablet/mobile surfaces, and header suppression.
- Update dashboard guide documentation for the default-on behavior and opt-out flag.
Files changed:
docs/dashboard-guide.md | 4 +-
packages/dashboard/app/App.tsx | 5 +-
.../mobile-feature-access-regression.test.tsx | 69 ++++++++++++++++++----
.../dashboard/app/components/SettingsModal.tsx | 16 ++++-
.../components/__tests__/SettingsModal.test.tsx | 39 ++++++++++++
5 files changed, 119 insertions(+), 14 deletions(-)
Fusion-Task-Id: FN-6843
Fusion-Task-Lineage: 44d73b9e-92aa-4381-883b-c42714bd7f99
Render the Command Center Team org chart horizontally when its container has room.
- Measure the Team org-chart viewport and reuse the shared Agents org-chart layout resolver.
- Add horizontal and vertical data-layout styling for Team org-chart roots and children.
- Cover wide, narrow, unmeasured, loading, error, empty, and single-root Team org-chart states.
- Document the Team org-chart horizontal layout behavior.
Files changed:
docs/dashboard-guide.md | 2 +-
.../components/command-center/areas/TeamArea.tsx | 38 ++++++++++-
.../command-center/areas/__tests__/areas.test.tsx | 77 ++++++++++++++++++++++
.../app/components/command-center/areas/areas.css | 36 +++++++++-
4 files changed, 149 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-6870
Fusion-Task-Lineage: b023788a-a353-4b10-ad68-a661e72e5be6
Align the left sidebar selected and resize states with each active dashboard theme.
- Switch active left-sidebar item color and background to the shared --accent token.
- Update the resize-handle focus and hover accent to follow theme accent colors.
- Add a CSS regression test and documentation for the theme-accent invariant.
- Define shared typography tokens and replace an optional-step danger fallback with an existing error token.
Files changed:
docs/dashboard-guide.md | 2 +-
.../left-sidebar-active-accent.css.test.ts | 38 ++++++++++++++++++++++
.../dashboard/app/components/LeftSidebarNav.css | 10 +++---
.../app/components/WorkflowOptionalStepsPanel.css | 2 +-
packages/dashboard/app/styles.css | 3 ++
5 files changed, 48 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-6830
Fusion-Task-Lineage: add8e9cd-4b91-45a1-a848-a54dd1083723
Move the left sidebar collapse control into the footer so it sits above Settings with row-style behavior.
- Replace the floating border collapse button with a footer row button that keeps accessible expanded/collapsed labels.
- Retokenize collapse toggle CSS around shared sidebar item styling and remove the obsolete floating modifier.
- Extend sidebar tests and dashboard guide coverage for the footer placement and collapsed rail behavior.
Files changed:
docs/dashboard-guide.md | 4 +-
.../dashboard/app/components/LeftSidebarNav.css | 24 ++--------
.../dashboard/app/components/LeftSidebarNav.tsx | 32 ++++++-------
.../components/__tests__/LeftSidebarNav.test.tsx | 54 ++++++++++++++++++++--
4 files changed, 72 insertions(+), 42 deletions(-)
Fusion-Task-Id: FN-6847
Fusion-Task-Lineage: 5d7781a1-afc9-4e5c-bf7b-0648bb874285
Document the false "engine not running" banner root cause and fix as a
docs/solutions learning, and add an "Engine Singleton Lock" entry to
CONCEPTS.md: a failed per-machine lock acquisition is proof an engine is
running elsewhere, not "no engine."
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>
The stepwise-coding IR had no workflow-step seam node, so a per-task
enabledWorkflowSteps entry (e.g. browser verification) would never execute.
Add the seam node on the success path (steps -> workflow-step -> review,
once post-foreach) and declare browser-verification as an optional step,
matching the coding workflow. Covers the dead-toggle gap with resolver and
engine execution-divergence tests.