Commit Graph

14 Commits

Author SHA1 Message Date
ischindl
3766dfc2a7 fix: Engine Control popover collapsed to ~trigger width (FN-8802 .card clamp) (#3363)
## What & why

RUFU-042. The open **Engine Controls** popover (footer status bar,
bottom-right) carries the shared `.card` class. Since FN-8802, `.card`
bases set `min-width: 0; max-width: 100%` (TaskCard.css). The popover's
containing block (`.engine-control-menu`) sizes to the narrow trigger
button, so `.card`'s `max-width: 100%` clamped the intended `24rem` grid
down to ~the trigger's width — a **~5mm-wide invisible popover**.

## Fix (CSS only, `EngineControlMenu.css`)

- Footer-scoped desktop rule (`0,3,0`) re-asserts
`min-width`/`max-width` clamped to the **viewport** (not the trigger
wrapper), deterministically beating the shared `.card` (`0,1,0`) by
specificity — same pattern as `.selection-comment-panel.card`.
- Mobile `@media (max-width:1024px)` resets `min-width:0;
max-width:none` so the full-width gutter panel cannot overflow nor be
re-clamped by `.card`.
- No `className="card"` removal; shared `.card` base untouched.

## Regression tests

Two new tests in `EngineControlMenu.test.tsx` assert the desktop min/max
guard and the mobile reset, so the collapse cannot silently return.
**17/17 tests pass.**

No changeset (`@fusion/dashboard` is a private package).

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Improved engine control popovers so they size correctly without
collapsing or overflowing.
* Enhanced mobile layouts to maintain full-width display with
appropriate screen gutters.

* **Tests**
* Added regression coverage for desktop width limits and narrow-screen
popover behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Fusion <noreply@runfusion.ai>
Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com>
2026-08-09 13:49:56 -10:00
gsxdsm
18d654a5ff capacity, part 3: delete the globalMaxConcurrent setting, API and UI (#2529)
Part 3 of the capacity simplification, and the half that removes the
**knob**. Enforcement (shared semaphore, runtime wiring) went in #2509;
this removes everything an operator or API client can still see, so
nothing is left readable-but-ignored.

## Deleted

Settings key + schema default · CentralCore’s
`getGlobalConcurrencyState` / `updateGlobalConcurrency` /
`acquireGlobalSlot` / `releaseGlobalSlot` and the `concurrency:changed`
event · the whole Global Concurrency block in `async-central-core` ·
`PUT /api/global-concurrency` · the Scheduling · Global settings section
· the footer and Command Center global sliders · the dead
`getGlobalConcurrencyLimit` reader whose only caller went in #2509.

## Kept, deliberately

**`GET /api/global-concurrency` survives as telemetry only** — live
`currentlyActive` / `projectsActive` from CentralCore’s side-effect-safe
source. “How busy is this machine?” is still a real question once the
cap that used to answer it is gone. It no longer reports
`globalMaxConcurrent`/`queuedCount`: those came from the deleted cap and
from slot bookkeeping production code never incremented, so publishing
them was publishing zeros dressed as state.

**`useGlobalConcurrency` becomes read-only.** Everything that existed to
*persist* went with the cap — the 500 ms debounce, the save-state
machine, the commit-on-close/unmount flush, the slider clamp, the
`interactive` gate. The module-level shared store is **kept**: its
original justification (two mounted consumers drift apart with private
copies) holds for a polled read exactly as it did for a cap, and one
fetch now serves both.

The live “N running (all projects)” readout survives in both surfaces,
moved onto the per-project row.

## Two sections become one

Scheduling · Global existed to host exactly one control. With it deleted
the section renders an empty pane, so the Global/Project pair merges
back into **“Scheduling”**. An empty nav entry is a promise of settings
that are not there.

## One real fix found on the way

`SchedulingSection`’s `concurrencyLoading` gated the **project**
concurrency inputs on the **global**-concurrency fetch — never the right
source, since `maxConcurrent` and `maxWorktrees` come from the settings
form. It is repointed at the form’s own load, preserving the invariant
it existed for: a concurrency input stays disabled until its live value
arrives, so an operator cannot overwrite a resolved limit with a blank
fallback.

## Migration

A stored `globalMaxConcurrent` is **ignored** — it is a project-blob key
nothing reads, so dropping it needs no schema change. The
`central.global_concurrency` **table** is dropped in a follow-up; this
slice stops seeding and reading it first, so that drop has no live
writer to race.

## Verification, and how the wider suite was controlled

`pnpm lint` clean · core/engine/dashboard `tsc` clean · `pnpm test:gate`
green (309 + 10 + 71) · dashboard settings/footer/command-center/hooks
**2237/2237** · core `central-core-backend` 9/9.

The broader dashboard suite shows failures, and I checked rather than
assumed: running the suspect files on **clean main** reproduces
`api-git` (49), `TaskDetailModal.rendering` (28) and `settings-mobile`
(17) identically. Two were genuinely mine —
`SettingsModal.scheduling-merge` (0 on main, 17 on this branch: my nav
rename) and one `settings-mobile` picker case asserting `scheduling` is
a scoped pair — and both are fixed.

Tests for deleted behaviour are removed with it (footer
confirm/cancel/flush/dedupe, global marker geometry, the hook’s PUT
case, the CentralCore slot cases), each carrying a note on what it
guarded and where the surviving **project-side** equivalent lives.
Fixture-only references were updated, not deleted.

Nothing booted.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 23:23:13 -07:00
gsxdsm
743df98aa4 capacity, part 1: merge pinned at 1, worktrees-off mode, and one dead knob deleted (#2502)
First slice of the capacity simplification. Operator: *"just have two
capacity — overall per project agent count and max worktrees. Remove all
other capacities and counts."* Plus two later additions: **merge is
always 1, fixed**, and **worktrees off ⇒ limit by total agents only**.

Three independently revertable commits. No limiter is added anywhere;
one is deleted, one is made structurally absent, and one is pinned.

---

## 1. Merge concurrency ratcheted at 1 (test-only)

I was asked to add a limiter if merge concurrency could be raised. **It
cannot** — there is no setting, workflow property, pool or trait config
anywhere that raises it, so this adds no code and pins what already
holds.

Serialization lives in the **pump**: `drainMergeQueue`’s `mergeRunning`
re-entrancy latch, `activeMergeTaskId` as a single-slot identity, the
`mergeBodyInFlight` next-generation latch, and one `ProjectEngine` per
projectId.

**Not** in the merge-queue lease, which is a per-task ROW (`primaryKey
[projectId, taskId]`) — two tasks can hold leases simultaneously by
construction, and it has exactly one caller (the worktree-reuse
handoff). Ordinary merges never take it. A lease-level test would have
been describing an invariant that layer has never held.

The second half guards the other direction: a merge-concurrency
*setting* would not fail the pump ratchet — it would sit unread until
someone wired it up.

**Revert-proof:** deleting the latch → `expected 1 times, but got 2
times`; deleting the `finally` → latch-stuck; injecting
`maxConcurrentMerges: 2` → fails naming the key; injecting a
`maxParallelLanes` merge-trait field → fails naming the field. Sources
restored byte-identical after each injection.

## 2. `worktreesEnabled` — off means the worktree limit cannot bind

No worktrees-off mode existed (no
`worktreesEnabled`/`useWorktrees`/`worktreeMode` anywhere — only
worktree *configuration*).

**Why not `maxWorktrees: 0`, which needs no new key:** it deadlocks. `??
4` keeps `0` (not nullish), the gate is `used >= limit`, so `0 >= 0`
holds **on an empty board** and nothing ever dispatches — while the
operator-visible reason reads `gate=maxWorktrees; used=0/0`, a limiter
that looks like it is working while the board is dead. It also needs the
Command Center `{min:1}` clamp relaxed. So `0` costs the gate rewrite
*and* the clamp change *and* encodes a mode as a magic value.

**Off is absence, not a big number.** `resolveWorktreeCapacityLimit`
returns `number | null`; `ConcurrencyGateDiagnostic.maxWorktreesGate` is
now optional, so consulting a worktree limit in OFF mode does not
type-check. A gate holding `Infinity` can start binding again the moment
someone "fixes" a comparison; an absent gate cannot.

That paid for itself immediately: making it nullable surfaced a
**second, independent** worktree gate (`activeWorktrees >= maxWorktrees`
early-return) that a skip-by-convention approach would have missed
silently.

**Scope, deliberately:** this is a statement about *counting*, not
isolation. It does not make concurrent agents safe to share one checkout
and builds nothing toward that — the non-worktree paths that exist today
are fallbacks to the operator’s own tree, one of which caused FN-8600.

**Revert-proof:** a resolver ignoring the flag turns both OFF scheduler
tests red while every ON test stays green — they reuse the *same*
fixture (5 in-progress, limit 4) that pre-existing tests prove blocks,
so the pair moves in opposite directions. Removing `disabled:` reddens
the UI test.

## 3. `maxTriageConcurrent` deleted — it controlled nothing

**Measured: zero enforcement reads.** The only `.maxTriageConcurrent`
reference in the repo was a route echoing it back in `/config`. FN-8453
removed the pool it gated and left the knob shipping in
`DEFAULT_SETTINGS`, the settings type, the section registry, the API
response and six i18n catalogs, doing nothing, for releases.

Historical FNXC comments are **updated, not deleted** — they explain a
real past incident; they now say "planning admission slot" so they stop
implying a live setting. Tombstoned so it cannot return.

`/config` loses a field; safe in-repo since `fetchConfig`’s own return
type never declared it.

---

## Two corrections worth recording

- I earlier reported `maxWorktrees` had **no** Settings UI. Wrong —
`WorktreesSection.tsx:47`; my grep was truncated by `head`. It changed
the placement (toggle beside it, rather than a duplicate key in
Scheduling).
- I planned to assert the queued-reason string is rewritten in OFF mode.
Measured that it is **unreachable**: when `maxConcurrent` binds, the
sweep bails before the per-task reason and logs nothing. The test
asserts absence instead.

Two near-misses caught before commit: a pre-existing FN-7505 guard
caught my *new* key missing a description mapping; and editing i18n via
`json.load/dump` silently dropped unrelated duplicate keys
(`autoUpdateAndRestart` in `fr`) — Python keeps only the last of a
duplicated key. Redone textually, every catalog re-validated.

## Verification

`pnpm lint` clean · core/engine/dashboard/i18n typecheck clean · `pnpm
test:gate` green (309 + 10 + 71) · capacity/worktree suites 11/11 ·
engine merge-invariant + scheduler 45/45 · dashboard settings 114/114.
Rebased onto current main and re-verified.

Nothing was booted at any point.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added a project setting to enable or disable running tasks in
worktrees.
* Disabling worktrees removes worktree capacity limits from task
scheduling.
* The “Max Worktrees” setting is disabled when worktree execution is
turned off.

* **Changes**
* Removed the unused triage concurrency setting from configuration and
dashboard responses.
* Updated scheduling diagnostics and queue messages to reflect disabled
worktree capacity limits.
  * Added localized labels and help text for the new setting.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 18:52:31 -07:00
gsxdsm
2a2b157cb9 FN-8585: fix dashboard composer test source reads
Stabilize dashboard composer tests when Vitest launches from the workspace root.

- Resolve dashboard test source fixtures relative to the app directory.
- Migrate affected component tests away from cwd-relative CSS reads.
- Enforce the fixture convention in test hooks and document it.

Files changed:
 docs/testing.md                                    |  4 +++
 package.json                                       |  6 ++--
 .../__tests__/AuthTokenRecoveryDialog.test.tsx     |  3 +-
 .../components/__tests__/ChatView.mobile.test.tsx  |  5 +--
 .../__tests__/EngineControlMenu.test.tsx           | 11 ++----
 .../components/__tests__/FloatingWindow.test.tsx   |  5 +--
 .../app/components/__tests__/ListView.test.tsx     |  5 +--
 .../__tests__/MissionInterviewModal.test.tsx       |  3 +-
 .../app/components/__tests__/MobileNavBar.test.tsx |  3 +-
 .../app/components/__tests__/NewTaskModal.test.tsx |  3 +-
 .../__tests__/PlanningModeModal.initial.test.tsx   |  3 +-
 .../PlanningModeModal.ui-interactions.test.tsx     |  7 ++--
 .../components/__tests__/PrCreateModal.test.tsx    |  3 +-
 .../__tests__/QuickChat.persist.test.tsx           |  3 +-
 .../components/__tests__/QuickEntryBox.test.tsx    |  3 +-
 .../components/__tests__/ReportActionMenu.test.tsx |  9 ++---
 .../app/components/__tests__/ReportModal.test.tsx  |  3 +-
 .../__tests__/ShadcnColorPicker.test.tsx           |  3 +-
 .../components/__tests__/TerminalModal.test.tsx    |  3 +-
 .../components/__tests__/ThemeDropdown.test.tsx    |  9 ++---
 .../__tests__/WorkflowNodeEditor.test.tsx          |  5 +--
 .../WorkflowOptionalStepsDropdown.test.tsx         |  3 +-
 .../components/__tests__/WorkflowSwitcher.test.tsx |  5 +--
 .../app/components/__tests__/board-mobile.test.tsx |  4 +--
 .../__tests__/CommandCenterControls.test.tsx       |  6 ++--
 .../__tests__/SystemControlsArea.test.tsx          |  5 +--
 .../__tests__/SystemStatsArea.test.tsx             |  3 +-
 .../command-center/areas/__tests__/areas.test.tsx  |  3 +-
 .../__tests__/KeyboardShortcutsSection.test.tsx    |  3 +-
 .../app/test/__tests__/cssFixture.test.ts          | 35 +++++++++++++++++++
 packages/dashboard/app/test/cssFixture.ts          | 12 +++++++
 .../check-no-cwd-relative-dashboard-test-reads.mjs | 39 ++++++++++++++++++++++
 32 files changed, 162 insertions(+), 55 deletions(-)

Fusion-Task-Id: FN-8585

Fusion-Task-Lineage: 83a35fb6-a29d-4e97-b282-1054c68b8cc9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-25 06:22:23 -07:00
gsxdsm
eef5eb751e FN-8453: unify concurrency accounting and indicators
Unify live-agent capacity accounting across engine and dashboard.

- Derive Running and Waiting from workflow traits and durable agent liveness.
- Apply unified limits to planner, executor, and merge admission while updating dashboard indicators.
- Remove duplicate concurrency controls and document the unified operator model.

Files changed:
 .changeset/fn-8453-unified-concurrency.md          |   7 +
 docs/agent-tool-surface-full-loop.md               |   4 +-
 docs/architecture.md                               |   2 +-
 docs/dashboard-guide.md                            |   4 +-
 docs/settings-reference.md                         |   4 +-
 .../skill/fusion/references/fusion-capabilities.md |   4 +-
 .../core/src/__tests__/live-agent-count.test.ts    |  91 ++++----
 packages/core/src/index.gate.ts                    |   6 +
 packages/core/src/index.ts                         |   6 +
 packages/core/src/live-agent-count.ts              | 107 ++++++---
 packages/dashboard/app/App.tsx                     |  28 ++-
 packages/dashboard/app/api/board-workflows.ts      |   2 +
 packages/dashboard/app/components/Column.tsx       |   6 +-
 .../dashboard/app/components/EngineControlMenu.tsx |  26 ---
 .../dashboard/app/components/ExecutorStatusBar.tsx |  38 ++-
 .../dashboard/app/components/SettingsModal.tsx     |   1 -
 .../app/components/__tests__/Column.test.tsx       |   6 +-
 .../__tests__/EngineControlMenu.test.tsx           |  10 +-
 .../__tests__/ExecutorStatusBar.test.tsx           |  32 ++-
 .../command-center/CommandCenterControls.tsx       |  26 ---
 .../settings/sections/SchedulingSection.search.ts  |   9 -
 .../settings/sections/SchedulingSection.tsx        |  13 --
 .../app/hooks/__tests__/useExecutorStats.test.ts   |  12 +-
 packages/dashboard/app/hooks/useExecutorStats.ts   |  50 ++--
 .../src/__tests__/project-store-resolver.test.ts   |  11 +-
 packages/dashboard/src/project-store-resolver.ts   |  14 +-
 .../register-config-mcp-pi-settings-routes.ts      |   3 +-
 packages/engine/src/__tests__/concurrency.test.ts  | 123 +++++++++-
 .../engine/src/__tests__/project-engine.test.ts    |  34 +++
 packages/engine/src/__tests__/triage.test.ts       |   7 +-
 packages/engine/src/concurrency.ts                 | 207 ++++++++++++++++-
 packages/engine/src/project-engine.ts              | 151 ++++++++++--
 packages/engine/src/scheduler.ts                   |  82 ++++++-
 packages/engine/src/triage.ts                      | 254 +++++++++++++--------
 .../lib/dashboard-browser-safe-core-modules.json   |   5 +
 35 files changed, 991 insertions(+), 394 deletions(-)

Fusion-Task-Id: FN-8453

Fusion-Task-Lineage: 12cfa5df-675d-4fce-b17e-932376544239

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 15:30:31 -07:00
gsxdsm
66ae82af5b FN-8007: align concurrency current-use markers
Align dashboard and footer concurrency markers with their native range thumbs.

- Map running counts in min-relative slider coordinates and clamp them to the configured cap
- Standardize native slider thumb dimensions and marker geometry across browsers
- Add dashboard coverage and document the marker behavior

Files changed:
 .changeset/fn-8007-concurrency-dot-alignment.md    |   7 +
 docs/dashboard-guide.md                            |   8 +-
 .../dashboard/app/components/EngineControlMenu.css |  20 ++-
 .../dashboard/app/components/EngineControlMenu.tsx |  19 ++-
 .../__tests__/EngineControlMenu.test.tsx           |  96 +++++-------
 .../command-center/CommandCenterControls.css       |  22 ++-
 .../command-center/CommandCenterControls.tsx       |  19 ++-
 .../__tests__/CommandCenterControls.test.tsx       | 164 +++++++++++++++++++++
 8 files changed, 277 insertions(+), 78 deletions(-)

Fusion-Task-Id: FN-8007

Fusion-Task-Lineage: 9ad8ee0b-09da-413e-96bc-530c897cb32e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-15 18:43:37 -07:00
gsxdsm
2179a61db9 FN-7973: fix mobile concurrency sliders with touch-action none
Restore horizontal concurrency thumb drags on mobile by opting range inputs out of the pan-y ancestor lock.

- Set touch-action:none on Engine Control menu and Command Center concurrency range inputs
- Update geometry/touch contract test to assert none and reject pan-y
- Add patch changeset for the mobile slider fix

Files changed:
 .changeset/fn-7973-mobile-concurrency-sliders.md              |  7 +++++++
 packages/dashboard/app/components/EngineControlMenu.css       |  5 ++++-
 .../app/components/__tests__/EngineControlMenu.test.tsx       | 11 ++++++++---
 .../app/components/command-center/CommandCenterControls.css   |  5 ++++-
 4 files changed, 23 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-7973

Fusion-Task-Lineage: bf36e544-c24f-49ae-beae-b11707be9c79

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-15 14:12:43 -07:00
gsxdsm
d786e7b9c9 FN-7340: align footer concurrency marker geometry
Align footer Engine Controls current-use dots with Command Center slider geometry.

- Mirror Command Center range sizing, touch behavior, and mobile thumb geometry in the footer controls.
- Cover the shared marker geometry contract and pending-cap marker recalculation in EngineControlMenu tests.
- Document the footer/Command Center alignment requirement and add a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-7340-footer-concurrency-dot-alignment.md    |  7 ++
 docs/dashboard-guide.md                            |  3 +-
 packages/dashboard/app/components/EngineControlMenu.css | 28 ++++++-
 packages/dashboard/app/components/__tests__/EngineControlMenu.test.tsx           | 85 ++++++++++++++++++++++
 4 files changed, 121 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-7340

Fusion-Task-Lineage: 5cb4d829-2b70-429c-b9da-0c559fdbf131

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 23:45:02 -07:00
gsxdsm
ffe2092109 FN-7248: require confirmation for footer concurrency edits
Footer concurrency controls now require explicit confirmation before persisting scheduler-capacity changes.

- Add local pending state for global and project footer concurrency slider edits so dismissals revert instead of saving.
- Reuse Command Center confirmation copy for single and grouped concurrency changes.
- Cover confirm, cancel, close, Escape, outside-click, loading, and error behaviors in EngineControlMenu tests.
- Document the footer confirmation and dismissal semantics and add a patch changeset.

Files changed:
 .../fn-7248-footer-concurrency-confirmation.md     |   7 +
 docs/dashboard-guide.md                            |   3 +-
 .../dashboard/app/components/EngineControlMenu.tsx | 235 ++++++++++++++---
 .../__tests__/EngineControlMenu.test.tsx           | 287 +++++++++++++++++++--
 4 files changed, 478 insertions(+), 54 deletions(-)

Fusion-Task-Id: FN-7248

Fusion-Task-Lineage: cbcd21fa-62c3-4c05-ac3d-67a641cf47c8

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-29 19:29:36 -07:00
gsxdsm
7b43f73327 FN-7235: align footer concurrency use markers
Align footer concurrency indicators with absolute running-agent utilization.

- Change footer use-marker ratio math to use current running count over configured cap.
- Cover zero, one-active, mid-track, over-cap, loading, and error marker states in EngineControlMenu tests.
- Document the footer marker behavior and add a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-7235-footer-concurrency-marker.md    |  7 +++
 docs/dashboard-guide.md                            |  3 +-
 .../dashboard/app/components/EngineControlMenu.tsx | 14 +++--
 .../__tests__/EngineControlMenu.test.tsx           | 70 +++++++++++++++++++---
 4 files changed, 79 insertions(+), 15 deletions(-)

Fusion-Task-Id: FN-7235

Fusion-Task-Lineage: 0dda1277-2d89-4195-882c-6488dfc67288

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-29 13:44:09 -07:00
gsxdsm
b5378d232c FN-7124: add engine-controls popover dismiss button
Add an explicit dismiss affordance for the footer engine-controls popover while preserving pending slider saves.

- Add a visible, localized Close engine controls X button inside the engine-control popover.
- Flush pending project concurrency debounce writes before closing via button, Escape, outside-click, or trigger toggle.
- Cover the dismiss affordance and flush behavior with dashboard tests and docs.
- Add a patch changeset for the published CLI bundle.

Files changed:
 .changeset/fn-7124-engine-controls-close.md        |  6 ++
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/EngineControlMenu.css | 19 +++++
 .../dashboard/app/components/EngineControlMenu.tsx | 87 +++++++++++++++++-----
 .../__tests__/EngineControlMenu.test.tsx           | 42 +++++++++++
 packages/i18n/locales/en/app.json                  |  1 +
 packages/i18n/locales/es/app.json                  |  1 +
 packages/i18n/locales/fr/app.json                  |  1 +
 packages/i18n/locales/ko/app.json                  |  1 +
 packages/i18n/locales/zh-CN/app.json               |  1 +
 packages/i18n/locales/zh-TW/app.json               |  1 +
 11 files changed, 142 insertions(+), 20 deletions(-)

Fusion-Task-Id: FN-7124

Fusion-Task-Lineage: cdd052e7-d4f1-4d4e-8348-002f7702a170

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-27 11:27:17 -07:00
gsxdsm
2db8ead842 FN-7071: show concurrency utilization in the footer panel
Expose live running-agent utilization in the footer concurrency controls.

- Show all-project and current-project running counts beside the matching concurrency sliders.
- Add clamped current-use markers on global and project slider tracks.
- Preserve shared global-concurrency hook state with utilization counts and cover the new UI behavior with tests.
- Document the footer panel utilization indicators and add a release changeset.

Files changed:
 .changeset/fn-7071-concurrency-running-counts.md   |   7 ++
 docs/dashboard-guide.md                            |   2 +-
 .../dashboard/app/components/EngineControlMenu.css |  23 ++++
 .../dashboard/app/components/EngineControlMenu.tsx | 103 +++++++++++++-----
 .../__tests__/EngineControlMenu.test.tsx           | 117 ++++++++++++++++++++-
 .../hooks/__tests__/useGlobalConcurrency.test.ts   |  96 +++++++++++++++++
 .../dashboard/app/hooks/useGlobalConcurrency.ts    |  41 +++++++-
 packages/i18n/locales/en/app.json                  |   4 +-
 packages/i18n/locales/es/app.json                  |   4 +-
 packages/i18n/locales/fr/app.json                  |   4 +-
 packages/i18n/locales/ko/app.json                  |   4 +-
 packages/i18n/locales/zh-CN/app.json               |   4 +-
 packages/i18n/locales/zh-TW/app.json               |   4 +-
 13 files changed, 373 insertions(+), 40 deletions(-)

Fusion-Task-Id: FN-7071

Fusion-Task-Lineage: db95d50a-c042-4972-a462-1987b7bca61e
2026-06-26 13:57:00 -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
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