Commit Graph

8183 Commits

Author SHA1 Message Date
gsxdsm
d07a5d6ce5 Offload background integrity_check off the main event loop
The boot-time integrity check (scheduleBackgroundIntegrityCheck, ~60s
after init) ran PRAGMA integrity_check on the live connection, walking
every page and freezing the event loop for several seconds — the largest
single read-contention stall in normal operation.

Offload it to the sqlite3 CLI in a child process (async spawn), matching
the existing out-of-process pattern used by quickCheckSqliteFile and
.recover. The CLI connection is opened -readonly so it can never
checkpoint or write the live WAL; this works because the live process
holds the DB open (so the -shm exists). When the CLI is unavailable or
can't open read-only, fall back to the in-process check (verified=false),
preserving today's behavior on those environments.

- New integrityCheckSqliteFileAsync(dbPath, limit) module helper.
- New private runBackgroundIntegrityCheck() seam (offload + fallback) so
  the scheduler has one testable, deterministic policy point.
- Background scheduler callback is now async (IIFE + finally) with errors
  swallowed so a background timer can't crash the process.

VACUUM is intentionally NOT offloaded: the call graph shows it is invoked
only by the `fn db vacuum` CLI command and tests, never from the periodic
maintenance loop, so it is not a background event-loop stall — and an
out-of-process VACUUM on a live WAL DB would add corruption surface for no
hot-path benefit.

Tests updated to the async/offloaded seam (deterministic regardless of
whether the sqlite3 CLI exists in the environment), plus coverage for the
new helper.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 14:12:59 -07:00
gsxdsm
849eefa35e Merge pull request #1692 from Runfusion/fix/sqlite-read-contention
Reduce SQLite read contention: bound WAL growth + release vacuum lock
2026-06-20 13:53:35 -07:00
gsxdsm
61c29cc6b4 Reduce SQLite read contention: bound WAL growth + release vacuum lock
Investigation of reported DB read contention found two cross-process
contention sources in the SQLite layer (single synchronous node:sqlite
connection per process, WAL mode):

- Unbounded WAL on central-db and archive-db. Neither set
  journal_size_limit, so their WAL never truncated back down after a
  checkpoint and every reader paid an ever-growing WAL-index scan. Add
  journal_size_limit=4MB (matching db.ts) plus explicit
  synchronous=FULL/wal_autocheckpoint=1000 for intent. central-db is the
  most cross-process-shared DB; archive-db had the same latent gap.

- vacuum() held the EXCLUSIVE lock past its own runtime. Resetting
  locking_mode to NORMAL does not drop the WAL exclusive lock until the
  connection next touches the DB, so other processes stayed locked out of
  reads (SQLITE_BUSY) until some unrelated query ran. A plain read does
  NOT release it in WAL mode (verified); a PASSIVE checkpoint does. Run
  one in the finally, guard the locking_mode reset so it can't mask the
  original error or skip the release, and log swallowed failures.

Tests: assert the new PRAGMAs on central-db and archive-db, and that a
second connection can read immediately after vacuum() returns.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 13:24:38 -07:00
gsxdsm
7e7eb6299d Harden orphan-worktree/stale-task-dir cleanup (code-review follow-up)
Addresses findings from a multi-agent review of the two prior fixes.

P0 (executor.ts): the stale-conflict recovery force-removed worktreePath with
no bounds check; that path can come from a git admin entry resolving outside
.worktrees/. Now refuses unless the path is inside the worktrees dir, not a
symlink (realpathSync), not a registered worktree, and not actively owned, and
re-verifies liveness in the catch instead of trusting the error string. Also
excludes spawn failures (spawn git ENOENT) from the stale-path classification.

worktree-pool.ts: resolveGitdirPointer -> dotGitPointerIsDangling. Reaps only
when a .git link's gitdir target is confirmed missing; a real .git dir,
unparseable pointer, or any read/stat failure is treated as NOT dangling
(conservative) so a transient read error on a live worktree can't trigger rm.
Drops the string|"directory"|null sentinel union.

core store.ts: bypass the reconcile recency window when the live task table is
empty (corruption/restore: surviving task.json keep old mtimes) and when
fusion.db was auto-recovered on startup, so .recover row loss isn't stranded.
Adds an ignoreRecencyWindow option.

Tests: executor recovery + out-of-bounds refusal, unparseable .git skip,
recency boundary, empty-DB/forced bypass. engine 135 + core 12 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 12:46:34 -07:00
gsxdsm
26ebb9206f Stop reconcile from resurrecting long-deleted task dirs
On restart, reconcileOrphanedTaskDirs re-imported ancient .fusion/tasks/<id>/
directories that had no DB row, surfacing old low-numbered tasks (FN-001, ...)
onto the live board — looking like "all task IDs reset / starting over".

The sweep is meant to recover dirs that appear after store init (heartbeat
races) or rows lost to recent DB corruption. Modern deletes leave a soft-delete
tombstone (caught by taskIdExistsAnywhere), but legacy hard-deletes left none,
so a months-old task.json with no DB row was silently re-imported.

Gate recovery on a 7-day recency window (task.json mtime). Older orphans are
skipped (reason: stale-orphan-dir-beyond-recency-window) and left for explicit
recovery or directory cleanup; heartbeat-race and recent-corruption recovery
still work. Adds a regression test for the stale-dir skip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 12:00:51 -07:00
gsxdsm
b2f564c2be FN-6791: add i18n regression guardrails
Add focused i18n regression coverage for dashboard localization guardrails.

- Assert dashboard hardcoded-string lint ignores stay limited to non-shipping patterns.
- Verify real locale catalogs retain key parity across supported locales and namespaces.
- Cover fallback behavior for empty secondary translations, missing keys, unsupported locale tags, and Chinese locale normalization.
- Document that @fusion/i18n tests now protect lint-ignore scope and catalog parity drift.

Files changed:
 docs/i18n-contributing.md                          |  2 +
 .../i18n/src/__tests__/i18n-gate-coverage.test.ts  | 65 +++++++++++++++++++
 .../i18n/src/__tests__/locale-fallback.test.ts     | 72 ++++++++++++++++++++++
 3 files changed, 139 insertions(+)

Fusion-Task-Id: FN-6791

Fusion-Task-Lineage: 7f52113e-237a-415d-a109-51295fdc0372
2026-06-20 11:02:55 -07:00
gsxdsm
bdf95f8d65 FN-6770: localize dashboard workflow and task UI strings
Localize dashboard workflow, task, setup, and pull request UI copy through the shared i18n resources.

- Replace hardcoded dashboard strings in workflow, task detail/chat/comment, setup wizard, PR, and related modal components with translation lookups.
- Add app/common namespace keys across English and secondary locale catalogs, plus regenerated i18n resource types.
- Add the published package changeset and clear the now-localized component files from the i18n lint deferral list.

Files changed:
 .changeset/fn-6770-localize-workflow-task-pr.md    |   5 +
 i18next.config.ts                                  |  17 +-
 packages/dashboard/app/components/Board.tsx        |  10 +-
 .../dashboard/app/components/PrCreateModal.tsx     |  38 +--
 packages/dashboard/app/components/PrPanel.tsx      |   2 +-
 .../dashboard/app/components/PullRequestView.tsx   |  51 ++--
 .../dashboard/app/components/SettingsModal.tsx     |  92 +++----
 .../dashboard/app/components/SetupWizardModal.tsx  |   8 +-
 packages/dashboard/app/components/TaskChatTab.tsx  | 107 ++++----
 packages/dashboard/app/components/TaskComments.tsx |   2 +-
 .../dashboard/app/components/TaskDetailModal.tsx   |  54 ++--
 .../app/components/WorkflowNodeEditor.tsx          | 109 +++++----
 .../app/components/WorkflowResultsTab.tsx          | 190 +++++++-------
 .../dashboard/app/components/WorkflowSelector.tsx  |  20 +-
 packages/i18n/locales/en/app.json                  | 268 ++++++++++++++++++--
 packages/i18n/locales/en/common.json               |  28 +--
 packages/i18n/locales/es/app.json                  | 268 ++++++++++++++++++--
 packages/i18n/locales/es/common.json               |  28 +--
 packages/i18n/locales/fr/app.json                  | 268 ++++++++++++++++++--
 packages/i18n/locales/fr/common.json               |  28 +--
 packages/i18n/locales/ko/app.json                  | 268 ++++++++++++++++++--
 packages/i18n/locales/ko/common.json               |  28 +--
 packages/i18n/locales/zh-CN/app.json               | 268 ++++++++++++++++++--
 packages/i18n/locales/zh-CN/common.json            |  28 +--
 packages/i18n/locales/zh-TW/app.json               | 268 ++++++++++++++++++--
 packages/i18n/locales/zh-TW/common.json            |  28 +--
 packages/i18n/src/resources.d.ts                   | 272 ++++++++++++++++++---
 27 files changed, 2144 insertions(+), 609 deletions(-)

Fusion-Task-Id: FN-6770

Fusion-Task-Lineage: 393b6b8a-1902-4e46-a53e-b4a0793022ca
2026-06-20 10:35:40 -07:00
gsxdsm
c0d78f19c5 FN-6795: update quarantine ledger after rescue triage
Refresh the test quarantine records after loaded-lane rescue verification.

- document the FN-6795 CLI and core quarantine triage outcomes
- rescue passing core and CLI test files by removing their ledger/config excludes
- retain CLI package-lane-only timeout quarantines and add the newly observed bin test flake

Files changed:
 docs/testing.md                  |  4 ++++
 packages/cli/vitest.config.ts    | 10 +++++++---
 packages/core/vitest.config.ts   |  4 +++-
 scripts/lib/test-quarantine.json | 25 +++++--------------------
 4 files changed, 19 insertions(+), 24 deletions(-)

Fusion-Task-Id: FN-6795
Fusion-Task-Lineage: b4460fc7-848f-4d54-89b4-cfd4d4533d57
2026-06-20 10:28:25 -07:00
gsxdsm
61ff17a057 FN-6797: harden in-review dependency rebound audits
Harden in-review dependency drift reconciliation with explicit guarded no-action audit evidence.

- Emit no-action run-audit events when pause, auto-merge, live execution, checkout, or rebound mutation guards prevent an in-review dependency rebound.
- Preserve scheduler dependency satisfaction semantics so in-review dependencies remain non-blocking under merge-request shadow mode without accepted markers.
- Extend regression coverage and run-audit documentation for guarded in-review rebounds.

Files changed:
 .changeset/fn-6797-in-review-dependency-drift.md   |   5 +
 AGENTS.md                                          |   2 +-
 docs/architecture.md                               |   4 +-
 .../in-review-unmet-dependency-reconcile.test.ts   |  18 ++-
 packages/engine/src/__tests__/self-healing.test.ts |  79 +++++++++++--
 packages/engine/src/self-healing.ts                | 129 ++++++++++++++++-----
 6 files changed, 190 insertions(+), 47 deletions(-)

Fusion-Task-Id: FN-6797

Fusion-Task-Lineage: f94c7875-619a-47be-88f5-320a4dda3b34
2026-06-20 10:21:26 -07:00
gsxdsm
438cd75eaf Fix leaked orphan worktree dirs failing execute node
Directories under .worktrees/ that survive with a dangling .git pointer
(present on disk, but their .git/worktrees/<name> admin entry is gone) are
invisible to `git worktree list`/`prune` yet collide with freshly generated
worktree names. The executor's conflict cleanup then fails with
"is not a working tree", failing the workflow graph at node 'execute' after
3 attempts.

- executor.ts: extend FN-4813 stale-conflict recovery to also treat
  "is not a working tree" and ENOENT (not just "validation failed, cannot
  remove working tree") as "no live worktree here" — prune the admin entry,
  force-remove the leftover dir, and proceed with fresh creation.
- worktree-pool.ts: reapOrphanWorktrees skipped any dir on mere .git-file
  presence, contradicting its own documented invariant. Resolve the .git
  pointer and only skip when the gitdir target exists; reap dangling
  pointers like any other orphan so they stop accumulating across runs.
- Tests for both the dangling (reaped) and valid (skipped) .git cases.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 09:58:23 -07:00
gsxdsm
eca96fbd0b FN-6771: localize settings section copy
Localize dashboard settings section text and restore i18n lint coverage for those files.

- Replace hardcoded settings section labels, help text, placeholders, and status copy with i18n lookups.
- Add settings translation keys across supported app and common locale catalogs and refresh generated resource types.
- Remove the settings sections from the i18n lint deferral list and document that coverage requirement.
- Add a patch changeset for the published Fusion package.

Files changed:
 .changeset/fn-6771-localize-settings-sections.md   |   5 +
 docs/i18n-contributing.md                          |   3 +-
 i18next.config.ts                                  |  26 +-
 .../settings/sections/AgentPermissionsSection.tsx  |  55 +-
 .../settings/sections/AppearanceSection.tsx        |  91 +-
 .../settings/sections/AuthenticationSection.tsx    | 457 +++-------
 .../settings/sections/BackupsSection.tsx           | 229 ++---
 .../settings/sections/CommandsSection.tsx          |  49 +-
 .../settings/sections/ExperimentalSection.tsx      | 109 +--
 .../settings/sections/GeneralSection.tsx           | 487 ++++-------
 .../settings/sections/GlobalGeneralSection.tsx     | 183 +---
 .../settings/sections/GlobalModelsSection.tsx      | 525 ++++-------
 .../components/settings/sections/MemorySection.tsx | 458 +++-------
 .../components/settings/sections/MergeSection.tsx  | 863 ++++++------------
 .../settings/sections/NodeRoutingSection.tsx       | 108 +--
 .../settings/sections/NodeSyncSection.tsx          | 105 +--
 .../settings/sections/NotificationsSection.tsx     | 484 ++++------
 .../settings/sections/PluginsSection.tsx           | 105 +--
 .../settings/sections/ProjectModelsSection.tsx     | 971 ++++++++-------------
 .../components/settings/sections/RemoteSection.tsx | 560 +++++-------
 .../settings/sections/ResearchGlobalSection.tsx    | 314 ++-----
 .../settings/sections/ResearchProjectSection.tsx   | 226 ++---
 .../settings/sections/RuntimesSections.tsx         |  40 +-
 .../settings/sections/ScheduledEvalsSection.tsx    | 169 ++--
 .../settings/sections/SchedulingSection.tsx        | 381 ++------
 .../settings/sections/WorktreesSection.tsx         | 330 ++-----
 packages/i18n/locales/en/app.json                  | 698 ++++++++++++++-
 packages/i18n/locales/en/common.json               |   8 +
 packages/i18n/locales/es/app.json                  | 698 ++++++++++++++-
 packages/i18n/locales/es/common.json               |   8 +
 packages/i18n/locales/fr/app.json                  | 698 ++++++++++++++-
 packages/i18n/locales/fr/common.json               |   8 +
 packages/i18n/locales/ko/app.json                  | 698 ++++++++++++++-
 packages/i18n/locales/ko/common.json               |   8 +
 packages/i18n/locales/zh-CN/app.json               | 698 ++++++++++++++-
 packages/i18n/locales/zh-CN/common.json            |   8 +
 packages/i18n/locales/zh-TW/app.json               | 698 ++++++++++++++-
 packages/i18n/locales/zh-TW/common.json            |   8 +
 packages/i18n/src/resources.d.ts                   | 706 ++++++++++++++-
 39 files changed, 7178 insertions(+), 5097 deletions(-)

Fusion-Task-Id: FN-6771
Fusion-Task-Lineage: cdf9b36f-414e-4084-b661-b578a4c27314
2026-06-20 08:57:45 -07:00
gsxdsm
52924ba23d FN-6759: add built-in lead-generation workflow
Add a selectable business workflow for managing lead-generation tasks.

- Register a built-in lead-generation workflow with custom business columns, lead fields, and stage prompts.
- Cover workflow registration, column traits, field metadata, compilation, and IR round-tripping with core tests.
- Document the workflow catalog entry and add a minor changeset for the published CLI package.

Files changed:
 .changeset/fn-6759-lead-generation-workflow.md     |   5 +
 docs/workflow-steps.md                             |   4 +
 .../builtin-lead-generation-workflow-ir.test.ts    | 123 ++++++++++++++++++
 .../core/src/__tests__/builtin-workflows.test.ts   |  10 ++
 .../src/builtin-lead-generation-workflow-ir.ts     | 141 +++++++++++++++++++++
 packages/core/src/builtin-workflows.ts             |  20 +++
 packages/core/src/index.ts                         |   1 +
 7 files changed, 304 insertions(+)

Fusion-Task-Id: FN-6759

Fusion-Task-Lineage: 6c724f84-a6a6-4b01-93ec-cabb9387be2f
2026-06-20 08:43:35 -07:00
gsxdsm
281ce35829 FN-6761: add built-in marketing workflow
Add a content-focused workflow while preserving standard Fusion lifecycle and merge behavior.

- Register builtin:marketing in the built-in workflow catalog and default-enabled workflow order.
- Define marketing-specific columns, content brief/draft/editorial prompts, lifecycle traits, and merge primitives.
- Cover the marketing workflow in built-in workflow tests and document it in workflow-step docs.
- Add a minor changeset for the published Fusion package.

Files changed:
 .changeset/fn-6761-marketing-workflow.md           |   5 +
 docs/workflow-steps.md                             |   3 +
 .../core/src/__tests__/builtin-workflows.test.ts   |  64 +++++++++++-
 packages/core/src/builtin-marketing-workflow-ir.ts | 116 +++++++++++++++++++++
 packages/core/src/builtin-workflows.ts             |  24 +++++
 packages/core/src/index.ts                         |   1 +
 6 files changed, 209 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6761

Fusion-Task-Lineage: 3242eceb-570f-47f8-8750-dc3acc971bbd
2026-06-20 08:20:39 -07:00
gsxdsm
d2fc70ac91 FN-6793: enforce dependency gates before review
Dependency gating now blocks executor and review recovery paths when dependencies remain unmet.

- Re-check unmet scheduling dependencies before workflow graph or authoritative executor dispatch and requeue blocked tasks with blockedBy.
- Rebound auto-merge-eligible in-review tasks with live unmet dependencies back to todo while preserving progress, worktree, and resume state.
- Add run-audit documentation, a patch changeset, and regression coverage for executor, scheduler, and self-healing behavior.

Files changed:
 .changeset/fn-6793-dependency-gating.md            |   7 +
 AGENTS.md                                          |   1 +
 docs/architecture.md                               |   2 +
 .../engine/src/__tests__/executor-core.test.ts     |  68 +++++++++
 .../in-review-unmet-dependency-reconcile.test.ts   | 115 +++++++++++++++
 packages/engine/src/__tests__/scheduler.test.ts    |  36 +++++
 packages/engine/src/__tests__/self-healing.test.ts | 159 +++++++++++++++++++++
 packages/engine/src/executor.ts                    |  46 ++++++
 packages/engine/src/self-healing.ts                | 112 +++++++++++++++
 9 files changed, 546 insertions(+)

Fusion-Task-Id: FN-6793

Fusion-Task-Lineage: b209264c-faae-41aa-a024-c33e0d8b61be
2026-06-20 08:13:33 -07:00
gsxdsm
083ebf8134 FN-6780: make i18n status check key parity
Make i18n status enforce catalog key parity while allowing empty fallback placeholders.

- Add a reusable i18n parity checker that reports missing and orphaned keys across secondary locales.
- Route pnpm i18n:status through the project parity gate and keep the upstream completeness report as i18n:status:report.
- Document that empty secondary locale strings are valid fallback placeholders and cover parity behavior with tests.

Files changed:
 docs/i18n-contributing.md                   |  18 +++-
 i18next.config.ts                           |  13 ++-
 package.json                                |   3 +-
 packages/i18n/scripts/check-i18n-parity.mjs | 110 +++++++++++++++++++++++
 packages/i18n/src/__tests__/config.test.ts  |   2 +-
 packages/i18n/src/__tests__/parity.test.ts  | 130 ++++++++++++++++++++++++++++
 packages/i18n/src/parity.ts                 | 126 +++++++++++++++++++++++++++
 7 files changed, 393 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-6780

Fusion-Task-Lineage: f687586a-bc09-4f9d-843f-b7205eb40a58
2026-06-20 06:46:35 -07:00
gsxdsm
254f31ebb6 FN-6790: quiesce deferred task-created writes on close
Rescue task-document coverage by making TaskStore teardown stop late deferred task-created filesystem work.

- Track deferred title write and task-created hook phases so close can drain active work.
- Skip late deferred task-created work once a store is closing to avoid recreating removed fixture roots.
- Update task-document regression coverage, harness teardown awaiting, and rescue documentation while keeping task-documents loaded.

Files changed:
 docs/testing.md                                    |  4 ++
 packages/core/src/__tests__/store-test-helpers.ts  |  2 +-
 packages/core/src/__tests__/task-documents.test.ts | 39 ++++++++++-
 packages/core/src/store.ts                         | 75 +++++++++++++++-------
 packages/core/vitest.config.ts                     |  3 +
 5 files changed, 96 insertions(+), 27 deletions(-)

Fusion-Task-Id: FN-6790

Fusion-Task-Lineage: c458fc4a-b2b4-4cc4-9d88-da8c43f6916d
2026-06-20 05:53:46 -07:00
gsxdsm
48e7a9d5e9 FN-6785: guard productivity metrics defaults
Productivity metrics now tolerate incomplete analytics payloads without crashing.\n\n- Default missing LOC and hours-saved metric objects to unavailable sentinels.\n- Render dash placeholders for incomplete productivity analytics payloads.\n- Add regression coverage for missing productivity metric fields.\n\nFiles changed:\n .../command-center/areas/ProductivityArea.tsx      | 13 ++++++++----\n .../command-center/areas/__tests__/areas.test.tsx  | 23 ++++++++++++++++++++++\n 2 files changed, 32 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6785

Fusion-Task-Lineage: 0600a88e-58ae-4f81-9871-c5879b49810f
2026-06-20 05:23:05 -07:00
gsxdsm
7f3e94292c FN-6760: add built-in design workflow
Add a built-in workflow path for UI-heavy implementation work with a required design review gate.

- Register builtin:design as a selectable built-in workflow after implementation and before standard review/merge.
- Define design review criteria covering hierarchy, spacing, typography, design tokens, component reuse, responsiveness, and design-language fit.
- Add catalog coverage and update workflow documentation to list the new Design workflow.
- Add a minor changeset for the published Fusion package.

Files changed:
 .changeset/fn-6760-design-workflow.md              |  5 +++++
 docs/getting-started.md                            |  2 +-
 docs/workflow-editor.md                            |  4 ++++
 docs/workflow-steps.md                             |  1 +
 .../core/src/__tests__/builtin-workflows.test.ts   | 23 +++++++++++++++++++++
 packages/core/src/builtin-workflows.ts             | 24 ++++++++++++++++++++++
 6 files changed, 58 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6760

Fusion-Task-Lineage: 2682ce3f-a89d-4237-b2cf-675439eea1d6
2026-06-20 05:14:25 -07:00
gsxdsm
b760fa0df9 FN-6769: localize remaining dashboard strings
Localize the remaining dashboard UI clusters and refresh the generated i18n resources.

- Replace hardcoded labels across agent, plugin, mission, workflow node, research, document, activity, and miscellaneous dashboard components with app namespace translations.
- Add and synchronize locale catalog entries for English, Spanish, French, Korean, Simplified Chinese, and Traditional Chinese.
- Update i18n lint configuration and generated resource types, with a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-6769-i18n-cluster.md                 |   5 +
 i18next.config.ts                                  |  47 +--
 .../dashboard/app/components/ActiveAgentsPanel.tsx |   2 +-
 packages/dashboard/app/components/ActivityFeed.tsx |  12 +-
 .../dashboard/app/components/ActivityLogModal.tsx  |   4 +-
 packages/dashboard/app/components/AddNodeModal.tsx |   4 +-
 .../dashboard/app/components/AgentDetailView.tsx   |   6 +-
 .../app/components/AgentGenerationModal.tsx        |   2 +-
 .../dashboard/app/components/AgentImportModal.tsx  |   4 +-
 .../app/components/AgentOnboardingModal.tsx        |   4 +-
 .../app/components/AgentPromptsManager.tsx         |   2 +-
 .../dashboard/app/components/AgentRunHistory.tsx   |   2 +-
 .../dashboard/app/components/AgentsOverviewBar.tsx |   2 +-
 .../dashboard/app/components/BranchGroupCard.tsx   |   4 +-
 .../dashboard/app/components/CliBinaryPanel.tsx    |   8 +-
 .../app/components/CursorCliProviderCard.tsx       |   4 +-
 .../dashboard/app/components/DashboardLoader.tsx   |   4 +-
 .../dashboard/app/components/DevServerView.tsx     |   8 +-
 .../dashboard/app/components/DocumentsView.tsx     |   6 +-
 .../dashboard/app/components/ErrorBoundary.tsx     |   9 +-
 .../dashboard/app/components/ExecutorStatusBar.tsx |   5 +-
 .../dashboard/app/components/GitHubStarPrompt.tsx  |  14 +-
 .../dashboard/app/components/GitManagerModal.tsx   |   4 +-
 .../dashboard/app/components/GroupTaskModal.tsx    |   2 +-
 packages/dashboard/app/components/Header.tsx       |   4 +-
 .../dashboard/app/components/HermesRuntimeCard.tsx |   2 +-
 packages/dashboard/app/components/InsightsView.tsx |   2 +-
 .../dashboard/app/components/IssueMentionPopup.tsx |   5 +-
 packages/dashboard/app/components/MailboxView.tsx  |   6 +-
 .../components/MilestoneSliceInterviewModal.tsx    |   2 +-
 .../app/components/MissionInterviewModal.tsx       |   2 +-
 .../dashboard/app/components/MissionManager.tsx    |   8 +-
 .../app/components/ModelOnboardingModal.tsx        |   2 +-
 .../dashboard/app/components/NodeDetailModal.tsx   |   2 +-
 .../app/components/PiExtensionsManager.tsx         |  10 +-
 .../dashboard/app/components/ProjectSelector.tsx   |   6 +-
 packages/dashboard/app/components/QuickChatFAB.tsx |  44 +--
 packages/dashboard/app/components/ResearchView.tsx |   2 +-
 packages/dashboard/app/components/RoutineCard.tsx  |   6 +-
 .../dashboard/app/components/RoutineEditor.tsx     |   2 +-
 packages/dashboard/app/components/RoutingTab.tsx   |   2 +-
 packages/dashboard/app/components/ScheduleCard.tsx |   6 +-
 packages/dashboard/app/components/ScheduleForm.tsx |   2 +-
 packages/dashboard/app/components/ScriptsModal.tsx |   2 +-
 .../app/components/StashConflictModal.tsx          |   4 +-
 .../dashboard/app/components/TerminalModal.tsx     |   2 +-
 .../app/components/nodes/WorkflowNodeTypes.tsx     |  47 +--
 packages/i18n/locales/en/app.json                  | 274 +++++++--------
 packages/i18n/locales/es/app.json                  | 144 ++++++--
 packages/i18n/locales/fr/app.json                  | 144 ++++++--
 packages/i18n/locales/ko/app.json                  | 144 ++++++--
 packages/i18n/locales/zh-CN/app.json               | 144 ++++++--
 packages/i18n/locales/zh-TW/app.json               | 144 ++++++--
 packages/i18n/src/resources.d.ts                   | 375 +++++++++++++++++++--
 54 files changed, 1261 insertions(+), 442 deletions(-)

Fusion-Task-Id: FN-6769

Fusion-Task-Lineage: a8733dc9-3b48-47e6-88c4-020f83ab41de
2026-06-20 05:04:25 -07:00
gsxdsm
fec197afdf FN-6774: remove colored card edge accents
Remove saturated edge stripes from stuck task and agent cards while preserving state legibility.

- Keep stuck task board cards and list rows on neutral borders with tinted backgrounds and existing status badges.
- Replace agent card status edge accents with subtle state backgrounds and a selected-card inset ring.
- Add CSS regression coverage to prevent colored edge-border variants from returning.

Files changed:
 packages/dashboard/app/components/AgentsView.css   | 46 ++++++++---
 packages/dashboard/app/components/ListView.css     |  5 +-
 packages/dashboard/app/components/TaskCard.css     |  5 +-
 .../__tests__/stuck-and-agent-card-border.test.ts  | 92 ++++++++++++++++++++++
 4 files changed, 133 insertions(+), 15 deletions(-)

Fusion-Task-Id: FN-6774

Fusion-Task-Lineage: da49ca64-2c10-4594-888f-332cf4f9c8c8
2026-06-20 04:51:57 -07:00
gsxdsm
c32c925321 FN-6783: recover orphaned task dirs into the task index
Reconcile on-disk task.json records that are missing from SQLite without resurrecting tombstoned IDs.

- Add TaskStore orphaned task directory scanning with metadata validation, FTS-safe insertion, cache updates, lifecycle events, and run-audit entries.
- Run the reconcile during store init and self-healing maintenance for tasks created after startup.
- Cover recovery, skip, and maintenance behavior with core and engine regression tests.
- Document task index reconciliation and add the published package changeset.

Files changed:
 .changeset/fn-6783-orphaned-task-dir-reconcile.md  |   5 +
 AGENTS.md                                          |   1 +
 docs/architecture.md                               |   2 +
 docs/storage.md                                    |   8 +
 .../store-orphaned-task-dir-reconcile.test.ts      | 179 +++++++++++++++++++++
 packages/core/src/store.ts                         | 170 ++++++++++++++++++-
 .../self-healing-orphaned-task-dirs.test.ts        |  40 +++++
 packages/engine/src/self-healing.ts                |  14 ++
 8 files changed, 412 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-6783
Fusion-Task-Lineage: 5c8d4690-5278-4c29-8f02-32d9f01d581d
2026-06-20 04:40:31 -07:00
gsxdsm
adbb1bbaaf FN-6787: remove duplicate sidebar branding
Keep project identity controls in the Header while preserving sidebar navigation behavior.

- Remove the Fusion logo, wordmark, and project selector from the experimental left sidebar.
- Keep the sidebar collapse control reachable in expanded and collapsed modes.
- Update sidebar tests and dashboard docs to cover the simplified navigation surface.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/LeftSidebarNav.css    | 35 +-----------
 .../dashboard/app/components/LeftSidebarNav.tsx    | 33 ++----------
 .../components/__tests__/LeftSidebarNav.test.tsx   | 63 +++++++++++++++++++++-
 4 files changed, 67 insertions(+), 66 deletions(-)

Fusion-Task-Id: FN-6787
Fusion-Task-Lineage: 18321939-4a68-48c2-bdbe-18e69e198a57
2026-06-20 04:19:48 -07:00
gsxdsm
a98a0ae23e FN-6768: show actual concurrency slider values
Command Center concurrency controls now preserve persisted scheduler values and improve mobile slider handling.

- Load concurrency defaults from project settings and display persisted values without clamping the readout.
- Expand range slider maxima when existing settings exceed normal UI bounds while keeping edits bounded.
- Add mobile touch-drag affordance styling and regression coverage for actual values, overflow values, and CSS contracts.

Files changed:
 .../command-center/CommandCenterControls.css       | 26 +++++++-
 .../command-center/CommandCenterControls.tsx       | 63 +++++++++++++-----
 .../__tests__/CommandCenterControls.test.tsx       | 74 +++++++++++++++++++++-
 3 files changed, 143 insertions(+), 20 deletions(-)

Fusion-Task-Id: FN-6768

Fusion-Task-Lineage: 2508c2ab-9e57-4d29-934c-828a015bdfe1
2026-06-20 03:08:19 -07:00
gsxdsm
d2c7ff5f95 FN-6751: show idle task chat warning
Make task-detail chat disclose when sent guidance will not receive an immediate agent reply.

- Add an idle session hint for non-done tasks without an active steerable agent while keeping the composer sendable.
- Style the idle hint with warning color and expose a stable test id for regression coverage.
- Expand TaskChatTab tests across inline, expanded, empty, populated, paused, and non-live session states.
- Document the idle saved-guidance behavior in the dashboard guide.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 packages/dashboard/app/components/TaskChatTab.css  |  5 ++
 packages/dashboard/app/components/TaskChatTab.tsx  | 13 ++-
 .../app/components/__tests__/TaskChatTab.test.tsx  | 95 +++++++++++++++++++---
 4 files changed, 99 insertions(+), 16 deletions(-)

Fusion-Task-Id: FN-6751

Fusion-Task-Lineage: 21f0764d-23db-49ca-b737-3b6a8be7a918
2026-06-20 02:56:51 -07:00
gsxdsm
2ca2627533 FN-6788: verify bottom settings placement
Expand LeftSidebarNav tests to lock the settings control at the sidebar footer.

- Assert the settings button renders as the last sidebar button in the footer.
- Preserve bottom settings coverage when optional destinations are gated off and when the rail is collapsed.
- Cover clicking the settings button without an optional handler.

Files changed:
 .../components/__tests__/LeftSidebarNav.test.tsx   | 26 +++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-6788

Fusion-Task-Lineage: 7f378f59-094f-4be1-9fee-eafb1b631cf8
2026-06-20 02:46:54 -07:00
gsxdsm
98720f3626 FN-6766: fix mobile nav icon spacing
Keeps mobile bottom navigation icons evenly centered across tab variants.

- Make each mobile nav tab an equal-width flex column that ignores intrinsic label width.
- Center and truncate labels without affecting icon spacing.
- Add coverage for optional tabs, active tabs, badges, status dots, and overflow plugin views.
- Add a patch changeset for the published CLI bundle.

Files changed:
 .changeset/fn-6766-mobile-nav-spacing.md           |  5 ++
 packages/dashboard/app/components/MobileNavBar.css | 18 ++--
 .../app/components/__tests__/MobileNavBar.test.tsx | 95 ++++++++++++++++++++++
 3 files changed, 113 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-6766

Fusion-Task-Lineage: 0fe92813-9110-4bc9-b0d0-39d98dc7dba9
2026-06-20 02:38:27 -07:00
gsxdsm
c4f34ceed1 FN-6767: make agents sidebar resizable
Make the Agents split view wider by default and persist user-adjusted sidebar widths.

- Add a desktop/tablet resize handle with pointer and keyboard controls, clamped accessible values, and per-project storage.\n- Update split-layout CSS so mobile remains stacked while non-mobile views reserve a resize affordance column.\n- Cover default, stored, clamped, pointer, keyboard, mobile, and org-chart sidebar behaviors in tests.\n- Add a patch changeset for the published Fusion package.\n\nFiles changed:\n .changeset/fn-6767-agents-sidebar.md               |   5 +\n packages/dashboard/app/components/AgentsView.css   |  47 ++++++--\n packages/dashboard/app/components/AgentsView.tsx   | 101 +++++++++++++++-\n .../app/components/__tests__/AgentsView.test.tsx   | 132 +++++++++++++++++++++\n .../app/utils/__tests__/projectStorage.test.ts     |   3 +-\n packages/dashboard/app/utils/projectStorage.ts     |   1 +\n 6 files changed, 280 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-6767

Fusion-Task-Lineage: 93605e16-7524-4577-bbcd-666c105a867b
2026-06-20 02:25:11 -07:00
gsxdsm
7eceec00cc FN-6763: add themed workflow status switcher
Add a reusable dashboard workflow picker that shows inline task status counts across board and list views.

- Replace native workflow selects with a themed accessible dropdown component.
- Share workflow status count calculation between board and list views.
- Add styling, i18n labels, tests, and dashboard docs for the switcher behavior.

Files changed:
 docs/dashboard-guide.md                            |   3 +-
 packages/dashboard/app/components/Board.tsx        |  28 +--
 packages/dashboard/app/components/Lane.css         |   2 +
 .../dashboard/app/components/LeftSidebarNav.tsx    |   2 +-
 packages/dashboard/app/components/ListView.css     |  17 --
 packages/dashboard/app/components/ListView.tsx     |  31 ++-
 .../dashboard/app/components/WorkflowSwitcher.css  | 186 ++++++++++++++
 .../dashboard/app/components/WorkflowSwitcher.tsx  | 270 +++++++++++++++++++++
 .../app/components/__tests__/Board.test.tsx        |  60 +++--
 .../app/components/__tests__/ListView.test.tsx     |  79 +++++-
 .../components/__tests__/WorkflowSwitcher.test.tsx |  92 +++++++
 .../__tests__/workflowStatusCounts.test.ts         | 122 ++++++++++
 .../app/components/workflowStatusCounts.ts         |  54 +++++
 packages/i18n/locales/en/app.json                  |   9 +
 packages/i18n/locales/es/app.json                  |   9 +
 packages/i18n/locales/fr/app.json                  |   9 +
 packages/i18n/locales/ko/app.json                  |   9 +
 packages/i18n/locales/zh-CN/app.json               |   9 +
 packages/i18n/locales/zh-TW/app.json               |   9 +
 19 files changed, 930 insertions(+), 70 deletions(-)

Fusion-Task-Id: FN-6763
Fusion-Task-Lineage: 3503ea85-841a-4cd3-9960-1b22ef2cd4ea
2026-06-20 02:08:36 -07:00
gsxdsm
1ab2d4161a FN-6789: make dashboard utility views fill flex rows
Goals, Research, and Stash Recovery now keep full-width layouts inside the project-content flex row.

- Add flex growth, zero min-width, and full-width root sizing to Goals, Research, and Stash Recovery views.
- Document the view-level flex sizing requirement with FNXC comments.
- Add CSS contract tests for both bundled and base CSS fixtures.

Files changed:
 packages/dashboard/app/components/GoalsView.css      |  7 +++++++
 packages/dashboard/app/components/ResearchView.css   |  7 +++++++
 .../dashboard/app/components/StashRecoveryView.css   |  7 +++++++
 .../app/components/__tests__/GoalsView.test.tsx      | 20 ++++++++++++++++++++
 .../app/components/__tests__/ResearchView.test.tsx   | 19 +++++++++++++++++++
 .../components/__tests__/StashRecoveryView.test.tsx  | 20 ++++++++++++++++++++
 6 files changed, 80 insertions(+)

Fusion-Task-Id: FN-6789

Fusion-Task-Lineage: f650d95b-583b-48c8-a2e4-fe63317b4576
2026-06-20 01:52:26 -07:00
gsxdsm
58a6dccfb2 FN-6758: set shadcn theme accent orange
Update the default shadcn dashboard theme to use orange highlight accents while keeping its neutral base.\n\n- Set dark and light shadcn accent tokens and accent text for orange highlights.\n- Update shadcn theme swatches and documentation to reflect the orange accent.\n- Adjust theme tests to assert the orange accent token and preserved glow neutralization.\n\nFiles changed:\n docs/dashboard-guide.md                                 |  2 +-\n packages/dashboard/app/components/ThemeSelector.css     |  4 ++--\n packages/dashboard/app/hooks/__tests__/useTheme.test.ts | 12 ++++++++----\n packages/dashboard/app/public/theme-data.css            | 11 +++++++----\n 4 files changed, 18 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-6758

Fusion-Task-Lineage: b4fe5a6d-416e-4cd1-be57-7e6da5a07f59
2026-06-20 01:43:20 -07:00
gsxdsm
7559883940 FN-6765: fix mobile nav mailbox duplication
Keep Mailbox as a single top-level entry while Todos stays in overflow navigation.

- Remove the duplicate Mailbox action from the mobile More sheet while preserving its primary-tab badges.
- Cover desktop, tablet, and mobile navigation placement expectations for Todos and Mailbox.
- Update dashboard docs to describe compact Header and mobile bottom-nav mailbox indicators.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 .../mobile-feature-access-regression.test.tsx      |  3 +-
 packages/dashboard/app/components/MobileNavBar.tsx | 22 +++---------
 .../app/components/__tests__/Header.test.tsx       | 19 +++++++----
 .../app/components/__tests__/MobileNavBar.test.tsx | 39 ++++++++++++++++++----
 5 files changed, 52 insertions(+), 33 deletions(-)

Fusion-Task-Id: FN-6765
Fusion-Task-Lineage: e32f271e-7dab-43e0-b824-da598641aa77
2026-06-20 01:34:51 -07:00
gsxdsm
10208ecd63 FN-6764: make research and insights tablet layouts full width
Research and Insights now reflow at tablet widths to avoid cut-off content while preserving mobile and desktop behavior.

- Add tablet-specific full-width Research layout rules with shrink-safe reader/history containers.
- Add tablet-specific Insights layout rules that stack the category rail above the detail pane.
- Cover Research and Insights responsive CSS contracts across desktop, mobile, and tablet tiers.

Files changed:
 packages/dashboard/app/components/InsightsView.css | 67 ++++++++++++++++++++++
 packages/dashboard/app/components/ResearchView.css | 47 +++++++++++++++
 .../app/components/__tests__/InsightsView.test.tsx | 20 +++++++
 .../app/components/__tests__/ResearchView.test.tsx | 13 +++++
 4 files changed, 147 insertions(+)

Fusion-Task-Id: FN-6764

Fusion-Task-Lineage: ed528038-e69b-4794-9885-fb3b5f47b3ed
2026-06-20 01:27:54 -07:00
gsxdsm
aaa1aa2fed FN-6786: narrow experimental sidebar labels
Refine the experimental left sidebar so it uses shorter labels in a narrower layout.

- Reduce the default and tokenized sidebar width while preserving resize bounds.
- Switch sidebar entries to noun labels and remove plugin "view" suffixes.
- Shorten the Compound Engineering plugin label to Compound and cover the behavior in sidebar tests.
- Add localized nav label keys for supported app locales.

Files changed:
 .../dashboard/app/components/LeftSidebarNav.css    |  2 +-
 .../dashboard/app/components/LeftSidebarNav.tsx    | 34 ++++++++++++------
 .../components/__tests__/LeftSidebarNav.test.tsx   | 40 ++++++++++++++++++++++
 packages/i18n/locales/en/app.json                  |  2 ++
 packages/i18n/locales/es/app.json                  |  2 ++
 packages/i18n/locales/fr/app.json                  |  2 ++
 packages/i18n/locales/ko/app.json                  |  2 ++
 packages/i18n/locales/zh-CN/app.json               |  2 ++
 packages/i18n/locales/zh-TW/app.json               |  2 ++
 9 files changed, 76 insertions(+), 12 deletions(-)

Fusion-Task-Id: FN-6786

Fusion-Task-Lineage: e8a35018-3b9c-44f6-a4ae-5b6a59281df3
2026-06-20 01:11:42 -07:00
gsxdsm
2e3b965909 FN-6757: smooth mobile Quick Chat keyboard resizing
Smooth Quick Chat mobile panel height changes while keeping viewport sampling synchronous.\n\n- Add Android resize-content detection that toggles height easing only for coarse keyboard viewport samples.\n- Clear smoothing and viewport CSS variables on blur, unmount, and suppressed shrink paths.\n- Cover Android smoothing, iOS offsetTop refocus, Latest gate, and streaming state with Quick Chat regression tests.\n- Document the mobile keyboard smoothing behavior and add a published package changeset.\n\nFiles changed:\n .changeset/smooth-mobile-quick-chat-keyboard.md    |   5 +\n docs/dashboard-guide.md                            |   1 +\n .../quick-chat-mobile-keyboard-board-shift.md      |   2 +\n packages/dashboard/app/components/QuickChatFAB.css |   8 ++\n packages/dashboard/app/components/QuickChatFAB.tsx |  17 +++\n .../app/components/__tests__/QuickChatFAB.test.tsx | 141 +++++++++++++++++++++\n 6 files changed, 174 insertions(+)

Fusion-Task-Id: FN-6757

Fusion-Task-Lineage: d301aee8-ef76-4d70-a4cd-91641bb05259
2026-06-20 00:41:36 -07:00
gsxdsm
24fd4952bb FN-6753: isolate routes-auth from dashboard backfill
Preserve auth route coverage by moving the suite out of the contended API backfill shard.\n\n- Add routes-auth to the curated dashboard API quality shard.\n- Document the FN-6753 suite-load coupling classification and shard-isolation remedy.\n\nFiles changed:\n docs/testing.md                     | 4 ++++\n packages/dashboard/vitest.config.ts | 7 ++++++-\n 2 files changed, 10 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6753

Fusion-Task-Lineage: 4da2f45f-87ba-4b80-baed-68dbde93a09e
2026-06-20 00:30:54 -07:00
gsxdsm
9483670d6a FN-6755: move org chart and heartbeat controls to Team
Relocate Command Center team operations out of Overview and into the Team section.

- Render the agent org chart and heartbeat pause/resume controls above Team analytics.
- Keep Overview controls focused on global engine, concurrency, and theme settings.
- Add Team-specific styling and tests for org chart, heartbeat, and responsive placement.
- Update Command Center documentation to describe the new Team operations layout.

Files changed:
 docs/dashboard-guide.md                            |   5 +-
 .../components/command-center/CommandCenter.tsx    |   2 +-
 .../command-center/CommandCenterControls.css       |  61 ------
 .../command-center/CommandCenterControls.tsx       | 188 +------------------
 .../__tests__/CommandCenter.mobile-scroll.test.tsx |   8 +-
 .../__tests__/CommandCenter.tablet-layout.test.tsx |   2 +-
 .../__tests__/CommandCenter.test.tsx               |   4 +
 .../__tests__/CommandCenterControls.test.tsx       |  89 +--------
 .../components/command-center/areas/TeamArea.tsx   | 204 ++++++++++++++++++++-
 .../command-center/areas/__tests__/areas.test.tsx  | 123 ++++++++++++-
 .../app/components/command-center/areas/areas.css  | 181 ++++++++++++++++++
 11 files changed, 526 insertions(+), 341 deletions(-)

Fusion-Task-Id: FN-6755

Fusion-Task-Lineage: 63ceb609-f0e3-4e02-8fea-c97cfc18ccf2
2026-06-20 00:15:25 -07:00
gsxdsm
24246fba2b FN-6772: add experimental left sidebar navigation
Add a flag-gated desktop/tablet sidebar navigation surface while preserving mobile navigation behavior.

- Add LeftSidebarNav with project selection, primary and overflow destinations, badges, collapsed state, and resize persistence.
- Wire the experimental flag through App and Header so the sidebar owns non-mobile navigation when enabled.
- Style the sidebar shell, resize handle, collapsed rail, and project selector adaptations.
- Document the experiment and cover sidebar/mobile navigation regressions with tests.

Files changed:
 docs/dashboard-guide.md                            |  10 +
 packages/dashboard/app/App.tsx                     |  52 ++-
 .../mobile-feature-access-regression.test.tsx      |  94 ++++-
 packages/dashboard/app/components/Header.tsx       |  12 +-
 .../dashboard/app/components/LeftSidebarNav.css    | 217 ++++++++++
 .../dashboard/app/components/LeftSidebarNav.tsx    | 465 +++++++++++++++++++++
 .../dashboard/app/components/ProjectSelector.css   |  20 +
 .../dashboard/app/components/SettingsModal.tsx     |   1 +
 .../components/__tests__/LeftSidebarNav.test.tsx   | 201 +++++++++
 9 files changed, 1063 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-6772
Fusion-Task-Lineage: 13ba4ea0-e64b-47a0-abf0-3134a750007a
2026-06-19 23:28:35 -07:00
gsxdsm
a326e8e684 FN-6717: move Nodes into Command Center
Move node management into the Command Center experience while removing the separate Nodes overlay entry points.

- Add a gated Nodes tab to Command Center and pass toast wiring through from App.
- Remove top-level header and mobile-nav Nodes overlay controls and overlay-only styling.
- Let NodesView render without a close button when embedded as a tab.
- Update navigation, lazy-load docs, mobile access, and Command Center tests for the new surface.

Files changed:
 AGENTS.md                                          |  3 +-
 packages/dashboard/app/App.tsx                     | 57 ++-------------
 .../app/__tests__/lazy-loaded-views-docs.test.ts   | 11 +--
 .../mobile-feature-access-regression.test.tsx      | 12 ++--
 packages/dashboard/app/components/Header.tsx       | 33 +--------
 packages/dashboard/app/components/MobileNavBar.tsx | 16 -----
 packages/dashboard/app/components/NodesView.css    | 37 ----------
 packages/dashboard/app/components/NodesView.tsx    | 22 +++---
 .../app/components/__tests__/Header.test.tsx       | 22 ++----
 .../app/components/__tests__/MobileNavBar.test.tsx | 22 +-----
 .../app/components/__tests__/NodesView.test.tsx    | 81 +++-------------------
 ...-merge-toggle-blank.mobile-integration.test.tsx |  1 -
 .../components/command-center/CommandCenter.tsx    | 17 ++++-
 .../__tests__/CommandCenter.mobile-scroll.test.tsx |  2 +-
 .../__tests__/CommandCenter.tablet-layout.test.tsx |  2 +-
 .../__tests__/CommandCenter.test.tsx               | 40 ++++++++++-
 packages/dashboard/app/styles.css                  |  2 +-
 packages/i18n/locales/en/app.json                  |  1 +
 18 files changed, 106 insertions(+), 275 deletions(-)

Fusion-Task-Id: FN-6717

Fusion-Task-Lineage: 89306335-c247-4c66-8937-adfdf8c3cbb8
2026-06-19 23:16:19 -07:00
gsxdsm
f3343ca79f FN-6754: restore Command Center tablet API mocks
Restore the Command Center tablet layout test mock contract so hook refresh calls resolve cleanly.

- Export fetchConfig, fetchSettings, and updateSettings from the tablet test api mock.
- Document why the real useAppSettings hook requires the full api mock surface.
- Preserve task fixture updates for populated productivity metrics.

Files changed:
 .../command-center/__tests__/CommandCenter.mobile-scroll.test.tsx | 2 +-
 .../command-center/__tests__/CommandCenter.tablet-layout.test.tsx | 8 ++++++--
 2 files changed, 7 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-6754

Fusion-Task-Lineage: 5c5955e3-7b23-4fb3-baf5-4ba9dcfeef2e
2026-06-19 23:06:44 -07:00
gsxdsm
28ba1bce85 FN-6784: keep Command Center numbers on one line
Command Center token totals now shrink to fit instead of wrapping digit groups.

- Add inline-size containers around stat cards and live metrics for container-query scaling.
- Replace digit wrapping with nowrap overflow clipping and clamp-based numeric font sizes.
- Strengthen Command Center tests for exact live metric values and CSS no-wrap shrink contracts.

Files changed:
 .../app/components/command-center/CommandCenter.css   | 17 ++++++++++++-----
 .../command-center/__tests__/CommandCenter.test.tsx   |  3 ++-
 .../CommandCenter.token-validity.css.test.ts          | 19 +++++++++++++++----
 3 files changed, 29 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-6784

Fusion-Task-Lineage: dfe165f4-7304-49eb-b46b-83c0a9e2c4a3
2026-06-19 22:31:57 -07:00
gsxdsm
a63cf1c911 FN-6750: harden task chat steering coverage
Verify task chat timestamps and immediate steering delivery across UI, route, and executor surfaces.

- Assert inline and expanded TaskChatTab timestamp parity for agent output and user steering comments.
- Cover steering route wake payloads so assigned agents receive the newest steering comment id immediately.
- Harden executor real-time steering tests for seen-before-inject ordering, queued prompt delivery, duplicate suppression, and empty-comment no-ops.

Files changed:
 .../app/components/__tests__/TaskChatTab.test.tsx  |  79 +++++++++++-
 .../src/__tests__/routes-tasks-ops.test.ts         | 136 +++++++++++++++++++++
 .../src/__tests__/executor-step-session.test.ts    | 116 ++++++++++++++++--
 3 files changed, 316 insertions(+), 15 deletions(-)

Fusion-Task-Id: FN-6750

Fusion-Task-Lineage: 48e1d57d-fd37-4d45-9b98-766c4a2f704d
2026-06-19 22:24:18 -07:00
gsxdsm
d4d7623ee0 FN-6749: rebaseline i18n lint guardrail
Rebaseline the i18n hardcoded-string lint guardrail for shipping dashboard surfaces.

- Add scoped i18n lint ignores for non-shipping tests, stories, and deferred source-copy files with follow-up rationale.
- Localize remaining plugin/view copy and replace technical glyph literals that should not be linted as prose.
- Refresh synced locale catalogs and generated resource types, and document the lint baseline policy.

Files changed:
 .changeset/fn-6749-i18n-lint-rebaseline.md         |    5 +
 docs/i18n-contributing.md                          |   14 +
 i18next.config.ts                                  |   96 ++
 .../dashboard/app/components/AgentDetailView.tsx   |    4 +-
 .../app/components/ConversationHistory.tsx         |    4 +-
 .../app/components/DockerNodeOnboardingModal.tsx   |    8 +-
 .../components/MilestoneSliceInterviewModal.tsx    |    4 +-
 .../app/components/MissionInterviewModal.tsx       |    4 +-
 .../app/components/ModelSelectionModal.tsx         |    4 +-
 .../dashboard/app/components/NodeDetailModal.tsx   |   15 +-
 .../dashboard/app/components/PlanningModeModal.tsx |    4 +-
 .../dashboard/app/components/SessionTerminal.tsx   |   15 +-
 .../app/components/SubtaskBreakdownModal.tsx       |    4 +-
 packages/dashboard/app/components/TaskForm.tsx     |    4 +-
 .../dashboard/app/components/TerminalModal.tsx     |   18 +-
 .../dashboard/app/plugins/pluginViewRegistry.tsx   |    7 +-
 packages/i18n/locales/en/app.json                  |  890 +++++++++---
 packages/i18n/locales/en/common.json               |   82 +-
 packages/i18n/locales/es/app.json                  |  986 ++++++++++---
 packages/i18n/locales/es/common.json               |   82 +-
 packages/i18n/locales/fr/app.json                  |  986 ++++++++++---
 packages/i18n/locales/fr/common.json               |   82 +-
 packages/i18n/locales/ko/app.json                  | 1482 ++++++++++++++------
 packages/i18n/locales/ko/cli.json                  |    8 +-
 packages/i18n/locales/ko/common.json               |   82 +-
 packages/i18n/locales/zh-CN/app.json               | 1482 ++++++++++++++------
 packages/i18n/locales/zh-CN/cli.json               |    8 +-
 packages/i18n/locales/zh-CN/common.json            |   82 +-
 packages/i18n/locales/zh-TW/app.json               | 1482 ++++++++++++++------
 packages/i18n/locales/zh-TW/cli.json               |    8 +-
 packages/i18n/locales/zh-TW/common.json            |   82 +-
 packages/i18n/src/resources.d.ts                   |  459 +++---
 32 files changed, 6055 insertions(+), 2438 deletions(-)

Fusion-Task-Id: FN-6749

Fusion-Task-Lineage: 789a7cbb-fdf8-4190-8cd2-6bf7d5e2d552
2026-06-19 22:14:57 -07:00
gsxdsm
e78853708a Raise min heartbeat staleness floor 5m -> 10m
Agents stop heartbeating during long legitimate work (e.g. a verification
step blocked on a multi-minute test command). The 5-minute floor could
misread a busy agent as dead and reclaim its in-progress task mid-run.
Raise MIN_HEARTBEAT_STALENESS_MS to 10 minutes and strengthen the floor
test (7-minute-silent fast-interval agent stays healthy — would have read
stale under the old 5-minute floor). Engine typecheck clean; heartbeat
suite 148/148 pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 21:46:00 -07:00
gsxdsm
a3be2351d1 Fix Full Suite test failures: productivity fixtures + delete teardown race
Three failures in the non-blocking Full Suite:

- CommandCenter mobile-scroll / tablet-layout regression tests rendered with
  productivity fixtures missing the `hoursSaved` field added in FN-6721. That
  made ProductivityArea throw on `data.hoursSaved.unavailable`, an uncaught
  exception that crashed the CommandCenter render (no `command-center` testid)
  and polluted the shared worker, causing collateral QuickEntryBox failures.
  Add `hoursSaved` to both fixtures.

- github-tracking-delete route test failed intermittently with
  `ENOTEMPTY: ... rmdir '.../.fusion'` because the fire-and-forget delete
  handler can write into `.fusion` while afterEach removes the temp dir. Make
  rm tolerant via maxRetries/retryDelay.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 21:09:12 -07:00
gsxdsm
0c0fda1d7d FN-6781: keep Command Center inline in the header
Keep Command Center anchored as an inline header destination while preserving changed-test coverage selection.

- Render Command Center immediately after Agents on tablet and desktop instead of moving it into the More views overflow.
- Update header and tablet tests plus docs to lock the stable inline navigation contract.
- Treat the quarantine data file as test-irrelevant so edits do not force gate mode and drop affected-package tests.

Files changed:
 .changeset/fix-quarantine-json-gate-mode.md        |  5 ++
 .changeset/fn-6781-command-center-header.md        |  5 ++
 CONCEPTS.md                                        |  3 +
 docs/dashboard-guide.md                            |  4 +-
 ...data-file-forces-gate-mode-dropping-coverage.md | 74 ++++++++++++++++++++++
 .../app/__tests__/tablet-header-controls.test.tsx  |  7 +-
 packages/dashboard/app/components/Header.tsx       | 51 +++++----------
 .../app/components/__tests__/Header.test.tsx       |  8 ++-
 scripts/__tests__/test-changed.test.mjs            | 20 ++++++
 scripts/test-changed.mjs                           |  8 +++
 10 files changed, 142 insertions(+), 43 deletions(-)

Fusion-Task-Id: FN-6781

Fusion-Task-Lineage: d328501d-7ec4-40ac-a140-6a491ea560e2
2026-06-19 20:59:05 -07:00
gsxdsm
60557cfea6 Merge pull request #1687 from Runfusion/fix/pause-abort-worktree-leak-storm
Fix pause-abort worktree-slot leak + retry storm; add board auto-recovery
2026-06-20 11:57:31 +08:00
gsxdsm
7f0ad62731 Update executor-recovery test for benign todo pause-abort (FN-6782)
The gate test asserted the OLD behavior — a paused graph exit in the `todo`
column parked `status:"failed"` with "operator action required". FN-6782
made the todo case benign (no failed park; benign log + cleared marker), so
split the parameterized test: `todo` now asserts the benign path (never
parked failed), `done` keeps the operator-action surfacing (log only, no
park). Full engine-core gate suite passes (644/644).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 20:53:37 -07:00
gsxdsm
8c93e2ad6b Re-check execution ownership before reaping a leaked slot (PR #1687)
coderabbit Major: reapLeakedConcurrencySlots captured executingIds once
before the loop, but each holder awaits getTask — a task could start
executing mid-sweep and have its worktree slot pulled. Refresh the
executing set immediately before clearPhantomExecutorBinding and skip if
the holder is now executing (same race the A1 recovery fix closed).
clearPhantomExecutorBinding's live-session refusal remains the last line
of defense; this avoids racing it. Added a mid-sweep race test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 20:34:53 -07:00
gsxdsm
7eaf513944 Address PR #1687 review: harden pause-abort recovery + FNXC comments
Substantive (A1 recoverPausedAbortFailures):
- Self-guard on globalPause/enginePaused at method entry (greptile P1) — the
  public method must not requeue tasks an operator intentionally froze.
- Re-validate the FULL predicate with a FRESH executing set on the re-read
  before the backward move (coderabbit Major + greptile): add fresh.userPaused
  and column re-check so a task that became ineligible across awaits is skipped.
- Isolate audit emission in its own try/catch (coderabbit) so an audit throw
  after a successful mutation can't log a false "recovery failed".
- Decouple the recovery predicate from the literal error text via shared
  PAUSE_ABORT_PARK_ERROR_MARKER/OPERATOR_MARKER constants (greptile) — the
  executor builds the parked message from the same constants.
- Use the wired clearPhantomExecutorBinding (live-session-guarded) instead of
  the declared-but-never-wired releaseExecutorWorktreeOwnership, which no-op'd.

Nits:
- FNXC-prefix new comments in executor.ts, run-audit.ts, and the benign test
  per repo comment policy.
- Fix a test-only type error on the clearPhantomExecutorBinding mock.

Added a test asserting the globalPause self-guard. Engine typecheck clean;
pause-abort/reaper/benign + regression suites pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 20:10:50 -07:00
gsxdsm
8e4b9e4f0f Add leaked-slot reaper (A2) to self-healing
reapLeakedConcurrencySlots() reclaims in-memory worktree slots whose
holder is no longer in-progress (the FN-6756 "in todo yet still a
maxWorktrees holder" leak) without an engine restart — defense-in-depth
behind the source fix.

- executor: new listWorktreeHolders() read-only introspection over
  activeWorktrees; wired through in-process-runtime to SelfHealingManager.
- reaper releases ONLY when every guard agrees: not executing, task
  missing or in todo/triage, past a 60s grace, and clearPhantomExecutor
  Binding itself refuses (returns false) if a live session surface is
  registered — so it can never pull a worktree from a running agent.
- registered in maintenance batch 2 (respects globalPause/enginePaused
  skip + FN-4962 ordering).
- widened the clearPhantomExecutorBinding option type to surface its
  boolean refusal signal.

Engine typecheck clean; 19 tests pass (new reaper 7 cases + regression).

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