Commit Graph

8308 Commits

Author SHA1 Message Date
gsxdsm
eb3477aba4 FN-6835: add system stats node selection
Add Command Center controls for inspecting local or remote node system telemetry.

- add a System area node selector with local defaults, remote stats loading, and per-node sample resets
- expose proxied node system-stats fetching and route local node requests through the shared stats builder
- route Vitest kill requests through node-aware proxy plumbing and cover node stats behavior with tests
- add localized node selector copy, docs, and a published package changeset

Files changed:
 .changeset/fuzzy-nodes-watch.md                    |   5 +
 docs/dashboard-guide.md                            |   4 +-
 packages/dashboard/app/api/legacy.ts               |  14 +-
 .../__tests__/CommandCenter.mobile-scroll.test.tsx |   2 +
 .../__tests__/CommandCenter.tablet-layout.test.tsx |   2 +
 .../__tests__/CommandCenter.test.tsx               |   1 +
 .../__tests__/SystemStatsArea.test.tsx             | 160 +++++++++++++++++
 .../command-center/areas/SystemStatsArea.css       |  13 ++
 .../command-center/areas/SystemStatsArea.tsx       |  72 +++++++-
 .../dashboard/src/__tests__/routes-system.test.ts  | 122 +++++++++++++
 packages/dashboard/src/routes.ts                   | 190 +++++++++++++--------
 packages/i18n/locales/en/app.json                  |  10 ++
 packages/i18n/locales/es/app.json                  |  10 ++
 packages/i18n/locales/fr/app.json                  |  10 ++
 packages/i18n/locales/ko/app.json                  |  10 ++
 packages/i18n/locales/zh-CN/app.json               |  10 ++
 packages/i18n/locales/zh-TW/app.json               |  10 ++
 17 files changed, 562 insertions(+), 83 deletions(-)

Fusion-Task-Id: FN-6835

Fusion-Task-Lineage: 8f9a047b-78d0-477e-824e-f7592966cdc0
2026-06-21 13:25:41 -07:00
gsxdsm
f80a785b95 FN-6869: add Codex model pricing
Add explicit OpenAI Codex pricing so token analytics can estimate Codex run costs.

- Add openai-codex pricing entries for GPT-5 Codex variants and codex-mini-latest.
- Bump the pricing verification date and document why Codex keys must use the openai-codex provider.
- Cover Codex pricing and lookup behavior in model-pricing tests.
- Add a changeset for the published Fusion package.

Files changed:
 .changeset/fn-6869-codex-pricing.md               |  7 ++++
 packages/core/src/__tests__/model-pricing.test.ts | 37 ++++++++++++++++++-
 packages/core/src/model-pricing.ts                | 44 ++++++++++++++++++++++-
 3 files changed, 86 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6869
Fusion-Task-Lineage: 4bf119db-0401-4b18-b389-4a762e665cfc
2026-06-21 13:25:41 -07:00
gsxdsm
32fad6dfba FN-6863: raise footer concurrency slider limits
Raise the footer engine control sliders to support higher concurrency without hiding persisted values.

- Increase max tasks, max triage, and max worktree slider baselines to 50.
- Preserve value-aware slider maxima for persisted settings above the new baseline.
- Add coverage for in-range 50 limits, above-range persisted values, and saving a value of 50.

Files changed:
 .../dashboard/app/components/EngineControlMenu.tsx |  9 ++--
 .../__tests__/EngineControlMenu.test.tsx           | 50 +++++++++++++++++++---
 2 files changed, 49 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-6863

Fusion-Task-Lineage: f42373fc-322b-4d20-9b8b-2d0c63254e79
2026-06-21 13:25:41 -07:00
gsxdsm
24c1c023a8 FN-6858: fix toast contrast across Shadcn themes
Make dashboard toast status text readable across themed dark and light modes.

- Add toast text tokens and Shadcn-specific success/info color overrides that preserve contrast.
- Cover success, error, and info toast contrast across all Shadcn variants and mobile toast styling.
- Add a patch changeset for the published Fusion package.

Files changed:
 .changeset/fn-6858-toast-contrast.md               |   5 +
 .../app/__tests__/toast-theme-contrast.test.ts     | 320 +++++++++++++++++++++
 packages/dashboard/app/styles.css                  |  44 ++-
 3 files changed, 368 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6858
Fusion-Task-Lineage: 1c06e346-9269-4965-a3ae-4ac02b43188e
2026-06-21 13:25:41 -07:00
gsxdsm
21a7416614 FN-6857: restore mobile Git toolbar horizontal scrolling
Restores touch-friendly horizontal scrolling for the Git Manager mobile section toolbar.

- Opt the Git Manager mobile sidebar back into horizontal touch panning and momentum scrolling.
- Prevent Git Manager mobile nav items from shrinking so every section remains reachable.
- Add mobile CSS coverage for the Git Manager toolbar scroll contract.

Files changed:
 packages/dashboard/app/components/ScriptsModal.css    | 12 ++++++++++++
 .../components/__tests__/core-modals-mobile.test.tsx  | 19 +++++++++++++++++++
 2 files changed, 31 insertions(+)

Fusion-Task-Id: FN-6857

Fusion-Task-Lineage: 8967bdd2-e830-4f2d-8cde-c96ccc80d67a
2026-06-21 13:25:41 -07:00
gsxdsm
ca08828813 FN-6855: raise Command Center concurrency sliders to 50
Command Center scheduler controls now expose a default slider ceiling of 50 without hiding higher persisted values.

- Set max concurrent tasks, max triage concurrency, and max worktrees sliders to default to a maximum of 50.
- Preserve dynamic slider maxima for persisted settings above 50 so existing out-of-range values remain visible.
- Add regression coverage for persisting 50, in-range slider maxima, and above-range readouts.

Files changed:
 .../command-center/CommandCenterControls.tsx       |  9 ++-
 .../__tests__/CommandCenterControls.test.tsx       | 71 +++++++++++++++++++---
 2 files changed, 67 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-6855

Fusion-Task-Lineage: 780d5322-5f3c-4503-9ec7-17716e966961
2026-06-21 13:25:41 -07:00
gsxdsm
47ba99a25e FN-6853: bump pi SDK packages
Update the pi SDK dependency family across Fusion packages and record a patch changeset.

- Bump @earendil-works/pi-ai and @earendil-works/pi-coding-agent to ^0.79.9 where used by CLI, dashboard, and engine packages.
- Refresh pnpm-lock.yaml to resolve the updated pi SDK dependency graph.
- Add a patch changeset for the published @runfusion/fusion package.

Files changed:
 .changeset/fn-6853-pi-sdk-bump.md |   5 +
 packages/cli/package.json         |   4 +-
 packages/dashboard/package.json   |   2 +-
 packages/engine/package.json      |   4 +-
 pnpm-lock.yaml                    | 285 +++++++++++++++++++++++++++-----------
 5 files changed, 214 insertions(+), 86 deletions(-)

Fusion-Task-Id: FN-6853
Fusion-Task-Lineage: bc2dba95-b8c2-48d1-855d-847e6eec9606
2026-06-21 13:25:41 -07:00
gsxdsm
9620a50756 FN-6850: refresh auto-claim candidates before heartbeat claims
Auto-claim heartbeats now validate cached todo candidates against current task rows before displaying or claiming them.

- Share the auto-claim runnability predicate between snapshot generation and canonical freshness checks.
- Rebuild cached candidates from fresh slim task rows before role filtering, prompt rendering, and claim selection.
- Cover stale triage, assigned, checked-out, deleted, dependency-blocked, and retitled candidate cases in snapshot and heartbeat tests.

Files changed:
 .../src/__tests__/auto-claim-snapshot.test.ts      | 65 +++++++++++++++-
 .../src/__tests__/heartbeat-executor.test.ts       | 85 +++++++++++++++++++-
 packages/engine/src/agent-heartbeat.ts             | 15 ++--
 packages/engine/src/auto-claim-snapshot.ts         | 91 +++++++++++++++-------
 4 files changed, 220 insertions(+), 36 deletions(-)

Fusion-Task-Id: FN-6850

Fusion-Task-Lineage: 5af79319-46f4-4ee7-b6dc-d846f45abaa4
2026-06-21 13:25:41 -07:00
gsxdsm
eb9635a406 FN-6843: enable left sidebar navigation by default
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
2026-06-21 13:25:41 -07:00
gsxdsm
dcf1ab1164 FN-6870: render wide team org charts horizontally
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
2026-06-21 13:25:41 -07:00
gsxdsm
2f7905386f FN-6848: refresh workflow dropdown counts on open
Refresh workflow dropdown counts from the latest board-workflows data whenever users open the selector.

- Refactor Board and ListView workflow payload fetching into reusable refresh callbacks shared by mount, visibility, focus, SSE, and dropdown-open events.
- Add a WorkflowSwitcher onOpen hook that fires only on closed-to-open click or keyboard transitions.
- Cover Board, ListView, and WorkflowSwitcher refresh behavior with regression tests and document the refreshed dropdown counts.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 packages/dashboard/app/components/Board.tsx        | 49 +++++++++++---------
 packages/dashboard/app/components/ListView.tsx     | 49 +++++++++++---------
 .../dashboard/app/components/WorkflowSwitcher.tsx  | 38 +++++++++++++---
 .../app/components/__tests__/Board.test.tsx        | 14 ++++++
 .../app/components/__tests__/ListView.test.tsx     | 39 ++++++++++++++++
 .../components/__tests__/WorkflowSwitcher.test.tsx | 53 ++++++++++++++++++++++
 7 files changed, 195 insertions(+), 49 deletions(-)

Fusion-Task-Id: FN-6848

Fusion-Task-Lineage: bb83cee9-4184-4094-89d6-f2cf2a4fbd46
2026-06-21 13:25:41 -07:00
gsxdsm
1c6fe544e2 FN-6846: move header search after workflow slot
Move the desktop and tablet search toggle to follow the workflow portal slot.\n\n- Reorder the non-mobile header search button after the workflow portal mount point.\n- Preserve the mobile search trigger position and behavior.\n- Add header tests covering empty, populated, tablet, and mobile slot behavior.\n\nFiles changed:\n packages/dashboard/app/components/Header.tsx       | 29 ++++++++-------\n .../app/components/__tests__/Header.test.tsx       | 42 ++++++++++++++++++++--\n 2 files changed, 56 insertions(+), 15 deletions(-)

Fusion-Task-Id: FN-6846

Fusion-Task-Lineage: 294100b1-76ae-4c46-b4b3-e4c83e4a55f8
2026-06-21 13:25:41 -07:00
gsxdsm
c9146e15b2 FN-6830: use theme accent for sidebar active states
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
2026-06-21 13:25:41 -07:00
gsxdsm
e412a1c1c6 FN-6833: keep usage popover near board top
Keep the desktop usage popover pinned near the board header regardless of viewport height or anchor position.

- Replace the viewport-ratio top cap with a small fixed near-top limit derived from the header inset.
- Update desktop popover positioning expectations for anchored, tall-viewport, and modal fallback cases.
- Cover low-anchor tall viewport behavior so the popover stays near the top of the board.

Files changed:
 .../dashboard/app/components/UsageIndicator.tsx    | 15 ++++-----
 .../components/__tests__/UsageIndicator.test.tsx   | 38 +++++++++++++++++++---
 2 files changed, 40 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-6833

Fusion-Task-Lineage: 907c08fc-4da9-4b15-80aa-6c638900df15
2026-06-21 13:25:41 -07:00
gsxdsm
c1b7ced9ef FN-6865: fix mobile agent tab overflow
Ensure the Agent Detail tab strip keeps scrollable tab widths on narrow mobile screens.

- Prevent agent detail tabs from shrinking inside the horizontal overflow strip.
- Extend mobile and tablet scroll regression coverage to assert non-shrinking tabs.

Files changed:
 packages/dashboard/app/components/AgentDetailView.css               | 4 ++++
 .../app/components/__tests__/AgentDetailView.mobile-scroll.test.tsx | 6 +++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6865

Fusion-Task-Lineage: 6a105b60-3a89-4023-b1cb-cc1a46c9f2f4
2026-06-21 13:25:41 -07:00
gsxdsm
300c31e335 FN-6864: enable touch panning for task detail tabs
Restores horizontal swiping for overflowing task detail tabs on touch viewports.

- Allow the detail tab strip to opt into horizontal touch panning despite the mobile pan-y default.
- Extend the CSS contract test to require the task detail tabs to remain touch-pannable.

Files changed:
 packages/dashboard/app/components/TaskDetailModal.css               | 6 ++++++
 .../dashboard/app/components/__tests__/TaskDetailModal.css.test.ts  | 3 ++-
 2 files changed, 8 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6864

Fusion-Task-Lineage: 0863d551-8088-4c8d-b583-1212b199ed69
2026-06-21 13:25:41 -07:00
gsxdsm
47be640bfb FN-6836: allow narrower left sidebar resizing
Allow the dashboard left sidebar to resize down to a compact but still labeled width.

- Lower the resizable left sidebar minimum width from 192px to 160px.
- Keep narrow sidebar labels truncated so badges and toggles stay aligned.
- Cover drag, keyboard, and persisted-width clamping at the new minimum.

Files changed:
 .../dashboard/app/components/LeftSidebarNav.css    |  4 +++
 .../dashboard/app/components/LeftSidebarNav.tsx    |  5 ++-
 .../components/__tests__/LeftSidebarNav.test.tsx   | 37 ++++++++++++++++++++++
 3 files changed, 45 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6836

Fusion-Task-Lineage: e136647f-3cd8-4b82-8186-b69d630946fc
2026-06-21 13:25:41 -07:00
gsxdsm
b20a25c526 FN-6815: add Shadcn Gray Blue theme
Add a slate-neutral Shadcn Gray Blue dashboard theme variant.\n\n- Register shadcn-gray-blue across core theme validation, startup bootstrap, and selector options.\n- Add dark and light slate blue-gray design tokens, swatches, and shared shadcn styling coverage.\n- Extend theme tests, dashboard docs, and the published package changeset for the new variant.\n\nFiles changed:\n .changeset/shadcn-gray-blue-theme.md               |   5 +\n docs/dashboard-guide.md                            |   2 +-\n packages/core/src/types.ts                         |   2 +\n .../dashboard/app/components/ThemeSelector.css     |  15 +++\n .../components/WorkflowOptionalStepsDropdown.css   |   3 +-\n packages/dashboard/app/components/themeOptions.ts  |   2 +\n .../dashboard/app/hooks/__tests__/useTheme.test.ts |  12 ++\n packages/dashboard/app/index.html                  |   2 +-\n packages/dashboard/app/public/theme-data.css       | 143 ++++++++++++++++++++-\n 9 files changed, 177 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-6815

Fusion-Task-Lineage: 71cca9b3-12ab-4b91-93c5-e3d2498501ce
2026-06-21 13:25:41 -07:00
gsxdsm
465b7b6263 FN-6842: fix trait-less workflow status counts
Restore workflow switcher counts for built-in linear workflows with empty column traits.

- Add canonical lifecycle id fallback after flag-based status classification.
- Cover trait-less built-in workflows and flag-authority edge cases in status-count tests.
- Document the built-in fallback behavior for Board and List workflow switchers.

Files changed:
 docs/dashboard-guide.md                            |   2 +-
 .../__tests__/workflowStatusCounts.test.ts         | 207 +++++++++++++++++++--
 .../app/components/workflowStatusCounts.ts         |  64 +++++--
 3 files changed, 246 insertions(+), 27 deletions(-)

Fusion-Task-Id: FN-6842

Fusion-Task-Lineage: f51eb675-74e7-440f-970f-3eb29de0b3ea
2026-06-21 13:25:40 -07:00
gsxdsm
5e1422edc3 FN-6838: fix dashboard footer CSS token scoping
Keep the dashboard project footer height token scoped with the footer-safe padding contract.

- Preserve the project shell footer-height token for sibling layout consumers.
- Co-locate the desktop footer-height token with the project content padding consumer.
- Repeat the mobile footer-height override where concatenated CSS order can otherwise restore the desktop value.

Files changed:
 .../dashboard/app/components/ProjectSelector.css   | 43 +++++++++++++++-------
 1 file changed, 30 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-6838

Fusion-Task-Lineage: 0c20437f-7c58-478c-a721-ba963343c995
2026-06-21 13:25:40 -07:00
gsxdsm
e67dd11b50 FN-6829: dock todos as a project view
Convert Todos into the standard project right-content navigation surface.

- Route Todos through taskView state instead of modal manager state.
- Remove TodoModal wiring, styles, and tests while updating header, sidebar, mobile nav, and history coverage.
- Polish TodoView as a standalone content page with refreshed header and layout styling.
- Update dashboard and todo documentation for the full-view behavior.

Files changed:
 docs/dashboard-guide.md                            |   5 +-
 docs/todo-view.md                                  |   5 +-
 packages/dashboard/app/App.tsx                     |  30 ++---
 .../app/__tests__/lazy-loaded-views-docs.test.ts   |  10 +-
 packages/dashboard/app/components/AppModals.tsx    |  16 ---
 packages/dashboard/app/components/Header.tsx       |  12 +-
 .../dashboard/app/components/LeftSidebarNav.tsx    |   8 +-
 packages/dashboard/app/components/MobileNavBar.tsx |   8 +-
 packages/dashboard/app/components/TodoModal.css    |  76 ------------
 packages/dashboard/app/components/TodoModal.tsx    |  79 ------------
 packages/dashboard/app/components/TodoView.css     |  55 ++++++---
 packages/dashboard/app/components/TodoView.tsx     |  24 ++--
 .../app/components/__tests__/AppModals.test.tsx    |  56 ---------
 .../app/components/__tests__/Header.test.tsx       |  26 ++--
 .../components/__tests__/LeftSidebarNav.test.tsx   |   7 +-
 .../app/components/__tests__/MobileNavBar.test.tsx |  22 +++-
 .../app/components/__tests__/TodoModal.test.tsx    | 136 ---------------------
 .../__tests__/TodoView.mobile-css.test.ts          |   7 --
 .../app/components/__tests__/TodoView.test.tsx     |  11 +-
 ...-merge-toggle-blank.mobile-integration.test.tsx |   1 -
 .../__tests__/navigation-history.test.tsx          |  29 ++++-
 .../dashboard/app/hooks/useMobileScrollLock.ts     |   2 +-
 packages/dashboard/app/hooks/useModalManager.ts    |  10 --
 packages/dashboard/app/hooks/useViewState.ts       |   7 +-
 24 files changed, 161 insertions(+), 481 deletions(-)

Fusion-Task-Id: FN-6829

Fusion-Task-Lineage: b4034bf2-b8e2-47ec-be7c-11c320d2fc44
2026-06-21 13:25:40 -07:00
gsxdsm
12aae94447 FN-6813: add shadcn mono accent variants
Expand the shadcn theme family with mono accent variants and migrate the legacy mono id.

- Rename the legacy shadcn-mono theme path to shadcn-mono-red with compatibility migration.
- Add shadcn mono blue, green, purple, pink, orange, and yellow theme tokens and swatches.
- Keep Shadcn Gray registered alongside the expanded shadcn family after conflict resolution.
- Cover theme migration and option registration with hook tests and docs.

Files changed:
 .changeset/shadcn-mono-color-family.md             |   5 +
 docs/dashboard-guide.md                            |   2 +-
 packages/core/src/types.ts                         |  14 +-
 .../dashboard/app/components/ThemeSelector.css     |  90 ++-
 packages/dashboard/app/components/themeOptions.ts  |   8 +-
 .../dashboard/app/hooks/__tests__/useTheme.test.ts |  35 +-
 packages/dashboard/app/hooks/useTheme.ts           |  10 +-
 packages/dashboard/app/index.html                  |   4 +-
 packages/dashboard/app/public/theme-data.css       | 802 ++++++++++++++++++++-
 9 files changed, 947 insertions(+), 23 deletions(-)

Fusion-Task-Id: FN-6813
Fusion-Task-Lineage: c489300c-2131-4914-84f6-41b8e12929d3
2026-06-21 13:25:40 -07:00
gsxdsm
da7fb002d5 FN-6862: give engine controls popover an opaque surface
Keep the footer engine controls popover opaque by using valid dashboard CSS tokens.

- Replace the undefined elevated surface token with the solid card surface.
- Align disabled action opacity, range accent, and mobile height CSS with defined tokens/values.
- Add a CSS token regression test for the engine control menu popover.

Files changed:
 .../dashboard/app/components/EngineControlMenu.css |  8 +-
 .../dashboard/app/components/EngineControlMenu.tsx |  3 +
 .../__tests__/EngineControlMenu.css.test.ts        | 99 ++++++++++++++++++++++
 3 files changed, 106 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6862
Fusion-Task-Lineage: 5e41177a-6fc5-48d0-861d-fefbcfca7060
2026-06-21 13:25:40 -07:00
gsxdsm
b9b9447d6e fix(FN-5048): reset stuck-kill streak on forward progress
stuckKillCount is a lifetime counter — incremented by self-healing on each stuck-kill
and reset ONLY by a manual retry — so a long task that genuinely advances between
intermittent stalls could be terminalized by accumulation toward maxStuckKills (default 6),
even though it is making progress.

Reset the streak in TaskStore.updateStep when a step reaches a terminal forward status
(done/skipped), the single chokepoint every step-completion surface routes through (legacy
fn_task_update, graph markStepDone, fn_task_done). It deliberately does NOT rescue a task
wedged re-running the same failing step — no step completes between those kills, so it still
terminalizes as designed; it only bounds the budget to consecutive stalls. Complements the
verification fan-out cap (PR #1708) that keeps verification fast in the first place.

New regression suite asserts reset on done/skipped/graph-source-done and NO reset on
in-progress advance or ignored out-of-order transitions. Merge gate + full @fusion/core
suite (6242 tests) + engine self-healing/stuck-detector (442 tests) green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 11:17:56 -07:00
gsxdsm
bbac132d71 Merge pull request #1708 from Runfusion/gsxdsm/slow-tests
fix: keep Fusion test verification bounded
2026-06-21 11:08:02 -07:00
gsxdsm
21df96cfbb fix(FN-5048): address PR feedback on test verification
Fusion-Task-Id: FN-5048
2026-06-21 10:53:08 -07:00
gsxdsm
03af93eb3a fix(FN-5048): direct agent + tool verification away from full workspace suite
Tighten the executor agent guidance and the fn_run_verification tool guidance so
verification stays scoped to changed files instead of running the full workspace
test suite, which (for a foundational-package edit) reverse-expands across the
whole workspace and stalls the task.

- agent-prompts.ts: remove the "during final integration" blanket permission to
  run workspace-wide suites; name the forbidden full-run commands explicitly.
- run-verification-tool.ts: strengthen BOUNDED_VERIFICATION_GUIDANCE to forbid
  `pnpm test:full` / `pnpm verify:workspace` / whole-package runs as verification.

Engine + core typecheck pass; run-verification-command and executor-review-verdicts
prompt-assertion suites stay green (93 tests).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:50:48 -07:00
gsxdsm
e949853511 test(FN-5048): migrate 41 core store tests to shared in-memory harness
The per-test `createTaskStoreTestHarness` recreated a TaskStore from scratch
every test — mkdtemp ×2 + new store + recursive rm with retry backoff — which
dominated wall-clock across these high-test-count files. Switch the files that
tolerate a shared store to `createSharedTaskStoreTestHarness`, which builds the
store once and resets state between tests via full table truncation + FTS
rebuild + filesystem reset, preserving isolation.

Measured on store-create.test.ts (53 tests): 4.44s → 1.78s wall
(test execution 3.59s → 0.93s, ~3.9x). Full @fusion/core suite stays green
(346 files, 6236 tests) and typecheck passes.

19 files that test disk persistence / migration / workflow-definition state are
incompatible with a shared in-memory store and were intentionally left on the
per-test harness.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:47:13 -07:00
gsxdsm
bc1c7db4bc Merge pull request #1707 from Runfusion/gsxdsm/engine-worklow
fix(engine): preserve task progress when a single-session run is hard-cancelled (FN-6722)
2026-06-21 10:42:55 -07:00
gsxdsm
ce90cc9b62 fix(FN-5048): keep Fusion test verification bounded 2026-06-21 10:05:12 -07:00
gsxdsm
e6503ca872 Address PR review feedback (#1707)
- Read hasResumableProgress from latestTask (the store snapshot fetched
  at ~9226), not the frozen dispatch-time task param, so a freshly
  dispatched task that commits step progress mid-session is preserved on
  a hard-cancel teardown — not just the re-dispatch case (greptile P1)
- Add companion regression test for the fresh-task-with-in-session-progress
  case, which fails against the stale-task snapshot (greptile P1)
- Reformat the requirement comment block to the canonical FNXC heading
  (FNXC:WorkflowLifecycle yyyy-MM-dd-hh:mm:) convention (CodeRabbit)

Fusion-Task-Id: FN-6722

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 09:59:26 -07:00
gsxdsm
93017a3c4a fix(engine): preserve task progress when a single-session run is hard-cancelled
When the engine aborted in-flight work mid-execution and bounced the task
back to `todo`, the single-session teardown cleared the task `branch` and
re-queued without `preserveResumeState` — resetting every step to `pending`
(store.moveTaskInternal resetAllStepsToPending) and dropping the pointer to
the commits already on the task branch. The next dispatch then re-planned
from Step 0 and the committed work was stranded, observed as FN-6722 losing
all its progress and getting stuck in todo.

The teardown now keeps the branch and moves with `preserveResumeState`
whenever the task has resumable step progress, matching the sibling
step-session (executor ~8065) and pause-park (executor ~1826) paths, so
execute() resumes onto the existing branch from the first incomplete step.
The worktree is still removed to free its concurrency slot (FN-6782) — only
the durable pointers (branch + step state) are kept.

Adds a regression test driving the exact single-session catch teardown.

Fusion-Task-Id: FN-6722

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 09:41:51 -07:00
gsxdsm
7e478fb473 Merge pull request #1703 from Runfusion/gsxdsm/workflow-optional-steps
feat(dashboard): workflow optional steps — authoring, full-modal parity, stepwise seam
2026-06-21 09:04:39 -07:00
gsxdsm
c7b56a5ab7 FN-6832: preserve default workflow routing
Preserve the default workflow unless users explicitly request workflow routing changes.

- Update triage and fast-planning prompt guidance to stop inferring alternate workflows from task type or no-commit markers.
- Refresh workflow docs and prompt tests to assert explicit-request-only workflow selection.
- Add a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-6832-workflow-routing.md               |  5 +++++
 docs/workflow-steps.md                               |  5 ++++-
 packages/core/src/agent-prompts.ts                   | 20 +++++++++++++-------
 .../src/__tests__/triage-threshold-settings.test.ts  |  7 +++++--
 packages/engine/src/__tests__/triage.test.ts         | 13 +++++--------
 5 files changed, 32 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-6832

Fusion-Task-Lineage: 5a7ad103-2081-4c4c-ac32-fd5e4f6adfda
2026-06-21 09:00:40 -07:00
gsxdsm
f13aaa1a99 FN-6722: expose resolved GitHub issues
Expose resolved GitHub issue details in Command Center analytics and exports.

- Add resolved issue rows to local GitHub issue analytics with exact-vs-approximate timestamp metadata.
- Render a resolved issues table in the Command Center GitHub area without empty links when issue URLs are missing.
- Include resolved issue details in CSV export, route coverage, dashboard tests, docs, and the release changeset.
- Quarantine the unrelated dashboard dev-server process timer flake observed during workspace verification under the deletion ratchet.

Files changed:
 ...fn-6722-command-center-resolved-issue-detail.md |   5 +
 docs/dashboard-guide.md                            |   3 +-
 .../src/__tests__/github-issue-analytics.test.ts   | 109 +++++++++++++++++++--
 packages/core/src/github-issue-analytics.ts        |  45 ++++++++-
 packages/core/src/index.ts                         |   1 +
 .../__tests__/CommandCenter.mobile-scroll.test.tsx |   4 +-
 .../__tests__/CommandCenter.test.tsx               |   1 +
 .../components/command-center/areas/GithubArea.tsx |  67 +++++++++++++
 .../command-center/areas/__tests__/areas.test.tsx  |  55 +++++++++++
 .../register-command-center-routes.test.ts         |  61 +++++++++++-
 packages/dashboard/src/command-center-csv.ts       |  39 +++++++-
 packages/dashboard/vitest.config.ts                |   7 +-
 scripts/lib/test-quarantine.json                   |   5 +
 13 files changed, 382 insertions(+), 20 deletions(-)

Fusion-Task-Id: FN-6722
Fusion-Task-Lineage: 9fcbd8c2-f1bc-4b86-b5f5-593e5fd0e675
2026-06-21 09:00:40 -07:00
gsxdsm
c18e827b90 FN-6839: await CLI cached store shutdown
Rescue the retained CLI quarantine by making TaskStore shutdown deterministic before fixture cleanup.

- Await cached extension TaskStore closes and clear the cache before asynchronous shutdown drains.
- Update CLI fixtures to await direct and cached store closure, with a regression proving cached close is awaited.
- Remove rescued CLI quarantine entries/excludes and document the loaded-suite rescue with a patch changeset.

Files changed:
 .changeset/fn-6839-close-cached-stores.md          |  5 ++
 CLAUDE.md                                          |  1 +
 docs/testing.md                                    |  4 ++
 .../extension-agent-set-instructions.test.ts       |  2 +-
 .../__tests__/extension-goal-tools-audit.test.ts   |  2 +-
 .../cli/src/__tests__/extension-goal-tools.test.ts |  2 +-
 .../cli/src/__tests__/extension-insights.test.ts   |  6 +--
 .../__tests__/extension-mission-goal-tools.test.ts |  2 +-
 .../cli/src/__tests__/extension-task-tools.test.ts | 16 ++++---
 packages/cli/src/__tests__/extension.test.ts       | 56 +++++++++++-----------
 .../src/__tests__/research-extension-tools.test.ts |  4 +-
 packages/cli/src/extension.ts                      | 16 +++----
 packages/cli/vitest.config.ts                      |  6 +--
 scripts/lib/test-quarantine.json                   | 15 ------
 14 files changed, 68 insertions(+), 69 deletions(-)

Fusion-Task-Id: FN-6839

Fusion-Task-Lineage: ea0c7c77-bb59-4db4-931d-5e052a1043e5
2026-06-21 09:00:40 -07:00
gsxdsm
fbce59b707 FN-6777: add artifact registry storage
Add a core artifact registry for storing metadata and task-scoped artifact payloads.\n\n- Add artifact types, schema, migrations, store APIs, and exports for registering/listing artifact metadata.\n- Persist binary artifact payloads under task or project artifact directories and hydrate artifacts during worktree acquisition.\n- Cover registry behavior, DB schema, and worktree hydration with tests and document storage semantics.\n\nFiles changed:\n .changeset/fn-6777-artifact-registry.md            |   5 +\n docs/storage.md                                    |   8 +\n packages/core/src/__tests__/artifacts.test.ts      | 257 +++++++++++++++++++++\n packages/core/src/__tests__/db.test.ts             |   5 +\n packages/core/src/db.ts                            |  59 ++++-\n packages/core/src/index.ts                         |   2 +-\n packages/core/src/store.ts                         | 220 +++++++++++++++++-\n packages/core/src/types.ts                         |  75 ++++++\n .../engine/src/__tests__/executor-test-helpers.ts  |   1 +\n .../engine/src/__tests__/executor-worktree.test.ts |   2 +\n .../__tests__/worktree-acquisition-backend.test.ts |   2 +-\n .../worktree-acquisition-secrets-env.test.ts       |   2 +-\n .../worktree-acquisition-worktrunk.test.ts         |   2 +-\n .../src/__tests__/worktree-acquisition.test.ts     |   2 +-\n .../src/__tests__/worktree-db-hydrate.test.ts      |  59 +++++\n packages/engine/src/worktree-acquisition.ts        |   2 +-\n packages/engine/src/worktree-db-hydrate.ts         |  42 +++-\n 17 files changed, 732 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-6777

Fusion-Task-Lineage: 42cdcdcf-6388-42fe-8de1-6857ef20839d
2026-06-21 09:00:40 -07:00
gsxdsm
cc26b333ce FN-6856: restrict executor full-suite testing
Clarify executor verification guidance so agents default to targeted tests and reserve full workspace suites for explicit opt-in.

- Update canonical executor prompts to prohibit full/workspace-wide test suites as the normal verification path.
- Preserve workspace lint/build/typecheck gates while requiring targeted test verification unless task or workflow instructions opt in.
- Extend executor prompt coverage to assert the full-suite restriction and allowFullSuite opt-in language.

Files changed:
 packages/core/src/agent-prompts.ts                            | 11 ++++++++---
 .../engine/src/__tests__/executor-review-verdicts.test.ts     |  5 ++++-
 packages/engine/src/executor.ts                               | 11 ++++++++---
 3 files changed, 20 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-6856
Fusion-Task-Lineage: 78d698df-9e85-4371-bf59-af27e64e3069
2026-06-21 09:00:40 -07:00
gsxdsm
e18745b79e FN-6844: move engine controls to footer status bar
Move engine stop, pause, and scheduler tuning controls into the executor footer status bar.

- Add a footer EngineControlMenu popover with stop/start, pause/resume, and debounced concurrency/worktree sliders.
- Remove the engine controls from the dashboard header and wire the footer running-state text to open the controls.
- Update dashboard tests, English labels, and operator documentation for the footer control location.

Files changed:
 docs/dashboard-guide.md                            |   4 +
 packages/dashboard/app/App.tsx                     |   7 -
 .../app/__tests__/tablet-header-controls.test.tsx  |  21 +-
 .../dashboard/app/components/EngineControlMenu.css | 118 +++++++++
 .../dashboard/app/components/EngineControlMenu.tsx | 292 +++++++++++++++++++++
 .../dashboard/app/components/ExecutorStatusBar.css |  28 ++
 .../dashboard/app/components/ExecutorStatusBar.tsx |  25 +-
 packages/dashboard/app/components/Header.css       |  89 -------
 packages/dashboard/app/components/Header.tsx       |  81 +-----
 .../app/components/__tests__/App.test.tsx          | 132 ----------
 .../__tests__/EngineControlMenu.test.tsx           | 145 ++++++++++
 .../__tests__/ExecutorStatusBar.test.tsx           |  40 +++
 .../app/components/__tests__/Header.test.tsx       |  57 +---
 .../components/__tests__/MultiProjectFlow.test.tsx |   8 -
 .../app/components/__tests__/ResearchView.test.tsx |   4 -
 packages/i18n/locales/en/app.json                  |   5 +-
 16 files changed, 666 insertions(+), 390 deletions(-)

Fusion-Task-Id: FN-6844

Fusion-Task-Lineage: f0e17e3d-489e-483c-ba7d-a020c111231c
2026-06-21 09:00:40 -07:00
gsxdsm
85f324fd2c Merge pull request #1705 from Runfusion/gsxdsm/fix-spinners
fix: make loading spinners actually spin across the dashboard
2026-06-21 04:10:56 -07:00
gsxdsm
3b61ac3d23 fix: make loading spinners actually spin across the dashboard
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>
2026-06-21 03:53:43 -07:00
gsxdsm
4672203acd FN-6814: add Shadcn Gray theme variant
Adds a neutral Shadcn Gray dashboard color theme across selection, bootstrap, documentation, and release notes.

- Add Shadcn Gray to core theme validation and dashboard theme picker options.
- Define dark and light zinc-gray theme tokens plus matching swatch previews.
- Cover the new theme with regression tests and document the expanded theme count.

Files changed:
 .changeset/shadcn-gray-variant.md                  |   5 +
 docs/dashboard-guide.md                            |   2 +-
 packages/core/src/types.ts                         |   4 +-
 .../app/__tests__/shadcn-gray-theme.test.ts        |  65 ++++++++++
 .../dashboard/app/components/ThemeSelector.css     |  15 +++
 packages/dashboard/app/components/themeOptions.ts  |   2 +
 packages/dashboard/app/index.html                  |   2 +-
 packages/dashboard/app/public/theme-data.css       | 143 ++++++++++++++++++++-
 8 files changed, 228 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-6814

Fusion-Task-Lineage: 0548ad7a-5a3c-4e39-8dab-3eb5d40d84c1
2026-06-21 03:40:56 -07:00
gsxdsm
f030f73032 FN-6847: move sidebar collapse toggle into footer
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
2026-06-21 03:40:56 -07:00
gsxdsm
1ff87147b7 FN-6831: narrow list sidebar and wrap task titles
Refine the desktop list split pane so narrower sidebars still show readable task titles.

- Lower the list-view sidebar minimum width from 280px to 200px across resize and keyboard handling.
- Clamp desktop list task titles to two wrapped lines with overflow protection.
- Update ListView coverage for the smaller persisted/keyboard minimum and title-clamp CSS.

Files changed:
 packages/dashboard/app/components/ListView.css     | 10 +++++++++-
 packages/dashboard/app/components/ListView.tsx     |  2 +-
 .../app/components/__tests__/ListView.test.tsx     | 22 +++++++++++++++++-----
 3 files changed, 27 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-6831

Fusion-Task-Lineage: ac3e455d-8cb0-4f42-ac5c-d735e56d2b89
2026-06-21 03:40:56 -07:00
gsxdsm
9d55f29c7a FN-6822: add dashboard i18n accessible-name fallbacks
Ensure dashboard accessibility labels render English defaults when i18n catalogs are unavailable.

- Add inline default text for the dashboard loader status label.
- Reuse the stash copy-reference fallback label for button accessibility and initial focus targeting.

Files changed:
 packages/dashboard/app/components/DashboardLoader.tsx    | 10 +++++++++-
 packages/dashboard/app/components/StashConflictModal.tsx | 12 +++++++++---
 2 files changed, 18 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6822

Fusion-Task-Lineage: 5057b051-43bd-467c-87b7-9ce86522c0c3
2026-06-21 03:40:56 -07:00
gsxdsm
19d60480db FN-6826: elevate the theme dropdown when open
Ensure the Command Center theme selector renders above neighboring views while preserving mobile in-flow behavior.

- Add an open state class to the theme dropdown root for local stacking control.
- Raise the open dropdown and popover above Command Center sibling cards without exceeding app chrome layers.
- Cover desktop elevation and mobile static popover behavior in ThemeDropdown tests.

Files changed:
 .../dashboard/app/components/ThemeDropdown.css     | 15 +++++++-
 .../dashboard/app/components/ThemeDropdown.tsx     |  2 +-
 .../components/__tests__/ThemeDropdown.test.tsx    | 40 ++++++++++++++++++++++
 3 files changed, 55 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6826

Fusion-Task-Lineage: ff43c06e-f3a7-4b4c-8e29-46deb66e9145
2026-06-21 03:40:56 -07:00
gsxdsm
fa9a3cc52f Address PR review feedback (#1704): clear stale external marker on acquire
Move externalEngines.delete(projectId) to immediately after acquiring the
singleton lock instead of after engine.start() succeeds. If a project was
marked external, the holder exits, acquire succeeds, but start() then throws,
the success-path delete never ran and hasRunningEngine() reported a phantom
engine forever. Added a regression test for the failed-takeover path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 03:32:53 -07:00
gsxdsm
0a49023f0b Address PR review feedback (#1704)
- Stop reconciliation/startAll/onProjectAccessed from warning every tick for
  externally-owned engines: swallow EngineAlreadyRunningError in the outer
  catches (it's expected and already logged once in createAndStart)
- Add FNXC:DashboardHealth requirement-trace comments on the externalEngines
  field and the dashboard hasRunningEngine health check
- Add regression test: reconciliation stays quiet across ticks for an
  externally-owned engine (inner refusal logged once, outer failure suppressed)
- Add regression test: hasDashboardEngine legacy fallback to getAllEngines when
  hasRunningEngine is unavailable on the manager

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 03:29:47 -07:00
gsxdsm
7c8eba38b4 Address PR review feedback (#1703)
- FNXC requirement-trace comments on the stepwise workflow-step seam,
  the flowToIr v2-signal/byte-identity contract, and TaskForm's
  optional-steps create-mode behavior
2026-06-21 03:13:23 -07:00
gsxdsm
7635ba8682 fix: report engine available when another fusion process owns it
The dashboard's engine-availability health check only counted engines
this process started. A second launch (e.g. `pnpm dev dashboard`
alongside an already-running `fusion`) is correctly refused the
per-machine engine singleton lock, so its engine map stays empty and
the dashboard showed a false "engine not running" banner even though an
engine was live on the machine.

ProjectEngineManager now records projects whose singleton lock is held
by another process (via EngineAlreadyRunningError) and exposes
hasRunningEngine(), which the health endpoint consults so the banner
reflects machine-level truth. Reconciliation still retries so this
process takes over if the other exits, and the "refusing to start" log
fires once per project instead of on every 30s reconciliation tick.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 03:09:35 -07:00