Commit Graph

11662 Commits

Author SHA1 Message Date
gsxdsm
9152d8fa61 FN-8229: remove background AI tasks pill
Replace the redundant footer AI session control with progress and action visibility in the session notification banner.

- Delete the BackgroundTasksIndicator component, styles, footer wiring, and obsolete translations.
- Surface non-planning generating and retained error sessions through the notification banner while leaving Planning in its dedicated view.
- Update session lifecycle, localization, documentation, and regression coverage.

Files changed:
 .../fn-8229-remove-ai-background-tasks-pill.md     |   7 +
 docs/dashboard-guide.md                            |   4 +-
 packages/dashboard/README.md                       |   1 -
 packages/dashboard/app/App.tsx                     |  28 +--
 .../app/__tests__/css-hygiene-scan.test.ts         |   2 -
 .../dashboard-component-color-tokenization.test.ts |   1 -
 packages/dashboard/app/api/legacy.ts               |   2 +-
 .../app/components/BackgroundTasksIndicator.css    | 130 -------------
 .../app/components/BackgroundTasksIndicator.tsx    | 210 ---------------------
 .../dashboard/app/components/ExecutorStatusBar.css |   3 -
 .../dashboard/app/components/ExecutorStatusBar.tsx |  30 +--
 .../app/components/SessionNotificationBanner.css   |  10 +
 .../app/components/SessionNotificationBanner.tsx   |  52 ++++-
 .../app/components/SubtaskBreakdownModal.tsx       |   7 +-
 .../app/components/__tests__/App.test.tsx          |  11 +-
 .../__tests__/ExecutorStatusBar.test.tsx           |   1 -
 .../__tests__/SessionNotificationBanner.test.tsx   |  88 ++++-----
 .../components/__tests__/utility-mobile.test.tsx   | 191 +------------------
 .../app/components/dashboard/DashboardBanners.tsx  |   8 +-
 .../dashboard/__tests__/DashboardBanners.test.tsx  |  30 ++-
 .../hooks/__tests__/useBackgroundSessions.test.ts  |  21 ++-
 .../dashboard/app/hooks/useBackgroundSessions.ts   |  21 ++-
 .../app/utils/__tests__/appLifecycle.test.ts       |  61 ++----
 packages/dashboard/app/utils/appLifecycle.ts       |  16 +-
 packages/dashboard/src/routes.ts                   |   2 +-
 packages/i18n/locales/en/app.json                  |  33 +---
 packages/i18n/locales/es/app.json                  |  44 ++---
 packages/i18n/locales/fr/app.json                  |  44 ++---
 packages/i18n/locales/ko/app.json                  |  44 ++---
 packages/i18n/locales/zh-CN/app.json               |  44 ++---
 packages/i18n/locales/zh-TW/app.json               |  44 ++---
 packages/i18n/src/resources.d.ts                   |  48 ++---
 32 files changed, 316 insertions(+), 922 deletions(-)

Fusion-Task-Id: FN-8229

Fusion-Task-Lineage: a232fb04-08ff-4f0a-a440-e94545243e61

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 14:25:30 -07:00
gsxdsm
0b6957a1b2 FN-8241: log Plan Review revisions distinctly
Classify requested Plan Review changes as normal specification revision activity rather than workflow failures.

- Replace failure log actions for deterministic and reviewer-requested revisions
- Preserve failed workflow-result state for replan and recovery processing
- Cover revision logging across deterministic, reviewer, and retry paths

Files changed:
 .../triage-review-spec-external-integration.test.ts        |  5 ++++-
 packages/engine/src/__tests__/triage.test.ts               | 11 +++++++++++
 packages/engine/src/triage.ts                              | 14 ++++++++++++--
 3 files changed, 27 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-8241

Fusion-Task-Lineage: 316370ac-36c2-45b5-944f-602375167cdd

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 14:19:28 -07:00
gsxdsm
a746a02f3b FN-8236: group mobile Settings sections by topic
Group the mobile Settings picker by desktop navigation topics while preserving scoped section adjacency.

- Render mobile section choices in native topic optgroups
- Preserve Global-before-Project ordering and search-aware empty groups
- Cover grouped picker behavior and document the mobile navigation

Files changed:
docs/dashboard-guide.md                            |  2 +-
packages/dashboard/app/components/SettingsModal.tsx | 31 +++++++--
packages/dashboard/app/components/__tests__/settings-mobile.test.tsx | 80 ++++++++++++++++++++++
3 files changed, 107 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-8236

Fusion-Task-Lineage: 3a90bc72-2393-4b41-a7c3-2c9e30c94e01

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 14:13:41 -07:00
gsxdsm
eae8d9dabe FN-8238: tighten mobile mailbox header layout
Keep full-page mailbox actions and detail controls compact on mobile devices.

- Gate compact mailbox styles on the runtime mobile viewport mode
- Preserve header actions, tabs, and message controls in single mobile rows
- Add regression coverage for mobile layout gating and actions

Files changed:
 packages/dashboard/app/components/MailboxModal.css | 113 ++++++++++++++++++++-
 packages/dashboard/app/components/MailboxView.tsx  |  12 ++-
 .../app/components/__tests__/MailboxView.test.tsx  |  73 +++++++++++++
 3 files changed, 193 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-8238

Fusion-Task-Lineage: fce35577-4368-4cf6-a059-445550c98463

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 13:58:34 -07:00
gsxdsm
595c27ceae FN-8235: add mobile Kanban column snapping
Mobile Kanban now settles user swipes on the nearest column.

- add a mobile-only, user-driven scroll-end snapping hook
- wire snapping to every live Board rendering and cover interaction boundaries
- document the behavior and add a patch changeset

Files changed:
 .changeset/fn-8235-mobile-kanban-snap.md           |   7 +
 docs/dashboard-guide.md                            |   6 +
 packages/dashboard/app/components/Board.tsx        |  19 ++-
 .../app/components/__tests__/board-mobile.test.tsx |  14 +-
 .../hooks/__tests__/useColumnScrollSnap.test.ts    | 159 ++++++++++++++++++
 .../dashboard/app/hooks/useColumnScrollSnap.ts     | 179 +++++++++++++++++++++
 6 files changed, 380 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-8235

Fusion-Task-Lineage: 46881e93-59f2-49d6-b29e-fa6150420f2a

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 13:53:13 -07:00
gsxdsm
44c784264a FN-8237: refine mobile footer quick actions
Make mobile footer quick actions configurable, reorderable, and immediately applied.

- Expand the selectable quick-action universe and preserve valid configured items.
- Add General settings controls for reordering, adding, and removing footer actions.
- Wire updated navigation settings through the dashboard and document the behavior.

Files changed:
 .../fn-8237-mobile-nav-quick-actions-refinement.md |   7 +
 docs/dashboard-guide.md                            |   2 +-
 docs/settings-reference.md                         |   2 +-
 .../src/__tests__/mobile-nav-primary-items.test.ts |  17 +-
 packages/core/src/mobile-nav-primary-items.ts      |  44 ++-
 packages/dashboard/app/App.tsx                     |   4 +-
 packages/dashboard/app/components/AppModals.tsx    |   2 +
 packages/dashboard/app/components/MobileNavBar.tsx | 319 ++++-----------------
 .../dashboard/app/components/SettingsModal.tsx     |   4 +
 .../app/components/__tests__/MobileNavBar.test.tsx |  18 +-
 .../__tests__/SettingsModal.general.test.tsx       |  20 ++
 .../dashboard/app/components/dashboard/MainContent.tsx |   2 +
 .../dashboard/app/components/dashboard/types.ts    |   1 +
 .../settings/sections/GeneralSection.tsx           |  75 ++---
 packages/dashboard/app/hooks/useAppSettings.ts     |  11 +
 packages/i18n/locales/en/app.json                  |   5 +-
 16 files changed, 220 insertions(+), 313 deletions(-)

Fusion-Task-Id: FN-8237

Fusion-Task-Lineage: cff91b30-7ef9-4557-8880-cc71ed74dafb

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 13:45:41 -07:00
gsxdsm
f0b6e4be0c FN-8233: reflect oversight state in menu trigger
Make the Oversight menu trigger icon reflect the effective overseer configuration.

- Switch the trigger between Eye and EyeOff based on oversight level and Session advisor state.
- Cover icon updates after changing either control.
- Document the combined trigger-state behavior.

Files changed:
 docs/dashboard-guide.md                            |  6 ++-
 .../dashboard/app/components/TaskDetailModal.tsx   | 10 +++-
 .../TaskDetailModal.oversight-controls.test.tsx    | 61 ++++++++++++++++++++++
 3 files changed, 74 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-8233

Fusion-Task-Lineage: 16012bf1-94f8-4461-90b6-95d309aa9a6d

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 13:38:32 -07:00
gsxdsm
2f7da57601 FN-8230: translate GitHub import issues across pages
GitHub import auto-translation now covers every reachable issue page within the fetch cap.

- Translate and retain per-page results while invalidating changed or reloaded issues
- Raise the translation budget for a 300-issue traversal and cover pagination regressions
- Document the GitHub-only pagination behavior and add a patch changeset

Files changed:
 .changeset/fn-8230-import-translate-pagination.md  |   7 ++
 docs/dashboard-guide.md                            |   2 +-
 docs/settings-reference.md                         |   4 +-
 .../dashboard/app/components/GitHubImportModal.tsx |  33 ++++++---
 .../components/GitHubImportTranslateControls.tsx   |  80 ++++++++++++---------
 .../__tests__/GitHubImportAutoTranslate.test.tsx   |  66 ++++++++++++-----
 .../__tests__/GitHubImportModal.test.tsx           |  32 +++++++++
 .../dashboard/src/__tests__/ai-translate.test.ts   |  20 ++++++
 packages/dashboard/src/ai-translate.ts             |   6 +-
 packages/dashboard/src/import-translate-service.ts | Bin 11109 -> 11099 bytes
 10 files changed, 186 insertions(+), 64 deletions(-)

Fusion-Task-Id: FN-8230

Fusion-Task-Lineage: 2c3ce6f6-a8f3-46a9-b93a-0192f0cdaf54

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 13:31:42 -07:00
gsxdsm
a650057b3a FN-8234: position task size badges beside IDs
Place task size badges directly after task IDs to keep card header metadata aligned.

- Move size badges out of trailing action clusters into the ID-adjacent header position
- Preserve desktop and mobile chip-height alignment for size badges and actions
- Update card layout tests for badge ordering and alignment

Files changed:
 packages/dashboard/app/components/TaskCard.css     | 33 ++++++---
 packages/dashboard/app/components/TaskCard.tsx     | 20 +++---
 .../__tests__/TaskCard.badge-wrap.test.tsx         | 81 +++++++++++++---------
 .../app/components/__tests__/TaskCard.test.tsx     | 31 +++++++--
 4 files changed, 107 insertions(+), 58 deletions(-)

Fusion-Task-Id: FN-8234

Fusion-Task-Lineage: c9c93d1a-3339-40b0-b818-4d7b1a44a650

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 13:21:13 -07:00
gsxdsm
cdcdc32679 FN-8232: keep task attachment picker available across tabs
Keep the task-detail attachment picker functional outside the Definition tab.

- Mount the shared hidden file input outside tab-specific content.
- Cover attachment picker access from the Activity tab.
- Add a patch changeset for the task-detail fix.

Files changed:
 .../fn-8232-task-detail-attachment-picker.md       |  7 +++++++
 .../dashboard/app/components/TaskDetailModal.tsx   | 20 ++++++++++++-------
 ...lModal.inline-editing-and-integrations.test.tsx | 23 ++++++++++++++++++++++
 3 files changed, 43 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-8232

Fusion-Task-Lineage: a425a373-f15c-4e7f-a50e-e2eba592d2c9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 13:15:58 -07:00
gsxdsm
9cdddab504 FN-8231: dismiss mobile mailbox details on Back
Mobile mailbox overlays now close through the shared navigation history before leaving the message list.

- Register mobile message, composer, and approval overlays as navigation modals.
- Remove matching history entries when mailbox overlays close or change state.
- Add mobile back-navigation coverage and document the behavior.

Files changed:
 docs/dashboard-guide.md                            |   3 +-
 packages/dashboard/app/components/MailboxView.tsx  | 117 ++++++++++++----
 .../app/components/__tests__/MailboxView.test.tsx  | 148 +++++++++++++++++++++
 3 files changed, 241 insertions(+), 27 deletions(-)

Fusion-Task-Id: FN-8231

Fusion-Task-Lineage: b6f06ed9-b03f-45d9-b90b-28b565231bcc

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 13:10:39 -07:00
gsxdsm
f3ef60b80a FN-8227: link closed tracked issues to landing commits
Closed GitHub tracked issues now reliably include their landing commit link.

- Re-read the authoritative task row before posting a Done tracking comment.
- Preserve event-snapshot commit links when the task lookup fails or is absent.
- Cover stale events, unavailable rows, no-op landings, and non-Done transitions.

Files changed:
 .changeset/fn-8227-tracked-issue-commit-link.md    |  7 ++
 .../src/__tests__/github-tracking-comments.test.ts | 81 ++++++++++++++++++++++
 packages/dashboard/src/github-tracking-comments.ts | 14 +++-
 3 files changed, 100 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8227

Fusion-Task-Lineage: f497dbb8-da5c-4409-a8fd-836d6df573da

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 13:04:45 -07:00
gsxdsm
9b9d6a2e72 FN-8226: install dependencies before full rebuilds
Full System rebuilds now refresh workspace dependencies before compiling and restarting.

- Run and stream pnpm install before full builds
- Abort builds and restarts when dependency installation fails
- Cover install sequencing, failure handling, and scoped rebuild behavior

Files changed:
 .changeset/FN-8226-full-rebuild-install.md         |   7 +
 .../__tests__/register-system-routes.test.ts       |  94 ++++++++++-
 .../dashboard/src/routes/register-system-routes.ts | 180 ++++++++++++++-------
 3 files changed, 220 insertions(+), 61 deletions(-)

Fusion-Task-Id: FN-8226

Fusion-Task-Lineage: 15d178d6-5052-445a-8376-bd5f32fc38c4

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 12:59:34 -07:00
gsxdsm
2e9c255268 FN-8228: support Back navigation in import detail sheets
Make mobile Back dismiss import detail sheets before the parent import modal.

- Register nested navigation entries for GitHub and GitLab detail sheets.
- Centralize detail selection cleanup across dismissal and successful actions.
- Cover native and browser Back flows and document the mobile behavior.

Files changed:
 docs/dashboard-guide.md                            |   7 ++
 .../dashboard/app/components/GitHubImportModal.tsx |  54 +++++++--
 .../__tests__/GitHubImportModal.test.tsx           | 132 ++++++++++++++++++++-
 3 files changed, 180 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-8228

Fusion-Task-Lineage: 36062d52-ad6b-4d5c-87ff-5a6959feecc9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 12:53:46 -07:00
gsxdsm
54565a092d docs: add Claude Agent SDK bridge provider plan
Capture the implementation-ready plan for a conditional, experimental
pi-claude-bridge / Agent SDK provider behind policy and isolation gates.
2026-07-17 12:15:09 -07:00
gsxdsm
adb3eb3a37 FN-8224: add Claude ACP runtime support
Add a bundled Claude Code ACP runtime with model discovery and CLI distribution integration.

- Add the Claude ACP runtime plugin, bridge, tool forwarding, and tests.
- Register Claude model discovery and cached picker support in the dashboard.
- Stage the plugin in CLI and desktop packaging with its pinned dependency.
- Add workspace, lockfile, and release metadata.

Files changed:
 .changeset/fn-8224-claude-acp-runtime.md           |   7 +
 packages/cli/package.json                          |   1 +
 packages/cli/src/__tests__/bundle-output.test.ts   |  32 +-
 .../cli/src/plugins/staged-bundled-plugin-ids.ts   |   1 +
 packages/cli/tsup.config.ts                        |  40 +-
 .../core/src/plugins/bundled-plugin-install.ts     |   2 +
 packages/dashboard/package.json                    |   3 +-
 packages/dashboard/src/claude-model-cache.ts       | 185 +++++++
 packages/dashboard/src/routes.ts                   |   1 +
 .../dashboard/src/routes/register-model-routes.ts  |  11 +
 packages/dashboard/src/runtime-provider-probes.ts  |  15 +
 packages/dashboard/vitest.config.ts                |   4 +
 packages/desktop/scripts/workspace-tools.ts        |   1 +
 plugins/fusion-plugin-claude-runtime/README.md     |   7 +
 plugins/fusion-plugin-claude-runtime/manifest.json |   1 +
 plugins/fusion-plugin-claude-runtime/package.json  |   1 +
 .../src/__tests__/cli-spawn.test.ts                |   3 +
 .../src/__tests__/index.test.ts                    |   3 +
 .../src/__tests__/provider.test.ts                 |   8 +
 .../src/__tests__/runtime-adapter.test.ts          |   7 +
 .../src/__tests__/tool-bridge.test.ts              |  79 +++
 .../src/acp-settings.ts                            |  21 +
 .../src/acp/VENDORED.md                            |  30 ++
 .../src/acp/cli-spawn.ts                           | 188 +++++++
 .../src/acp/control-handler.ts                     | 302 ++++++++++++
 .../src/acp/event-bridge.ts                        | 308 ++++++++++++
 .../src/acp/fs-capabilities.ts                     | 263 ++++++++++
 .../fusion-plugin-claude-runtime/src/acp/index.ts  |  16 +
 .../src/acp/path-jail.ts                           | 229 +++++++++
 .../src/acp/process-manager.ts                     | 177 +++++++
 .../src/acp/prompt-builder.ts                      |  87 ++++
 .../src/acp/provider.ts                            | 542 +++++++++++++++++++++
 .../src/acp/runtime-adapter.ts                     | 190 ++++++++
 .../src/acp/sanitize.ts                            |  81 +++
 .../src/acp/tool-mapping.ts                        |  47 ++
 .../fusion-plugin-claude-runtime/src/acp/types.ts  | 189 +++++++
 .../fusion-plugin-claude-runtime/src/cli-spawn.ts  |  31 ++
 plugins/fusion-plugin-claude-runtime/src/index.ts  |  95 ++++
 .../src/mcp-forwarding.ts                          | 114 +++++
 .../src/mcp-schema-server.cjs                      | 155 ++++++
 plugins/fusion-plugin-claude-runtime/src/probe.ts  |   8 +
 .../fusion-plugin-claude-runtime/src/provider.ts   |   8 +
 .../src/runtime-adapter.ts                         | 424 ++++++++++++++++
 .../src/skill-loader.ts                            | 290 +++++++++++
 .../src/tool-bridge.ts                             | 264 ++++++++++
 plugins/fusion-plugin-claude-runtime/src/types.ts  | 142 ++++++
 plugins/fusion-plugin-claude-runtime/tsconfig.json |  10 +
 .../fusion-plugin-claude-runtime/vitest.config.ts  |  22 +
 pnpm-lock.yaml                                     | 131 ++++-
 pnpm-workspace.yaml                                |   1 +
 50 files changed, 4753 insertions(+), 24 deletions(-)

Fusion-Task-Id: FN-8224

Fusion-Task-Lineage: 4e626913-32bb-4baa-a142-816c7f4ee7c4

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 12:00:26 -07:00
gsxdsm
7f1b7e21c1 FN-8223: enforce full CLI quarantine ledger lockstep
Extend CLI quarantine validation across the entire ledger.

- Normalize package-relative Vitest exclusions to repository paths.
- Require each CLI configuration exclusion and ledger entry exactly once.
- Validate ISO 8601 quarantine timestamps.

Files changed:
 .../src/__tests__/lockstep-cli-quarantine.test.ts  | 52 +++++++++++-----------
 packages/cli/vitest.config.ts                      |  4 +-
 2 files changed, 27 insertions(+), 29 deletions(-)

Fusion-Task-Id: FN-8223

Fusion-Task-Lineage: 7abe719b-63bf-4dfa-8db6-e3dd7547c7fe

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 11:43:46 -07:00
gsxdsm
065890ca01 FN-8222: align CLI tests with current store APIs
Repair CLI test mocks and retry-reset expectations for the current store contracts.

- Add the backend store factory to the experiment-finalize mock.
- Provide global settings directory access in backup test stores.
- Assert all manual retry reset fields in task command tests.

Files changed:
 .../extension-experiment-finalize.test.ts          | 13 ++++++++++
 .../commands/__tests__/backup-lock-retry.test.ts   |  2 ++
 packages/cli/src/commands/__tests__/backup.test.ts | 17 ++++++++++++-
 packages/cli/src/commands/__tests__/task.test.ts   | 28 +++++++++++++++++-----
 4 files changed, 53 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-8222

Fusion-Task-Lineage: 033ce6a6-c699-409c-a59e-2d1f5e041cfc

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 11:37:32 -07:00
gsxdsm
5d2c3be6a0 FN-8221: clear inactive planner overseer state
Clear retained planner overseer state when effective oversight is disabled.

- Remove monitor, recovery, advisor, and dedup runtime for oversight-off tasks.
- Suppress stale oversight-off Eye badges in task cards.
- Cover cleanup and badge behavior with regression tests.
- Document the runtime snapshot invariant and add a patch changeset.

Files changed:
 .changeset/fn-8221-overseer-badge-oversight-off.md |   7 ++
 docs/architecture.md                               |   4 +
 packages/dashboard/app/components/TaskCard.tsx     |   9 +-
 .../app/components/__tests__/TaskCard.test.tsx     |  20 ++++
 .../__tests__/planner-overseer-off-cleanup.test.ts | 119 +++++++++++++++++++++
 packages/engine/src/project-engine.ts              |  12 +++
 6 files changed, 170 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-8221

Fusion-Task-Lineage: 01c9d838-fbe4-4d34-8eb5-d735cf35e581

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 11:27:44 -07:00
gsxdsm
b686fbd61d FN-8220: mock daemon model runtime setup
Align daemon startup mocks with the model runtime initialization path.

- Add the auth-storage setModelRuntime mock.
- Stub the Fusion model registry factory to use the shared test registry.

Files changed:
 packages/cli/src/commands/__tests__/daemon.test.ts | 9 +++++++++
 1 file changed, 9 insertions(+)

Fusion-Task-Id: FN-8220

Fusion-Task-Lineage: 6e00980f-2e24-4502-a4d8-e91849df33b9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 11:24:02 -07:00
gsxdsm
5acea6c0cf fix(pg): route residual SQLite-stub store paths through the async data layer (#2273)
## Summary

An audit of the SQLite→PostgreSQL store migration found data-store paths
still reaching the removed SQLite stub in backend (PG) mode. In backend
mode `store.db`/`getDatabase()` throw the removed-SQLite error, so each
of these either threw on every run or — worse — had the throw swallowed
into a silent wrong result. This PR routes all of them through the
`AsyncDataLayer` (and removes one dead primitive).

## The 6 live bugs fixed

| Fix | Was |
|-----|-----|
| `executor.ts` authoritative assigned-agent fallback now inherits the
TaskStore `asyncLayer` | silently returned `null` → model drift to the
pi built-in (the exact thing its comment guards) |
| `pruneAgentLogFilesAsync` replaces the sync self-healing prune call |
threw `SQLite Database is not available` every maintenance sweep →
agent-log pruning never ran |
| `cleanupOrphanedMaterializedSteps` deletes PG `workflow_steps` rows on
a failed create | swallowed the throw → leaked rows |
| `deleteTaskBackendImpl` now runs the async mission feature/task-link
unlink | PG hard delete left orphaned mission links |
| `getWorkflowSettingsProjectId` returns `rootDir` in backend mode
without touching the stub | swallowed throw for unscoped backend stores
|
| `fn plugin` unregistered-project fallback bootstraps a `CentralCore`
`AsyncDataLayer` | layerless `PluginStore` threw in PG |

## The 4 latent traps, fixed properly

- **`cleanupArchivedTasks`** — real async port (enumerate archived
soft-deleted rows, guarantee cold snapshot, hard-delete project row +
purge selection rows + rm dir).
- **`deleteWorkflowStep`** — real async port (delete `workflow_steps`
via the layer with `.returning()` to preserve the not-found contract).
- **`applyTaskPatch`** — **removed** (zero-caller SQLite column-patch
primitive with no backend analogue; impl + facade + import deleted).
- **`AgentStore.importLegacyFileRuns`** — clean backend no-op (no legacy
SQLite run-files exist in a PG deployment; its only `init()` caller
early-returns in backend mode).

## Symptom Verification

New PG regression suite
`packages/core/src/__tests__/postgres/store-sqlite-residue-fixes.pg.test.ts`
reproduces the original failures against real embedded Postgres and
asserts they're gone:
- orphaned `workflow_steps` are actually deleted (no swallowed throw)
- `pruneAgentLogFilesAsync` resolves and prunes inactive-task log files
- hard delete unlinks the mission feature from the task
- `deleteWorkflowStep` removes the row / reports not-found
- `cleanupArchivedTasks` hard-deletes the project row while retaining
the cold snapshot

## Verification

- `@fusion/core`, `@fusion/engine`, `@runfusion/fusion` typecheck clean
- ~50 existing + 5 new PG tests pass; lint clean; changeset validates

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

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

* **Bug Fixes**
* Prevented PostgreSQL backend maintenance from hitting removed legacy
SQLite code paths, avoiding datastore failures and residue cleanup
issues.
* Fixed workflow-step deletion and “not found” behavior in backend mode.
* Ensured backend hard-deletes correctly unlink related mission
feature/task links and clean orphaned materialized steps.
* Prevented legacy file-run imports from incorrectly reporting success
in backend mode.
* **New Features**
* Added async agent-log pruning for inactive tasks and updated
maintenance to use it.
* **Tests**
* Added PostgreSQL regression coverage for residue fixes and
archive/workflow cleanup.
* **Refactor**
* Removed an unused task patch operation and updated task-store cleanup
methods to be async where needed.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:22:21 -07:00
gsxdsm
cdcc3261f1 FN-8225: migrate goal-tool tests to shared PostgreSQL harness
Migrate goal-tool extension tests to the injected shared PostgreSQL harness.

- Replace temporary embedded PostgreSQL roots with shared harness lifecycle hooks
- Reuse harness API registration and tool helpers across goal retrieval and audit suites
- Preserve retrieval audit assertions while avoiding concurrent database startup locks

Files changed:
 .../__tests__/extension-goal-tools-audit.test.ts   |  72 ++++++-------
 .../cli/src/__tests__/extension-goal-tools.test.ts | 113 ++++++++-------------
 2 files changed, 76 insertions(+), 109 deletions(-)

Fusion-Task-Id: FN-8225

Fusion-Task-Lineage: 424c1bb2-5cb7-4e81-b3fd-8f6a6f29b433

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 11:18:50 -07:00
gsxdsm
a7ab3ccb49 fix(heartbeat): stop zombie-timer audit churning live-but-skipping timers (#2271)
## Problem

Permanent (durable) agent heartbeats went silent while the rest of the
engine kept running. Investigation of the live DB showed **every**
permanent agent's `heartbeatTimerRepair` metadata carrying
`nonAdvancingEscalated: true` with **3–63 consecutive** zombie re-arms —
the audit re-arming a timer every 60s for hours while emitting
`heartbeat-rearm-nonadvancing-escalated` warnings that never recovered
anything.

## Root cause

The heartbeat trigger audit classified a "zombie" (dead) timer **solely
from a stale `lastHeartbeatAt`**. But that column advances *only* on a
successful `"ok"` delivery (`agent-store.ts` `recordHeartbeat`). It
stays frozen whenever a heartbeat is intentionally skipped or no-op'd:

- agent over budget / over budget threshold
- `globalPause` / `enginePaused`
- `skipHeartbeatWhenIdle` on an idle agent
- idle "org" agents whose runs complete as `no_assignment_identity_run`

In all of these the interval keeps firing perfectly — the timer is
alive, delivery is just (correctly) skipped. Keying zombie detection off
`lastHeartbeatAt` misread those healthy timers as dead, re-armed them
every 60s, and escalated forever. Re-arming a live timer is a no-op, so
the loop could never recover — it only produced churn and phantom
warnings.

## Fix (the invariant)

Key zombie detection off **whether the interval physically fired**, not
whether delivery advanced.

- New `lastTimerFireAtMs` map, stamped at the top of `onTimerTick`
**before any gate** — a fired-but-skipped tick still counts as proof of
liveness.
- In the audit: a present + stale timer that fired within its stale
window is **left untouched** (no re-arm, no escalation, non-advancing
counter reset). Only a timer with **no recent fire** (a genuinely dead
interval) falls through to the existing re-arm/escalation path.
- Map cleaned up in `unregisterAgent()` / `stop()`.

This preserves the FN-7645 zombie repair (a timer that stops firing goes
stale in lockstep on both clocks and is still re-armed) and the FN-7939
watchdog, while eliminating the phantom churn for live-but-skipping
timers.

Why not "force a heartbeat" or "park the agent": forcing delivery would
bypass budget/pause governance, and parking a healthy idle agent would
be wrong. The correct action for a live-but-skipping timer is to leave
it alone — its next real tick delivers once the skip condition clears.

## Tests

- Rewrote the old `skipHeartbeatWhenIdle` test that codified the buggy
escalation → now asserts a **live** idle-skipping timer is left
untouched (no zombie re-arm, no escalation).
- Added a budget/no-assignment surface: a live timer that dispatches but
leaves `lastHeartbeatAt` frozen must not be misclassified.

`heartbeat-scheduler.test.ts` 120/120; broader heartbeat + concurrency
suites 349/349; `@fusion/engine` typecheck 0 errors.

## Review

Self-reviewed at medium effort. Two acknowledged, bounded trade-offs
(kept intentionally): a genuinely-dead-but-recently-fired timer's repair
latency is bounded at ~2× interval (same as the original FN-7645
latency), and the escalation warning is suppressed for live timers (it
only ever fired because of the churn this removes; per-tick error logs +
a new "left live-but-skipping timer" log retain visibility). One trivial
cleanup applied (single `Date.now()` sample).

## Notes

- Engine is a private package → no changeset.
- Complementary to a separate in-flight fix for the
agentStore/scheduler-not-constructed bug (why heartbeats stopped
*entirely*); this PR ensures that once the scheduler runs again, the
audit stops the phantom churn/escalation.

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


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

## Summary by CodeRabbit

* **Bug Fixes**
* Improved heartbeat timer monitoring to distinguish healthy timers from
genuinely stopped timers.
* Prevented unnecessary timer re-registration and warning escalation
when heartbeats are intentionally skipped due to idle, paused,
budget-limited, or unassigned states.
* Improved recovery when a replacement timer stops firing, ensuring it
is detected and repaired reliably.

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

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:15:41 -07:00
gsxdsm
01b1c694d1 FN-8219: remove expired CLI quarantined tests
Remove expired CLI test quarantines and preserve evidence of their resolution.

- Delete five expired quarantined CLI test files
- Remove their Vitest exclusions
- Add a lockstep regression guard for the retired quarantine scope

Files changed:
 .../src/__tests__/extension-fn-secret-get.test.ts  |  164 -
 .../src/__tests__/lockstep-cli-quarantine.test.ts  |   64 +
 packages/cli/src/__tests__/skill-sync.test.ts      |  562 ---
 packages/cli/src/__tests__/version.test.ts         |   62 -
 .../cli/src/commands/__tests__/dashboard.test.ts   | 3736 --------------------
 .../__tests__/bundled-plugin-freshness.test.ts     |   75 -
 packages/cli/vitest.config.ts                      |   21 +-
 7 files changed, 78 insertions(+), 4606 deletions(-)

Fusion-Task-Id: FN-8219

Fusion-Task-Lineage: cac0b4c5-3255-4733-ba24-2156979d60f3

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 11:11:07 -07:00
gsxdsm
526aaf8d65 FN-8218: stub model registry runtime initialization in serve tests
Keep serve command tests compatible with async ModelRuntime initialization.

- Add setModelRuntime to the auth storage mock
- Mock createFusionModelRegistry with the shared registry fixture

Files changed:
 packages/cli/src/commands/__tests__/serve.test.ts | 10 ++++++++++
 1 file changed, 10 insertions(+)

Fusion-Task-Id: FN-8218

Fusion-Task-Lineage: dcbba740-e363-4b17-8eba-00c399343d16

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 11:05:02 -07:00
gsxdsm
abc2550cc6 FN-8216: fix settings description test guard
Keep the Settings default-description coverage aligned with surfaced and global-only settings.

- Add missing Notifications and Scheduling description keys to the coverage map
- Allowlist the global-only LAN discovery setting so the guard does not require a UI description

Files changed:
 .../sections/__tests__/settings-default-descriptions.test.tsx    | 9 +++++++++
 1 file changed, 9 insertions(+)

Fusion-Task-Id: FN-8216

Fusion-Task-Lineage: a5449429-c5b2-4d88-915b-26baba3fb60b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 10:59:11 -07:00
gsxdsm
eb7d223a03 FN-8207: add task reassignment for delegated work
Correct delegation routing for duplicate tasks and enable explicit task owner reassignment.

- Preserve requested assignee and todo routing on duplicate canonical tasks
- Add governed fn_task_assign to engine, heartbeat, triage, workflow, and chat sessions
- Cover assignment validation, truthful delegation responses, and tool availability

Files changed:
 .changeset/fn-8207-delegate-assign.md              |   7 ++
 docs/agents.md                                     |   6 ++
 packages/core/src/types.ts                         |   1 +
 packages/core/src/usage-events.ts                  |   2 +-
 .../dashboard/src/__tests__/chat-manager.test.ts   |   2 +
 packages/dashboard/src/__tests__/chat.test.ts      |   2 +
 packages/dashboard/src/chat.ts                     |   2 +
 .../engine/src/__tests__/agent-action-gate.test.ts |   2 +
 .../src/__tests__/agent-tools-delegation.test.ts   |  99 ++++++++++++++++++-
 .../src/__tests__/agent-tools-task-assign.test.ts  |  75 +++++++++++++++
 .../src/__tests__/gating-classifications.test.ts   |   1 +
 .../src/__tests__/heartbeat-executor.test.ts       |   8 +-
 .../src/__tests__/permanent-agent-gating.test.ts   |   2 +
 .../src/__tests__/step-session-executor.test.ts    |   4 +-
 packages/engine/src/__tests__/triage.test.ts       |   5 +-
 packages/engine/src/agent-heartbeat.ts             |   4 +-
 packages/engine/src/agent-tools.ts                 | 105 ++++++++++++++++++++-
 packages/engine/src/executor.ts                    |   3 +
 packages/engine/src/gating-classifications.ts      |   1 +
 packages/engine/src/index.ts                       |   2 +
 packages/engine/src/step-session-executor.ts       |   2 +
 packages/engine/src/triage.ts                      |   2 +
 22 files changed, 324 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-8207

Fusion-Task-Lineage: db6f3876-bdc8-4279-b726-29344d9acdb9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 10:53:19 -07:00
gsxdsm
86c281bc38 FN-8215: add GitHub issue comment posting
Enable operators to post upstream GitHub issue comments from the Import Tasks preview.

- Add authenticated GitHub CLI and REST fallback support for creating issue comments.
- Expose a validated API route and inline issue-comment composer with optimistic preview updates.
- Add localized UI copy, documentation, release metadata, and coverage for client, route, and modal behavior.

Files changed:
 .changeset/fn-8215-github-issue-add-comment.md     |  7 ++
 docs/dashboard-guide.md                            |  9 ++-
 packages/dashboard/app/api/legacy.ts               | 13 ++++
 .../dashboard/app/components/GitHubImportModal.css | 34 +++++++++
 .../dashboard/app/components/GitHubImportModal.tsx | 68 +++++++++++++++++-
 .../__tests__/GitHubImportModal.test.tsx           | 62 +++++++++++++++++
 packages/dashboard/src/__tests__/github.test.ts    | 48 +++++++++++++
 .../dashboard/src/__tests__/routes-github.test.ts  | 80 ++++++++++++++++++++++
 packages/dashboard/src/github.ts                   | 49 +++++++++++++
 .../dashboard/src/routes/register-git-github.ts    | 56 +++++++++++++++
 packages/i18n/locales/en/app.json                  |  5 ++
 packages/i18n/locales/es/app.json                  |  5 ++
 packages/i18n/locales/fr/app.json                  |  5 ++
 packages/i18n/locales/ko/app.json                  |  5 ++
 packages/i18n/locales/zh-CN/app.json               |  5 ++
 packages/i18n/locales/zh-TW/app.json               |  5 ++
 packages/i18n/src/resources.d.ts                   |  5 ++
 17 files changed, 459 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8215

Fusion-Task-Lineage: 0fe6acca-e86d-484f-a97f-5746d32717a1

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 10:37:00 -07:00
gsxdsm
3b0b9a5661 FN-8214: show runtime model providers in chat
Ensure task chat role icons reflect each agent's actual runtime model.

- Parse runtime model markers from status and text log entries.
- Prefer runtime and effective models over stale task provider overrides.
- Cover provider icon precedence and fallback behavior for all chat roles.

Files changed:
 packages/dashboard/app/components/TaskChatTab.tsx        |  8 +-
 packages/dashboard/app/components/__tests__/TaskChatTab.test.tsx | 88 ++++++++++++++++++----
 2 files changed, 76 insertions(+), 20 deletions(-)

Fusion-Task-Id: FN-8214

Fusion-Task-Lineage: 1eb02ca5-469f-4a9d-932c-5cf02383b7fe

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 10:30:46 -07:00
gsxdsm
26807c8bf4 FN-8211: restore intrinsic mobile option icons
Restore intrinsic mobile sizing for Quick Add option icons.

- Limit enlarged mobile glyphs to primary Quick Add controls.
- Preserve compact options, touch targets, and desktop styling.
- Add regression coverage and a patch changeset.

Files changed:
 .changeset/fn-8211-quick-add-icon-revert.md        |  7 +++++
 .../quick-entry-action-row-height-parity.test.tsx  | 27 ++++++++++---------
 .../dashboard/app/components/QuickEntryBox.css     | 30 +++++++++++++---------
 3 files changed, 38 insertions(+), 26 deletions(-)

Fusion-Task-Id: FN-8211

Fusion-Task-Lineage: 85399053-2d6e-4bb7-8741-e7c3b1aa437d

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 10:25:01 -07:00
gsxdsm
0d339f4803 FN-8210: repair CLI package configuration test contract
Restore the CLI package configuration test to the active test lane with current build expectations.

- Allowlist WhatsApp plugin-only tsup externals as non-runtime CLI dependencies.
- Assert the full workspace build command in the verification contract.
- Remove the stale package-config test quarantine.

Files changed:
 packages/cli/src/__tests__/package-config.test.ts | 12 +++++++++++-
 packages/cli/vitest.config.ts                     |  9 ++++-----
 2 files changed, 15 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-8210

Fusion-Task-Lineage: aa29d866-430f-4097-affa-a89d107474b2

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 10:19:34 -07:00
gsxdsm
611e51d2a8 FN-8209: align task detail toolbar icons on mobile
Make Task Detail inline controls use the compact, accessible Quick Add icon pattern.

- Replace labeled priority and execution controls with icon-only buttons and a priority picker.
- Apply shared icon sizing to oversight, attachment, priority, and fast-mode controls.
- Update responsive and interaction coverage and add a patch changeset.

Files changed:
 .changeset/fn-8209-task-detail-toolbar-icons.md    |   7 +
 .../dashboard/app/components/TaskDetailModal.css   | 160 ++++++---------------
 .../dashboard/app/components/TaskDetailModal.tsx   | 109 ++++++++++----
 ...lModal.inline-editing-and-integrations.test.tsx |  31 ++--
 .../TaskDetailModal.oversight-controls.test.tsx    |   5 +-
 .../TaskDetailModal.oversight-mobile.test.tsx      |   4 +
 .../__tests__/TaskDetailModal.rendering.test.tsx   |  95 +++---------
 ...etailModal.responsive-and-dependencies.test.tsx |  20 ++-
 8 files changed, 182 insertions(+), 249 deletions(-)

Fusion-Task-Id: FN-8209
Fusion-Task-Lineage: 3c079a7b-245a-4c4d-b058-6e1cf4b5a69d
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 10:13:23 -07:00
gsxdsm
7a50232916 FN-8208: validate agent message recipients before delivery
Prevent false-success agent messages by validating recipients before delivery.

- Wire AgentStore into every send-message tool registration.
- Reject missing or unvalidated agent recipients before persistence or wake-up.
- Add recipient validation coverage and a patch changeset.

Files changed:
 .../fn-8208-send-message-recipient-validation.md   |   7 ++
 .../chat-send-message-agentstore-wiring.test.ts    |  11 ++
 packages/dashboard/src/chat.ts                     |   2 +-
 ...tools-send-message-recipient-validation.test.ts | 116 +++++++++++++++++++++
 packages/engine/src/agent-heartbeat.ts             |   4 +-
 packages/engine/src/agent-tools.ts                 |  24 ++++-
 packages/engine/src/executor.ts                    |   2 +-
 packages/engine/src/step-session-executor.ts       |   2 +-
 8 files changed, 162 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-8208
Fusion-Task-Lineage: 84752bb8-c9f7-42bd-87c1-9681ac442789
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 10:07:24 -07:00
gsxdsm
28878d8125 FN-8206: validate landed merge checkout
Validate mission assertions against the delivered merge revision rather than an ambient working branch.

- Materialize and dispose a detached checkout at mergeDetails.commitSha for validator sessions.
- Defer failed validation when landed-code ancestry cannot be proven, preventing spurious fix features.
- Link validator runs to their board tasks and document the inspection behavior.

Files changed:
 .changeset/fn-8206-mission-validator-inspection-root.md   |   7 +
 docs/missions.md                                          |   2 +
 packages/engine/src/__tests__/mission-execution-loop.test.ts | 278 +++++++++++++--------
 packages/engine/src/mission-execution-loop.ts             | 160 ++++++++----
 4 files changed, 298 insertions(+), 149 deletions(-)

Fusion-Task-Id: FN-8206

Fusion-Task-Lineage: dfd1eb21-fcdf-4722-acb8-416750f4f40b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 10:00:18 -07:00
gsxdsm
67fac31f5c FN-8202: prevent mDNS hostname conflicts
Prevent self-conflicting mDNS advertisements and allow automatic LAN discovery to be disabled.

- Advertise a Fusion-owned DNS-SD hostname derived from the node ID.
- Add a global automatic LAN discovery opt-out for dashboard and serve.
- Cover hostname isolation and discovery startup behavior with tests and documentation.

Files changed:
 .changeset/fn-8202-mdns-hostname-fix.md            |  7 +++++
 docs/settings-reference.md                         |  1 +
 docs/shared-mesh-protocol.md                       |  2 +-
 .../cli/src/commands/__tests__/dashboard.test.ts   | 24 ++++++++++++++++
 packages/cli/src/commands/__tests__/serve.test.ts  | 12 ++++++++
 packages/cli/src/commands/dashboard.ts             | 24 +++++++++++-----
 packages/cli/src/commands/serve.ts                 | 24 +++++++++++-----
 packages/core/src/__tests__/node-discovery.test.ts | 32 +++++++++++++++++++++-
 .../core/src/__tests__/settings-defaults.test.ts   |  8 ++++++
 packages/core/src/node-discovery.ts                | 31 +++++++++++++++++++++
 packages/core/src/settings-schema.ts               |  5 ++++
 packages/core/src/types.ts                         |  2 ++
 12 files changed, 156 insertions(+), 16 deletions(-)

Fusion-Task-Id: FN-8202

Fusion-Task-Lineage: c1d6e36b-bda7-4968-b40c-c14e16ebda28

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 09:54:44 -07:00
gsxdsm
7fc4b439ee FN-8205: fix shared auth credential lock retries
Serialize shared auth credential writes and await durable persistence under contention.

- Replace synchronous auth-file locking with queued asynchronous retries.
- Propagate asynchronous credential mutations through CLI, dashboard, and provider wrappers.
- Cover held-lock persistence, queue recovery, and awaited caller behavior.

Files changed:
 .changeset/fn-8205-auth-lock-retry.md              |   7 ++
 .../cli/src/commands/__tests__/onboard.test.ts     |  17 +++
 .../src/commands/__tests__/provider-auth.test.ts   |  78 ++++++------
 packages/cli/src/commands/onboard.ts               |   2 +-
 packages/dashboard/src/routes.ts                   |   6 +-
 .../dashboard/src/routes/register-auth-routes.ts   |  10 +-
 .../dashboard/src/routes/register-mesh-routes.ts   |   4 +-
 .../register-settings-sync-inbound-routes.ts       |   4 +-
 .../src/routes/register-settings-sync-routes.ts    |   4 +-
 .../src/__tests__/auth-storage-concurrency.test.ts |  84 ++++++++++---
 packages/engine/src/__tests__/auth-storage.test.ts |  48 ++++----
 packages/engine/src/auth-storage.ts                | 137 +++++++++++++--------
 packages/engine/src/provider-auth.ts               |  56 ++++-----
 13 files changed, 284 insertions(+), 173 deletions(-)

Fusion-Task-Id: FN-8205

Fusion-Task-Lineage: b932b9ce-9aee-4f0a-9155-63b026c6bde4

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 09:47:40 -07:00
gsxdsm
4293826b5a FN-8212: remove model dropdown sticky-header gap
Make pinned model provider headers sit flush against the fixed dropdown header stack.

- Remove top padding that exposed scrolling rows above sticky provider headers.
- Cover the no-seam invariant across desktop and mobile layouts with and without thinking controls.
- Add a patch changeset for the dropdown scrolling fix.

Files changed:
 .changeset/fn-8212-model-dropdown-sticky-gap.md    |  7 ++++
 .../app/components/CustomModelDropdown.css         |  5 ++-
 .../__tests__/CustomModelDropdown.test.tsx         | 46 ++++++++++++++++++++++
 3 files changed, 57 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-8212

Fusion-Task-Lineage: d7ce42d1-bcbe-4000-8107-794ec8e05307

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 09:35:14 -07:00
gsxdsm
d6860b5b76 FN-8204: add configurable mobile footer quick actions
Add an ordered project setting for mobile footer quick-action destinations.

- Render selected destinations as primary mobile tabs and retain omitted choices in More.
- Provide settings controls, validation, translations, documentation, and regression coverage.
- Add a minor changeset for the published CLI package.

Files changed:
 .changeset/fn-8204-mobile-nav-primary-items.md     |   7 +
 docs/dashboard-guide.md                            |   4 +
 docs/settings-reference.md                         |   4 +
 .../src/__tests__/mobile-nav-primary-items.test.ts |  23 +++
 packages/core/src/index.ts                         |   9 ++
 packages/core/src/mobile-nav-primary-items.ts      |  55 +++++++
 packages/core/src/settings-schema.ts               |   1 +
 packages/core/src/types.ts                         |   7 +
 packages/dashboard/app/App.tsx                     |   2 +
 .../mobile-feature-access-regression.test.tsx      |  19 +++
 packages/dashboard/app/components/MobileNavBar.tsx | 159 +++++----------------
 .../app/components/__tests__/MobileNavBar.test.tsx |  16 +++
 .../app/components/settings/section-keys.ts        |   1 +
 .../settings/sections/GeneralSection.search.ts     |   9 ++
 .../settings/sections/GeneralSection.tsx           |  45 ++++++
 .../settings-default-descriptions.test.tsx         |   1 +
 packages/dashboard/app/hooks/useAppSettings.ts     |   5 +
 packages/i18n/locales/en/app.json                  |   4 +
 18 files changed, 244 insertions(+), 127 deletions(-)

Fusion-Task-Id: FN-8204

Fusion-Task-Lineage: 077de4c4-d281-401d-bddd-e5ce8e91d4ab

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 09:27:33 -07:00
gsxdsm
c0d610d9d7 fix(whatsapp-plugin): connect with current WA Web version and load as bundled plugin
WhatsApp rejects handshakes advertising Baileys' baked-in stale protocol
version with a 405 close, so the plugin cycled starting->disconnected and
never issued a QR. connect() now fetches the current WA Web version per
socket build. /status also exposes lastError so this failure mode is
diagnosable from the documented troubleshooting surface.

The published bundled.js also failed to load entirely ("Dynamic require
of 'crypto' is not supported"): plugin bundles are ESM but Baileys is
CJS. bundlePluginEntry now injects the same createRequire banner as
dist/bin.js.

Verified end-to-end against an isolated fn serve: bundled.js loads,
status reaches awaiting-qr, /qr serves a scannable QR data URL,
/pair-code validates input, /logout clears auth state.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 09:13:55 -07:00
gsxdsm
e445b3e367 FN-8201: pin pi dependency versions
Pin the pi runtime packages to a single exact version so global npm installs resolve a compatible set.

- Pin pi-ai and pi-coding-agent declarations across workspace manifests
- Add a guard and tests that reject ranged or mismatched pi versions
- Document the source-install fallback and add a patch changeset

Files changed:
 .changeset/fn-8201-pin-pi-versions.md              |   7 ++
 docs/getting-started.md                            |   3 +
 package.json                                       |   6 +-
 packages/cli/package.json                          |   4 +-
 packages/cli/src/__tests__/package-config.test.ts  |  18 +++-
 packages/core/package.json                         |   2 +-
 packages/dashboard/package.json                    |   2 +-
 packages/engine/package.json                       |   4 +-
 packages/pi-claude-cli/package.json                |   8 +-
 .../__tests__/check-pi-versions-pinned.test.mjs    |  45 ++++++++
 scripts/check-pi-versions-pinned.mjs               | 120 +++++++++++++++++++++
 11 files changed, 205 insertions(+), 14 deletions(-)

Fusion-Task-Id: FN-8201

Fusion-Task-Lineage: bf0ac363-df5f-4445-835b-cfd2d4909659

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 09:12:01 -07:00
gsxdsm
6ca7e48f87 fix(FN-7965): surface duplicate decisions
Show a clear operator-decision badge and deliver an idempotent mailbox prompt for triage duplicate markers.

Fusion-Task-Id: FN-7965
2026-07-17 08:53:44 -07:00
gsxdsm
c6adac6e7c fix(dashboard): stop mobile task-detail panel shifting left
The full-screen mobile task-detail sheet hides all resize handles, so
FN-8015's `margin-inline-end: var(--space-lg)` gutter on the shared
`.floating-window__body` (added to keep the scrollbar clear of desktop
resize hot zones) only added dead space on the right and shifted the
entire panel left. Zero it for `.floating-window--task-detail` inside
the mobile breakpoint so `.detail-body`'s own padding defines both
insets equally; desktop resize-handle clearance is untouched.

Refined the FN-8015 invariant test to enforce the desktop hot-zone gutter
media-aware (strips @media blocks) and added a regression guard for the
mobile zeroing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 08:35:44 -07:00
gsxdsm
f27965d711 FN-8200: add Settings theme selector spacing
Add tokenized spacing below the Settings current-theme selector before Font Size.

- Scope the spacing to the Settings current-theme row without affecting compact dropdowns.
- Add a regression test for the established spacing token.
- Add a patch changeset for the Settings layout fix.

Files changed:
 .changeset/fn-8200-theme-selector-spacing.md                      | 6 ++++++
 packages/dashboard/app/components/ThemeDropdown.css               | 8 ++++++++
 .../dashboard/app/components/__tests__/ThemeDropdown.test.tsx     | 6 ++++++
 3 files changed, 20 insertions(+)

Fusion-Task-Id: FN-8200

Fusion-Task-Lineage: 6b72d0f7-759f-49aa-a8f9-f788cc9ec5c5

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 08:17:09 -07:00
gsxdsm
f866e68c6a FN-8199: sync translated README updates
Bring localized README feature and storage descriptions in line with the English documentation.

- Add PostgreSQL storage and documentation references across translations.
- Refresh model, task chat, theme, GitHub, dashboard, and model override descriptions.
- Align package storage terminology with the PostgreSQL migration.

Files changed:
 README.es.md    | 16 +++++++++-------
 README.fr.md    | 16 +++++++++-------
 README.ko.md    | 16 +++++++++-------
 README.zh-CN.md | 16 +++++++++-------
 README.zh-TW.md | 16 +++++++++-------
 5 files changed, 45 insertions(+), 35 deletions(-)

Fusion-Task-Id: FN-8199

Fusion-Task-Lineage: ba617549-e43e-4531-bdfe-4e79f94ffdae

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 01:29:30 -07:00
gsxdsm
7b540959c5 FN-8198: add Todo item task creation API
Add API endpoints that turn Todo lists and items into executable board tasks.

- Expose Todo list and item read endpoints with async store parity.
- Create tasks from Todo items with validation, project scoping, provenance, and workflow-default placement.
- Document the scripting flow and cover dashboard and PostgreSQL behavior.

Files changed:
 .changeset/fn-8198-todo-api.md                     |   7 +
 docs/todo-view.md                                  |  18 ++-
 .../src/__tests__/postgres/todo-store.pg.test.ts   |  13 ++
 packages/core/src/async-todo-store.ts              |  17 +++
 .../dashboard/src/__tests__/todo-routes.test.ts    | 157 ++++++++++++++++++++-
 packages/dashboard/src/todo-routes.ts              | 128 ++++++++++++++++-
 6 files changed, 335 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-8198

Fusion-Task-Lineage: f8d5032b-4844-43c9-97d1-3cc7d13d0ce1

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 01:23:32 -07:00
gsxdsm
a51cba0d69 FN-8197: move merge details to summary tab
Keep completed task merge metadata with its completion summary.

- Relocate the Merge Details card from Definition to the done-only Summary tab.
- Cover merge-detail states and Definition/mobile containment with dashboard tests.
- Document the Summary tab behavior and add a patch changeset.

Files changed:
 .changeset/fn-8197-merge-details-summary-tab.md    |  7 +++
 docs/dashboard-guide.md                            |  2 +-
 packages/dashboard/app/components/TaskDetailModal.tsx   |  4 +-
 packages/dashboard/app/components/TaskSummaryTab.tsx    |  9 +++
 packages/dashboard/app/components/__tests__/TaskDetailModal.responsive-and-dependencies.test.tsx | 49 ++++++++++------
 packages/dashboard/app/components/__tests__/TaskDetailModal.summary-tab.test.tsx | 65 ++++++++++++++++++++++
 6 files changed, 115 insertions(+), 21 deletions(-)

Fusion-Task-Id: FN-8197

Fusion-Task-Lineage: f4aac014-1e8d-4b8f-91f1-ba40ae879508

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 01:17:22 -07:00
gsxdsm
6183621ca3 FN-8196: add mobile footer stat tooltips
Make compact mobile executor footer statistics identifiable on tap.

- Add accessible tap targets and portaled tooltips for mobile footer statistics.
- Dismiss stat tooltips on repeat tap, outside interaction, Escape, scrolling, and viewport changes.
- Cover mobile behavior while preserving desktop and tablet inline labels.
- Document the interaction and add a patch changeset.

Files changed:
 .changeset/fn-8196-mobile-footer-stat-tooltips.md  |   7 +
 docs/dashboard-guide.md                            |   2 +
 .../dashboard/app/components/ExecutorStatusBar.css |  47 +++++-
 .../dashboard/app/components/ExecutorStatusBar.tsx | 166 +++++++++++++++++++--
 .../__tests__/ExecutorStatusBar.test.tsx           | 132 +++++++++++++++-
 5 files changed, 333 insertions(+), 21 deletions(-)

Fusion-Task-Id: FN-8196

Fusion-Task-Lineage: c566b614-739d-4538-85c5-a8ff62720f4d

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 01:12:08 -07:00
gsxdsm
7f175b036b FN-8195: label replan task status
Display the needs-replan task state with a clear localized operator-facing label.

- Map needs-replan status badges to Replan centrally.
- Add English i18n resources and generated resource typings.
- Cover the status-label mapping and add a patch changeset.

Files changed:
 .changeset/fn-8195-replan-badge.md                                | 7 +++++++
 .../dashboard/app/utils/__tests__/taskStatusBadgeLabel.test.ts    | 4 ++++
 packages/dashboard/app/utils/taskStatusBadgeLabel.ts              | 8 ++++++++
 packages/i18n/locales/en/app.json                                 | 2 ++
 packages/i18n/src/resources.d.ts                                  | 2 ++
 5 files changed, 23 insertions(+)

Fusion-Task-Id: FN-8195

Fusion-Task-Lineage: 7ad115b8-6405-426e-9201-bfa1258fff5e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 01:07:52 -07:00
gsxdsm
79b05c62ea FN-8190: apply heartbeat multipliers to agent health
Align dashboard health labels with project-resolved heartbeat cadence.

- Load the project heartbeat multiplier in agent list and detail views.
- Apply the effective cadence once when determining stale agents.
- Cover long-cadence and multiplier boundary health states.

Files changed:
 .../dashboard/app/components/AgentDetailView.tsx   | 19 ++++++++++++--
 .../dashboard/app/components/AgentListModal.tsx    | 19 ++++++++++++--
 packages/dashboard/app/components/AgentsView.tsx   |  2 +-
 .../__tests__/AgentDetailView.test-helpers.ts      |  3 +++
 .../components/__tests__/AgentListModal.test.tsx   | 27 ++++++++++++++++++++
 .../app/utils/__tests__/agentHealth.test.tsx       | 29 ++++++++++++++++++++++
 packages/dashboard/app/utils/agentHealth.tsx       | 25 ++++++++++++++++---
 7 files changed, 115 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-8190

Fusion-Task-Lineage: 1efcdc19-503a-4893-b277-f65e900a399b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 01:01:53 -07:00
gsxdsm
87ffb24fca FN-8194: align task detail inline controls
Align task-detail actions with Quick Add while preserving existing integrations.

- Add inline attachment and eligible GitHub tracking controls
- Replace the Oversight menu dots with an Eye icon and reorder metadata actions
- Cover action order, integration behavior, icon rendering, and mobile wrapping

Files changed:
 .changeset/fn-8194-task-detail-inline-controls.md  |  7 ++
 docs/dashboard-guide.md                            |  6 +-
 .../dashboard/app/components/TaskDetailModal.tsx   | 99 +++++++++++++++-------
 ...lModal.inline-editing-and-integrations.test.tsx | 80 ++++++++++++++++-
 .../TaskDetailModal.mock-coverage.test.ts          |  1 +
 .../TaskDetailModal.oversight-controls.test.tsx    | 19 +++++
 ...etailModal.responsive-and-dependencies.test.tsx |  5 +-
 .../__tests__/TaskDetailModal.test-helpers.ts      | 10 +--
 8 files changed, 187 insertions(+), 40 deletions(-)

Fusion-Task-Id: FN-8194

Fusion-Task-Lineage: 8de0e36f-b428-401c-98aa-35964c556a39

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 00:55:57 -07:00