Commit Graph

7940 Commits

Author SHA1 Message Date
gsxdsm
9512e98330 feat(FN-branch-group): surface group PR controls in dashboard + CLI (U7)
Extend BranchGroupCard/GroupTaskModal with an Abandon action (open PRs) and
terminal merged/closed badges; promote stays completion-gated. New
fn branch-group list|show|promote (alias fn bg) reaching the same coordinator
path with createGroupPrCallback wired — agent-native parity with the dashboard
promote flow, same completion-gate rejection.
2026-06-03 10:31:18 -07:00
gsxdsm
415470c7bd feat(FN-branch-group): sync group PR as members land + terminal lifecycle (U6)
Push the single group PR's body (member checklist, x/N landed) on each member
landing via an injected SyncGroupPrFn — new updatePr/closePr GitHubClient
helpers (gh CLI + API parity); refreshPrInBackground is task-scoped/wrong
direction and intentionally not reused. Sync failures are non-fatal+retryable;
out-of-band closed/merged PRs reconcile prState instead of erroring. New
POST /branch-groups/:id/abandon closes the PR best-effort and marks the group
abandoned. Also fixes the U5-introduced stub-context regression in the U4
dashboard bridge test (missing options).
2026-06-03 10:20:30 -07:00
gsxdsm
b1454c198e feat(FN-branch-group): create single real GitHub PR on group promotion (U5)
Group promotion in PR mode previously flipped prState to 'open' without ever
calling GitHub — prNumber/prUrl were never populated. Add an injected
CreateGroupPrFn (mirrors the processPullRequestMerge seam, no engine→dashboard
import): coordinator creates-or-reuses exactly one PR per group, persists
prNumber/prUrl/prState, and leaves state untouched on GitHub failure so
re-promotion retries. Idempotent via persisted prNumber +
getBranchGroupByBranchName. Wired at all three CLI engine-construction sites
(daemon/dashboard/serve).
2026-06-03 10:01:53 -07:00
gsxdsm
508b9c44d0 fix(FN-branch-group): add engine.promoteBranchGroup bridge method (U4)
The dashboard promote route called engine.promoteBranchGroup(groupId) as a
method that never existed — only a standalone coordinator function did — so
the route was dead, masked by a vi.fn mock in the test. Add the real method on
ProjectEngine delegating to the coordinator (resolving store/cwd/settings like
attemptBranchGroupPromotion), and de-mock the test so it now fails if the
method goes missing. No PR-creation behavior yet (U5).
2026-06-03 09:46:54 -07:00
gsxdsm
cad44b1f56 fix(FN-5846): commit-ownership-anchor already-merged attribution (U3)
Audit of all shared-member merge + self-healing finalize paths: routing,
merger finalize-success, and the 6 self-healing recovery paths were already
group-branch-safe (FN-5846). Found a residual of the 2026-05-23 lost-work
incident bug #2: already-merged-detector's ancestry strategy used bare
git log --grep first-hit, and the ownership regex made the conventional scope
optional (bare 'feat:' matched). Anchor attribution on trailers or task-scoped
subject; scan candidates instead of accepting the first grep hit. Adds real-git
characterization tests.
2026-06-03 09:40:30 -07:00
gsxdsm
88b4b0d5b3 fix(FN-branch-group): unify landed/completion predicate in core (U2)
Route and coordinator disagreed on landed/complete: the route required
mergeConfirmed + matching mergeTargetBranch, the coordinator accepted bare
column===done/in-review and never checked the branch. Extract canonical
isBranchGroupMemberLanded/isBranchGroupComplete in @fusion/core (stricter
route semantics win — load-bearing for merge-target safety) and consume from
both sides. Tightens promotion gating to fire only when all members are
merge-confirmed onto the group branch.
2026-06-03 09:23:44 -07:00
gsxdsm
66ca583ece fix(FN-branch-group): stamp real BG- id into branchContext.groupId (U1)
Planning and mission entry points discarded the BranchGroup returned by
ensureBranchGroupForSource and stamped a synthetic planning:/mission: string
that never resolved against getBranchGroup, breaking member enumeration.
Capture and stamp the real BG- id; stop setTaskBranchGroup hardcoding
assignmentMode; add a removable legacy read-side shim. Export TaskBranchContext.
2026-06-03 09:17:51 -07:00
gsxdsm
36218876a3 docs(plan): branch-group single managed PR flow plan 2026-06-03 08:58:06 -07:00
gsxdsm
04a5cd196c Merge pull request #1347 from Runfusion/gsxdsm/activitydebug
fix(dashboard): show missing Minimax usage rows and weekly windows
2026-06-03 08:09:32 -07:00
gsxdsm
6f378067f4 fix(dashboard): show missing Minimax usage rows and weekly windows
The Minimax usage panel only rendered one model row. The primary `general`
model meters quota purely via `current_interval_remaining_percent` (its
`current_interval_total_count` is 0), so the count-based `total > 0` visibility
filter dropped it entirely. The percent was also derived from count fields
rather than the authoritative `*_remaining_percent` field.

fetchMinimaxUsage now builds windows via a helper that prefers
`*_remaining_percent` (count-based fallback when absent) and skips a window only
when no quota signal exists. Each model's separate weekly quota window is now
surfaced as its own indicator alongside the interval window.

Verified against the live coding_plan/remains endpoint: 2 models (general,
video) now produce 4 windows (interval + weekly each) instead of 1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 07:51:38 -07:00
gsxdsm
59cd9ea66c Planning fixes 2026-06-03 07:10:02 -07:00
gsxdsm
d72cb2ab2b FN-5911: move agent logs to per-task JSONL storage
Store agent logs in per-task JSONL files instead of the legacy SQLite table.

- add a file-backed agent log store with JSONL append/read/prune helpers and task-scoped source refs
- migrate legacy SQLite agentLogEntries data into task files, rewrite goal citation references, and preserve soft-deleted logs for forensics
- update task store, settings, docs, dashboard route coverage, and add regression tests for migration, retention, and log access

Files changed:
 .changeset/fn-5911-agent-log-jsonl.md              |   5 +
 AGENTS.md                                          |   2 +-
 docs/diagnostics.md                                |   2 +-
 docs/settings-reference.md                         |   2 +
 docs/soft-delete-verification-matrix.md            |   7 +-
 docs/storage.md                                    |   8 +-
 .../src/__tests__/agent-log-file-store.test.ts     | 123 ++++++
 .../core/src/__tests__/agent-log-migration.test.ts | 186 +++++++++
 .../core/src/__tests__/agent-log-retention.test.ts | 208 ++++++++++
 packages/core/src/__tests__/db-migrate.test.ts     |  14 +-
 packages/core/src/__tests__/db.test.ts             |  39 +-
 .../src/__tests__/goal-citations-store.test.ts     |  38 +-
 packages/core/src/__tests__/goals-schema.test.ts   |   2 +-
 packages/core/src/__tests__/insight-store.test.ts  |  10 +-
 .../src/__tests__/merge-request-record.test.ts     |   2 +-
 packages/core/src/__tests__/mission-store.test.ts  |   2 +-
 packages/core/src/__tests__/run-audit.test.ts      |   2 +-
 packages/core/src/__tests__/secrets-schema.test.ts |   6 +-
 .../src/__tests__/soft-delete-agent-logs.test.ts   |  71 ++--
 .../src/__tests__/store-agent-log-file.test.ts     |  91 +++++
 .../core/src/__tests__/store-merge-queue.test.ts   |   2 +-
 packages/core/src/__tests__/store-test-helpers.ts  |  43 +-
 packages/core/src/__tests__/store-upsert.test.ts   |  37 +-
 packages/core/src/__tests__/task-documents.test.ts |   2 +-
 packages/core/src/agent-log-constants.ts           |  25 ++
 packages/core/src/agent-log-file-store.ts          | 267 ++++++++++++
 packages/core/src/db.ts                            |  51 ++-
 packages/core/src/settings-schema.ts               |   1 +
 packages/core/src/store.ts                         | 453 ++++++++++++---------
 packages/core/src/types.ts                         |  10 +-
 .../__tests__/agent-log-routes.integration.test.ts |  48 +++
 .../src/__tests__/evaluator-evidence.test.ts       |  47 ++-
 packages/engine/src/self-healing.ts                |  12 +
 .../src/store/__tests__/roadmap-store.test.ts      |   4 +-
 34 files changed, 1477 insertions(+), 345 deletions(-)

Fusion-Task-Id: FN-5911

Fusion-Task-Lineage: 07c42f3a-87cf-4558-8f01-ac8460b5558b
2026-06-03 01:10:18 -07:00
gsxdsm
1962bea0fc FN-5934: replace undefined dashboard spacing token
Replace dashboard CSS uses of the undefined --space-2xs token with supported spacing values.

- swap var(--space-2xs) for var(--space-xs) in confirm dialog, merge advance notice, and PR checks styles
- add a dashboard test that scans component stylesheets for undefined --space-2xs references
- assert shared token sources continue to omit an intentional --space-2xs definition

Files changed:
 .../app/__tests__/space-token-defined.test.ts      | 45 ++++++++++++++++++++++
 .../dashboard/app/components/ConfirmDialog.css     |  2 +-
 .../app/components/MergeAdvanceNotice.css          |  8 ++--
 packages/dashboard/app/components/PrChecksList.css |  2 +-
 4 files changed, 51 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-5934

Fusion-Task-Lineage: aa77df19-3f76-4ede-aa42-0396230edde5
2026-06-03 01:08:09 -07:00
gsxdsm
5336ad1071 FN-5923: remove duplicate merger fixture key
Remove the duplicate merger override from the SettingsModal test fixture.

- delete the earlier legacy merger object from the mocked settings payload
- keep the deterministic merger override as the single effective fixture value

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

Fusion-Task-Id: FN-5923

Fusion-Task-Lineage: 206239b0-af4a-4e45-93b8-2940a42d431a
2026-06-03 01:04:04 -07:00
gsxdsm
43c3fa9edc FN-5935: fix dashboard interop plugin context types
Align the dependency graph plugin's dashboard interop declarations with the current dashboard contract.

- import ReactNode for plugin task card rendering support
- add DetailTaskTab, PluginToastType, and PluginTaskView type exports
- update PluginDashboardViewContext to require workflowSteps and the expanded openTaskDetail signature
- add optional renderTaskCard and addToast hooks to match dashboard expectations

Files changed:
 .../src/dashboard-interop.d.ts                            | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-5935

Fusion-Task-Lineage: 32313a96-1008-4de6-a7cb-e6bfbc385534
2026-06-03 00:53:24 -07:00
gsxdsm
38ff2ef86d FN-5932: fix research settings containment layout
Keep research settings controls inside their containment wrappers so inputs stay onscreen across breakpoints.

- wrap advanced provider controls in a dedicated research settings body container
- tighten research grid and field min-width behavior in desktop and mobile styles
- add regression coverage for global and project research sections on desktop and mobile

Files changed:
 packages/dashboard/app/components/SettingsModal.css                  |  37 +++++++-
 packages/dashboard/app/components/SettingsModal.tsx                  | 104 +++++++++++----------
 packages/dashboard/app/components/__tests__/SettingsModal.test.tsx   |  65 +++++++++++++
 packages/dashboard/app/components/__tests__/settings-mobile.test.tsx |  48 ++++++++++
 4 files changed, 201 insertions(+), 53 deletions(-)

Fusion-Task-Id: FN-5932

Fusion-Task-Lineage: 22dff41f-b563-40d0-97ea-1ca6d1e09466
2026-06-03 00:49:22 -07:00
gsxdsm
de7847c44d FN-5927: categorize pnpm build scripts for install
Document and enforce pnpm build-script review decisions to prevent ignored-script install warnings.

- add reviewed ignoredBuiltDependencies entries to the root pnpm config and mirror the effective policy in pnpm-workspace.yaml
- add a regression test that verifies reviewed dependencies are categorized exactly once and stay aligned across both config files
- document the pnpm build-script approval policy in contributing docs and link plugin authoring guidance from AGENTS.md and PLUGIN_AUTHORING.md

Files changed:
 AGENTS.md                                          |  5 ++
 docs/PLUGIN_AUTHORING.md                           |  3 +-
 docs/contributing.md                               | 14 ++++
 package.json                                       |  9 +++
 pnpm-workspace.yaml                                | 14 ++++
 scripts/__tests__/pnpm-build-scripts-config.test.mjs   | 74 ++++++++++++++++++++++
 6 files changed, 118 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-5927

Fusion-Task-Lineage: 192bbed9-c5ed-45cb-b4bd-fb18514e2783
2026-06-03 00:28:41 -07:00
gsxdsm
7be377da0c FN-5926: break bundled plugin dashboard dependency cycle
Remove direct dashboard package dependencies from bundled plugins while preserving typed dashboard interop.

- add a workspace acyclic dependency regression test for all packages and dashboard-bundled plugins
- expose dashboard app aliases in dashboard TS/Vite/Vitest configs for plugin interop imports
- replace bundled plugin @fusion/dashboard dependencies with local dashboard interop declarations and updated tsconfig path mappings

Files changed:
 .../workspace-dependency-acyclicity.test.ts        | 174 +++++++++++++++++++++
 packages/dashboard/tsconfig.app.json               |   6 +-
 packages/dashboard/tsconfig.test-check.json        |   6 +-
 packages/dashboard/vite.config.ts                  |   4 +
 packages/dashboard/vitest.config.ts                |   4 +
 .../fusion-plugin-cli-printing-press/package.json  |   1 -
 .../src/dashboard-interop.d.ts                     |  19 +++
 .../fusion-plugin-cli-printing-press/tsconfig.json |   7 +-
 .../fusion-plugin-dependency-graph/package.json    |   1 -
 .../src/dashboard-interop.d.ts                     |   6 +
 .../fusion-plugin-dependency-graph/tsconfig.json   |   3 +-
 plugins/fusion-plugin-roadmap/package.json         |   1 -
 .../src/dashboard-interop.d.ts                     |  19 +++
 plugins/fusion-plugin-roadmap/tsconfig.json        |   7 +-
 pnpm-lock.yaml                                     |   9 --
 15 files changed, 248 insertions(+), 19 deletions(-)

Fusion-Task-Id: FN-5926

Fusion-Task-Lineage: 1b39c08a-1415-407d-90cc-b3de89af0316
2026-06-03 00:12:13 -07:00
gsxdsm
0971eced30 FN-5920: prefer mission detail event count for activity tab
Use mission detail event counts as the authoritative pre-load source for mission activity.

- add mission hierarchy eventCount support in core and dashboard mission types
- return mission eventCount from mission detail APIs and document the field
- prefer the detail eventCount over stale list summaries before activity events load
- add coverage for store, API, and MissionManager pre-load count behavior

Files changed:
 docs/missions.md                                   |  2 +-
 packages/core/src/__tests__/mission-store.test.ts  | 18 +++++++++
 packages/core/src/mission-store.ts                 |  6 +++
 packages/core/src/mission-types.ts                 |  2 +
 packages/dashboard/app/api/legacy.ts               |  2 +
 packages/dashboard/app/components/MissionManager.tsx    | 12 +++++-
 packages/dashboard/app/components/__tests__/MissionManager.test.tsx   | 46 +++++++++++++++++++++-
 packages/dashboard/app/components/mission-types.ts |  1 +
 packages/dashboard/src/__tests__/mission-e2e.test.ts    |  2 +
 9 files changed, 86 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-5920

Fusion-Task-Lineage: a0269499-d34a-495d-89fc-0534bb62a94e
2026-06-02 23:47:32 -07:00
gsxdsm
6d3b1c9810 FN-5931: fix board viewport fill on narrow widths
Keep the board stretched between the header and footer across narrow layouts.

- make .project-content and .board flex-aware with min-size guards so board columns fill the remaining viewport space
- keep the board resize stabilization cleanup defensive when visualViewport lacks removeEventListener
- extend board mobile regression coverage and document footer-safe fill layout guidance

Files changed:
 docs/dashboard-guide.md                            |  2 +
 packages/dashboard/app/components/Board.tsx        |  8 ++-
 packages/dashboard/app/components/ProjectSelector.css   |  2 +
 packages/dashboard/app/components/__tests__/board-mobile-initial-render.test.tsx | 81 ++++++++++++++++++++--
 packages/dashboard/app/styles.css                  |  7 +-
 5 files changed, 89 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-5931

Fusion-Task-Lineage: 0031ad20-82e5-465d-9326-2b6c2d45de69
2026-06-02 23:33:11 -07:00
gsxdsm
8b450506fc FN-5925: polish task review tab layout
Refine the task review tab layout for clearer hierarchy and better mobile behavior.

- group the review summary and decision badge into a stacked header layout
- reorganize review items with dedicated selection, status, and metadata regions
- restyle review cards, status badges, auto-merge controls, and body containers for improved spacing and overflow handling
- extend TaskReviewTab coverage for populated layout hooks and mobile CSS regressions

Files changed:
 packages/dashboard/app/components/TaskReviewTab.css     | 220 +++++++++++++++------
 packages/dashboard/app/components/TaskReviewTab.tsx     |  24 ++-
 packages/dashboard/app/components/__tests__/TaskReviewTab.test.tsx    |  32 ++-
 3 files changed, 206 insertions(+), 70 deletions(-)

Fusion-Task-Id: FN-5925

Fusion-Task-Lineage: fdb9d882-abda-48b0-aed0-a1ff4262af8f
2026-06-02 23:26:59 -07:00
gsxdsm
a1b7556c7b FN-5924: throttle OAuth expiry alerts across restarts
Persist OAuth expiry alert state so repeated provider expiry warnings are suppressed for 12 hours across engine restarts.

- add a persisted OAuth alert state store under ~/.fusion/agent and share it between the expiry monitor and startup validity logger
- throttle repeated oauth-token-expired notifications and startup expiry warnings per provider for 12 hours, while clearing stale state when providers disappear or change
- cover persisted throttling, restart behavior, failure handling, and wiring updates in engine notification tests
- document the persisted 12-hour OAuth alert throttle and add a patch changeset for @runfusion/fusion

Files changed:
 .changeset/fn-5924-oauth-alert-throttle.md         |   5 +
 docs/settings-reference.md                         |   4 +-
 packages/engine/src/__tests__/project-engine-soft-delete-merge-abort.test.ts |   3 +
 packages/engine/src/__tests__/project-engine.test.ts    |  17 ++-
 packages/engine/src/__tests__/reliability-interactions/soft-delete-in-flight-abort.test.ts            |   3 +
 packages/engine/src/auth-storage.ts                |   6 +-
 packages/engine/src/notification/__tests__/oauth-alert-state.test.ts            |  72 ++++++++++
 packages/engine/src/notification/__tests__/oauth-expiry-monitor.test.ts         | 148 ++++++++++++++++---
 packages/engine/src/notification/__tests__/oauth-validity-logger.test.ts        | 159 ++++++++++++++++++---
 packages/engine/src/notification/index.ts          |   3 +
 packages/engine/src/notification/oauth-alert-state.ts   | 144 +++++++++++++++++++
 packages/engine/src/notification/oauth-expiry-monitor.ts       |  12 +-
 packages/engine/src/notification/oauth-validity-logger.ts      |  16 ++-
 packages/engine/src/project-engine.ts              |  13 +-
 14 files changed, 554 insertions(+), 51 deletions(-)

Fusion-Task-Id: FN-5924
Fusion-Task-Lineage: 83255a25-40c7-44d4-8302-b068ae51250e
2026-06-02 23:13:16 -07:00
gsxdsm
669a6ecfdc FN-5929: track hidden usage windows by instance
Store hidden usage windows with per-instance identities while keeping legacy labels restorable.

- persist hidden usage windows with an index-qualified identity instead of label-only keys
- treat legacy label-only entries as matches for restore/show-hidden behavior
- guard hidden-window counts when provider windows are empty or undefined
- add regression coverage for duplicate labels, multiple hidden windows, and legacy persistence

Files changed:
 packages/dashboard/app/components/UsageIndicator.tsx    |  71 +++++++++----
 packages/dashboard/app/components/__tests__/UsageIndicator.test.tsx   | 113 ++++++++++++++++++++-
 2 files changed, 159 insertions(+), 25 deletions(-)

Fusion-Task-Id: FN-5929

Fusion-Task-Lineage: eb48988e-80b8-4d6c-90b9-0d324564f1aa
2026-06-02 22:46:12 -07:00
gsxdsm
fab2377fd1 FN-5921: persist queued chat messages across navigation
Keep queued chat composer state when users move between sessions and only clear it when the session is truly discarded.

- stop clearing persisted pending chat messages during session switches in useChat and useQuickChat
- clear persisted queued messages only when creating a fresh session or archiving/deleting an existing session
- add regression coverage for navigation, reselection, pre-session queueing, and cleanup behavior across chat and quick chat hooks

Files changed:
 .../dashboard/app/hooks/__tests__/useChat.test.ts  | 246 ++++++++++++++++++++-
 .../app/hooks/__tests__/useQuickChat.test.ts       | 150 +++++++++++++
 packages/dashboard/app/hooks/useChat.ts            |   9 +-
 packages/dashboard/app/hooks/useQuickChat.ts       |   5 +-
 4 files changed, 396 insertions(+), 14 deletions(-)

Fusion-Task-Id: FN-5921

Fusion-Task-Lineage: 8916f862-77f5-4d5b-be9a-412e8a71a47d
2026-06-02 22:42:19 -07:00
gsxdsm
941a3297bc FN-5922: fix(FN-5922): use default model fallback in new chat dialog when no model is explicitly selected
Fix NewChatDialog to resolve the model from the dropdown default when the user has not
explicitly picked a model, allowing chat creation with the default model.

- Introduce `resolvedModel` that falls back to `defaultModelValue` when `selectedModel` is empty
- Use `resolvedModel` in submit handler and submit-disabled guard so the default model is accepted
- Add test for creating a session with the default model ("Use default" selected)
- Add test for creating a session with an explicitly chosen non-default model
- Update existing no-default test to verify the submit button stays disabled and no session is created

Files changed:
 packages/dashboard/app/components/ChatView.tsx     | 12 ++--
 packages/dashboard/app/components/__tests__/ChatView.test.tsx | 69 ++++++++++++++++++++--
 2 files changed, 72 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-5922

Fusion-Task-Lineage: 30b2aecb-af73-4f6d-b697-cc0b5630d5d8
2026-06-02 22:29:21 -07:00
gsxdsm
3a5a3f2035 FN-5919: restore hidden usage toggle counts
Keep the usage indicator's Show hidden action available when persisted hidden rows no longer render.

- count hidden usage rows from both rendered windows and orphaned persisted labels
- preserve Show hidden visibility on mobile modal and desktop popover surfaces
- add regression coverage for orphaned hidden labels across both UI surfaces

Files changed:
 packages/dashboard/app/components/UsageIndicator.tsx  | 22 ++++++-
 packages/dashboard/app/components/__tests__/UsageIndicator.test.tsx | 75 ++++++++++++++++++++++
 2 files changed, 96 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-5919

Fusion-Task-Lineage: 6e4827a6-0d6f-424d-a4df-ec7185adf841
2026-06-02 22:07:32 -07:00
gsxdsm
ee00d9f1b7 FN-5928: enforce surface enumeration for bug-fix invariants
Require bug-fix specs and reviews to enumerate affected surfaces and reject repro-only regression coverage.

- add a required `## Surface Enumeration` section to triage prompt templates and bug-fix planning guidance
- tighten reviewer guidance to block missing surface enumeration and repro-only regression tests
- document the canonical surface checklist in `docs/testing.md` and cover the new wording with prompt/reviewer tests

Files changed:
 AGENTS.md                                         |  6 ++--
 docs/testing.md                                   |  9 +++++
 packages/core/src/__tests__/agent-prompts.test.ts | 22 ++++++++++++
 packages/core/src/agent-prompts.ts                | 16 +++++++++
 packages/engine/src/__tests__/reviewer.test.ts    | 17 ++++++++++
 packages/engine/src/__tests__/triage.test.ts      | 41 ++++++++++++++++++++---
 packages/engine/src/reviewer.ts                   |  3 ++
 packages/engine/src/triage.ts                     | 24 +++++++++++++
 8 files changed, 131 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-5928
Fusion-Task-Lineage: 717ddcbe-f3a6-4589-ad90-4e640f7a9ff2
2026-06-02 21:57:21 -07:00
gsxdsm
e33dadd77a FN-5916: fix CLI bin targets for pnpm install
Use a committed launcher for published CLI bin links to avoid fresh-install warnings.

- point the published fn and fusion bin entries at a committed bin.mjs launcher
- add a launcher that checks for dist/bin.js and forwards execution to the built CLI
- cover bin target invariants across workspace packages and update CLI package config tests
- add a patch changeset for the published @runfusion/fusion package

Files changed:
 .changeset/fn-5916-cli-bin-launcher.md            |  5 ++
 packages/cli/bin.mjs                              | 20 ++++++
 packages/cli/package.json                         |  5 +-
 packages/cli/src/__tests__/bin-targets.test.ts    | 85 +++++++++++++++++++++++
 packages/cli/src/__tests__/package-config.test.ts |  8 ++-
 5 files changed, 118 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-5916

Fusion-Task-Lineage: 59d40654-ff77-4655-b9ce-3f3421521b2c
2026-06-02 21:54:14 -07:00
gsxdsm
a8f91e9cc8 fix(FN-5930): remove duplicate const in afterEach cleanup
The FN-5930 squash merge combined two wait-for-exit strategies,
leaving a shadowed 'const exited' and double await. Collapse to
a single register-before-kill pattern.

Fusion-Task-Id: FN-5930
2026-06-02 21:42:38 -07:00
gsxdsm
3ac02ccdd3 FN-5930: stabilize verification spawn supervision test
Reduce flakiness in the real-git verification spawn supervision test.\n\n- write the child PID to stdout with an awaited newline flush before the parent exits\n- collapse the scenario branching so the SIGTERM path is mutually exclusive with crash handling\n- await parent process exit during cleanup and document coverage across normal, signal, and crash teardown paths\n\nFiles changed:\n .../verification-spawn-supervision.real-git.test.ts              | 9 ++++++---\n 1 file changed, 6 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-5930

Fusion-Task-Lineage: 20c3fe73-a640-4c34-8a07-edf5bdda4b25
2026-06-02 21:38:03 -07:00
gsxdsm
821d724628 Fix tests 2026-06-02 21:37:16 -07:00
gsxdsm
bddc876d10 Fix tests 2026-06-02 21:10:00 -07:00
gsxdsm
6d3a077539 FN-5912: separate planning summary button loading states
Keep planning summary actions responsive with operation-specific loading indicators.

- pass separate single-task and breakdown loading flags into the planning summary view
- show the Creating spinner only on Create Single Task and the Breaking down spinner only on Break into Tasks while keeping the sibling action disabled
- add regression coverage for both pending-action paths and normalize the restart integration test temp worktree root under /private/tmp

Files changed:
 .../dashboard/app/components/PlanningModeModal.tsx |  14 ++-
 .../PlanningModeModal.planning-flow.test.tsx       | 138 +++++++++++++++++++++
 .../src/__tests__/restart.integration.test.ts      |   7 +-
 3 files changed, 151 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-5912

Fusion-Task-Lineage: b93da566-0c2b-4ff8-83ea-b6e009dfd650
2026-06-02 20:47:42 -07:00
gsxdsm
9a58c8efac Clean up agents 2026-06-02 20:14:24 -07:00
gsxdsm
ed80f98216 FN-5918: reap dashboard vitest workers on wrapper exit
Prevent dashboard test wrappers from leaving orphaned Vitest subprocesses after interruption or timeout.

- run dashboard vitest wrappers in a detached process group and forward shutdown signals to the whole group
- add an exit-time cleanup path and spawn override seam for process-lifecycle handling without launching real vitest
- cover SIGINT/SIGTERM orphan reaping and keep the dashboard test config guard aligned with the new script test

Files changed:
 .../scripts/__tests__/run-vitest-with-heap.test.ts | 172 +++++++++++++++++++++
 .../dashboard/scripts/run-vitest-with-heap.mjs     |  89 ++++++++++-
 .../__tests__/dashboard-test-config-guard.test.ts  |   1 +
 packages/dashboard/vitest.config.ts                |   1 +
 4 files changed, 256 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-5918

Fusion-Task-Lineage: 5c695b3b-14c5-4749-ad9c-eb9f33d5ecd5
2026-06-02 19:51:12 -07:00
gsxdsm
dbab9e1fd9 FN-5906: defer first planning turn until stream connect
Ensure initial planning reasoning streams live to the UI instead of being emitted before subscribers connect.

- register each new or restarted planning session's first turn as pending until the SSE stream attaches
- consume the deferred initial turn on the first subscriber so thinking output and first question are broadcast live
- add route-planning coverage for deferred first-turn behavior, existing drafts, concurrent subscribers, and settings-resolution flows

Files changed:
 .../src/__tests__/routes-planning.test.ts          | 190 +++++++++++++++++++++
 packages/dashboard/src/planning.ts                 |  63 +++++--
 .../src/routes/register-planning-subtask-routes.ts |   2 +
 3 files changed, 238 insertions(+), 17 deletions(-)

Fusion-Task-Id: FN-5906

Fusion-Task-Lineage: 204fcbaa-15b4-46a0-b794-6dae6ebd97fe
2026-06-02 19:44:37 -07:00
gsxdsm
a411b8a7e0 FN-5914: fix mission activity counts and chronology
Keep mission activity counts accurate before event data loads and show events in chronological order.

- add persisted mission event counts to core mission summaries and dashboard mission summary types
- use the summary event count for the Activity tab preload badge instead of the currently loaded page total
- render mission activity oldest-to-newest, keep load-more prepends stable, and scroll to the latest event on initial/live updates
- extend mission store, dashboard, and MissionManager tests for event count and ordering coverage

Files changed:
 packages/core/src/__tests__/mission-store.test.ts  |  19 ++++
 packages/core/src/mission-store.ts                 |  24 ++++-
 packages/dashboard/app/api/legacy.ts               |   2 +
 .../dashboard/app/components/MissionManager.tsx    |  19 ++--
 .../components/__tests__/MissionManager.test.tsx   | 107 ++++++++++++++++-----
 packages/dashboard/app/components/mission-types.ts |   1 +
 .../dashboard/src/__tests__/mission-e2e.test.ts    |   7 +-
 7 files changed, 143 insertions(+), 36 deletions(-)

Fusion-Task-Id: FN-5914

Fusion-Task-Lineage: b3119e94-66bd-437d-bcde-d5e4e43cb29e
2026-06-02 19:28:01 -07:00
gsxdsm
0041962309 FN-5915: show unread badge on header mailbox
Add unread mailbox status to the desktop header toggle while keeping pending approvals prioritized.

- show an unread status dot on the desktop header mailbox toggle when unread mail exists without pending approvals
- keep pending-approval indicators taking precedence and hide mailbox indicators while the mailbox view is active
- extend Header coverage for unread-only, pending-only, combined, zero-count, and active-mailbox states
- update restart integration coverage to reuse an existing worktree during orphaned resume concurrency

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 packages/dashboard/app/components/Header.tsx       |  9 +++++--
 .../app/components/__tests__/Header.test.tsx       | 26 ++++++++++++++++---
 .../src/__tests__/restart.integration.test.ts      | 29 ++++++++++++++++++++--
 4 files changed, 58 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-5915

Fusion-Task-Lineage: 3a207e2c-ca58-402f-94cf-3a9e514fe263
2026-06-02 19:19:33 -07:00
gsxdsm
39d96bc83b FN-5913: fix dashboard spinner anchoring
Keep dashboard loading spinners rotating around the correct center.

- switch shared SVG spinner utilities from fill-box to view-box anchoring
- factor spinner CSS assertions into a shared contract helper
- add lucide Loader2 coverage and a regression test against fill-box anchoring

Files changed:
 .../app/__tests__/spinner-animation.css.test.ts    | 50 ++++++++++++++--------
 packages/dashboard/app/styles.css                  |  2 +-
 2 files changed, 34 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-5913

Fusion-Task-Lineage: 5fbf2577-301e-4813-ac15-30a73267d155
2026-06-02 19:13:24 -07:00
gsxdsm
6d2a08d7d7 FN-5910: fix skills toggle mobile anchoring
Keep the Skills view toggle anchored correctly after skill enablement on mobile and desktop.

- add relative positioning to the Skills view toggle wrapper so the hidden input stays aligned with its label
- expand the CSS regression test to verify the hidden input anchoring contract and checked-toggle geometry selectors

Files changed:
 packages/dashboard/app/components/SkillsView.css   |  1 +
 .../components/__tests__/SkillsView.css.test.ts    | 30 +++++++++++++++++++---
 2 files changed, 28 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-5910

Fusion-Task-Lineage: d5988ddb-febe-4319-bfef-d0dbc37909ba
2026-06-02 19:10:50 -07:00
gsxdsm
38b84a36f4 FN-5908: recover planning sessions after load failures
Keep failed planning session resumes recoverable instead of dead-ending in the empty planner.

- route errored persisted planning sessions into the retryable error view during session restore
- preserve the session id and surface load/parsing errors through Retry/Dismiss recovery instead of a generic load failure reset
- add planning modal coverage for errored sidebar sessions, malformed persisted results, reopen resync, retry reuse, and missing-session fallback behavior

Files changed:
 .changeset/fair-lizards-jump.md                    |   5 +
 .../dashboard/app/components/PlanningModeModal.tsx |  27 +-
 .../PlanningModeModal.planning-flow.test.tsx       | 284 ++++++++++++++++++++-
 3 files changed, 305 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-5908

Fusion-Task-Lineage: 6904c223-562d-45c5-8965-71b5b90dcbe9
2026-06-02 18:58:48 -07:00
gsxdsm
3d18872f98 FN-5917: fix Codex OAuth option selection
Prevent multi-option OAuth prompts from cancelling Codex browser login.

- add OAuth option selection logic that prefers the browser flow for openai-codex prompts
- fall back to default-labelled or first options for other multi-option OAuth prompts
- add API route coverage for Codex multi-option, single-option, and generic default-labelled prompt handling

Files changed:
 .changeset/fn-5917-codex-oauth-login.md            |  5 ++
 packages/dashboard/src/__tests__/routes-auth.test.ts    | 72 ++++++++++++++++++++++
 packages/dashboard/src/routes/register-auth-routes.ts   | 26 ++++++--
 3 files changed, 97 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-5917

Fusion-Task-Lineage: 3b069280-9dbf-47ee-ae04-b7c54ff14d63
2026-06-02 18:56:36 -07:00
gsxdsm
cf23c6f571 FN-5909: run configured merge bootstrap before verification
Ensure AI merge verification reuses the configured worktree bootstrap command.

- run merge dependency sync unconditionally when a non-blank worktreeInitCommand is configured
- reuse the configured init command instead of inferred package-manager install commands during merge verification
- add merger verification coverage for warm/cold worktrees, inferred-install fallback, and whitespace-only init commands
- document the expanded worktreeInitCommand behavior and add a published changeset

Files changed:
 .changeset/fn-5909-merge-install-script.md         |   5 +
 docs/settings-reference.md                         |   2 +-
 packages/engine/src/__tests__/merger-verification.test.ts      | 159 +++++++++++++++------
 packages/engine/src/merger.ts                      |  30 +++-
 4 files changed, 143 insertions(+), 53 deletions(-)

Fusion-Task-Id: FN-5909

Fusion-Task-Lineage: 8530c641-9574-45e2-b9ac-82e42c9c00a7
2026-06-02 18:43:29 -07:00
gsxdsm
5c4c765134 FN-5904: feat(FN-5904): add browse-and-install flow for skills.sh catalog in Skills view
Add end-to-end browse-and-install flow for skills.sh catalog entries in the dashboard Skills view, enabling users to install skills directly from the catalog UI.

- Add POST /api/skills/install route with source validation and scoped project cwd
- Add installSkill method to SkillsAdapter using supervised npx skills add spawn
- Add installSkill client API function and Install button on catalog cards
- Refresh discovered skills list automatically after successful install
- Handle install errors with structured error codes (invalid_source, install_failed, install_timeout, spawn_error)
- Add card header layout with install button, disabled state, and loading spinner
- Add comprehensive tests: adapter unit tests, route integration tests, component tests
- Add changeset for @runfusion/fusion minor bump
- Update dashboard-guide.md with install endpoint documentation

Files changed:
 .changeset/four-oranges-film.md                    |   5 +
 docs/dashboard-guide.md                            |  45 +++++++
 packages/dashboard/app/__tests__/api-skills.test.ts |  46 +++++++
 packages/dashboard/app/api/legacy.ts               |  12 ++
 packages/dashboard/app/components/SkillsView.css   |  16 +++
 packages/dashboard/app/components/SkillsView.tsx   |  83 +++++++++---
 packages/dashboard/app/components/__tests__/SkillsView.test.tsx |  72 +++++++++++
 packages/dashboard/src/__tests__/routes-skills.test.ts |  67 ++++++++++
 packages/dashboard/src/__tests__/skills-adapter.test.ts | 113 ++++++++++++++++
 packages/dashboard/src/routes/__tests__/register-agent-skills-routes.test.ts | 144 +++++++++++++++++++++
 packages/dashboard/src/routes/register-agent-skills-routes.ts |  51 ++++++++
 packages/dashboard/src/skills-adapter.ts           | 103 +++++++++++++++
 12 files changed, 736 insertions(+), 21 deletions(-)

Fusion-Task-Id: FN-5904

Fusion-Task-Lineage: 338d53e3-baba-4c6c-9173-8e214242403c
2026-06-02 18:29:53 -07:00
gsxdsm
577ce12a18 FN-5898: add unlinked mission goal indicator
Document the manual no-backfill mission-goal policy and flag active missions that still need explicit goal links.

- document the mission→goal linkage model, explicit no-backfill decision, and manual linkage workflow in missions docs
- include linkedGoalCount in mission summaries and cover single-summary/batched-summary behavior in MissionStore tests
- show an Unlinked badge for active non-interview missions with zero linked goals and add MissionManager coverage

Files changed:
 .changeset/fn-5898-mission-goal-unlinked-indicator.md     |  5 ++
 docs/missions.md                                   | 18 ++++--
 packages/core/src/__tests__/mission-store.test.ts  | 32 +++++++++-
 packages/core/src/mission-store.ts                 | 25 +++++++-
 packages/dashboard/app/components/MissionManager.css    |  6 ++
 packages/dashboard/app/components/MissionManager.tsx    | 14 ++++
 packages/dashboard/app/components/__tests__/MissionManager.test.tsx   | 74 ++++++++++++++++++++++
 packages/dashboard/app/components/mission-types.ts |  1 +
 8 files changed, 166 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-5898

Fusion-Task-Lineage: e31e9544-4e03-4b52-afbb-e372314b997e
2026-06-02 18:15:14 -07:00
gsxdsm
cc18206bc5 FN-5902: make mission validation AI-run all criteria
Route every mission feature through validator-backed completion checks.

- lazily restore a managed feature assertion before validation instead of auto-passing zero-assertion features
- thread milestone acceptance criteria into validator prompts and system instructions as enforced requirements
- update MissionManager copy/tests to present criteria as AI-validated runtime gates and remove informational-only/zero-assertion warnings
- document the all-criteria AI-run contract and add a changeset for @runfusion/fusion

Files changed:
 .changeset/fn-5902-mission-validation-ai-run.md    |   5 +
 AGENTS.md                                          |   2 +-
 docs/architecture.md                               |   2 +-
 docs/missions-completion-contract.md               | 198 ++++++---------------
 docs/missions.md                                   |   5 +-
 packages/core/src/__tests__/mission-store.test.ts  |  23 ++-
 packages/core/src/mission-store.ts                 |  10 ++
 packages/dashboard/app/components/MissionManager.css    |  31 ----
 packages/dashboard/app/components/MissionManager.tsx    |  86 +++------
 packages/dashboard/app/components/__tests__/MissionManager.test.tsx   |  60 +++++--
 packages/engine/src/__tests__/mission-execution-loop.test.ts   | 111 +++++++++---
 packages/engine/src/__tests__/reliability-interactions/mission-validation-trigger-gap.test.ts         |  57 +++---
 packages/engine/src/mission-execution-loop.ts      |  78 ++++----
 13 files changed, 318 insertions(+), 350 deletions(-)

Fusion-Task-Id: FN-5902

Fusion-Task-Lineage: 5f25caad-33c9-42ff-822b-1ea092afc29f
2026-06-02 18:11:26 -07:00
gsxdsm
abbeaec0a8 FN-5897: surface linked goals in mission read paths
Expose mission-linked goals across mission detail surfaces.

- load linked goal records into mission hierarchy reads in core and return them from the mission detail API
- show linked goals in mission detail views, add goal-chip navigation, and anchor highlighted goal cards in GoalsView
- extend CLI mission output, docs, tests, and add a published changeset for the new read-path support

Files changed:
 .changeset/fn-5897-linked-goals-read-paths.md      |  5 +++
 docs/missions.md                                   |  6 ++-
 packages/cli/src/__tests__/extension.test.ts       | 48 +++++++++++++++++++++-
 packages/cli/src/extension.ts                      | 10 +++++
 packages/core/src/__tests__/mission-store.test.ts  | 14 +++++++
 packages/core/src/mission-store.ts                 | 29 +++++++++++++
 packages/core/src/mission-types.ts                 |  4 ++
 packages/dashboard/app/App.tsx                     | 16 +++++++-
 packages/dashboard/app/components/GoalsView.css    |  6 +++
 packages/dashboard/app/components/GoalsView.tsx    | 42 +++++++++++++++++--
 packages/dashboard/app/components/MissionManager.css | 44 ++++++++++++++++++++
 packages/dashboard/app/components/MissionManager.tsx | 31 +++++++++++++-
 packages/dashboard/app/components/__tests__/GoalsView.test.tsx | 31 ++++++++++++++
 packages/dashboard/app/components/__tests__/MissionManager.test.tsx | 45 ++++++++++++++++++++
 packages/dashboard/app/components/mission-types.ts |  2 +
 packages/dashboard/src/__tests__/mission-e2e.test.ts |  4 ++
 packages/dashboard/src/mission-routes.ts           |  5 ++-
 17 files changed, 332 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-5897

Fusion-Task-Lineage: 5176270d-9885-447a-845b-4e0d69d531a0
2026-06-02 17:58:41 -07:00
gsxdsm
6c7ed1e1fc docs: add compound-engineering plugin implementation plan
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 17:41:26 -07:00
gsxdsm
d9941c3886 docs: add compound-engineering plugin requirements (brainstorm + review)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 17:24:17 -07:00
gsxdsm
bb87ac0693 FN-5905: remove orphaned .skip stubs from soft-delete test
Remove obsolete placeholder skips from the soft-delete end-to-end suite.

- delete six orphaned `it.skip(...)` stub cases from `soft-delete-end-to-end.test.ts`
- keep the reliability interaction test focused on active end-to-end assertions instead of cross-file placeholder notes

Files changed:
 packages/engine/src/__tests__/reliability-interactions/soft-delete-end-to-end.test.ts | 49 ----------------------
 1 file changed, 49 deletions(-)

Fusion-Task-Id: FN-5905
Fusion-Task-Lineage: 2edd9ef8-e5f4-492e-9bd0-a58963ac2e58
2026-06-02 16:21:07 -07:00