Commit Graph

11546 Commits

Author SHA1 Message Date
gsxdsm
4df5c62854 FN-8133: add local codebase context metrics
Expose local codebase token estimates and apparent disk size in the project dashboard.

- Add a bounded, cached, symlink-safe codebase metrics service and project API.
- Display token and disk indicators across Command Center overview states.
- Add formatting, route, UI, and metric calibration coverage with a minor changeset.

Files changed:
 .changeset/fn-8133-codebase-metrics.md             |   7 +
 docs/dashboard-guide.md                            |   2 +-
 .../dashboard/app/__tests__/api-projects.test.ts   |  12 ++
 packages/dashboard/app/api/legacy.ts               |  14 ++
 .../components/command-center/CommandCenter.css    |   5 +
 .../components/command-center/CommandCenter.tsx    |  65 +++++++--
 .../CommandCenter.mobile-chart-layout.test.ts      |   4 +
 .../__tests__/CommandCenter.test.tsx               |  10 ++
 .../__tests__/SystemStatsArea.test.tsx             |   8 +
 .../command-center/areas/SystemStatsArea.tsx       |   8 +-
 .../app/utils/__tests__/formatBytes.test.ts        |  18 +++
 packages/dashboard/app/utils/formatBytes.ts        |  11 ++
 .../src/lib/__tests__/codebase-metrics.test.ts     |  62 ++++++++
 .../lib/__tests__/fixtures/token-corpus/README.md  |  17 +++
 .../fixtures/token-corpus/calibration/component.ts |   1 +
 .../fixtures/token-corpus/calibration/config.json  |   1 +
 .../lib/__tests__/fixtures/token-corpus/example.ts |   1 +
 .../lib/__tests__/fixtures/token-corpus/notes.md   |   3 +
 .../fixtures/token-corpus/reference-counts.json    |   9 ++
 .../__tests__/fixtures/token-corpus/settings.json  |   1 +
 .../lib/__tests__/fixtures/token-corpus/view.tsx   |   1 +
 packages/dashboard/src/lib/codebase-metrics.ts     | 161 +++++++++++++++++++++
 .../__tests__/codebase-metrics-route.test.ts       |  34 +++++
 .../src/routes/register-project-routes.ts          |  19 +++
 24 files changed, 456 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-8133

Fusion-Task-Lineage: d591636b-d4b8-469e-8788-c4516eeb8405

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 14:08:43 -07:00
gsxdsm
d306ab67b2 FN-8140: reuse host TaskStore across extension loads
Reuse process-wide extension store state to prevent duplicate backend boots from blocking agent reads.

- Share TaskStore cache, boot-inflight, and failure cooldown state across ESM module instances.
- Preserve host-injected stores when cold boots race and add bounded boot-resolution coverage.
- Add a patch changeset for responsive agent reads.

Files changed:
 .changeset/fn-8140-taskstore-boot-timeout.md       |  7 ++
 .../src/__tests__/extension-tool-timeout.test.ts   | 88 +++++++++++++++++++++-
 packages/cli/src/extension.ts                      | 48 ++++++++++--
 3 files changed, 136 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-8140

Fusion-Task-Lineage: de32f4e9-5870-4d8f-8454-2fe342a575a8

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 14:01:59 -07:00
gsxdsm
f111a40c72 FN-8130: default Settings to Appearance
Open Settings on the always-visible Appearance section by default.

- Change the Settings modal default and unavailable-section fallback to Appearance.
- Cover desktop and mobile default selection and fallback behavior.
- Add a patch changeset for the corrected landing section.

Files changed:
 .changeset/default-settings-appearance.md          |  7 ++++++
 .../dashboard/app/components/SettingsModal.tsx     | 16 ++++++++------
 .../__tests__/SettingsModal.general.test.tsx       | 15 +++++++------
 .../SettingsModal.remote-notifications.test.tsx    |  4 ++--
 .../SettingsModal.scheduling-merge.test.tsx        | 11 ++++++----
 .../components/__tests__/settings-mobile.test.tsx  | 25 ++++++++++++++++------
 6 files changed, 53 insertions(+), 25 deletions(-)

Fusion-Task-Id: FN-8130

Fusion-Task-Lineage: de9e31d8-98e5-4a02-8135-c5a397f7b8ad

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 13:55:37 -07:00
gsxdsm
2c3a777bca FN-8132: recover bare worktree branch collisions
Recover safe worktree creation when a dangling task branch already exists.

- Classify bare branch collisions and preserve foreign or mixed commit history.
- Reuse task-owned branches or recreate merged branches from the pinned start point.
- Audit recovery outcomes and cover native, fallback, and workspace acquisition paths.

Files changed:
 .../fn-8132-worktree-branch-collision-recovery.md  |   7 ++
 docs/architecture.md                               |   1 +
 .../__tests__/worktree-acquisition-backend.test.ts |  69 +++++++++++
 .../worktree-acquisition-workspace.test.ts         |  21 ++++
 .../worktree-backend-branch-collision.test.ts      | 132 +++++++++++++++++++++
 packages/engine/src/branch-conflicts.ts            | 121 +++++++++++++++++++
 packages/engine/src/run-audit.ts                   |   1 +
 packages/engine/src/worktree-acquisition.ts        |   3 +-
 packages/engine/src/worktree-backend.ts            |  94 +++++++++++++++-
 9 files changed, 447 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8132

Fusion-Task-Lineage: f09d140f-4fcd-48a6-99b1-a351630f37bd

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 13:48:00 -07:00
gsxdsm
60b6e3e048 FN-7996: add configurable executor tool-failure retries
Add bounded, durable same-model retry handling for qualifying consecutive executor tool errors.
- Persist retry claims, cursors, and audit markers with PostgreSQL migrations.
- Expose project retry count, backoff, and failure threshold settings in the dashboard.
- Cover retry, exhaustion, reset, and stale-run safety behavior with tests.

Files changed:
 .changeset/fn-7996-executor-tool-failure-retry.md  |   7 +
 AGENTS.md                                          |   1 +
 docs/architecture.md                               |   1 +
 docs/settings-reference.md                         |  10 ++
 .../executor-tool-failure-retry-claim.test.ts      |  17 +++
 .../core/src/__tests__/manual-retry-reset.test.ts  |   3 +
 .../core/src/__tests__/settings-defaults.test.ts   |  15 +-
 packages/core/src/in-review-stall.ts               |  20 +++
 packages/core/src/index.gate.ts                    |   6 +
 packages/core/src/index.ts                         |   6 +
 packages/core/src/manual-retry-reset.ts            |   3 +
 .../0013_executor_tool_failure_retry.sql           |   4 +
 packages/core/src/postgres/schema-applier.ts       |  17 +++
 packages/core/src/postgres/schema/project.ts       |   3 +
 packages/core/src/settings-schema.ts               |   3 +
 packages/core/src/store.ts                         |  10 +-
 packages/core/src/task-store/persistence.ts        |   7 +
 packages/core/src/task-store/remaining-ops-2.ts    |   2 +-
 packages/core/src/task-store/remaining-ops-3.ts    |   2 +-
 packages/core/src/task-store/remaining-ops-6.ts    |  65 ++++++++-
 packages/core/src/task-store/serialization.ts      |   3 +
 packages/core/src/task-store/task-update.ts        |   6 +
 packages/core/src/types.ts                         |  16 +++
 .../dashboard/app/components/SettingsModal.tsx     |  15 ++
 .../app/components/settings/section-keys.ts        |   3 +
 .../settings/sections/SchedulingSection.search.ts  |  27 ++++
 .../settings/sections/SchedulingSection.tsx        |   4 +
 .../settings-default-descriptions.test.tsx         |   3 +
 .../__tests__/executor-tool-failure-retry.test.ts  | 160 +++++++++++++++++++++
 packages/engine/src/executor.ts                    |  87 ++++++++++-
 packages/i18n/locales/en/app.json                  |   6 +
 31 files changed, 523 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-7996
Fusion-Task-Lineage: d1682ef8-534c-410e-b74c-1f2cf176eac2
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 13:41:14 -07:00
gsxdsm
6f99fdb18b FN-8137: add PR checks refresh control
Let GitHub pull request previews refresh their current check status and comments.

- Add an accessible refresh action that bypasses the selected PR detail cache
- Prevent stale refresh responses from overwriting cached or visible PR details
- Cover refresh behavior across modal and embedded views, and document the control
- Add a minor changeset for the new GitHub import capability

Files changed:
 .changeset/fn-8137-refresh-pr-checks.md            |   7 ++
 docs/dashboard-guide.md                            |   2 +-
 .../dashboard/app/components/GitHubImportModal.css |  29 ++++++
 .../dashboard/app/components/GitHubImportModal.tsx |  48 +++++++--
 .../__tests__/GitHubImportModal.test.tsx           | 115 +++++++++++++++++++++
 5 files changed, 191 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-8137

Fusion-Task-Lineage: 1d4ffa9d-635c-4d59-b17c-63075f6d8c5e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 13:34:54 -07:00
gsxdsm
255e9c19b9 FN-8134: add update banner restart action
Offer a supervised Fusion restart directly after an in-app update succeeds.

- Add restart capability detection, scheduling feedback, and manual-restart guidance to the update banner
- Cover supported, unsupported, failed, loading, and mobile restart states
- Document the update flow and add a minor CLI changeset

Files changed:
 .changeset/fn-8134-restart-after-update.md         |   7 ++
 docs/dashboard-guide.md                            |   2 +-
 packages/dashboard/app/components/UpdateAvailableBanner.css |  10 +-
 packages/dashboard/app/components/UpdateAvailableBanner.tsx | 100 +++++++++++++--
 packages/dashboard/app/components/__tests__/UpdateAvailableBanner.test.tsx | 139 ++++++++++++++++++---
 packages/i18n/locales/en/app.json                  |   4 +
 6 files changed, 236 insertions(+), 26 deletions(-)

Fusion-Task-Id: FN-8134

Fusion-Task-Lineage: 84f9290e-aa87-4144-a9db-da445dcb76e3

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 13:29:25 -07:00
gsxdsm
3e55492c97 FN-8128: restore CLI Binary to basic Settings
Restore the CLI Binary settings panel to the default-visible Settings navigation.

- Remove CLI Binary from Advanced-only sections and place it in the Global group.
- Cover desktop navigation, search, Advanced mode, and mobile picker visibility.
- Add a patch changeset for the restored default access.

Files changed:
 .changeset/fn-8128-cli-binary-out-of-advanced.md   |   7 ++
 .../dashboard/app/components/SettingsModal.tsx     |  14 ++-
 .../SettingsModal.cliBinaryVisibility.test.tsx     | 124 +++++++++++++++++++++
 .../components/__tests__/settings-mobile.test.tsx  |  15 +++
 .../settings/sections/CliBinarySection.tsx         |   6 +-
 5 files changed, 156 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-8128

Fusion-Task-Lineage: aa6e5c11-1186-4213-9b1a-2582e892d363

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 13:22:56 -07:00
gsxdsm
bd4857a44e FN-8136: update cron-runner backup error expectations
Align cron-runner backup failure assertions with the current PostgreSQL project-state error wording.

- Update legacy command backup failure expectation
- Update command-step backup failure expectation

Files changed:
 packages/engine/src/__tests__/cron-runner.test.ts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8136

Fusion-Task-Lineage: 8f182491-1ded-43bb-b4ca-02485dce656a

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 13:17:00 -07:00
gsxdsm
d4914eb8b3 FN-8127: fix embedded PostgreSQL backups
Enable backup managers to resolve active embedded PostgreSQL runtime URLs safely.

- Track embedded backend URLs with generation-aware lifecycle leases.
- Keep backup resolution current through owner shutdown and joiner release.
- Document PostgreSQL client-tool requirements and add regression coverage.

Files changed:
 .changeset/fn-8127-embedded-backup.md              |   7 ++
 docs/settings-reference.md                         |   3 +
 packages/core/src/__tests__/backup.test.ts         | 115 ++++++++++++++++++++
 packages/core/src/backup.ts                        |  17 ++-
 packages/core/src/index.gate.ts                    |   9 ++
 packages/core/src/index.ts                         |   9 ++
 .../core/src/postgres/active-backend-registry.ts   | 119 +++++++++++++++++++++
 packages/core/src/postgres/embedded-lifecycle.ts   |   5 +
 packages/core/src/postgres/index.ts                |   9 ++
 packages/core/src/postgres/startup-factory.ts      | 118 +++++++++++++++++---
 10 files changed, 389 insertions(+), 22 deletions(-)

Fusion-Task-Id: FN-8127

Fusion-Task-Lineage: 6125be5c-d1d5-4228-a6b1-290311de70d9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 13:09:48 -07:00
gsxdsm
9b7f282b84 FN-8131: wrap Quality header actions on mobile
Keep Quality preset and refresh actions visible beneath the title on compact screens.

- Wrap the scoped Quality dashboard header at mobile breakpoints.
- Give the title and action cluster full-width rows without desktop regressions.
- Add responsive CSS coverage and a patch changeset.

Files changed:
 .changeset/fn-8131-quality-mobile-header.md        |  7 ++++
 .../__tests__/dashboard-view-mobile-header.test.ts | 37 ++++++++++++++++++++++
 .../fusion-plugin-quality/src/dashboard-view.css   | 29 +++++++++++++++++
 3 files changed, 73 insertions(+)

Fusion-Task-Id: FN-8131

Fusion-Task-Lineage: 920ae59f-327a-45c8-90b1-1b4d7639442f

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 13:03:20 -07:00
gsxdsm
f58b56488c FN-8125: align mobile Settings auth cards
Align Authentication provider card content with the Settings section header on mobile.

- Remove the nested mobile gutter within Authentication panels.
- Preserve Custom Provider card spacing outside authentication panels.
- Cover scoped mobile alignment rules and add a patch changeset.

Files changed:
 .changeset/fn-8125-mobile-auth-card-alignment.md   |  7 +++++++
 .../dashboard/app/components/SettingsModal.css     | 22 ++++++++++++++++++++++
 .../components/__tests__/settings-mobile.test.tsx  |  7 +++++--
 3 files changed, 34 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8125

Fusion-Task-Lineage: a299fe3e-8a32-401a-85f2-85fe58e61da3

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 12:54:00 -07:00
gsxdsm
47f9aa7144 FN-8124: reuse dashboard theme dropdown in Settings
Unify Settings appearance theme selection with the dashboard control.

- Reuse ThemeDropdown and its custom-color picker in ThemeSelector
- Remove the obsolete Settings color-theme grid styles
- Cover shared dropdown interactions and document the unified control
- Add a patch changeset for the Settings theme selector

Files changed:
 .changeset/FN-8124-settings-theme-dropdown.md      |   7 +
 docs/dashboard-guide.md                            |   2 +-
 .../dashboard/app/components/ThemeDropdown.tsx     |   9 +-
 .../dashboard/app/components/ThemeSelector.css     |  48 --
 .../dashboard/app/components/ThemeSelector.tsx     |  49 +-
 .../components/__tests__/ThemeSelector.test.tsx    | 778 ++-------------------
 .../__tests__/CommandCenterControls.test.tsx       |  18 +-
 7 files changed, 109 insertions(+), 802 deletions(-)

Fusion-Task-Id: FN-8124

Fusion-Task-Lineage: 6bd87f2a-d9e1-4374-8f54-1a2266c4004f

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 12:48:51 -07:00
gsxdsm
fdea8a4294 FN-8118: document continuation rescue test coverage
Document why the verified post-done continuation rescue suite remains unquarantined.

- Record the serialized in-memory reliability coverage and its exclusion rationale.
- Preserve the engine-default reliability partition exclusion.

Files changed:
 packages/engine/vitest.config.ts | 2 ++
 1 file changed, 2 insertions(+)

Fusion-Task-Id: FN-8118

Fusion-Task-Lineage: 0ac7f24a-888c-470c-b175-98b4e0411061

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 12:42:17 -07:00
gsxdsm
15335e8cde FN-8122: increase mobile activity feed inset
Increase mobile activity-feed spacing across the modal, dock, and standalone feed.

- Add token-based mobile insets for activity-feed content.
- Widen Activity Log modal and embedded right-dock padding.
- Cover mobile inset behavior with CSS contract tests.

Files changed:
 packages/dashboard/app/components/ActivityFeed.css |  11 +++
 .../dashboard/app/components/ActivityLogModal.css  |   7 +-
 packages/dashboard/app/components/ScriptsModal.css |   8 +-
 .../__tests__/activity-feed-mobile-inset.test.tsx  | 107 +++++++++++++++++++++
 4 files changed, 130 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-8122

Fusion-Task-Lineage: c6d81ee9-ae8d-4d2d-a765-2f44a73b1ac9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 12:36:03 -07:00
gsxdsm
2142841f0c FN-8111: restore reliability test coverage
Restore PostgreSQL-compatible reliability coverage and prevent completed tasks from wedging on stale continuation recovery.

- Update reliability fixtures and audit assertions for PostgreSQL-backed stores
- Prioritize completed-task handling before stale assistant-continuation retries
- Unquarantine the restored meta-archive and continuation reliability suites

Files changed:
 .../explicit-duplicate-marker-sweep.test.ts        |  4 ++++
 .../meta-archive-guard-composition.test.ts         | 26 +++++++++++++++++-----
 .../post-done-continuation-no-wedge.test.ts        |  3 ++-
 packages/engine/src/executor.ts                    |  7 ++++++
 packages/engine/vitest.config.ts                   |  4 ++--
 scripts/lib/test-quarantine.json                   | 10 ---------
 6 files changed, 36 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-8111

Fusion-Task-Lineage: 8b30b5cb-c160-44e1-8e8c-dd58f4877edc

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 12:09:55 -07:00
gsxdsm
3b6bfeee46 FN-8109: import PR comments as resolve feedback tasks
Enable GitHub comment imports to create independent resolve-feedback tasks.

- Add comment import controls, status feedback, and client API support
- Create validated GitHub comment tasks with quoted feedback and provenance
- Label pull request imports as resolve-feedback work and document the workflow

Files changed:
 docs/dashboard-guide.md                            |  4 +-
 packages/dashboard/app/api/legacy.ts               | 20 ++++++
 .../dashboard/app/components/GitHubImportModal.css | 35 +++++++++
 .../dashboard/app/components/GitHubImportModal.tsx | 82 +++++++++++++++++++---
 .../__tests__/GitHubImportModal.test.tsx           | 56 +++++++++++++++
 .../dashboard/src/__tests__/routes-github.test.ts  | 73 +++++++++++++++++++
 .../dashboard/src/routes/register-git-github.ts    | 48 ++++++++++++-
 7 files changed, 304 insertions(+), 14 deletions(-)

Fusion-Task-Id: FN-8109

Fusion-Task-Lineage: bdb4477b-31b4-4e01-8439-b72437ff692d

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 11:58:27 -07:00
gsxdsm
46f09e4ac1 FN-8115: consolidate GitHub import settings reads
Reuse request-scoped project settings across GitHub issue import operations.

- Read project settings once for single and batch imports
- Share settings with translation and GitHub tracking resolution
- Cover settings reuse and translated/original batch content

Files changed:
 .../dashboard/src/__tests__/routes-github.test.ts  | 105 ++++++++++++++++++++-
 .../dashboard/src/routes/register-git-github.ts    |  56 ++++++++---
 2 files changed, 145 insertions(+), 16 deletions(-)

Fusion-Task-Id: FN-8115

Fusion-Task-Lineage: acc046c5-d599-4df4-b380-a1e167d45548

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 11:42:45 -07:00
gsxdsm
446c969968 fix(FN-2127): harden Quality Postgres store (project scope, races) (#2230)
## Summary

Follow-up after **#2164** and main’s **FN-8103 / FN-8104**
(Postgres-only data access / SQLite retirement).

Main already routes Quality through `AsyncQualityStore` +
`getAsyncLayer()`. This PR keeps the **review hardening** that was still
missing:

- **Project binding** — reject request `projectId` mismatches vs bound
AsyncDataLayer; all SQL uses bound project
- **`createRunIfNoActive`** — advisory lock so concurrent starts cannot
double-queue
- **Cancel-safe runner** — cancel slot registered before the running
write; pre-spawn cancel skips process
- **`finalizeRun`** — never overwrites a `cancelled` terminal status
- **Detached execute** — catch only execution failures; prune fail-soft
in `finally`
- Guardrail tests + Quality v2 plan doc

## Test plan

- [ ] Task QA loads under PostgreSQL (no SQLite/backend-mode error)
- [ ] Concurrent start for same task → 409 second start
- [ ] Cancel during start does not leave a live orphan process
- [ ] Cancelled run stays cancelled after process exit
- [ ] `pnpm --filter @fusion-plugin-examples/quality test` (37 tests)
2026-07-16 11:38:34 -07:00
gsxdsm
4a797d3804 FN-8117: restore explicit duplicate marker sweep coverage
Configure duplicate-marker PG fixtures with canonical FN task IDs so the sweep coverage exercises real deletion paths.

- Set taskPrefix to FN for duplicate-marker reliability fixtures.
- Remove the corrected test from the PG quarantine ledger and Vitest exclusions.
- Document why valid marker IDs are required for this coverage.

Files changed:
 .../explicit-duplicate-marker-sweep.test.ts          | 20 +++++++++++++-------
 packages/engine/vitest.config.ts                     |  4 +++-
 scripts/lib/test-quarantine.json                     |  5 -----
 3 files changed, 16 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-8117

Fusion-Task-Lineage: 3b09cbbe-924c-4e3c-849b-cf7643b0ac0e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 11:36:32 -07:00
gsxdsm
038ec04975 FN-8113: confirm GitHub issue closures
Guard GitHub issue closure with a destructive confirmation flow.

- Style the Close issue action as dangerous and require confirmation before API calls.
- Cover confirmation, cancellation, success, failure, and mobile behavior in modal tests.
- Add a patch changeset describing the safer close interaction.

Files changed:
 .changeset/fn-8113-github-close-confirm.md         |  7 ++
 .../dashboard/app/components/GitHubImportModal.tsx | 22 ++++--
 .../__tests__/GitHubImportModal.test.tsx           | 91 +++++++++++++++++++++-
 3 files changed, 113 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-8113

Fusion-Task-Lineage: 80e4e1a3-b779-473d-9658-4231bd58d7e6

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 11:30:17 -07:00
gsxdsm
3084d7287b FN-8112: fix GitHub import tracking test mocks
Make GitHub import tracking settings mocks persist across each route read.

- Return tracking settings for every read in single-import tests
- Document the persistent-mock requirement for import tracking

Files changed:
 packages/dashboard/src/__tests__/routes-github.test.ts | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8112

Fusion-Task-Lineage: 87318b54-39b6-46bb-8093-10c020a3ad72

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 11:19:59 -07:00
gsxdsm
68583b5c68 FN-8110: add failed-check fix task action
Add an in-context recovery path for failed GitHub PR checks.

- Add a per-failed-check Create fix task action with progress and result feedback.
- Compose fix-task context from the selected PR, repository, branches, check status, and details URL.
- Cover the GitHub import behavior and document the feature release.

Files changed: .changeset/fn-8110-pr-failed-check-fix-task.md     |   7 +
 docs/dashboard-guide.md                            |   2 +-
 .../dashboard/app/components/GitHubImportModal.css |  23 ++++
 .../dashboard/app/components/GitHubImportModal.tsx |  91 ++++++++++++-
 .../__tests__/GitHubImportModal.test.tsx           | 148 +++++++++++++++++++++
 5 files changed, 269 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8110

Fusion-Task-Lineage: 0f69a4e2-d950-4a9f-925e-bd56fb6bf45d

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 11:16:06 -07:00
gsxdsm
504c702262 FN-8107: add mobile drawer drag dismissal
Enable intuitive swipe-down dismissal for the mobile More navigation drawer.

- Add guarded touch drag handling that preserves interior scrolling
- Animate sheet drag and snap-back states with an expanded grab handle
- Cover distance, velocity, scroll, submenu, and cancellation gestures
- Add a patch changeset for the mobile drawer fix

Files changed:
 .../fn-8107-mobile-more-drawer-drag-dismiss.md     |   7 ++
 packages/dashboard/app/components/MobileNavBar.css |  28 ++++-
 packages/dashboard/app/components/MobileNavBar.tsx | 104 +++++++++++++++-
 .../app/components/__tests__/MobileNavBar.test.tsx | 136 ++++++++++++++++++++-
 4 files changed, 265 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-8107

Fusion-Task-Lineage: 144bd68a-0c72-4786-9efd-ddf86bb9515d

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 11:07:57 -07:00
gsxdsm
b891e3a37b fix(dashboard): drop Settings footer Help icon and fix its underline/sizing
The Help link is an <a class="btn"> and .btn never resets link
text-decoration, so the browser's default underline painted under the
icon+label box, reading as an overlap. Drop the icon (redundant next to
the "Help" label) and reset text-decoration on the shared
discord/help anchor-button selector. Also fold the Help button into the
same mobile 36px touch-target rule as Export/Import/Reset/Save so all
five footer buttons render at a consistent height.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-16 10:53:54 -07:00
gsxdsm
daf5b1297d fix(dashboard): restore 36px touch target for mobile Settings footer buttons
Export/Import/Reset/Cancel/Save use .btn-sm, which the global mobile
touch-target rule deliberately excludes to keep dense table/card button
rows compact. That exclusion also caught the Settings footer, leaving
those buttons at ~24px tall on mobile — visibly smaller than the Help
and auth Test/Disable buttons on the same rail. Scope the 36px minimum
back to just this footer.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-16 10:40:33 -07:00
gsxdsm
dabb6b8246 fix(dashboard): remove redundant radio buttons from GitHub import list
List rows are selectable buttons with selected styling; radios were leftover after import moved into the detail preview action bar.
2026-07-16 10:37:36 -07:00
gsxdsm
0b488523c2 FN-8104: retire legacy SQLite database fallbacks
Retire legacy SQLite database calls from PostgreSQL-only startup and self-healing paths.

- Route plugin schema initialization exclusively through the PostgreSQL executor.
- Delegate soft-delete column repair to the PostgreSQL reconciliation seam.
- Remove temporary getDatabase allowlist entries and add no-SQLite regression coverage.

Files changed:
 .../postgres/store-safe-defaults.pg.test.ts        | 14 +++++-
 packages/core/src/store.ts                         | 24 ++++------
 .../engine/src/__tests__/plugin-runner.test.ts     |  6 ---
 .../self-healing-fake-overlap-seam.test.ts         | 44 +++++++++++++++++++
 packages/engine/src/self-healing.ts                | 51 +++++-----------------
 scripts/lib/getdatabase-allowlist.json             | 17 +-------
 6 files changed, 77 insertions(+), 79 deletions(-)

Fusion-Task-Id: FN-8104

Fusion-Task-Lineage: 88dee027-51c3-4c68-94dc-88191fe20330

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 10:33:47 -07:00
gsxdsm
aa07a78f18 fix: recover graph-node missing-worktree failures instead of terminal-parking (FN-7996) (#2231)
## Why

FN-7996 sat in a dispatch→park loop **all day** (06:06→16:35): its
`worktree` metadata pointed at recycled pool worktrees (`coral-badger`,
`grand-ridge` — the latter actually belonged to FN-8069), Plan Review
refused to start in the missing directory, and the task terminal-parked
`failed` every cycle while the planner overseer blindly retried.

Root-cause chain:

1. **`graphFailureValue()` couldn't read optional-group results.**
`runOptionalGroup` publishes context under the group id
(`node:plan-review:value`) and the unqualified template id, but the
failed node is recorded as the materialized
`plan-review::plan-review-step` — the lookup only understood `#` foreach
ids. FN-7977's provider-failure hold *did* classify this failure, but
its hold value was invisible to routing.
2. **No graph-failure router handled the `assertValidWorktreeSession`
refusal**, so it fell to the terminal sink, which parked the task and
*overwrote* `task.error` with a generic message — erasing the signature
the missing-worktree self-healing sweep (in-review-only anyway)
classifies on.
3. **Plan Review didn't need the worktree at all** — its spec is
store-injected (FN-7561) — yet it launched its reviewer in whatever
stale `task.worktree` said.

## What

- `handleGraphFailure` routes unusable-worktree node failures (any node,
any error key, `::`/`#` materialized ids) into the existing bounded
worktree-session recovery: clear stale worktree/branch/session metadata,
requeue to todo, budgeted by `worktreeSessionRetryCount`. An exhausted
budget still falls through to the visible terminal park for human
inspection.
- `graphFailureValue` resolves `group::template` ids (group value first
— it carries post-classification routing intent — then the unqualified
template value). Foreach `#` behavior unchanged.
- Plan Review falls back to the repo root when its recorded worktree is
missing on disk; other read-only gates intentionally keep failing fast
into the new recovery (silently retargeting them to root would review
the wrong tree).
- `recoverMissingWorktreeSessionStartFailure` returns its outcome so the
graph router can distinguish requeue from escalate-exhausted; existing
truthy callers unchanged.

## Symptom Verification

- **Original symptom:** graph-node session-start refusal → `Workflow
graph terminated with failure at node 'plan-review::plan-review-step'`,
task parked failed with stale metadata intact, no recovery.
- **Reproduction:** `graph-node-missing-worktree-recovery.test.ts`
drives `handleGraphFailure` with the exact FN-7996 result shape
(optional-group materialized id + `Refusing to start coding agent in
missing worktree` node error).
- **Assertion it is gone:** the task is requeued to `todo` with
`worktree`/`branch`/`sessionFile` cleared and retry budget incremented —
and is *not* marked `failed`; budget exhaustion still parks visibly.

## Surface Enumeration

- Optional-group template nodes (Plan Review — the repro), write-capable
review gates, and any custom graph node: covered by the
`handleGraphFailure` router (scans exact/materialized/unqualified
`:error` keys).
- Execute-seam session start: already covered by the pre-existing
recovery (unchanged, still passes).
- In-review / merge-active columns: already covered by self-healing
sweeps (unchanged).
- Paused / user-paused / deleted / done tasks: explicitly left to their
owning machinery (guard tests).
- Budget exhaustion: falls through to the visible terminal park (test).

## Testing

- `pnpm --filter @fusion/engine exec vitest run
src/__tests__/reliability-interactions/graph-node-missing-worktree-recovery.test.ts`
— 13 passed
- Adjacent suites (`worktree-incomplete-session-start`,
`executor-graph-requeue-gate`, `workflow-graph-optional-group`,
`executor-paused-abort-todo-benign`) — 78 passed
- `tsc --noEmit` on `@fusion/engine` — clean

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

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

## Summary by CodeRabbit

* **Bug Fixes**
* Improved recovery when workflow tasks encounter missing or recycled
worktrees.
* Automatically retries affected tasks with stale worktree details
cleared, up to the configured retry limit.
  * Escalates tasks after recovery attempts are exhausted.
* Improved failure routing for optional workflow groups and template
instances.
* Plan Review now falls back to the repository root when its recorded
worktree is unavailable.
* **Tests**
* Added regression coverage for recovery, routing, retry limits, and
repository-root fallback behavior.

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

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 10:28:11 -07:00
gsxdsm
06d03d4e1f FN-8103: enforce PostgreSQL-only production data access
Require production paths to use PostgreSQL-aware stores and prevent new unrestricted database access.

- Add a checked allowlist that bans production getDatabase() calls by default.
- Route Quality plugin persistence through an async PostgreSQL-aware store and add Drizzle ORM.
- Document backend-safe plugin storage patterns and cover guarded access behavior.

Files changed:
 docs/PLUGIN_AUTHORING.md                           |  20 +++
 package.json                                       |   6 +-
 .../src/__tests__/agent-logs-backend-mode.test.ts  |   7 +
 packages/core/src/store.ts                         |   7 +-
 packages/core/src/task-store/remaining-ops-5.ts    |   8 +-
 plugins/fusion-plugin-quality/package.json         |   1 +
 .../src/__tests__/async-quality-store.pg.test.ts   |  36 +++++
 .../src/__tests__/cancel-and-plans.test.ts         |   8 +-
 .../src/__tests__/experimental-gate.test.ts        |   1 +
 .../src/routes/create-routes.ts                    |  50 +++----
 .../src/runner/command-runner.ts                   |  17 ++-
 .../src/store/async-quality-store.ts               |  34 +++++
 pnpm-lock.yaml                                     |   3 +
 scripts/__tests__/check-no-getdatabase.test.mjs    |  90 ++++++++++++
 scripts/check-no-getdatabase.mjs                   | 159 +++++++++++++++++++++
 scripts/lib/getdatabase-allowlist.json             |  18 +++
 16 files changed, 422 insertions(+), 43 deletions(-)

Fusion-Task-Id: FN-8103
Fusion-Task-Lineage: ff17bcb2-5341-4c6c-a5c4-993580539676
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 10:13:49 -07:00
gsxdsm
1d0feb264a feat(dashboard): page GitHub issue import + fix close-on-Done backstop
Import picker now surfaces all open issues instead of a silent first-30
slice, and reliably closes linked/imported issues when their task reaches
Done.

Import:
- GitHubImportModal fetches up to 300 open issues in one request and pages
  the result client-side at 30/page with Previous/Next controls, a page
  indicator, and a truncation notice past the cap.
- NewTaskModal reference picker limit 30 -> 100.
- GitHubClient.listIssues pages the REST path (per_page loop until
  limit/exhaustion; PR-filtering no longer stops paging early) and lifts the
  gh path's 100 cap (gh --limit paginates internally); gh-CLI label filtering
  fetches the full cap before client-side OR filtering.

Close-on-Done:
- GitHubTrackingReconciler.runSweep isolates its three reconcile passes so a
  throw in one (e.g. the PG-backend deleted/archived pass) no longer starves
  the done-task + source-issue passes. Previously all three shared one
  try/catch with a silent swallow, so a single early throw disabled the whole
  close-on-Done reconcile backstop on every sweep, leaving linked issues open.
  Failures are now logged instead of hidden.

Tests: REST multi-page paging, PR-filter-doesn't-stop-paging, Prev/Next UI,
one-page (no controls), and per-pass isolation invariants.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 09:33:20 -07:00
gsxdsm
c803a2d906 FN-8100: restore PostgreSQL task delegation collision coverage
Restore PostgreSQL-backed collision coverage for the built task-delegation extension.

- Seed an occupied task ID through the shared PostgreSQL TaskStore.
- Override the allocator once to exercise the real unique-violation error path.
- Assert that fn_delegate_task returns the structured task-ID collision error.

Files changed:
 .../src/__tests__/extension-integration.test.ts    | 53 +++++++++++++---------
 1 file changed, 32 insertions(+), 21 deletions(-)

Fusion-Task-Id: FN-8100

Fusion-Task-Lineage: d26b825e-2abd-482e-899e-51c0db753176

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 09:24:56 -07:00
gsxdsm
fcd400f02e FN-8097: harden CLI package-lane test builds
Stabilize CLI package-lane tests with reliable asset builds and PostgreSQL-backed fixtures.

- add stale-lock recovery and deterministic coverage for CLI asset builds
- migrate affected CLI tests to shared PostgreSQL harnesses and async build setup
- restore delegate collision coverage and clean bundled extension caches

Files changed:
 .../src/__tests__/bundle-output-helpers.test.ts    | 185 ++++++++++++----
 .../cli/src/__tests__/bundle-output-helpers.ts     | 240 +++++++++++++++------
 packages/cli/src/__tests__/bundle-output.test.ts   |   4 +-
 .../extension-agent-set-instructions.test.ts       |  56 ++---
 .../src/__tests__/extension-agent-update.test.ts   |  58 ++---
 .../src/__tests__/extension-integration.test.ts    |  25 ++-
 packages/cli/src/__tests__/task-plan.test.ts       |  67 +++---
 packages/cli/src/__tests__/task-steer.test.ts      |  56 ++---
 .../src/commands/__tests__/agent-export.test.ts    |  42 +++-
 9 files changed, 481 insertions(+), 252 deletions(-)

Fusion-Task-Id: FN-8097

Fusion-Task-Lineage: 7c84efe0-eb5b-4d65-b8ca-ad71926dc84c

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 09:14:15 -07:00
gsxdsm
c484964b82 FN-8102: fix CLI package-lane test scaffolding
Restore CLI tests to the current PostgreSQL harness and structured tool-error contracts.

- Inject cached stores and project-context mocks for isolated extension and command tests
- Assert structured MCP error responses for delete and lineage rejection cases
- Update workflow, retry, and project mocks for current harness and core APIs

Files changed:
 .../extension-experiment-finalize.test.ts          | 21 ++++++++++--
 .../src/__tests__/extension-workflow-tools.test.ts | 15 ++++++--
 .../__tests__/task-command-gitlab-import.test.ts   | 20 +++++++++++
 .../task-delete-allow-resurrection.test.ts         | 20 ++++++-----
 .../cli/src/__tests__/task-lineage-unlink.test.ts  | 40 +++++++++++++++-------
 packages/cli/src/__tests__/task-retry.test.ts      | 16 +++++++--
 .../cli/src/commands/__tests__/project.test.ts     |  4 +++
 .../cli/src/commands/__tests__/task.test.ts        |  6 ++++
 8 files changed, 114 insertions(+), 28 deletions(-)

Fusion-Task-Id: FN-8102

Fusion-Task-Lineage: 20723ce0-77bb-4d37-9395-4191769ee752

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 08:58:13 -07:00
gsxdsm
40aa924ec0 FN-8101: disambiguate workflow revision reset test selector
Target the named reset control in the workflow review-cap test.

- Select the Reset to default button by accessible name
- Prevent ambiguity when multiple row buttons are rendered

Files changed:
 packages/dashboard/app/components/__tests__/WorkflowSettingsPanel.test.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Fusion-Task-Id: FN-8101

Fusion-Task-Lineage: e822941f-eab0-4d7a-a27b-53c152aac5de

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 08:47:20 -07:00
gsxdsm
291fabcce8 FN-8083: preserve GitLab tracking across archive restore
Preserve GitLab import tracking metadata throughout TaskStore archive and restore flows.

- Store GitLab tracking data in archived task entries and restored tasks
- Hydrate GitLab tracking when serializing archive entries
- Cover live reads, searches, modified-task listings, and archive restoration in PostgreSQL tests
- Add a patch changeset for the tracking persistence fix

Files changed:
 .changeset/fn-8083-gitlab-tracking-hydration.md    |  7 +++
 .../store-gitlab-tracking-hydration.pg.test.ts     | 58 +++++++++++-----------
 .../core/src/task-store/archive-lifecycle-2.ts     |  7 +++
 packages/core/src/task-store/serialization.ts      |  1 +
 4 files changed, 43 insertions(+), 30 deletions(-)

Fusion-Task-Id: FN-8083

Fusion-Task-Lineage: 877f320f-11c9-469d-8ea5-b843e95b78d3

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 08:41:34 -07:00
gsxdsm
1a337df5e9 FN-8098: add executor model fallback
Add workflow-specific executor fallback configuration and bounded recovery.

- Add executor fallback provider, model, and thinking settings across core schemas and settings UI.
- Route executor, heartbeat, child, and workflow-step sessions through the executor fallback resolver.
- Retry the primary model after fallback failure before reporting terminal exhaustion.
Files changed:

 .changeset/fn-8098-model-fallback.md               |  7 +++
 docs/settings-reference.md                         |  7 ++-
 .../core/src/__tests__/model-resolution.test.ts    | 13 ++++
 .../core/src/__tests__/settings-parity.test.ts     |  5 ++
 packages/core/src/builtin-workflow-settings.ts     | 24 +++++++
 packages/core/src/index.gate.ts                    |  1 +
 packages/core/src/index.ts                         |  1 +
 packages/core/src/model-resolution.ts              | 21 +++++++
 packages/core/src/settings-schema.ts               |  3 +
 packages/core/src/types.ts                         | 11 ++++
 .../app/components/WorkflowSettingsPanel.tsx       |  8 +++
 .../settings/sections/ProjectModelsSection.tsx     | 10 ++-
 packages/engine/src/__tests__/pi.test.ts           | 14 ++++-
 packages/engine/src/agent-session-helpers.ts       |  7 ++-
 packages/engine/src/executor.ts                    | 48 +++++++-------
 packages/engine/src/pi.ts                          | 73 ++++++++--------------
 packages/engine/src/step-session-executor.ts       |  8 ++-
 17 files changed, 180 insertions(+), 81 deletions(-)

Fusion-Task-Id: FN-8098

Fusion-Task-Lineage: 61b3103b-357b-431a-8d58-411e7806b87b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 08:33:57 -07:00
gsxdsm
2ea3c5afec FN-8081: migrate CLI tests to PostgreSQL harness
Migrate CLI test coverage from SQLite-specific fixtures to PostgreSQL-compatible stores.

- Run built extension tests with the shared PostgreSQL TaskStore harness.
- Inject the harness async layer into extension diagnostics and agent setup.
- Remove SQLite-only writer-lock and collision fixtures while retaining portable retry coverage.

Files changed:
 .../src/__tests__/extension-integration.test.ts    | 115 +++++++++++----------
 packages/cli/src/__tests__/extension.test.ts       |  24 +++--
 .../src/commands/__tests__/task-lock-retry.test.ts |  96 ++---------------
 3 files changed, 84 insertions(+), 151 deletions(-)

Fusion-Task-Id: FN-8081

Fusion-Task-Lineage: 89cc39d8-0094-4486-8a9d-772b6b964bb1

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 08:28:43 -07:00
gsxdsm
0e7b86ecc4 FN-8099: refresh GitHub stars in Settings
Refresh the Settings GitHub star counter while the interface is visible.

- refresh stale counts on a visibility-gated 15-minute interval
- bypass HTTP caching and prevent overlapping GitHub requests
- add Settings-surface and hook regression coverage

Files changed:
 .changeset/fn-8099-github-star-refresh.md          |   7 ++
 .../dashboard/app/components/SettingsModal.tsx     | 109 +++++++++-------
 .../components/__tests__/settings-mobile.test.tsx  |  59 ++++++++-
 .../__tests__/useGitHubStarCount.test.tsx          | 140 +++++++++++++++++++++
 4 files changed, 271 insertions(+), 44 deletions(-)

Fusion-Task-Id: FN-8099

Fusion-Task-Lineage: f93f5fe0-a1ea-48f2-b737-2fa1fbee4ed6

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 08:23:19 -07:00
gsxdsm
e6b438e4ec chore(i18n): drop orphaned settings.scope banner strings and restore catalog parity
The settings scope banners ("shared across all your Fusion projects" /
"only affect this project") were removed from the UI — scope is conveyed by
the nav's globe/folder icons and "· Global/Project" labels — leaving
settings.scope.globalBanner/projectBanner dead in all six catalogs. Removed
from the authored source of truth (packages/i18n/locales) and regenerated
resources.d.ts.

Also ran the documented pnpm i18n:sync remediation for the pre-existing
parity gap: seeds the missing secondary-locale keys (autoTranslate*,
skipConfirmationDialogs*, taskDetail.plan approval/replan copy) as empty
strings for fallback-to-en and aligns plural key shapes
(resultCount_one/_other), turning pnpm i18n:status and the @fusion/i18n
parity tests green again.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 08:14:44 -07:00
gsxdsm
14953f39e2 FN-8075: restore PostgreSQL self-healing test coverage
Restore self-healing coverage for PostgreSQL-backed maintenance.

- Update self-healing mocks and assertions for asynchronous audit APIs and PostgreSQL WAL behavior
- Align git command expectations and transient recovery budget coverage with current implementation
- Remove the repaired self-healing suite from the quarantine ledger and gate exclusion

Files changed:
 packages/engine/src/__tests__/self-healing.test.ts | 70 ++++++++++++----------
 packages/engine/vitest.config.ts                   |  1 -
 scripts/lib/test-quarantine.json                   |  5 --
 3 files changed, 39 insertions(+), 37 deletions(-)

Fusion-Task-Id: FN-8075

Fusion-Task-Lineage: 7dfce9b0-9d10-4d70-8e92-8100f6595fce

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 08:11:24 -07:00
gsxdsm
fc9fb21470 FN-8095: repair dashboard API quality backfill
Stabilize the dashboard API backfill baseline and validate emitted plugin registry artifacts.

- Align API integration-test mocks and assertions with current service contracts.
- Move dist-dependent plugin registry coverage into the build test command.
- Exclude the artifact-dependent test from API backfill shards.

Files changed:
 packages/dashboard/package.json                    |  2 +-
 .../src/__tests__/chat-project-services.test.ts    |  3 +
 .../gitlab-source-issue-reconciler.test.ts         | 27 +++----
 .../src/__tests__/mcp-helper-forwarding.test.ts    | 44 ++++++++---
 .../src/__tests__/plugin-registry-dist.test.ts     |  6 ++
 .../src/__tests__/process-lifecycle.test.ts        |  8 +-
 .../register-git-github.gitlab-lifecycle.test.ts   | 11 ++-
 .../src/__tests__/register-signal-routes.test.ts   | 86 +++++++++++-----------
 .../routes-agent-prompt-sizes-integration.test.ts  | 54 ++++++++------
 .../src/__tests__/server-view-preload.test.ts      | 45 +++++++----
 .../task-effective-settings-route.test.ts          | 12 ++-
 .../routes/__tests__/agent-avatar-routes.test.ts   |  3 +
 .../mission-workflow-triage-route.test.ts          | 73 +++++++++---------
 .../register-settings-memory-worktrunk.test.ts     | 14 +++-
 ...sk-workflow-routes.merge-advance-events.test.ts | 18 +++--
 ...r-task-workflow-routes.runtime-fallback.test.ts |  4 +-
 .../__tests__/tasks-overseer-controls.test.ts      | 29 ++++----
 .../__tests__/tasks-planner-overseer-state.test.ts | 56 +++++++-------
 .../__tests__/workflow-validate-route.test.ts      | 21 ++----
 packages/dashboard/vitest.config.ts                |  4 +
 20 files changed, 307 insertions(+), 213 deletions(-)

Fusion-Task-Id: FN-8095

Fusion-Task-Lineage: 8f775431-2149-433a-a8b6-e6106eab661b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 08:06:49 -07:00
gsxdsm
748cf9370d test(dashboard): repair SettingsModal remote/scheduling suites broken by the Advanced settings switch
67 pre-existing failures: the Advanced settings simplification (2026-07-11) hid
advanced-only nav sections and display:none'd low-frequency form-groups in Basic
mode, and these two suites were never opted in. They now set the
fusion:settings:show-advanced preference like settings-mobile/models-auth do.

Also repointed stale assertions at current UI: research nav labels are
"Research · Global" / "Research · Project" (not "Research Defaults"/"Research"),
the ntfy Advanced disclosure click is scoped to its <summary> (the nav now also
renders an "Advanced" group header), the research provider disclosure holds
Settings*Row primitives rather than form-groups, and the removed global-scope
prose banner is asserted via the nav scope icon instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 07:53:40 -07:00
gsxdsm
40687cb0be FN-8050: cover cached dependency reconciliation seeding
Ensure raw dependency-reconciliation fixtures invalidate warmed task caches.

- Warm slim task-list caches before corrupt-row seeding in cycle reconciliation tests.
- Document the PostgreSQL-only fixture seam and cache invalidation rationale.

Files changed:
 .../engine/src/__tests__/reliability-interactions/_helpers.ts | 11 ++++++-----
 .../dependency-cycle-reconcile.test.ts                        |  7 +++++++
 2 files changed, 13 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-8050

Fusion-Task-Lineage: 5e708d58-faed-4271-a075-24c36eaa5878

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 07:48:12 -07:00
gsxdsm
bc02b27ed9 test(dashboard): update quick-add image preview assertions to FN-8037 contract
FN-8037 extracted pending-image previews into PendingImagePreviews,
which renders the thumbnail as a decorative alt="" image inside a
button labelled 'Open image <name>'. Point the four stale
getByAltText assertions at that accessible open button instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 07:42:14 -07:00
gsxdsm
f718a7d2fd fix(dashboard): spread quick-add control rows edge-to-edge on mobile
Switch the mobile row alignment from centered to space-between and
widen the icons+Save group to the full row, so the workflow/steps and
option-chip rows share the exact same left/right edges as the bottom
row. Group gaps remain as minimum spacing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 07:32:26 -07:00
gsxdsm
50ed689379 FN-8044: restore dependency reconcile reliability tests
Restore dependency reconciliation coverage using a PostgreSQL raw-seeding seam.

- Add a cache-invalidating raw task-column seeding helper for corrupt fixture states.
- Update dependency-cycle and self-defeating reconciliation tests to use the PG seam.
- Remove restored suites from the reliability quarantine configuration and ledger.

Files changed:
 .../__tests__/reliability-interactions/_helpers.ts | 29 ++++++++
 .../dependency-cycle-reconcile.test.ts             | 86 +++++++++++-----------
 .../self-defeating-dep-reconcile.test.ts           |  7 +-
 packages/engine/vitest.config.ts                   |  7 +-
 scripts/lib/test-quarantine.json                   | 10 ---
 5 files changed, 82 insertions(+), 57 deletions(-)

Fusion-Task-Id: FN-8044

Fusion-Task-Lineage: 213f606c-1951-4d25-93b4-2ceb97460ace

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 07:14:01 -07:00
gsxdsm
6a1b53f9b3 FN-8096: bound runtime process cleanup listeners
Keep Grok and OMP ACP cleanup listeners bounded when Vitest reloads plugin modules.

- Store active ACP process registries on the process singleton.
- Guard each plugin's exit cleanup hook against duplicate module evaluation.
- Add lifecycle regressions that reject listener leaks and preserve child cleanup.

Files changed:
 .../src/__tests__/process-lifecycle.test.ts        | 54 ++++++++++++++++++++++
 .../src/acp/process-manager.ts                     | 16 ++++++-
 plugins/fusion-plugin-grok-runtime/src/index.ts    | 17 +++++--
 .../src/__tests__/process-lifecycle.test.ts        | 54 ++++++++++++++++++++++
 .../src/acp/process-manager.ts                     | 16 ++++++-
 plugins/fusion-plugin-omp-runtime/src/index.ts     | 17 +++++--
 6 files changed, 166 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-8096

Fusion-Task-Lineage: c8a5daba-e13c-464b-b7e6-11c07d264864

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 07:06:48 -07:00
gsxdsm
85b854882d FN-8093: rescue dist-barrel coverage
Restore the isolated built-core barrel regression guard to the default CLI test lane.

- Hoist recompilation and PostgreSQL fixture setup outside timed test bodies.
- Inject the fixture store into the dynamic extension and retain text-budget assertions.
- Skip cleanly per test when a transitive dist artifact is unavailable.
- Remove the matching CLI quarantine exclusion and ledger entry.

Files changed:
 .../src/__tests__/extension-dist-barrel.test.ts    | 234 +++++++++++----------
 packages/cli/vitest.config.ts                      |   8 +-
 scripts/lib/test-quarantine.json                   |   5 -
 3 files changed, 121 insertions(+), 126 deletions(-)

Fusion-Task-Id: FN-8093

Fusion-Task-Lineage: 352b3675-0579-43bc-acd9-6a11919ed646

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 06:55:22 -07:00
gsxdsm
78245a48a3 FN-8077: stabilize quarantined test timing
Make previously quarantined CLI and dashboard tests deterministic.

- Use the shared PostgreSQL harness for project-context integration coverage.
- Control dashboard CPU sampling time with a fake Date-only clock.
- Remove both repaired tests from quarantine configuration and ledger.

Files changed:
 packages/cli/src/__tests__/project-context.test.ts | 103 +++++++++++++--------
 packages/cli/vitest.config.ts                      |   5 +-
 .../dashboard/src/__tests__/routes-system.test.ts  |  17 ++--
 packages/dashboard/vitest.config.ts                |   6 +-
 scripts/lib/test-quarantine.json                   |  10 --
 5 files changed, 76 insertions(+), 65 deletions(-)

Fusion-Task-Id: FN-8077

Fusion-Task-Lineage: 9a057928-3258-459a-9802-52f58df39c9a

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 06:20:20 -07:00