Commit Graph

8972 Commits

Author SHA1 Message Date
Phil Larson
283f689d8a fix(engine): retriage stale mission feature links 2026-06-14 19:26:55 -07:00
gsxdsm
f7635faf37 FN-6452: backfill plugin proof-point evidence
Document the restored FN-6437 proof-point results in the external plugin runbook.

- Replace the pending-verification placeholder with the recorded NOT MET verdict for @runfusion/fusion@0.43.0.
- Add package, integrity, environment, command, scaffold, and TypeScript failure evidence from the restored report.
- Preserve explicit gaps for list/enable proof and follow-up checks that were blocked by the released scaffold failure.

Files changed:
 docs/plugins/external-proof-point-runbook.md | 132 +++++++++++++++++++++++++--
 1 file changed, 124 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-6452

Fusion-Task-Lineage: 14d3b848-59cd-43bb-b725-6586182906ee
2026-06-14 15:29:35 -07:00
gsxdsm
fa71525850 FN-6438: add external plugin proof-point runbook
Add a durable proof-point runbook for validating external plugins against released Fusion CLI builds.

- Document release selection, npm integrity capture, scaffold/build/test/install/enable validation, and pass/fail criteria for external plugin proof points.
- Link the runbook from the docs index so it remains discoverable with other plugin authoring docs.
- Extend the docs README index test to require the new proof-point runbook entry.

Files changed:
 docs/README.md                                     |   1 +
 docs/plugins/external-proof-point-runbook.md       | 211 +++++++++++++++++++++
 .../cli/src/__tests__/docs-readme-index.test.ts    |   1 +
 3 files changed, 213 insertions(+)

Fusion-Task-Id: FN-6438

Fusion-Task-Lineage: 5c768d7e-4465-42ac-9535-f16dc42ab6d0
2026-06-14 15:29:35 -07:00
gsxdsm
56d9743a58 FN-6451: ignore local Paseo config
Keep Paseo-generated repo-root configuration out of source control.

- Add a documented .gitignore entry for paseo.json.\n- Preserve local Paseo worktree-manager configuration as untracked repo noise.\n\nFiles changed:\n .gitignore | 4 ++++\n 1 file changed, 4 insertions(+)

Fusion-Task-Id: FN-6451

Fusion-Task-Lineage: 412c2dda-c461-4dbb-a413-fb69eb8b7736
2026-06-14 15:29:35 -07:00
gsxdsm
b7c23c09c3 FN-6450: enable touch scrolling for agent detail tabs
Enable mobile users to swipe across the agent detail tab strip.

- Restores horizontal touch panning on the agent detail tabs while preserving vertical pan behavior.
- Documents the mobile touch-action requirement next to the tab-strip CSS.
- Adds a mobile regression test covering pan-x touch-action and horizontal overflow.

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

Fusion-Task-Id: FN-6450
Fusion-Task-Lineage: 7006af83-4490-4fe0-a357-7d19b7b522c0
2026-06-14 15:29:35 -07:00
gsxdsm
e526ad2b2c FN-6447: rescue session reconnect teardown
Rescue the session reconnect SSE test by shutting down route-owned background work before temp cleanup.

- Isolate the focused API harness from TaskStore EventEmitter startup workers.
- Dispose API routes and scheduled AI session cleanup before deleting the test temp root.
- Remove session-reconnect from the dashboard quarantine ledger and vitest skip list.

Files changed:
 .../src/__tests__/session-reconnect.test.ts        | 22 ++++++++++++++++++----
 packages/dashboard/vitest.config.ts                |  6 ++++--
 scripts/lib/test-quarantine.json                   |  5 -----
 3 files changed, 22 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-6447

Fusion-Task-Lineage: a3fef28c-b92b-4f47-9181-a63bb31e4f48
2026-06-14 15:29:35 -07:00
gsxdsm
12efd3fd3f FN-6445: reject quality skip-list overlaps
Prevent dashboard curated skip-list entries from masking tests already covered by quality projects.

- Add validation that flags skip-list files included by quality lanes.
- Cover overlap, empty-reason overlap, and genuine orphan cases in inventory tests.
- Document that skip-lists are only for genuinely non-executed dashboard tests.

Files changed:
 docs/testing.md                                 |  1 +
 scripts/__tests__/check-test-inventory.test.mjs | 29 ++++++++++++++++++++++---
 scripts/check-test-inventory.mjs                |  9 ++++++++
 3 files changed, 36 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-6445

Fusion-Task-Lineage: 1741f684-8dfc-41fc-8f30-baa3700ac11b
2026-06-14 15:29:35 -07:00
gsxdsm
c9680b5767 FN-6448: document Quick Chat mobile reliability
Document Quick Chat's mobile send and stop-button reliability expectations.\n\n- Note the mobile delivery watchdog for stranded queued messages.\n- Describe duplicate pointer/touch send protection and immediate stop handling.\n- Document the streaming stop control's square touch-target sizing.\n\nFiles changed:\n docs/dashboard-guide.md | 3 +++\n 1 file changed, 3 insertions(+)

Fusion-Task-Id: FN-6448

Fusion-Task-Lineage: e5d4e5b5-05ba-47bc-9b64-0d641b8d75a8
2026-06-14 15:29:35 -07:00
gsxdsm
c12e7e39fb FN-6444: rescue dashboard route API tests
Rescue deterministic dashboard route/API tests from the curated skip-list and quarantine the remaining stale suites.

- Remove dashboard src route/API tests from the curated skip-list once they either run in backfill or move to quarantine.
- Add dated quarantine coverage for stale mission, planning, and session reconnect suites.
- Update rescued route/API test expectations and FNXC comments to match current deterministic behavior.

Files changed:
 .../dashboard/src/__tests__/chat-manager.test.ts   |  4 ++
 .../dashboard/src/__tests__/evals-routes.test.ts   |  8 +++-
 .../src/__tests__/github-tracking-delete.test.ts   |  4 ++
 ...ithub-tracking-periodic-reconcile-sweep.test.ts |  8 +++-
 .../src/__tests__/insights-routes.test.ts          | 12 ++++--
 .../__tests__/routes-run-audit-goal-events.test.ts |  6 ++-
 .../src/__tests__/routes-run-cited-goals.test.ts   |  6 ++-
 .../shared-branch-group-entry-points.test.ts       |  6 +--
 packages/dashboard/src/__tests__/usage.test.ts     |  4 ++
 packages/dashboard/vitest.config.ts                |  6 +++
 scripts/lib/dashboard-curated-skiplist.json        | 44 ----------------------
 scripts/lib/test-quarantine.json                   | 15 ++++++++
 12 files changed, 66 insertions(+), 57 deletions(-)

Fusion-Task-Id: FN-6444

Fusion-Task-Lineage: f314da67-d05e-48c5-9c9c-890c28cf0e5b
2026-06-14 15:29:35 -07:00
gsxdsm
6cc873e23f FN-6446: make Secrets view fill mobile width
Ensure the Secrets page root expands within the project content flex row on narrow screens.

- Let the Secrets view root flex to available width with a zero min-width.
- Preserve existing height and spacing behavior while avoiding intrinsic card-width collapse.
- Cover the mobile layout contract with a root-container CSS assertion.

Files changed:
 packages/dashboard/app/components/SecretsView.css                  | 7 +++++++
 .../dashboard/app/components/__tests__/SecretsView.mobile.test.tsx | 7 +++++++
 2 files changed, 14 insertions(+)

Fusion-Task-Id: FN-6446

Fusion-Task-Lineage: 34f55d8e-ee57-432c-b1ce-165cc43333ee
2026-06-14 15:29:35 -07:00
gsxdsm
1f540b29d7 FN-6443: rescue dashboard session tests
Rescue skipped dashboard session tests by making planning responses durable before continuation.

- Persist planning-session response history before agent continuation so retry and replay state survives generation errors.
- Isolate dashboard session tests on dedicated SQLite handles and close them before temp cleanup.
- Restore engine mocks for workflow authoring tools and remove the rescued session tests from the curated dashboard skiplist.
- Add a patch changeset for the published CLI bundle.

Files changed:
 .changeset/fn-6443.md                              |  5 +++
 .../src/__tests__/session-cross-tab.test.ts        | 38 ++++++++++++++--------
 .../src/__tests__/session-error-recovery.test.ts   |  2 ++
 .../session-persistence-roundtrip.test.ts          |  2 ++
 .../src/__tests__/session-reconnect.test.ts        | 21 ++++++++++--
 packages/dashboard/src/planning.ts                 | 11 ++++---
 scripts/lib/dashboard-curated-skiplist.json        | 16 ---------
 7 files changed, 58 insertions(+), 37 deletions(-)

Fusion-Task-Id: FN-6443

Fusion-Task-Lineage: 953534e7-6857-4cd5-9a5a-5772354cac5a
2026-06-14 15:29:35 -07:00
gsxdsm
a6d5efce27 FN-6442: rescue dashboard hook tests from skiplist
Rescues three dashboard hook test files by replacing brittle coverage with stable assertions and removing their skiplist entries.

- Stub global localStorage failures directly for quick chat persistence coverage.
- Remove the placeholder skipped useChatRooms pagination test.
- Rework useTaskDiffStats stepVersion tests around active worktree cache behavior.
- Drop the rescued dashboard hook tests from the curated skiplist.

Files changed:
 .../__tests__/quickChatLastSessionStorage.test.ts  | 23 ++++--
 .../app/hooks/__tests__/useChatRooms.test.ts       |  6 --
 .../app/hooks/__tests__/useTaskDiffStats.test.ts   | 94 ++++++++++++----------
 scripts/lib/dashboard-curated-skiplist.json        | 12 ---
 4 files changed, 67 insertions(+), 68 deletions(-)

Fusion-Task-Id: FN-6442
Fusion-Task-Lineage: f2fe4791-1216-420d-9734-3938287779da
2026-06-14 15:29:35 -07:00
gsxdsm
4f7b3ac78f FN-6439: clear stale near-duplicate flags
Clear near-duplicate decisions when their canonical task is no longer active.

- Add a shared canonical activity helper for near-duplicate detection.
- Clear stale persisted near-duplicate metadata when canonical tasks are done, archived, or deleted.
- Prevent triage and dashboard surfaces from presenting duplicate decisions for inactive canonicals.
- Cover stale-flag cleanup and hidden dashboard affordances with regression tests.

Files changed:
 docs/task-management.md                            |   4 +-
 .../near-duplicate-stale-flag-clear.test.ts        | 105 +++++++++++++++++++++
 packages/core/src/__tests__/near-duplicate.test.ts |  19 +++-
 packages/core/src/index.ts                         |   2 +
 packages/core/src/near-duplicate-canonical.ts      |  25 +++++
 packages/core/src/near-duplicate.ts                |   3 +
 packages/core/src/store.ts                         | 102 +++++++++++++++++++-
 packages/dashboard/app/App.tsx                     |   7 +-
 packages/dashboard/app/components/Column.tsx       |  10 ++
 packages/dashboard/app/components/TaskCard.tsx     |  12 ++-
 .../dashboard/app/components/TaskDetailModal.tsx   |  12 ++-
 packages/dashboard/app/components/WorktreeGroup.tsx     |  30 +++++-
 .../app/components/__tests__/TaskCard.test.tsx     |  28 ++++++
 .../__tests__/TaskDetailModal.rendering.test.tsx   |  26 +++++
 .../near-duplicate-intake.test.ts                  |  24 +++++
 packages/engine/src/triage.ts                      |  10 ++
 16 files changed, 411 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-6439

Fusion-Task-Lineage: e57b80e8-36aa-4b96-ad13-53b5a431477d
2026-06-14 15:29:35 -07:00
gsxdsm
175aab15ac FN-6441: rescue and quarantine dashboard component tests
Rescue passing dashboard component tests and move still-failing orphaned tests under the quarantine ratchet.

- Remove the FN-6441 dashboard component batch from the curated skip-list.
- Keep passing PlanningModeModal, TaskReviewTab, and TerminalModal coverage documented in app backfill.
- Register remaining failing dashboard component/CSS tests in the dated quarantine ledger and Vitest excludes.
- Teach the dashboard curated inventory guard to accept dated quarantine entries without returning them to the skip-list.

Files changed:
 .../PlanningModeModal.ui-interactions.test.tsx     |  9 ++-
 .../components/__tests__/TaskReviewTab.test.tsx    |  4 ++
 .../components/__tests__/TerminalModal.test.tsx    |  4 ++
 packages/dashboard/vitest.config.ts                | 14 +++++
 scripts/__tests__/check-test-inventory.test.mjs    | 32 +++++++++++
 scripts/check-test-inventory.mjs                   | 67 +++++++++++++++++-----
 scripts/lib/dashboard-curated-skiplist.json        | 56 ------------------
 scripts/lib/test-quarantine.json                   | 58 ++++++++++++++++++-
 8 files changed, 172 insertions(+), 72 deletions(-)

Fusion-Task-Id: FN-6441

Fusion-Task-Lineage: 19065d1f-31eb-45fc-a6ce-083773b094e4
2026-06-14 15:29:35 -07:00
gsxdsm
0b047d4fc8 FN-6440: replace dashboard skip-list placeholders
Dashboard curated-gate skip-list entries now point to actionable tracking work.

- Replace placeholder FN-TBD references with concrete Fusion task IDs grouped by affected dashboard area.
- Document the requirement that skip-list reasons cite real tracking tasks unless entries are removed after rescue.
- Preserve the standalone build-output exception while making the remaining skip-list ownership actionable.

Files changed:
 docs/testing.md                             |  1 +
 scripts/lib/dashboard-curated-skiplist.json | 66 ++++++++++++++---------------
 2 files changed, 34 insertions(+), 33 deletions(-)

Fusion-Task-Id: FN-6440
Fusion-Task-Lineage: abf1cef2-8199-4746-b8ec-8b5487eb1ecc
2026-06-14 15:29:35 -07:00
gsxdsm
8caced6b57 FN-6436: remove CLI Vitest timeout appeasement
Remove the CLI extension integration suite's hidden Vitest timeout override while keeping its explicit build-only allowance.

- Replace the file-wide 30s Vitest test and hook timeout override with a scoped comment documenting default caps.
- Derive the extension bundle path from the CLI root in the test file.
- Use a SQLite collision trigger instead of a TaskStore prototype spy and fix the agent delete tool payload.
- Clear the timeout appeasement allowlist now that the CLI test exemption is gone.

Files changed:
 .../src/__tests__/extension-integration.test.ts    | 25 ++++++++++++++++------
 .../lib/test-timeout-appeasement-allowlist.json    |  8 +------
 2 files changed, 20 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-6436
Fusion-Task-Lineage: 670f41ea-f98f-400c-aa16-6a1cbb1e9bea
2026-06-14 15:29:35 -07:00
gsxdsm
1f660f3e8a FN-6434: block Vitest timeout appeasement
Add a fast guard that rejects Vitest timeout bumps in tracked test files.

- Add a test-timeout appeasement scanner with a temporary allowlist for legacy exemptions.
- Run the scanner in pretest, pretest:full, and test:gate so merge gates catch timeout bumps.
- Cover the scanner behavior with node:test cases and document the policy/remediation path.

Files changed:
 docs/testing.md                                    |   6 ++
 package.json                                       |   6 +-
 .../check-no-test-timeout-appeasement.test.mjs     |  49 +++++++++
 scripts/check-no-test-timeout-appeasement.mjs      | 119 +++++++++++++++++++++
 .../lib/test-timeout-appeasement-allowlist.json    |  10 ++
 5 files changed, 187 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-6434

Fusion-Task-Lineage: deb46a27-b0c9-4644-b8bb-34ce98e7acde
2026-06-14 15:29:35 -07:00
gsxdsm
93b2288d37 FN-6433: rescue non-CLI quarantined tests
Rescue and ratchet non-CLI quarantine state across engine, core, and dashboard suites.

- Empty the core, dashboard, and engine quarantine exclude arrays after proving rescued suites run under package load.
- Replace broad AI-merge active-session registry cleanup with path-scoped unregistering in engine tests.
- Delete the duplicate soft-delete blocker residue suite and clear the quarantine ledger.
- Document the non-CLI quarantine sweep pattern for future rescues.

Files changed:
 docs/testing.md                                    |   2 +
 packages/core/vitest.config.ts                     |  10 +-
 packages/dashboard/vitest.config.ts                |  12 +-
 .../merger-ai-cleanup-active-session.test.ts       |  20 +++-
 .../engine/src/__tests__/merger-ai-cleanup.test.ts |   5 +-
 .../soft-delete-blocker-residue.test.ts            | 128 ---------------------
 packages/engine/vitest.config.ts                   |  12 +-
 scripts/lib/test-quarantine.json                   |  65 +----------
 8 files changed, 40 insertions(+), 214 deletions(-)

Fusion-Task-Id: FN-6433

Fusion-Task-Lineage: 18c37475-e6e1-4358-9350-eca65cf53b68
2026-06-14 15:29:35 -07:00
gsxdsm
d7430800e2 FN-6431: remove provider settings timeout appeasement
Keep provider-settings tests on Vitest's default timeout after fixture isolation fixes.

- Remove the file-wide 30s Vitest timeout override from provider-settings tests.
- Document why the synchronous temp-workspace checks must remain under the default timeout.

Files changed:
 .../cli/src/commands/__tests__/provider-settings.test.ts    | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-6431

Fusion-Task-Lineage: 4e18795d-4cbb-4af7-92f7-8368cec95c37
2026-06-14 15:29:35 -07:00
gsxdsm
59f2596c61 FN-6435: add plugin scaffold state
Ensure generated plugin scaffolds include the FusionPlugin state required by the SDK contract.

- Add state: "installed" to workspace and standalone plugin scaffold outputs.
- Cover scaffold output with tests and a compile-time FusionPlugin fixture.
- Document the state field in plugin authoring guidance and add a patch changeset.

Files changed:
 .changeset/FN-6435-plugin-scaffold-state.md        |  9 +++++++
 docs/PLUGIN_AUTHORING.md                           |  2 ++
 packages/cli/src/__tests__/plugin-scaffold.test.ts | 22 ++++++++++++++--
 packages/cli/src/commands/plugin-scaffold.ts       |  5 ++++
 .../type-guards/plugin-scaffold-fusion-plugin.ts   | 30 ++++++++++++++++++++++
 5 files changed, 66 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6435

Fusion-Task-Lineage: 8c7e2f5d-9dd4-4058-aef9-11d6ff0ba5e0
2026-06-14 15:29:35 -07:00
gsxdsm
2fc6d4d667 FN-6430: rescue CLI quarantine tests
Rescue the quarantined CLI suites by fixing shared test isolation instead of extending timeouts.

- Remove rescued CLI files from the quarantine ledger and Vitest exclude list while preserving an empty rescue ledger comment.
- Tighten Vitest HOME isolation to reject inherited worker homes and sweep legacy top-level fn-test-home roots with bounded cleanup.
- Reset affected CLI fixtures, close research stores, and narrow the slow mission store seam so rescued tests run on default timeouts.
- Document the CLI shared-fixture rescue pattern for future quarantine recoveries.

Files changed:
 docs/testing.md                                    |   2 +
 .../cli/src/__tests__/extension-task-tools.test.ts |   7 +-
 packages/cli/src/__tests__/extension.test.ts       | 117 +++++++++----------
 .../cli/src/commands/__tests__/mission.test.ts     |  16 ++-
 packages/cli/src/commands/__tests__/plugin.test.ts |   5 +
 packages/cli/vitest.config.ts                      |  52 ++-------
 packages/core/src/__test-utils__/vitest-setup.ts   |  25 ++++-
 .../core/src/__test-utils__/vitest-teardown.ts     |  28 ++++-
 .../vitest-teardown-worker-root-cleanup.test.ts    |  15 +++
 scripts/lib/test-quarantine.json                   | 124 +--------------------
 10 files changed, 157 insertions(+), 234 deletions(-)

Fusion-Task-Id: FN-6430

Fusion-Task-Lineage: 943b73b4-5f92-4703-8e93-0ae3207eb63c
2026-06-14 15:29:35 -07:00
gsxdsm
23c2bc935a Merge pull request #1676 from plarson/fix/incomplete-stuck-loop-parking
fix: park incomplete stuck-loop exhaustion
2026-06-14 12:18:06 -07:00
Phil Larson
93fd220aaf fix: guard stuck-loop park logging
Handle logEntry failures after in-place parking without falling back to executor requeue and tighten the reliability assertion for STUCK_LOOP_EXHAUSTED.
2026-06-14 11:19:11 -07:00
Phil Larson
10ee5954d5 fix: guard stuck-loop in-place park patch failure 2026-06-14 11:09:17 -07:00
Phil Larson
f1ac8d5f6b fix: address stuck-loop parking review comments 2026-06-14 10:59:21 -07:00
Phil Larson
19eca3d74b fix(engine): park incomplete stuck-loop exhaustion
Preserve incomplete task progress after stuck-kill budget exhaustion while marking the task failed and paused for manual intervention instead of making it scheduler-runnable again.
2026-06-14 10:42:36 -07:00
gsxdsm
4482425d4b chore(release): v0.43.0
Version bump via changesets.
2026-06-14 00:43:13 -07:00
gsxdsm
b14fad9c59 chore: normalize changeset format
Use the `@runfusion/fusion` package key (matching the repo convention) for the
mobile chat changesets instead of `@fusion/dashboard`, and restore the missing
`---` frontmatter delimiters on the Claude OAuth refresh changeset.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 00:41:56 -07:00
gsxdsm
fd6caaa338 fix(chat): stop quick chat mobile send button firing twice per tap
A real touch tap dispatches both pointerdown and touchstart, and the quick chat
send (and stop) buttons ran their action on each event. Because React had not
flushed the composer clear between the two synchronous handlers, both saw the
same input and fired handleSendMessage — and the hook's second send closed the
first's freshly-opened stream and re-POSTed, which could drop the agent's
response (notably for the first message after a response completed).

Add a tap-scoped guard (cleared after the current input task) so only the first
of the paired pointerdown/touchstart events performs the action. This is kept
separate from the 700ms onClick latch — which is shared between the send and
stop buttons — so a stop tap right after a send is never swallowed.

The earlier component test masked this because fireEvent flushes React state
between calls; the regression test now dispatches the full tap sequence in one
act() to mirror the device.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 00:34:17 -07:00
gsxdsm
9eeaaa706f fix(chat): widen the too-narrow quick chat stop button
The quick chat stop button reused ChatView's `.chat-input-stop` class, which
sizes itself with `--chat-input-control-size` — a variable defined on
`.chat-input-row` in the ChatView composer and undefined in the quick chat DOM.
The invalid var collapsed the button's width (and mobile min-width) toward its
icon, leaving it noticeably narrower than the send button it replaces.

Pin the stop button to the send button's square dimensions with a compound
selector using globally-scoped spacing tokens, so it outranks the single-class
base and mobile rules from both stylesheets.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 00:18:45 -07:00
gsxdsm
8cf32d5b2b fix(chat): add delivery watchdog for stranded quick chat messages
Follow-up to the quick chat send fix. The send-time stale-stream recovery
only fires when a message is queued while the streaming flag is already
stuck, and the pre-session flush effect fires once on session activation and
bails permanently if a stream ref is lingering. Either gap leaves a queued
message stranded idle in the composer — shown locally but never sent to the
agent or persisted (so also absent from regular chat).

Add a delivery watchdog: whenever a message stays pending under an active
session, re-confirm after a short delay and force-deliver it if the server
reports no generation in flight and no live stream is connected. This is a
catch-all backstop independent of which targeted flush trigger bailed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 00:06:34 -07:00
gsxdsm
f54100b67e FN-6427: document CLI quarantine triage
Document the current CLI quarantine decision so the deletion ratchet stays explicit.

- Record that all 24 quarantined CLI Vitest suites were re-triaged and kept in-window.\n- Capture the direct-run evidence and package-load rescue rationale in the CLI Vitest config.\n- Preserve the existing quarantine list without adding or removing suites.\n\nFiles changed:\n packages/cli/vitest.config.ts | 4 ++++\n 1 file changed, 4 insertions(+)

Fusion-Task-Id: FN-6427

Fusion-Task-Lineage: 30e4ccc7-97d3-4aa1-838c-dcb35f2734f1
2026-06-13 23:59:06 -07:00
gsxdsm
67ae2be0de fix(chat): deliver mobile chat sends that silently dropped
Two mobile send failures with a shared symptom of "nothing happens":

- Regular chat: the send button was dead to touch. The action lived only
  in onClick, but iOS suppresses the trailing synthetic click after
  preventDefault() in the touch sequence, so taps never sent. Fire the send
  from pointerdown/touchstart with a self-clearing dedupe latch (mirroring the
  QuickChat send button), keeping a single send per tap.

- Quick chat: a queued message could strand in the composer — shown locally
  but never reaching the agent or the persisted session (so it also never
  appeared in regular chat). A stream that dropped without onDone/onError
  (e.g. mobile tab suspension) left the streaming flag stuck true, so every
  later send took the "queue while streaming" branch and was never flushed.
  On a queued send, detect the stale flag via the stream's connection state
  and the server's generation status, then tear down the dead stream and flush.

Both paths covered by new tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 23:45:15 -07:00
gsxdsm
aa71ace101 fix(auth): refresh expired Claude OAuth tokens
Refresh stored Claude OAuth credentials before reporting dashboard auth status or resolving model auth so users do not need to repeatedly re-login after access-token expiry.

Coalesce concurrent refresh attempts, prevent stale refreshes from overwriting newer logins, and route CLI dashboard/serve/daemon/onboard auth wiring through the shared refresh-capable storage.
2026-06-13 23:20:06 -07:00
gsxdsm
52a0f9dfd8 Fix changeset frontmatter delimiters
Add missing --- fences around the YAML frontmatter in
fix-database-recovery-preserve-corrupt.md so the changeset parses.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 22:45:48 -07:00
gsxdsm
be2773b412 FN-6423: fix scheduler capacity accounting
Correct scheduler dispatch diagnostics so capacity decisions use consistent non-negative slot counts.

- Clamp excess semaphore releases at zero and warn once when a slot is returned without an active holder.
- Recompute dispatch capacity at each queue decision, including tasks started earlier in the same scheduler tick.
- Update scheduler and semaphore tests for true binding gates, non-negative diagnostics, and workflow-step env stability.
- Add a patch changeset for the scheduler capacity fix.

Files changed:
 .changeset/fn-6423-scheduler-capacity.md           |   5 +
 packages/engine/src/__tests__/concurrency.test.ts  |  32 ++++++
 .../src/__tests__/executor-step-session.test.ts    |  10 +-
 packages/engine/src/__tests__/scheduler.test.ts    | 122 ++++++++++++++++++++-
 packages/engine/src/concurrency.ts                 |  29 ++++-
 packages/engine/src/scheduler.ts                   | 117 ++++++++++----------
 6 files changed, 248 insertions(+), 67 deletions(-)

Fusion-Task-Id: FN-6423

Fusion-Task-Lineage: a6b2e668-a822-46e9-9cd8-ac267fbde804
2026-06-13 21:23:39 -07:00
gsxdsm
b1ba87e599 FN-6414: preserve built-in Z.ai models after extensions
Keep GLM-5.2 visible when user Z.ai extensions replace the provider registration.

- Add shared helpers to clone and register the built-in Z.ai provider safely.
- Re-merge missing built-in Z.ai models after extension provider registration in daemon, serve, dashboard, and pi flows.
- Cover provider replacement behavior in core and dashboard model route tests, and document the extension-preserving behavior.

Files changed:
 .changeset/FN-6414-glm-5-2-visible.md              |  5 ++
 docs/settings-reference.md                         |  2 +-
 packages/cli/src/commands/daemon.ts                | 12 +--
 packages/cli/src/commands/dashboard.ts             | 12 +--
 packages/cli/src/commands/serve.ts                 | 12 +--
 packages/core/src/__tests__/zai-provider.test.ts   | 33 +++++++-
 packages/core/src/index.ts                         |  7 +-
 packages/core/src/zai-provider.ts                  | 93 +++++++++++++++++++++
 ...register-model-routes-zai-real-registry.test.ts | 97 ++++++++++++++++++++++
 packages/engine/src/pi.ts                          | 12 +--
 10 files changed, 250 insertions(+), 35 deletions(-)

Fusion-Task-Id: FN-6414

Fusion-Task-Lineage: f0990da2-968d-4782-8c00-fbc350d6954f
2026-06-13 21:17:20 -07:00
gsxdsm
7b839069b5 FN-6420: run dependency sync in AI merge worktrees
Run configured or inferred dependency installs before AI merge verification uses the clean-room worktree.

- Add shared dependency-sync helpers with install marker caching for inferred lockfile installs.
- Run dependency sync during AI clean-room merges and audit/log the command, skip reason, and duration.
- Reuse the helper from merger paths while documenting the new behavior and covering install success/failure cases.

Files changed:
 .changeset/fn-6420-ai-merge-dependency-sync.md     |   5 +
 docs/architecture.md                               |   2 +-
 docs/settings-reference.md                         |   2 +-
 .../src/__tests__/executor-step-session.test.ts    |   5 +-
 .../merger-ai-dependency-install.slow.test.ts      | 269 +++++++++++++++++++++
 packages/engine/src/merge-dependency-sync.ts       | 144 +++++++++++
 packages/engine/src/merger-ai.ts                   |  31 +++
 packages/engine/src/merger.ts                      | 120 +++------
 packages/engine/src/run-audit.ts                   |   1 +
 9 files changed, 484 insertions(+), 95 deletions(-)

Fusion-Task-Id: FN-6420

Fusion-Task-Lineage: 49353cb6-4953-4670-b620-a90331f048dc
2026-06-13 21:09:12 -07:00
gsxdsm
3d5c22c075 FN-6425: pin task chat expand control
Keep the task chat expand action visible as an icon-only overlay inside the chat view.

- Move the expand/collapse button out of the scrolling transcript and onto the task chat container.
- Style the control as a centered icon-only button with stable overlay positioning.
- Extend TaskChatTab coverage for empty, loading, populated, expanded, and scrolled transcript states.

Files changed:
 packages/dashboard/app/components/TaskChatTab.css  | 10 +++-
 packages/dashboard/app/components/TaskChatTab.tsx  | 26 +++++-----
 .../app/components/__tests__/TaskChatTab.test.tsx  | 58 +++++++++++++++++-----
 3 files changed, 68 insertions(+), 26 deletions(-)

Fusion-Task-Id: FN-6425

Fusion-Task-Lineage: 6526eb4a-4be9-472b-9595-c7fcea6971b1
2026-06-13 20:54:32 -07:00
gsxdsm
6bb120525d FN-6424: scope terminal symbols font glyph ranges
Prevent the terminal symbols font from corrupting ASCII cell measurement on mobile.\n\n- Add unicode-range scoping to the Fusion terminal Nerd Font symbols face.\n- Cover the CSS contract so symbols ranges include Nerd Font blocks and exclude printable ASCII.\n- Document the xterm font-loading regression and required verification path.\n\nFiles changed:\n .../xterm-symbols-nerd-font-unicode-range.md       | 63 ++++++++++++++++++++++\n .../dashboard/app/__tests__/terminal-input.test.ts | 49 +++++++++++++++++\n .../dashboard/app/components/TerminalModal.css     |  5 ++\n 3 files changed, 117 insertions(+)

Fusion-Task-Id: FN-6424

Fusion-Task-Lineage: 7350c926-1d51-474b-bfc3-a17f922b9322
2026-06-13 20:46:54 -07:00
gsxdsm
b898c3d1db FN-6419: keep task metadata inline
Keep task detail metadata in a compact wrapping row across viewport sizes.

- Make the detail metadata container a wrapping flex row with aligned controls, provenance, PR context, and timestamps.
- Document the one-row metadata behavior in the dashboard guide.
- Add rendering and responsive CSS regression coverage for direct inline metadata children and mobile row behavior.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/TaskDetailModal.css   | 21 +++++++--
 .../__tests__/TaskDetailModal.rendering.test.tsx   | 53 ++++++++++++++++++++++
 ...etailModal.responsive-and-dependencies.test.tsx | 10 ++++
 4 files changed, 81 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-6419

Fusion-Task-Lineage: 925c2f0d-8665-430f-8e4e-a00d80704e8d
2026-06-13 20:33:44 -07:00
gsxdsm
b8dbe69b21 FN-6418: tighten task chat composer spacing
Tightens the task detail chat layout so the composer sits closer to the transcript without affecting other detail tabs.

- Reduce the chat tab stack gap and composer vertical padding on desktop and mobile.
- Remove the chat section's inherited top margin while keeping shared tab padding intact.
- Document the spacing requirement with FNXC comments near the affected chat styles.

Files changed:
 packages/dashboard/app/components/TaskChatTab.css     | 10 ++++++----
 packages/dashboard/app/components/TaskDetailModal.css |  7 ++++++-
 2 files changed, 12 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-6418

Fusion-Task-Lineage: 4b484de5-9d6f-403b-902d-5df9f0591811
2026-06-13 20:22:03 -07:00
gsxdsm
ffaef67549 FN-6421: quarantine flaky CLI integration tests
Quarantine load-sensitive CLI vitest suites instead of widening default test timeouts.

- Add extension agent provisioning and serve suites to the CLI vitest quarantine list.
- Record quarantine ledger entries with standalone pass evidence and deletion-clock dates.
- Keep FNXC rationale next to the excluded CLI tests for future cleanup.

Files changed:
 packages/cli/vitest.config.ts    |  6 ++++++
 scripts/lib/test-quarantine.json | 10 ++++++++++
 2 files changed, 16 insertions(+)

Fusion-Task-Id: FN-6421

Fusion-Task-Lineage: de6db6a5-aad7-4e25-9bf4-7734dc6d8d05
2026-06-13 20:15:54 -07:00
gsxdsm
8ff7a934b0 fix(FN-6424): pan mobile board from whole task card 2026-06-13 19:58:14 -07:00
gsxdsm
85a25b3598 FN-6416: document heap test quarantine context
Clarify why the heap-wrapper timeout test remains quarantined under the deletion ratchet.

- Update the dashboard vitest quarantine comment to reference the heap wrapper exclusion requirement.
- Expand the quarantine ledger reason with the FN-6416 context and leaked temp-worker cleanup observation.

Files changed:
 packages/dashboard/vitest.config.ts | 4 ++--
 scripts/lib/test-quarantine.json    | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-6416

Fusion-Task-Lineage: 627c1fd9-60d8-415d-88b5-a4e946de0110
2026-06-13 19:53:51 -07:00
gsxdsm
0d75725a28 fix: reliable mobile board horizontal swipe over task cards
Swiping across the board to scroll horizontally was intermittent when the
gesture started on a task card. Cards render with native HTML5 `draggable`
for desktop drag-to-move, but native DnD does not function via touch — the
attribute only arms the browser's touch-drag heuristic, which non-
deterministically hijacks horizontal swipes meant to pan the board.

Disable native drag on touch-primary devices (`(hover: none) and
(pointer: coarse)`) via a new `useCoarsePointer` hook, folded into the
card's `isDraggable`. Mouse/desktop and hybrid laptops keep drag-to-move;
touch loses nothing (DnD never worked there) and panning is now reliable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 19:40:15 -07:00
gsxdsm
417183da9f FN-6415: send task chat on Enter
Enable the task-detail Chat composer to submit messages with standard Enter behavior.

- Submit non-empty task chat drafts on plain Enter while preserving Shift+Enter newline entry and IME composition safety.
- Keep Cmd/Ctrl+Enter as a supported send path through the same handler.
- Document the composer keyboard shortcuts and add dashboard tests for steering, refinement, newline, shortcut, and composition behavior.
- Add a patch changeset for the published Fusion package.

Files changed:
 .changeset/tiny-tasks-chat-enter.md                |   5 +
 docs/dashboard-guide.md                            |   2 +-
 packages/dashboard/app/components/TaskChatTab.tsx  |  13 ++-
 .../app/components/__tests__/TaskChatTab.test.tsx  | 120 +++++++++++++++++++++
 4 files changed, 136 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6415

Fusion-Task-Lineage: 7d200bf6-5130-4fb8-b59c-66bccffe4265
2026-06-13 19:32:27 -07:00
gsxdsm
066c919ace test: quarantine slow and flaky test lanes
Move observed load-sensitive and slow tests out of the default lanes per the deletion-ratchet policy, keep the quarantine ledger in sync, and preserve corrupt databases when recovery fails during verification.
2026-06-13 19:22:00 -07:00
gsxdsm
67d4d51aeb FN-6413: move task-card timer to footer cluster
Move the task timing badge out of the header/meta row and into the footer's bottom-right badge cluster.

- Render the time indicator with footer chips so it aligns with retry and GitHub badges.
- Reuse footer badge sizing for the timer across desktop, wrapping, and mobile layouts.
- Update TaskCard layout tests to assert footer placement and add a patch changeset.

Files changed:
 .changeset/fn-6413-task-card-timing-footer.md      |   5 +
 packages/dashboard/app/components/TaskCard.css     |   8 +-
 packages/dashboard/app/components/TaskCard.tsx     |  31 ++---
 .../__tests__/TaskCard.footer-alignment.test.tsx   |  13 +-
 .../__tests__/TaskCard.footer-wrap.test.tsx        |   1 +
 .../app/components/__tests__/TaskCard.test.tsx     | 138 ++++++++++++++-------
 .../app/components/__tests__/board-mobile.test.tsx |   5 +-
 7 files changed, 130 insertions(+), 71 deletions(-)

Fusion-Task-Id: FN-6413

Fusion-Task-Lineage: a82da5ab-20c6-4dfa-92a3-150306011fd6
2026-06-13 19:17:36 -07:00
gsxdsm
6a5d7ab48f FN-6405: overlay task chat expand control
Moves the task chat expand control into the transcript as an overlay while preserving accessible labels and state coverage.

- Render the expand/collapse button inside the transcript container instead of a separate toolbar.
- Add tokenized overlay positioning and mobile sizing styles for the transcript expand control.
- Extend TaskChatTab tests across loading, empty, populated, and CSS states to prevent toolbar regressions.

Files changed:
 packages/dashboard/app/components/TaskChatTab.css  | 34 +++++++++---------
 packages/dashboard/app/components/TaskChatTab.tsx  | 22 ++++++------
 .../app/components/__tests__/TaskChatTab.test.tsx  | 42 ++++++++++++++++++++--
 3 files changed, 67 insertions(+), 31 deletions(-)

Fusion-Task-Id: FN-6405

Fusion-Task-Lineage: 344d3ad0-bd57-4df2-86dc-deb8cddb76bc
2026-06-13 18:38:57 -07:00