Commit Graph

1896 Commits

Author SHA1 Message Date
gsxdsm
863ebfaa96 FN-6464: add CLI session relaunch route
Enable exhausted CLI sessions to request a fresh task-backed relaunch from the dashboard.

- Add an authenticated project-scoped relaunch endpoint for task-bound CLI sessions.\n- Wire relaunch intent through the dashboard server to clear resume linkage and re-enqueue the owning task.\n- Enable the session banner Relaunch fresh action and cover API, UI, transport, and runtime wiring behavior.\n- Document the CLI session action contract and add a published package changeset.\n\nFiles changed:\n .changeset/fn-6464-cli-relaunch-route.md           |  5 ++
 docs/agents.md                                     |  4 +
 packages/cli/src/commands/dashboard.ts             |  2 +
 packages/dashboard/app/App.tsx                     | 20 +++--
 .../app/__tests__/app-cli-action-wiring.test.tsx   | 31 +++++++-
 packages/dashboard/app/api/legacy.ts               |  7 ++
 .../__tests__/SessionNotificationBanner.test.tsx   | 52 ++++++++++---
 .../src/__tests__/cli-agent-runtime-wiring.test.ts | 49 +++++++++++-
 .../src/__tests__/cli-session-transport.test.ts    | 36 +++++++++
 .../src/__tests__/cli-sessions-routes.test.ts      | 50 +++++++++++-
 packages/dashboard/src/cli-session-transport.ts    | 38 +++++++++
 packages/dashboard/src/index.ts                    |  3 +-
 packages/dashboard/src/routes/cli-sessions.ts      | 26 ++++++-
 packages/dashboard/src/server.ts                   | 89 ++++++++++++++++++++++
 14 files changed, 390 insertions(+), 22 deletions(-)

Fusion-Task-Id: FN-6464

Fusion-Task-Lineage: f1ce171b-84a7-4893-9288-e1c8f01c3305
2026-06-15 02:30:41 -07:00
gsxdsm
a9815fb1ff FN-6457: add ACP ask runner and bundled Claude bridge setup
Route ACP-backed planning and validation through a read-only ask-once runner with a pinned Claude bridge foundation.

- Add askAcpOnce for single-turn ACP sessions with timeout handling, JSON recovery, clean stop validation, and disposal.
- Refactor validation seams to use ACP runtime prompts and require structured pass verdicts.
- Resolve the Claude ACP bridge from the plugin bundle and add setup checks for identity, environment, probing, and auth readiness.
- Document the ACP Route B plan and update tests for validator, session, runtime, and plugin setup behavior.

Files changed:
 CONCEPTS.md                                        |   6 +
 docs/acp-contract.md                               |  36 ++
 .../2026-06-14-001-feat-claude-acp-runtime-plan.md | 465 +++++++++++++++++++++
 .../engine/src/__tests__/cli-agent-ask.test.ts     | 104 +++++
 .../src/__tests__/cli-agent-validator.test.ts      | 137 +++---
 .../src/__tests__/interactive-ai-session.test.ts   |  96 +++--
 packages/engine/src/agent-runtime.ts               |   6 +-
 packages/engine/src/cli-agent-ask.ts               | 120 ++++++
 packages/engine/src/cli-agent-validator.ts         |  65 ++-
 .../cli-agent/__tests__/one-shot-session.test.ts   |  16 +-
 packages/engine/src/cli-agent/one-shot-session.ts  |  17 +-
 packages/engine/src/index.ts                       |   8 +-
 packages/engine/src/interactive-ai-session.ts      |  33 +-
 plugins/fusion-plugin-acp-runtime/AGENTS.md        |  14 +
 plugins/fusion-plugin-acp-runtime/CHANGELOG.md     |   6 +
 plugins/fusion-plugin-acp-runtime/README.md        |  13 +-
 plugins/fusion-plugin-acp-runtime/package.json     |   3 +-
 .../src/__tests__/index.test.ts                    |  51 ++-
 .../src/__tests__/process-manager.test.ts          |  32 +-
 .../src/__tests__/runtime-adapter.test.ts          |   4 +-
 .../src/__tests__/setup.test.ts                    |  71 ++++
 plugins/fusion-plugin-acp-runtime/src/cli-spawn.ts |  95 ++++-
 plugins/fusion-plugin-acp-runtime/src/index.ts     |  16 +-
 .../src/process-manager.ts                         |  26 +-
 .../src/runtime-adapter.ts                         |  11 +-
 plugins/fusion-plugin-acp-runtime/src/setup.ts     | 104 +++++
 plugins/fusion-plugin-acp-runtime/src/types.ts     |   6 +-
 pnpm-lock.yaml                                     | 139 ++++--
 28 files changed, 1502 insertions(+), 198 deletions(-)

Fusion-Task-Id: FN-6457
Fusion-Task-Lineage: a3364ed7-cb28-4a2b-b898-6ccd0d95fb92
2026-06-15 02:30:41 -07:00
gsxdsm
fee0178b4f FN-6461: block incomplete no-commits no-op finalization
Add a shared no-op finalize guard so no-commits tasks with mostly incomplete steps return to todo instead of silently completing.

- Add core step-evidence evaluation for no-commits no-op finalization.
- Apply the guard across AI empty merge, early empty-own-diff, legacy no-op classifier, direct no-op, and self-healing finalize lanes.
- Emit run-audit/log evidence and preserve progress when demoting blocked tasks.
- Cover guard behavior with core, merger, AI merge, real-git, and self-healing tests.
- Document the finalize integrity invariant and add a patch changeset.

Files changed:
 .changeset/fn-6461-no-commits-finalize-guard.md    |   5 +
 docs/architecture.md                               |   2 +
 .../__tests__/no-commits-finalize-guard.test.ts    |  58 +++++++
 packages/core/src/index.ts                         |   2 +
 packages/core/src/no-commits-finalize-guard.ts     |  42 +++++
 packages/engine/src/__tests__/merger-ai.test.ts    |  59 +++++++
 .../merger-finalize-unproven.real-git.test.ts      | 176 +++++++++++++++++++++
 packages/engine/src/__tests__/self-healing.test.ts | 125 +++++++++++++++
 packages/engine/src/merger-ai.ts                   |  45 ++++++
 packages/engine/src/merger.ts                      | 130 +++++++++++++++
 packages/engine/src/run-audit.ts                   |   6 +
 packages/engine/src/self-healing.ts                |  41 ++++-
 12 files changed, 689 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6461
Fusion-Task-Lineage: 36647768-42da-414a-9304-d8e0ed61b99c
2026-06-15 02:29:08 -07:00
gsxdsm
da44392fea FN-6462: document OAuth refresh behavior
Document Claude OAuth refresh behavior across user-facing docs.

- Explain that auth status polling can refresh expired Anthropic OAuth credentials automatically.
- Clarify when OAuth expiry banners and notifications remain visible after refresh attempts.
- Update onboarding guidance to set expectations for Claude re-login frequency.

Files changed:
 docs/dashboard-guide.md    |  6 +++++-
 docs/getting-started.md    |  2 +-
 docs/settings-reference.md | 10 ++++++++--
 3 files changed, 14 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6462

Fusion-Task-Lineage: 06a73655-483d-4379-aeba-ac6bf9bb8df9
2026-06-15 02:29:08 -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
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
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
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
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
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
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
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
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
df01ab71dd FN-6402: detect PR preflight conflicts by exit code
Use merge-tree exit status and empty-commit handling so PR conflict remediation reports clean states correctly.

- Treat git merge-tree exit code 1, not stdout, as the PR preflight conflict signal.
- Skip conflict-resolution commits when the branch already contains the selected base or the AI pass leaves no staged changes.
- Cover the preflight and resolver no-op paths with dashboard route and conflict resolver tests.
- Document the no-empty-commit conflict remediation behavior and add a published package changeset.

Files changed:
 .changeset/fn-6402-pr-conflict-detection.md        |   5 +
 docs/dashboard-guide.md                            |   2 +-
 .../src/__tests__/pr-conflict-resolver.test.ts     | 130 +++++++++++++++++++++
 ...it-github.pr-options-preflight-metadata.test.ts |  22 +++-
 .../register-git-github.pr-push-branch.test.ts     |   2 +-
 ...egister-git-github.pr-resolve-conflicts.test.ts |   2 +-
 packages/dashboard/src/pr-conflict-resolver.ts     |  57 +++++++--
 .../dashboard/src/routes/register-git-github.ts    |   8 +-
 8 files changed, 212 insertions(+), 16 deletions(-)

Fusion-Task-Id: FN-6402
Fusion-Task-Lineage: 9e709fb8-204a-4d88-8351-260a356c7520
2026-06-13 17:46:11 -07:00
gsxdsm
7040cd3511 docs: capture mobile .visually-hidden scrollWidth bug in solutions
Document the root cause (offset-less position:absolute sr-only utility
escaping the kanban board's overflow clip and inflating
documentElement.scrollWidth → iOS shrink-to-fit zoom), the top/left:0 fix,
and the CSS-fixture regression guard. Cross-links the sibling mobile
viewport-containment learnings.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 17:26:12 -07:00
gsxdsm
91e7da2906 FN-6404: group task card meta badges
Group task card metadata into a single header badge row.

- Move priority, fast mode, agent-created provenance, and time chips into a shared wrapping meta badge group.
- Keep GitHub and retry chips in the footer without rendering empty footer shells for timer-only cards.
- Update dashboard docs and TaskCard coverage for grouped metadata layout and responsive styling.

Files changed:
 docs/dashboard-guide.md                            |   4 +-
 packages/dashboard/app/components/TaskCard.css     |  16 +-
 packages/dashboard/app/components/TaskCard.tsx     |  82 +++++-----
 .../__tests__/TaskCard.footer-alignment.test.tsx   |   9 +-
 .../app/components/__tests__/TaskCard.test.tsx     | 169 ++++++++++++++++++---
 5 files changed, 213 insertions(+), 67 deletions(-)

Fusion-Task-Id: FN-6404

Fusion-Task-Lineage: 29c2c700-d4f3-430d-baaa-bf8d7d0d0011
2026-06-13 17:17:25 -07:00
gsxdsm
821a8fb936 Merge pull request #1672 from Runfusion/feature/ce-workflow-integration
feat: make the compound-engineering workflow run the CE way end-to-end
2026-06-13 16:36:57 -07:00
gsxdsm
9149121bb6 FN-6401: add built-in Z.ai GLM-5.2 support
Add Z.ai's built-in provider registration so GLM-5.2 is selectable across Fusion model settings.

- Define and export a shared Z.ai provider registration with existing GLM models plus GLM-5.2.
- Register the built-in provider for CLI server and engine pi model registries.
- Cover provider availability and CLI auth-provider wrapping with focused tests.
- Document Z.ai model selection and add a minor changeset.

Files changed:
 .changeset/FN-6401-glm-5-2.md                      |   5 +
 docs/settings-reference.md                         |   2 +
 packages/cli/src/commands/__tests__/daemon.test.ts |  11 ++
 .../cli/src/commands/__tests__/dashboard.test.ts   |  13 +++
 packages/cli/src/commands/__tests__/serve.test.ts  |  11 ++
 packages/cli/src/commands/daemon.ts                |   8 ++
 packages/cli/src/commands/dashboard.ts             |   8 ++
 packages/cli/src/commands/serve.ts                 |   8 ++
 packages/core/src/__tests__/zai-provider.test.ts   |  48 ++++++++
 packages/core/src/index.ts                         |   2 +
 packages/core/src/zai-provider.ts                  | 125 +++++++++++++++++++++
 .../src/__tests__/pi-create-fn-agent.test.ts       |   5 +-
 packages/engine/src/pi.ts                          |  20 +++-
 13 files changed, 264 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6401

Fusion-Task-Lineage: e1f7a90d-0614-4d9f-826f-015605a08baa
2026-06-13 16:30:29 -07:00
gsxdsm
1db4835d1d FN-6390: fix terminal font remeasure and paste handling
Fix terminal rendering and input delivery at the xterm font and paste seams.

- Remeasure TerminalModal xterm instances after the terminal web font finishes loading.
- Let xterm native paste handle Cmd/Ctrl+V so clipboard input is delivered once.
- Add regression coverage for modal and session terminal paste/font behavior.
- Document the xterm async font and native paste solution.

Files changed:
 .../xterm-async-font-remeasure-paste-dedupe.md     |  59 +++++++++
 .../dashboard/app/components/TerminalModal.tsx     |  60 +++++++--
 .../components/__tests__/SessionTerminal.test.tsx  |  31 +++++
 .../components/__tests__/TerminalModal.test.tsx    | 140 ++++++++++++++++++---
 4 files changed, 264 insertions(+), 26 deletions(-)

Fusion-Task-Id: FN-6390

Fusion-Task-Lineage: f041a058-73c5-40fc-b390-c20bdb3bad69
2026-06-13 16:30:28 -07:00
gsxdsm
7fa8c4e5f4 FN-6397: fix mobile workflow board fill chain
Ensure workflow-mode boards fill the mobile viewport while preserving internal column scrolling.

- Reassert the mobile flex fill chain for project content, workflow board wrappers, and workflow columns.
- Extend mobile board regression coverage across empty/populated workflow states with and without the toolbar.
- Document the workflow board collapse root cause and add a transient temp-dir isolation guard test.

Files changed:
 docs/dashboard-guide.md                            |   1 +
 .../ui-bugs/mobile-workflow-board-fill-chain.md    |  61 +++++++++++++
 .../__tests__/board-mobile-initial-render.test.tsx | 101 +++++++++++++++++++++
 packages/dashboard/app/styles.css                  |  52 +++++++++++
 scripts/__tests__/check-test-isolation.test.mjs    |  23 +++++
 scripts/check-test-isolation.mjs                   |  12 ++-
 6 files changed, 249 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6397
Fusion-Task-Lineage: ddee773d-6d3a-46d1-b1c7-f601a961365e
2026-06-13 16:30:28 -07:00
gsxdsm
e8c2d516af FN-6386: add one-click update installation
Add a dashboard update action that installs available Fusion releases directly from the UI.

- Add an install-update API route backed by npm global install with bin-collision retry handling.
- Add Update now controls, loading/error/success states, and responsive styling to the update banner and settings modal.
- Extend localization, documentation, changeset coverage, and update-check tests for the new install flow.

Files changed:
 .changeset/fn-6386-update-now-button.md            |   5 +
 docs/dashboard-guide.md                            |   4 +
 docs/settings-reference.md                         |   2 +
 packages/dashboard/app/api/legacy.ts               |  13 ++
 .../dashboard/app/components/SettingsModal.css     |  38 +++++-
 .../dashboard/app/components/SettingsModal.tsx     |  96 ++++++++++++--
 .../app/components/UpdateAvailableBanner.css       |  46 +++++++
 .../app/components/UpdateAvailableBanner.tsx       | 103 ++++++++++++---
 .../components/__tests__/SettingsModal.test.tsx    |  79 +++++++++++
 .../__tests__/UpdateAvailableBanner.test.tsx       |  57 +++++++-
 .../components/__tests__/settings-mobile.test.tsx  |  19 +++
 .../src/__tests__/update-check-route.test.ts       |  78 ++++++++++-
 .../dashboard/src/__tests__/update-check.test.ts   |  45 +++++++
 .../src/routes/register-update-check-routes.ts     |  25 +++-
 packages/dashboard/src/update-check.ts             |  93 +++++++++++++
 packages/i18n/locales/en/app.json                  |  14 +-
 packages/i18n/src/resources.d.ts                   | 146 ++++++++++++++++++++-
 17 files changed, 819 insertions(+), 44 deletions(-)

Fusion-Task-Id: FN-6386

Fusion-Task-Lineage: bcccf253-c0f1-493e-b849-b189a65d1479
2026-06-13 16:30:28 -07:00
gsxdsm
8a53871de2 FN-6388: enable quick-entry GitHub tracking overrides
Allow quick entry to override GitHub tracking regardless of the project default.

- Send explicit githubTracking overrides whenever the quick-entry toggle is changed.
- Keep the GitHub toggle usable when settings are loading or default tracking is off.
- Cover off-default opt-in, opt-out, label, and reset behavior in QuickEntryBox tests.
- Document the quick-entry GitHub icon as a per-task tracking override.

Files changed:
 docs/dashboard-guide.md                            |   1 +
 .../dashboard/app/components/QuickEntryBox.tsx     |  27 ++---
 .../components/__tests__/QuickEntryBox.test.tsx    | 118 ++++++++++++++++++---
 3 files changed, 110 insertions(+), 36 deletions(-)

Fusion-Task-Id: FN-6388

Fusion-Task-Lineage: f46ef738-ccd6-48cc-8919-9c2de7ecb4e3
2026-06-13 16:30:28 -07:00
gsxdsm
df4939a656 FN-6385: add dashboard overflow regression coverage
Add a shared mobile and tablet overflow-containment safety net for dashboard surfaces.\n\n- Add viewport overflow regression coverage for board, task detail, workflow editor, simple workflow editor, and Activity Log surfaces.\n- Cover mobile, tablet, and landscape-phone breakpoints across empty and populated states.\n- Stabilize related dashboard tests with viewport and DOM cleanup helpers.\n- Document the targeted overflow-containment test command.\n\nFiles changed:\n docs/testing.md                                    |   6 +\n .../dashboard-overflow-containment.test.tsx        | 435 +++++++++++++++++++++\n .../app/components/__tests__/App.test.tsx          |   4 +-\n .../components/__tests__/FileBrowserModal.test.tsx |   9 +\n .../components/__tests__/GitManagerModal.test.tsx  |   2 +\n .../__tests__/MobileWorkflowGraphView.css.test.ts  |   9 +-\n .../__tests__/PlanningModeModal.autosize.test.tsx  |   2 +\n .../__tests__/PlanningModeModal.initial.test.tsx   |   2 +\n .../PlanningModeModal.planning-flow.test.tsx       |   2 +\n .../components/__tests__/SettingsModal.test.tsx    |   2 +\n .../__tests__/SettingsModal.testMode.test.tsx      |   6 +-\n .../__tests__/SettingsModal.worktrunk.test.tsx     |   6 +-\n .../__tests__/WorkflowNodeEditor.css.test.ts       |   4 +-\n 13 files changed, 479 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-6385

Fusion-Task-Lineage: 8335a9c6-279a-4962-b855-ea459ba9eb0a
2026-06-13 16:30:28 -07:00
gsxdsm
dd0ceec7dd Merge main: keep ce-* agent install alongside stale-session recovery; address PR review
Resolves the onLoad conflict in the compound-engineering plugin by keeping both
the bundled ce-* persona-def install (this branch) and main's
recoverStaleSessionsForContext call.

Also addresses PR #1672 review feedback:
- executor: sentinel resume now guards on !live.paused (mirrors
  runAwaitInputNode) so a still-paused task can't consume a reply and re-enter
  the skill early.
- TaskCard: make the Answer-questions button text/title/aria-label fallbacks
  consistent ("Answer questions") for label-in-name a11y; update test.
- ce-work: replace the unshipped `skill: ce-worktree` reference with the real
  git worktree commands so Option B can't dead-end.
- ce-resolve-pr-feedback: invoke bundled scripts by absolute path via the new
  FUSION_CE_SKILLS_DIR env (sessions run with cwd=projectRoot); add the Fusion
  await-input sentinel path instead of AskUserQuestion for workflow steps;
  normalize whitespace-only review bodies like PR comments.
- plugin: expose FUSION_CE_SKILLS_DIR (installed skills root) to step sessions.
- plan doc: add language to fenced block (markdownlint MD040).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 16:08:51 -07:00
gsxdsm
4797eac348 Merge origin/main into feat/validator-behavioral-verification
Resolve conflicts from concurrent main work:
- db.ts: renumber behavioral-verification migration 115 -> 118 after main's
  workflow-work-items (115), graphResumeRetryCount (116), autoMergeProvenance (117);
  SCHEMA_VERSION = 118. Update all schema-version test assertions to 118
  (keep SCHEMA_VERSION constant where used).
- vitest.config / test-quarantine.json: union both branches' quarantine sets
  (FN-6206 behavioral-verification files + main's merger-ai-cleanup/merger-ai/
  QuickEntryBox/soft-delete-blocker-residue/routes-settings entries).
- settings-sync routes: keep workflowId-qualified field keys + persisted global
  pull; drop duplicate workflowApplyResult from auto-merge interleave.
- Keep behavioral-verification changes in mission-execution-loop imports,
  useNodeSettingsSync, save-split, driver, and sync tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 15:48:54 -07:00
gsxdsm
3098478d9e Merge origin/main: align merge-region visited nodes with collapse refactor
main's workflow-graph-executor now collapses the merge-policy region
(merge-gate, branch-group-*, merge-attempt) into a single synthetic
`merge` node. Reconcile the S05 work-item-driver test's visitedNodeIds
assertion to match, and union the `observed` recording-primitive fields
from both branches (executedTasks + merge attempt/run/workflow ids).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 15:47:01 -07:00
gsxdsm
e51d05bf1d Merge remote-tracking branch 'origin/main' into fix/test-timeout-failures
# Conflicts:
#	scripts/test-changed.mjs
2026-06-13 15:44:28 -07:00
gsxdsm
a49450ef5e Address PR review feedback (#1669)
- watchdog: escalate forwarded SIGINT/SIGTERM/SIGHUP to SIGKILL after grace so
  external cancellation can't hang for the full budget (coderabbit major)
- watchdog: route onProcExit through signalGroup for injection consistency (greptile)
- watchdog: add cwd option; test-changed passes rootDir so pnpm runs from repo
  root regardless of invocation cwd (coderabbit major — preserved original run() cwd)
- dashboard runner: validate/clamp FUSION_RUN_VITEST_* env so a malformed value
  can't NaN-disable the watchdog (coderabbit)
- tests: verify exit-listener cleanup, forwarded-signal escalation, cwd passthrough
- plan doc: per-class-ceiling fallback wording (not median); label Output Structure fence

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 15:21:00 -07:00
gsxdsm
59411c7054 FN-6381: expose simple workflow editor controls at every width
Styles the simple workflow editor so its mobile-style controls are available and documented across desktop and narrow layouts.

- Move simple editor tab, add, action, and touch-target styling out of the mobile-only media query.
- Cover desktop simple editor affordances for custom and built-in workflows with regression tests.
- Document desktop simple editor tabs and the surfaced workflow action buttons.

Files changed:
 docs/dashboard-guide.md                            |   6 +-
 .../app/components/WorkflowNodeEditor.css          | 286 +++++++++++----------
 .../__tests__/WorkflowNodeEditor.test.tsx          |  53 ++++
 3 files changed, 201 insertions(+), 144 deletions(-)

Fusion-Task-Id: FN-6381

Fusion-Task-Lineage: fd7f1ada-6e50-4d92-b455-7f38fb46c1e2
2026-06-13 12:00:58 -07:00
gsxdsm
eea33639ee FN-6378: contain mobile board overscroll
Contain horizontal overscroll on mobile kanban board scrollers so iOS edge drags do not rubber-band columns off screen.

- Add horizontal overscroll containment to board, workflow column, and lane column scrollers while preserving proximity snap scrolling.
- Add CSS fixture regression coverage for mobile/base board and lane overscroll containment.
- Document the iOS horizontal overscroll containment root cause and fix.

Files changed:
 ...-board-ios-horizontal-overscroll-containment.md | 64 +++++++++++++++++++++
 .../board-mobile-overscroll-containment.test.ts    | 65 ++++++++++++++++++++++
 packages/dashboard/app/components/Lane.css         |  2 +
 packages/dashboard/app/styles.css                  |  1 +
 4 files changed, 132 insertions(+)

Fusion-Task-Id: FN-6378

Fusion-Task-Lineage: 70b4852b-feb0-42b5-81ba-13bfd143e0bc
2026-06-13 11:53:44 -07:00
gsxdsm
eb607c6ffd FN-6377: make tablet modals touch-resizable
Enable shared resize handles for modals on tablet and desktop while keeping mobile sheets full-screen.

- Add a pointer-driven resize grip to useModalResizePersist with debounced persistence and mobile cleanup.
- Widen the task-detail modal tablet default to 96vw / 1024px.
- Cover resize behavior and tablet width expectations with dashboard tests.
- Document the shared modal resize pattern and add the published package changeset.

Files changed:
 .changeset/FN-6377-tablet-resizable-modals.md      |   5 +
 docs/dashboard-guide.md                            |   2 +-
 .../task-detail-modal-tablet-width.test.ts         |   4 +-
 .../dashboard/app/components/TaskDetailModal.css   |   4 +-
 .../hooks/__tests__/useModalResizePersist.test.tsx | 218 +++++++++++++++++++++
 .../dashboard/app/hooks/useModalResizePersist.ts   | 140 ++++++++++---
 packages/dashboard/app/styles.css                  |  36 ++++
 7 files changed, 382 insertions(+), 27 deletions(-)

Fusion-Task-Id: FN-6377

Fusion-Task-Lineage: ecc12aa4-f881-4476-a69b-13d34a73e263
2026-06-13 11:46:53 -07:00
gsxdsm
6fff41817a FN-6372: start refinements from done task chat
Done-task chat messages now create refinement tasks while preserving steering behavior elsewhere.

- Route completed-task Chat composer submissions through refineTask and show the created task ID.
- Keep non-done task sends on the existing steering-comment path with queued/live session copy.
- Cover refinement success, failure rollback, send lifecycle, and routing surfaces in TaskChatTab tests.
- Document the completed-task refinement behavior in the dashboard guide.

Files changed:
 docs/dashboard-guide.md                            |   2 +-
 packages/dashboard/app/components/TaskChatTab.tsx  |  45 +++---
 .../app/components/__tests__/TaskChatTab.test.tsx  | 152 ++++++++++++++++++++-
 3 files changed, 177 insertions(+), 22 deletions(-)

Fusion-Task-Id: FN-6372

Fusion-Task-Lineage: 201f3a5e-e951-4f70-8b92-8d270e3181de
2026-06-13 11:30:45 -07:00
gsxdsm
88e25dc9f4 FN-6365: prevent mobile document horizontal panning
Contain the mobile dashboard document viewport while preserving intended inner horizontal scrollers.

- Lock mobile html/body/#root and fullscreen overlay chrome to the viewport inline axis.
- Default mobile touch handling to vertical-only panning and opt board/code/table scrollers back into horizontal gestures.
- Add CSS fixture regression coverage plus a solution note for mobile horizontal pan containment.

Files changed:
 docs/solutions/ui-bugs/mobile-horizontal-pan-document-viewport-containment.md |  62 +++++++++++
 packages/dashboard/app/__tests__/mobile-horizontal-pan-containment.test.ts    | 116 +++++++++++++++++++++
 packages/dashboard/app/styles.css                                            |  47 +++++++--
 3 files changed, 219 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-6365

Fusion-Task-Lineage: 4673da28-1438-4ea5-b32c-25bc52285273
2026-06-13 11:22:07 -07:00
gsxdsm
4838c86b8c FN-6370: add expandable task chat modal
Add a full-modal expansion affordance for task-detail chat conversations.

- Add an expand/collapse toolbar button to the task chat tab with accessible labels and icon states.
- Let the task detail modal switch into a chat-expanded layout and reset that state when leaving chat or entering edit mode.
- Cover the chat toggle and layout behavior with dashboard component tests and document the control.

Files changed:
 docs/dashboard-guide.md                            |   1 +
 packages/dashboard/app/components/TaskChatTab.css  |  22 +++++
 packages/dashboard/app/components/TaskChatTab.tsx  |  21 ++++-
 .../dashboard/app/components/TaskDetailModal.css   |  42 +++++++++
 .../dashboard/app/components/TaskDetailModal.tsx   |  13 ++-
 .../app/components/__tests__/TaskChatTab.test.tsx  |  37 ++++++++
 .../TaskDetailModal.attachments-and-tabs.test.tsx  | 100 +++++++++++++++++++++
 7 files changed, 233 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-6370
Fusion-Task-Lineage: 787300bb-b928-45cf-a5c1-7fed5f375111
2026-06-13 11:14:06 -07:00
gsxdsm
6e9f2a384d FN-6369: make task chat send control icon-only
Refine the task-detail chat composer so the send action stays narrow and inline with the input.

- Replace the composer placeholder with the steering-focused copy.
- Convert the send button to an accessible icon-only control with loading state labels.
- Keep the send control inline at mobile breakpoints and cover the behavior in tests and docs.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 packages/dashboard/app/components/TaskChatTab.css  | 14 +++++++----
 packages/dashboard/app/components/TaskChatTab.tsx  | 11 ++++++---
 .../app/components/__tests__/TaskChatTab.test.tsx  | 27 ++++++++++++++++++++--
 4 files changed, 44 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-6369
Fusion-Task-Lineage: b7e0717f-4cba-4380-a08a-e01fc12985e3
2026-06-13 10:51:31 -07:00
gsxdsm
f68775a5a6 FN-6376: preserve user-paused tasks during recovery
Ensure automated resume and recovery paths leave user-paused tasks paused.

- Skip user-paused tasks when cascading agent resume and approval-decision unpauses.
- Preserve userPaused during stuck-task recovery and log skipped recoveries for user-paused tasks.
- Add regression coverage across engine heartbeat, self-healing, and dashboard route surfaces.
- Document the invariant and add a patch changeset.

Files changed:
 .changeset/fn-6376-user-paused-stays-paused.md     |  5 ++++
 docs/architecture.md                               |  1 +
 .../src/__tests__/routes-agent-runs.test.ts        |  4 +++
 .../src/__tests__/routes-approval.test.ts          | 26 +++++++++++++++--
 .../src/routes/register-agent-runtime-routes.ts    |  2 +-
 .../src/routes/register-approval-routes.ts         |  2 +-
 .../src/__tests__/heartbeat-executor.test.ts       | 28 ++++++++++++++++++
 packages/engine/src/__tests__/self-healing.test.ts | 33 +++++++++++++++++++++-
 packages/engine/src/agent-heartbeat.ts             |  3 +-
 packages/engine/src/self-healing.ts                | 12 ++++++--
 10 files changed, 108 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-6376
Fusion-Task-Lineage: efa00cb1-58e1-496a-919b-69867f8bff3c
2026-06-13 10:44:01 -07:00
gsxdsm
b90f966a98 FN-6374: fix workflow board tablet fill height
Keep workflow-mode board columns stretched through the tablet viewport.

- Preserve a definite height chain from the workflow board wrapper to the column rows.
- Ensure workflow columns stretch and keep internal overflow ownership at tablet widths.
- Extend board layout tests to cover workflow-mode empty and populated tablet states.
- Document the footer-safe workflow fill-height invariant.

Files changed:
 docs/dashboard-guide.md                            |   2 +-
 packages/dashboard/app/components/Lane.css         |  12 ++
 .../__tests__/board-mobile-initial-render.test.tsx | 121 ++++++++++++++++++++-
 3 files changed, 129 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-6374
Fusion-Task-Lineage: 9b7042cf-c8bc-4d69-8599-42dafc333b15
2026-06-13 10:36:24 -07:00
gsxdsm
38007db549 FN-6364: reset iOS mobile viewport on restore
Recover stale iOS document scroll after returning to the Fusion dashboard.

- Add an iOS-only restore hook that clears orphaned body offsets and scrolls the document back to the origin when unlocked.
- Wire the restore reset from the dashboard app shell for mobile layouts.
- Cover visible/page-show restores, platform no-ops, active-lock guards, and orphaned style cleanup.
- Document the mobile restore drift solution for future regressions.

Files changed:
 .../mobile-ios-restore-document-scroll-drift.md    |  59 ++++++++++
 packages/dashboard/app/App.tsx                     |   4 +-
 .../hooks/__tests__/useMobileScrollLock.test.ts    | 121 ++++++++++++++++++++-
 .../dashboard/app/hooks/useMobileScrollLock.ts     |  61 +++++++++++
 4 files changed, 243 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6364

Fusion-Task-Lineage: 9243cab8-5fbb-4332-ac4d-aabefde4161c
2026-06-13 10:29:24 -07:00
gsxdsm
422833045c FN-6359: add latest jump control to task chat
Adds an in-transcript control for returning to the newest task chat output after reviewing older messages.

- Track whether the task chat transcript is near the bottom and preserve live-follow behavior.
- Render an accessible sticky Latest button when populated transcripts are scrolled up, including mobile styling.
- Cover empty/loading, desktop, mobile, and click-to-jump behavior in TaskChatTab tests.
- Document the Latest jump affordance in the dashboard guide.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 packages/dashboard/app/components/TaskChatTab.css  | 40 +++++++++++
 packages/dashboard/app/components/TaskChatTab.tsx  | 40 ++++++++++-
 .../app/components/__tests__/TaskChatTab.test.tsx  | 82 ++++++++++++++++++++++
 4 files changed, 162 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6359

Fusion-Task-Lineage: 9b4a3533-2969-4f0d-a4de-6ba895662726
2026-06-13 10:20:11 -07:00
gsxdsm
fb102a86d5 FN-6362: reset mobile keyboard restore metrics
Reset mobile keyboard restore sampling so collapsed viewports clear stale keyboard-open metrics.

- Add a restore-specific sampling path for visibilitychange/pageshow that can reset the viewport baseline and bypass the impossible-sample hold once.
- Preserve the existing in-session impossible-sample guard and tail polling behavior for normal focus/resize updates.
- Cover iOS restore, stale offset drift, genuinely open restored keyboards, and Android-style shrink reset cases.
- Document the mobile keyboard restore stale viewport fix for future UI debugging.

Files changed:
 .../mobile-keyboard-restore-stale-viewport.md      |  59 ++++++++
 .../app/hooks/__tests__/useMobileKeyboard.test.ts  | 160 +++++++++++++++++++++
 packages/dashboard/app/hooks/useMobileKeyboard.ts  |  75 +++++++---
 3 files changed, 275 insertions(+), 19 deletions(-)

Fusion-Task-Id: FN-6362

Fusion-Task-Lineage: 3919d892-b2d5-419a-abeb-84ac298ca2d5
2026-06-13 10:14:11 -07:00
gsxdsm
2974f7e878 FN-6358: compact task chat tool-call entries
Tighten the task-detail chat tool-call presentation while documenting the denser layout.

- Reduce spacing and typography weight for collapsed tool-call summaries and expanded entry cards.
- Assert compact tool-call classes in TaskChatTab tests for paired and standalone result entries.
- Update the dashboard guide to describe compact summaries and dense expanded cards.

Files changed:
 docs/dashboard-guide.md                             |  2 +-
 packages/dashboard/app/components/TaskChatTab.css   | 21 ++++++++++++---------
 .../app/components/__tests__/TaskChatTab.test.tsx   | 18 ++++++++++++++++--
 3 files changed, 29 insertions(+), 12 deletions(-)

Fusion-Task-Id: FN-6358

Fusion-Task-Lineage: 83cbf328-c062-4032-a2e7-e3550f386557
2026-06-13 09:55:49 -07:00
gsxdsm
00282fbf20 FN-6357: document external integration evidence format
Document the labeled provenance evidence layout expected by spec validation.

- Add an AGENTS.md example for required external integration evidence fields.
- Expand contributing guidance with accepted labels, URL expectations, and checksum rules.
- Add a regression test that keeps the documented example aligned with the evidence gate.

Files changed:
 AGENTS.md                                          | 14 ++++++++
 docs/contributing.md                               | 28 ++++++++++++++++
 .../src/__tests__/docs-evidence-example.test.ts    | 37 ++++++++++++++++++++++
 3 files changed, 79 insertions(+)

Fusion-Task-Id: FN-6357

Fusion-Task-Lineage: 788260ed-d5cf-4592-b117-40af5c45e0a1
2026-06-13 09:18:58 -07:00
gsxdsm
95b91c1f72 FN-6355: add deterministic docs index test script
Expose the docs README index suite as a focused CLI test lane and document its deterministic invocation.

- Add a package script for running only the docs README index Vitest file.
- Lock the package-config contract around the new script and dashboard quality runner expectations.
- Clarify the CI shard docs to pass Vitest shard flags without a bare separator.

Files changed:
 docs/contributing.md                              |  2 +-
 packages/cli/package.json                         |  1 +
 packages/cli/src/__tests__/package-config.test.ts | 37 ++++++++++++++++++-----
 3 files changed, 31 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-6355

Fusion-Task-Lineage: 2a02bc5f-2407-4bad-8aed-afa519826ce7
2026-06-13 07:38:54 -07:00
gsxdsm
195f731b9d feat(engine): optional systemPromptOverride for fn_spawn_agent (U2)
Add an optional systemPromptOverride to spawnAgentParams. When non-empty,
the spawned child runs under that persona system prompt instead of the
generic child base prompt (executor instructions still appended), so a
caller can spawn a specific persona — the primitive the compound-
engineering reviewer/research fan-out needs.

Two spikes confirmed the need: fn_spawn_agent had no persona param, and
Fusion has no plugin agent-contribution channel — so the lightweight path
is a generic override here + plugin-local persona defs the skill reads and
passes inline (revised KTD-4/U2/U3 in the plan). Behavioral coverage lands
with U10.

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