Commit Graph

6688 Commits

Author SHA1 Message Date
gsxdsm
e43dffad52 FN-8434: preserve evolving running plans
Keep Planning Mode's running plan as an evolving work product alongside every interview question.

- Carry model-authored running-plan updates through question responses without ending the interview
- Merge partial plan updates with prior title, deliverables, dependencies, size, and priority
- Derive safe fallback summaries without turning interview questions into deliverables
- Cover running-plan persistence and document the contract

Files changed:
 .changeset/fn-8434-running-plan-content.md         |   7 +
 docs/dashboard-guide.md                            |   2 +-
 packages/core/src/types.ts                         |   6 +
 .../PlanningModeModal.planning-flow.test.tsx       |  11 +-
 .../__tests__/planning-e2e-plan-creation.test.ts   |  17 ++-
 .../__tests__/planning-infinite-interview.test.ts  |  91 +++++++++++-
 packages/dashboard/src/planning.ts                 | 163 ++++++++++++++-------
 7 files changed, 232 insertions(+), 65 deletions(-)

Fusion-Task-Id: FN-8434

Fusion-Task-Lineage: cdf1c4ff-fd33-4e4a-84f4-b54a5e0a9cf8

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 10:33:59 -07:00
gsxdsm
76822d8c4c FN-8432: document responsive Planning Mode navigation
Clarify and verify tablet tab navigation and mobile list-first Planning Mode behavior.

- Add tablet progressive-tab coverage across interview states.
- Assert mobile saved-session list-first navigation and plan visibility.
- Update mobile and dashboard guidance with the intentional session-selection flow.
- Add a patch changeset for the Planning Mode fix.

Files changed:
 .../fn-8432-planning-tablet-mobile-plan-layout.md  |  7 ++++
 MOBILE.md                                          |  2 +-
 docs/dashboard-guide.md                            |  2 +-
 .../PlanningModeModal.planning-flow.test.tsx       | 43 +++++++++++++++++++++-
 .../PlanningModeModal.ui-interactions.test.tsx     | 25 +++++++++++++
 5 files changed, 75 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-8432

Fusion-Task-Lineage: e412069e-87e2-4a61-9556-6908f86b56c5

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 10:07:44 -07:00
gsxdsm
087fd8f881 FN-8429: fix live activity snapshot metrics
Keep Live activity counts current and project-scoped rather than date-range derived.

- Exclude soft-deleted tasks from live board column totals
- Share SSE-refreshed live snapshots between Overview and Mission Control
- Count all in-progress aliases and current active sessions/runs
- Cover live refresh, date-range independence, and deleted-task behavior

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 .../command-center-remaining-analytics.pg.test.ts  | 12 ++-
 packages/core/src/command-center-live.ts           | 15 +++-
 .../components/command-center/CommandCenter.tsx    | 43 +++-------
 .../command-center/MissionControlPanel.tsx         | 46 +++++++----
 .../__tests__/CommandCenter.test.tsx               | 91 ++++++++++++++++++----
 .../command-center/liveSnapshotMetrics.ts          | 32 ++++++++
 7 files changed, 174 insertions(+), 67 deletions(-)

Fusion-Task-Id: FN-8429

Fusion-Task-Lineage: a29a92a1-1d27-4927-9e19-9c42e66a0674

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 09:57:38 -07:00
gsxdsm
bd558462ed FN-8427: restore mobile planning session navigation
Restore a full-pane saved-session destination for compact Planning Mode.

- Unmount the running-plan pane while mobile and tablet session lists are open.
- Keep Back and Sessions available from active, completed, and new planning surfaces.
- Cover compact navigation behavior and document the mobile interaction.

Files changed:
 .../fn-8427-planning-mobile-session-list-nav.md    |  7 ++
 MOBILE.md                                          |  2 +-
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/PlanningModeModal.css | 56 +++++++++++++++-
 .../dashboard/app/components/PlanningModeModal.tsx | 33 ++++++---
 .../__tests__/PlanningModeModal.css.test.ts        |  5 ++
 .../PlanningModeModal.ui-interactions.test.tsx     | 78 ++++++++++++++++++++++
 7 files changed, 167 insertions(+), 16 deletions(-)

Fusion-Task-Id: FN-8427
Fusion-Task-Lineage: 6664d075-0614-4b5a-ba36-34a0ec6a20a3
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 09:51:26 -07:00
gsxdsm
8d216e628c FN-8431: give report menu an opaque background
Make the report action menu render on a defined opaque surface.

- Replace undefined menu color and spacing tokens with defined design tokens.
- Add regression coverage for opaque menu surfaces and token availability.
- Add a patch changeset for the report menu fix.

Files changed:
 .changeset/fn-8431-report-menu-background.md       |  7 ++++
 .../dashboard/app/components/ReportActionMenu.css  | 40 ++++++++++++++++++++--
 .../components/__tests__/ReportActionMenu.test.tsx | 17 +++++++++
 3 files changed, 61 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-8431

Fusion-Task-Lineage: d300b5ae-272c-452d-932d-8efeee30a0d9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 09:46:22 -07:00
gsxdsm
b621f29747 FN-8428: add mailbox links to related work
Add direct mailbox navigation to related tasks and planning sessions.

- Extend mailbox message metadata with task and planning-session references.
- Render accessible related-work actions in mailbox views and avoid duplicate artifact task links.
- Route planning clarification actions to the associated Planning session and cover the flows with tests.

Files changed:
 packages/core/src/types/messages.ts                |  6 +++
 .../app/components/MailboxArtifactAttachment.tsx   |  5 +-
 packages/dashboard/app/components/MailboxModal.tsx | 15 ++++++
 .../app/components/MailboxRelatedWorkLink.tsx      | 63 ++++++++++++++++++++++
 packages/dashboard/app/components/MailboxView.tsx  | 15 ++++++
 .../app/components/__tests__/MailboxModal.test.tsx | 31 +++++++++++
 .../__tests__/MailboxRelatedWorkLink.test.tsx      | 54 +++++++++++++++++++
 .../app/components/__tests__/MailboxView.test.tsx  | 41 ++++++++++++--
 .../app/components/dashboard/MainContent.tsx       | 10 ++++
 .../MainContent.mailbox-view-task.test.tsx         | 13 +++++
 .../__tests__/planning-infinite-interview.test.ts  | 35 ++++++++++++
 packages/dashboard/src/planning.ts                 |  5 ++
 12 files changed, 288 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-8428

Fusion-Task-Lineage: d0c6bf0e-7fb4-4bff-8cb2-3c75045a43da

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 09:41:02 -07:00
gsxdsm
860533eff2 FN-8402: extract config, MCP, and Pi settings routes
Extract config, MCP, and Pi-settings handlers into a dedicated dashboard route registrar.

- Move seven configuration and MCP endpoint handlers out of the API-route orchestrator.
- Preserve registrar mount precedence and document the expanded route map.
- Add registrar coverage and update the inline-route modularity baseline.

Files changed:
 .../src/__tests__/mcp-documentation.test.ts        |   2 +-
 packages/dashboard/src/routes.ts                   | 303 +--------------------
 packages/dashboard/src/routes/README.md            |  84 +++---
 .../register-config-mcp-pi-settings-routes.test.ts |  61 +++++
 .../src/routes/create-api-routes-mount-sequence.ts |   2 +-
 .../register-config-mcp-pi-settings-routes.ts      | 275 +++++++++++++++++++
 scripts/lib/routes-modular-baseline.json           |   2 +-
 7 files changed, 385 insertions(+), 344 deletions(-)

Fusion-Task-Id: FN-8402

Fusion-Task-Lineage: f5f71f64-03cf-41cf-9fb2-33046b0c04bf

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 09:35:55 -07:00
gsxdsm
c279b8cefc FN-8347: add report capture regression coverage
Expand dashboard report tests across screenshot capture and activity-trace egress.

- Cover screenshot capture pending, failure, opt-out, and mobile modal behavior
- Verify bounded activity traces and recursive privacy scrubbing across report routes
- Exercise screenshot artifact references through draft, duplicate, and filing paths

Files changed:
 .../app/components/__tests__/ReportModal.test.tsx  | 46 ++++++++++++
 .../app/utils/__tests__/activity-trace.test.ts     | 32 +++++++++
 .../src/__tests__/report-pipeline.test.ts          | 83 +++++++++++++++++++++-
 .../dashboard/src/__tests__/report-routes.test.ts  | 35 ++++++++-
 .../dashboard/src/__tests__/report-scrub.test.ts   | 19 ++++-
 5 files changed, 208 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-8347
Fusion-Task-Lineage: 5323fdcb-01c3-48aa-beb9-ecd4651e981a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 09:28:27 -07:00
gsxdsm
8993e912d2 FN-8426: adapt Planning Mode for compact layouts
Make Planning Mode usable on mobile, tablet, and short-height layouts.

- Collapse compact Planning interviews into selectable question, plan, and history surfaces.
- Keep Sessions navigation synchronized so returning from the session list restores a visible interview pane.
- Document and test mobile, tablet, and short-landscape behavior.

Files changed:
 .../fn-8426-planning-mobile-tablet-layout.md       |  7 ++
 MOBILE.md                                          |  2 +-
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/PlanningModeModal.css | 94 ++++++++++++++++++++--
 .../dashboard/app/components/PlanningModeModal.tsx | 51 +++++++++++-
 .../__tests__/PlanningModeModal.css.test.ts        | 17 ++++
 .../PlanningModeModal.planning-flow.test.tsx       | 36 +++++++++
 .../__tests__/PlanningModeModal.test-helpers.ts    | 23 ++++++
 8 files changed, 220 insertions(+), 12 deletions(-)

Fusion-Task-Id: FN-8426

Fusion-Task-Lineage: 489d6f92-326c-4780-bc85-d28967c7ab35

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 09:16:12 -07:00
Phil Larson
c1bc95c1db fix(dashboard): honor forced GraphQL transport (#2353)
## Summary
- honor `forceMode` for GraphQL queries and mutations
- keep token-backed Discussion operations on the selected token
transport even when `gh` is authenticated
- add regression coverage for forced-token category lookup, errors, and
Discussion creation

## Test plan
- `CI=true pnpm --filter @fusion/dashboard exec vitest run
src/__tests__/github-discussions.test.ts
src/__tests__/github-forced-mode.test.ts
src/__tests__/github-pr-threads.test.ts`
- `CI=true pnpm build`


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

* **Bug Fixes**
* GitHub Discussions GraphQL operations now consistently honor the
selected transport/authentication mode.
* Forced token-based transport correctly applies to discussion queries
and mutations (including discussion creation).
* Missing required authentication is now reported instead of falling
back to an unauthenticated path.
* **Tests**
* Added a test covering discussion creation using forced token-based
GraphQL transport.
* **Release**
  * Shipped as a patch release of the Fusion library.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-20 08:49:28 -07:00
gsxdsm
8166c80bad FN-8420: keep Planning Mode interviews open until validation
Keep the Planning Mode workspace active until the operator explicitly validates its running plan.

- Preserve the answered-question, current-question, and running-plan panes through stream updates and recoverable states.
- Require durable validation before exposing terminal summaries and task creation actions.
- Make every answer request one new high-impact question and update Planning Mode guidance, coverage, and release notes.

Files changed:
 .../fn-8420-planning-mode-user-validation.md       |   7 +
 docs/dashboard-guide.md                            |   6 +-
 docs/settings-reference.md                         |   2 +-
 .../dashboard/app/components/PlanningModeModal.tsx | 163 +++++++++++++--------
 .../__tests__/PlanningModeModal.initial.test.tsx   |  20 ++-
 .../PlanningModeModal.planning-flow.test.tsx       |  99 +++++++++----
 .../PlanningModeModal.ui-interactions.test.tsx     |  14 ++
 .../app/planning-browser-e2e-fixture.html          |   5 +
 .../dashboard/app/planning-browser-e2e-fixture.tsx | 131 +++++++++++++++++
 .../src/__tests__/planning-browser-e2e.test.ts     | 115 +++++++++++++++
 .../__tests__/planning-infinite-interview.test.ts  |   2 +
 .../planning-interview-formatters.test.ts          |   8 +
 packages/dashboard/src/planning.ts                 |  16 +-
 13 files changed, 485 insertions(+), 103 deletions(-)

Fusion-Task-Id: FN-8420

Fusion-Task-Lineage: af88729b-98c1-4141-bad3-a17ddb497181

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 02:01:58 -07:00
gsxdsm
02f8bffb2e FN-8423: suppress duplicate task agent badges
Avoid redundant creator badges when a task is assigned to its creating agent.

- Compare assigned and source agents by ID, with normalized names as a fallback
- Preserve both badges for distinct agent identities and cover badge behavior with regression tests
- Add a patch changeset for the TaskCard fix

Files changed:
 .changeset/fn-8423-duplicate-agent-badge.md        |  7 ++
 packages/dashboard/app/components/TaskCard.tsx     | 40 +++++++++++-
 .../app/components/__tests__/TaskCard.test.tsx     | 74 +++++++++++++++++++++-
 3 files changed, 119 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8423

Fusion-Task-Lineage: 2fb020c9-43e5-485e-80a9-1b723ee63ae8

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 01:12:34 -07:00
gsxdsm
57636226b1 FN-8421: align tablet task modal control heights
Align Task Detail action controls and Planner Chat composer heights across tablet and desktop.

- Apply shared compact-height classes to inline Task Detail actions
- Use Quick Add control-height tokens and remove conflicting button padding
- Size Planner Chat Send and Stop controls to match the composer
- Add dashboard regression coverage and a patch changeset

Files changed:
 .../fn-8421-task-detail-tablet-control-heights.md  |  7 ++++++
 .../dashboard/app/components/TaskDetailModal.css   | 18 ++++++++++++---
 .../dashboard/app/components/TaskDetailModal.tsx   | 11 ++++++---
 .../app/components/TaskPlannerChatTab.css          | 10 ++++++++
 .../__tests__/TaskDetailModal.rendering.test.tsx   |  8 +++++++
 ...etailModal.responsive-and-dependencies.test.tsx | 13 +++++++++++
 .../__tests__/TaskPlannerChatTab.test.tsx          | 27 ++++++++++++++++++++++
 7 files changed, 88 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-8421

Fusion-Task-Lineage: 151795c8-4c00-4976-8901-9446557fc1a3

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 01:00:37 -07:00
gsxdsm
2c1567c6b8 FN-8418: add WhatsApp QR pairing settings
Add WhatsApp connection pairing guidance directly in plugin settings.

- Display a QR code and phone pairing instructions for WhatsApp Chat connections.
- Expose connection details through the plugin and document the setup flow.
- Add dashboard and plugin regression coverage plus a release changeset.

Files changed:
 .changeset/fn-8418-whatsapp-settings-pairing.md    |   7 +
 docs/plugin-management.md                          |   2 +-
 .../dashboard/app/components/PluginManager.tsx     |   4 +
 .../app/components/WhatsAppChatPairingPanel.css    | 115 ++++++++++++++
 .../app/components/WhatsAppChatPairingPanel.tsx    | 165 +++++++++++++++++++++
 .../components/__tests__/PluginManager.test.tsx    |  21 +++
 .../__tests__/WhatsAppChatPairingPanel.test.tsx    |  78 ++++++++++
 plugins/fusion-plugin-whatsapp-chat/README.md      |  19 +--
 .../src/__tests__/connection.test.ts               |  16 +-
 .../src/__tests__/index.test.ts                    |  33 +++++
 .../fusion-plugin-whatsapp-chat/src/connection.ts  |  21 ++-
 plugins/fusion-plugin-whatsapp-chat/src/index.ts   |  15 +-
 12 files changed, 479 insertions(+), 17 deletions(-)

Fusion-Task-Id: FN-8418

Fusion-Task-Lineage: a16b7d25-422d-4612-83d4-d5ac9c049aec

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 00:54:01 -07:00
gsxdsm
e1dddcbfae FN-8404: extract dashboard domain route registrars
Move maintenance, AI text assistant, and setup/activity endpoints into focused dashboard route registrars.

- Register the extracted domains in the API mount sequence.
- Preserve route precedence and document registrar responsibilities.
- Add registrar coverage and refresh the modular-route baseline.

Files changed:
 packages/dashboard/src/routes.ts                   | 948 +--------------------
 packages/dashboard/src/routes/README.md            |  82 +-
 .../register-ai-text-assistant-routes.test.ts      |  49 ++
 .../register-setup-activity-routes.test.ts         |  54 ++
 .../register-system-maintenance-routes.test.ts     |  48 ++
 .../src/routes/create-api-routes-mount-sequence.ts |   8 +-
 .../routes/register-ai-text-assistant-routes.ts    | 327 +++++++
 .../src/routes/register-setup-activity-routes.ts   | 320 +++++++
 .../routes/register-system-maintenance-routes.ts   | 320 +++++++
 scripts/lib/routes-modular-baseline.json           |   2 +-
 10 files changed, 1176 insertions(+), 982 deletions(-)

Fusion-Task-Id: FN-8404

Fusion-Task-Lineage: d6b5be1f-e011-47fc-a7f8-5df89893766f

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 00:46:14 -07:00
gsxdsm
e22c65ad11 FN-8397: separate pinned chats and retain failed edits
Separate direct-chat session groups and make message edits safely retryable.

- Render explicit Pinned and Recent sections across desktop and mobile chat lists.
- Keep inline message corrections open until edit-and-resend succeeds in Direct and Planner Chat.
- Add localized Recent labels, documentation, release metadata, and regression coverage.

Files changed:
 .changeset/fn-8397-chat-pin-separation-and-edit-save.md   |  7 +++
 docs/dashboard-guide.md                                    |  5 +-
 packages/dashboard/app/components/ChatView.css             | 10 ++++
 packages/dashboard/app/components/ChatView.tsx             | 31 ++++++++---
 packages/dashboard/app/components/StandardChatSurface.tsx  | 35 +++++++++----
 packages/dashboard/app/components/TaskPlannerChatTab.tsx   | 14 +++--
 packages/dashboard/app/components/__tests__/ChatView.core-contracts.test.tsx | 46 +++++++++++++++++
 packages/dashboard/app/components/__tests__/ChatView.message-edit.test.tsx | 60 ++++++++++++++++++++--
 packages/dashboard/app/components/__tests__/TaskPlannerChatTab.test.tsx | 10 ++--
 packages/dashboard/app/hooks/__tests__/useChat.test.ts     |  4 +-
 packages/dashboard/app/hooks/useChat.ts                    | 13 +++--
 packages/i18n/locales/{en,es,fr,ko,zh-CN,zh-TW}/app.json  |  6 +++
 17 files changed, 205 insertions(+), 36 deletions(-)

Fusion-Task-Id: FN-8397

Fusion-Task-Lineage: 4dbc664a-56a3-48c7-be9a-febd5f411c9e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 00:42:15 -07:00
Phil Larson
cb1acc1590 test(dashboard): configure Discussion screenshot fixture (#2354)
## Summary
- configure the screenshot pipeline's Discussion fixture with a valid
selected category
- provide category discovery in the fake client so Feedback and Help
exercise screenshot upload/embedding instead of returning an
availability error

## Test plan
- `CI=true pnpm --filter @fusion/dashboard exec vitest run
src/__tests__/report-pipeline-screenshots.test.ts`


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

## Summary by CodeRabbit

* **Tests**
* Updated dashboard report-pipeline screenshot test coverage to support
general discussion categories.
* Enhanced the test environment to provide a mocked general discussion
category.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-20 00:19:12 -07:00
gsxdsm
b63ebe8fdb FN-8417: verify GitHub translation cache reuse
Add route-level coverage for durable GitHub import translation reuse.\n\n- Mock translation and rate-limit services at the GitHub route boundary\n- Verify identical auto-translate requests return cached results without further model or rate-limit cost\n- Confirm cached translations are recorded once\n\nFiles changed:\n .../dashboard/src/__tests__/routes-github.test.ts  | 80 ++++++++++++++++++++++\n 1 file changed, 80 insertions(+)

Fusion-Task-Id: FN-8417

Fusion-Task-Lineage: 685d753a-d711-4625-809b-14921ce14b6b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 23:28:17 -07:00
gsxdsm
2fe1b996bf FN-8400: rework Planning Mode into a guided three-pane flow
Make planning interviews easier to navigate while keeping the evolving plan and validation actions accessible.

- Show answered questions in an editable navigation pane and keep one clear next-question action.
- Keep the generated plan and validation controls visible throughout planning and recovery.
- Add server validation and localized copy for session title updates.

Files changed:
 .changeset/fn-8400-planning-mode-ui.md             |   7 +
 MOBILE.md                                          |   2 +-
 docs/dashboard-guide.md                            |   6 +-
 packages/dashboard/app/api/legacy.ts               |  12 +-
 .../dashboard/app/components/PlanningModeModal.css | 112 +++--
 .../dashboard/app/components/PlanningModeModal.tsx | 408 +++++++++++--------
 .../PlanningModeModal.planning-flow.test.tsx       | 453 ++++++++-------------
 .../PlanningModeModal.ui-interactions.test.tsx     |   4 +-
 .../src/__tests__/routes-planning.test.ts          |  50 +++
 packages/dashboard/src/planning.ts                 |  21 +-
 .../src/routes/register-planning-subtask-routes.ts |  26 ++
 packages/i18n/locales/en/app.json                  |   7 +-
 packages/i18n/locales/es/app.json                  |   7 +-
 packages/i18n/locales/fr/app.json                  |   7 +-
 packages/i18n/locales/ko/app.json                  |   7 +-
 packages/i18n/locales/zh-CN/app.json               |   7 +-
 packages/i18n/locales/zh-TW/app.json               |   7 +-
 packages/i18n/src/resources.d.ts                   |   5 +
 18 files changed, 620 insertions(+), 528 deletions(-)

Fusion-Task-Id: FN-8400
Fusion-Task-Lineage: 032cf0ad-134d-4680-878f-b870eea23cc9
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 23:01:44 -07:00
gsxdsm
d4a87accb8 FN-8395: autosave settings changes
Settings edits now persist automatically with safe feedback and close handling.

- Debounce and serialize settings persistence, retaining newer edits through in-flight saves and unmounts.
- Remove the Settings Save action and unsaved-changes prompt while flushing pending section and workflow-lane updates.
- Update Settings documentation, release metadata, and regression coverage for auto-save behavior.

Files changed:
 .changeset/fn-8395-settings-autosave.md            |   7 +
 docs/dashboard-guide.md                            |  11 +-
 docs/settings-reference.md                         |   8 +-
 .../dashboard/app/components/SettingsModal.tsx     | 402 ++++++++++++++++-----
 .../__tests__/SettingsModal.general.test.tsx       | 154 ++++++--
 .../SettingsModal.keyboardShortcuts.test.tsx       |   7 +-
 .../__tests__/SettingsModal.models-auth.test.tsx   |  46 +--
 .../SettingsModal.remote-notifications.test.tsx    |  38 +-
 .../SettingsModal.scheduling-merge.test.tsx        |  58 ++-
 .../__tests__/SettingsModal.test-harness.tsx       |   9 +-
 .../__tests__/SettingsModalNodeRouting.test.tsx    |   2 -
 .../settings/sections/ProjectModelsSection.tsx     |  15 +-
 12 files changed, 548 insertions(+), 209 deletions(-)

Fusion-Task-Id: FN-8395

Fusion-Task-Lineage: 77f4c0d3-d0cc-4973-9831-c70eb2a2b49b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 22:16:11 -07:00
gsxdsm
9e962bb670 FN-8415: scrub report file activity traces
Scrub file-report activity traces before report pipeline processing.

- Sanitize top-level and nested activity traces before parsing report input.
- Add regressions for trace scrubbing and absent-trace behavior.
- Document the report filing scrub boundary and add a security changeset.

Files changed:
 .changeset/fn-8415-report-file-activity-trace-scrub.md    |  7 +++++
 docs/dashboard-guide.md                            |  2 +-
 packages/dashboard/src/__tests__/report-routes.test.ts  | 35 ++++++++++++++++++++++
 packages/dashboard/src/routes/register-report-routes.ts | 16 ++++++++--
 4 files changed, 56 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-8415

Fusion-Task-Lineage: 90e42370-1682-42fc-bd53-61bb23da84a8

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 21:27:25 -07:00
gsxdsm
8d5c3b0811 FN-8414: fix mission interview thinking-level binding
Fix mission interviews that omit a thinking level while preserving project and plugin bindings.

- Remove the ambiguous session positional overload.
- Resolve omitted thinking levels from planning settings and display the configured default.
- Cover omitted and explicit thinking-level session starts with regression tests.
- Add a patch changeset for the crash fix.

Files changed:
 ...n-8414-mission-interview-thinking-level-bind.md |   7 ++
 .../app/components/MissionInterviewModal.tsx       |  25 ++++-
 .../__tests__/MissionInterviewModal.test.tsx       |  13 +++
 .../mission-interview-thinking-level-bind.test.ts  | 108 +++++++++++++++++++++
 packages/dashboard/src/mission-interview.ts        |  19 ++--
 packages/dashboard/src/mission-routes.ts           |  21 +++-
 6 files changed, 178 insertions(+), 15 deletions(-)

Fusion-Task-Id: FN-8414

Fusion-Task-Lineage: d3be2cd6-9221-4e1d-a27a-c5fbe04f9200

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 21:04:43 -07:00
gsxdsm
a11f789b0c FN-8327: fall back to issues when Discussions are disabled
Reports can select a Discussion category and reliably file to Issues when Discussions are unavailable.

- Add Discussion-disabled detection across GitHub GraphQL operations.
- Let report submission select a category and disclose the actual filing destination.
- Preserve duplicate handling and document the fallback behavior.

Files changed:
 .changeset/fn-8327-discussion-fallback.md          |  7 +++
 docs/dashboard-guide.md                            |  4 +-
 packages/dashboard/app/api/report.ts               | 22 +++++--
 packages/dashboard/app/components/ReportModal.tsx  |  7 ++-
 .../app/components/__tests__/ReportModal.test.tsx  | 13 ++++
 .../src/__tests__/github-discussions.test.ts       | 29 +++++++--
 .../src/__tests__/report-pipeline.test.ts          | 63 ++++++++++++++-----
 .../dashboard/src/__tests__/report-routes.test.ts  | 15 +++--
 packages/dashboard/src/github.ts                   | 71 ++++++++++++++++------
 packages/dashboard/src/report-pipeline.ts          | 54 +++++++++++-----
 .../dashboard/src/routes/register-report-routes.ts | 12 +++-
 11 files changed, 227 insertions(+), 70 deletions(-)

Fusion-Task-Id: FN-8327

Fusion-Task-Lineage: 510d3d4f-ffc9-4167-bee8-7043e0ddbd9c

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 20:42:05 -07:00
gsxdsm
f6c788dee4 FN-8409: enable coding tools for dashboard chat agents
Enable interactive dashboard chat sessions to use the project coding workspace safely.

- Share the coding tool mode across direct, room, and planner chat sessions.
- Document branch-sticky workspace behavior and durable-agent policy gates.
- Cover coding tool access and prompt guidance with chat tests.
- Add a minor changeset for the published Fusion package.

Files changed:
 .changeset/fn-8409-chat-coding-tools.md            |  7 +++++
 docs/agents.md                                     |  6 +++++
 docs/dashboard-guide.md                            |  2 ++
 .../dashboard/src/__tests__/chat-manager.test.ts   | 31 +++++++++++++++-------
 .../src/__tests__/chat-system-prompt.test.ts       | 11 ++++++++
 packages/dashboard/src/chat.ts                     | 12 ++++++---
 6 files changed, 56 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-8409

Fusion-Task-Lineage: ca88794d-a5cf-4852-a931-90f61e3751df

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 20:36:27 -07:00
gsxdsm
237d9be05f fix(dashboard): de-emphasize empty verification status 2026-07-19 19:02:21 -07:00
gsxdsm
5c67b19cb2 FN-8394: rescue deterministic quarantined tests
Restore reliable test coverage and delete quarantined tests that could not be rescued.

- Replace process- and database-dependent tests with bounded dependency seams
- Restore stabilized CLI, dashboard, and plugin test coverage
- Remove unrescuable bundle and merge-worktree test suites and clear the quarantine ledger

Files changed:
 packages/cli/src/__tests__/bundle-output.test.ts   | 519 ------------
 .../src/commands/__tests__/task-lock-retry.test.ts |  10 +
 packages/cli/vitest.config.ts                      |   8 -
 .../TaskDetailModal.tab-persistence.test.tsx       |   2 +-
 .../__tests__/TaskDetailModal.test-helpers.ts      |   7 +
 .../src/__tests__/dev-server-process.test.ts       | 391 ++++-----
 packages/dashboard/src/dev-server-process.ts       |  22 +-
 packages/dashboard/vitest.config.ts                |  21 +-
 .../merge-reuse-task-worktree.slow.test.ts         | 876 ---------------------
 packages/engine/vitest.config.ts                   |   7 -
 .../src/__tests__/process-lifecycle.test.ts        |  21 +-
 .../fusion-plugin-grok-runtime/vitest.config.ts    |   2 -
 .../src/__tests__/async-quality-store.pg.test.ts   | 148 +++-
 plugins/fusion-plugin-quality/vitest.config.ts     |   3 +-
 scripts/lib/test-quarantine.json                   |  43 +-
 15 files changed, 323 insertions(+), 1757 deletions(-)

Fusion-Task-Id: FN-8394

Fusion-Task-Lineage: e949b33e-b8d5-4f73-a002-e550b97ee125

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 18:59:36 -07:00
gsxdsm
90b9feb7ae fix: prevent false PostgreSQL corruption alerts (#2352)
## Summary

PostgreSQL runtime roles without `CREATE` permission on `public` no
longer trigger schema writes during migration-marker health reads, so
`permission denied for schema public` is not mislabeled as database
corruption. Once connectivity and task-ID integrity pass, an unavailable
migration marker is treated as advisory instead of making the whole
database unhealthy. Dashboard and notification guidance now describes a
PostgreSQL health failure accurately and renders actionable log and
recovery links in every supported locale.

## Validation

- 54 targeted tests passed across core, dashboard, engine, and i18n.
- Typechecks passed for all four affected packages.
- Scoped ESLint, strict changeset validation, and diff checks passed.

---

[![Compound
Engineering](https://img.shields.io/badge/Built_with-Compound_Engineering-6366f1)](https://github.com/EveryInc/compound-engineering-plugin)


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

* **Bug Fixes**
* PostgreSQL health failures are now reported as degraded health checks
rather than database corruption.
* Migration-status lookup failures no longer incorrectly mark an
otherwise healthy database as unhealthy.
* Migration-state checks are now read-only and avoid creating or
modifying database structures.

* **UI & Localization**
* Updated database health banner messaging and recovery guidance across
supported languages.
* The banner now appears for broader PostgreSQL health failures and
links to storage documentation.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-19 18:59:28 -07:00
gsxdsm
4ad7c241a6 FN-8408: preserve chronological chat message order
Keep direct-chat transcripts chronologically ordered through mid-generation reloads and SSE updates.

- Normalize cached, API, optimistic, and SSE message merges by timestamp and ID.
- Add coverage for returning to an active generation with persisted user echoes.

Files changed:
 packages/dashboard/app/hooks/__tests__/useChat.test.ts  | 100 +++++++++++++++++++--
 packages/dashboard/app/hooks/useChat.ts                  |  49 ++++++----
 2 files changed, 128 insertions(+), 21 deletions(-)

Fusion-Task-Id: FN-8408

Fusion-Task-Lineage: 92775a15-d3c3-4caf-8923-00127606ac3b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 18:51:05 -07:00
gsxdsm
64c1193d1e FN-8333: embed report screenshots in GitHub filings
Enable opt-in report screenshots to be safely hosted and embedded in filed GitHub reports.

- add GitHub Contents API image upload support and CLI-safe payload handling
- validate and resolve report screenshot artifacts before best-effort Markdown embedding
- cover upload, media access, filing, and report modal behavior with tests

Files changed:
 .changeset/github-report-screenshot-embed.md       |  7 +++
 docs/dashboard-guide.md                            |  4 +-
 packages/core/src/__tests__/gh-cli-input.test.ts   | 32 ++++++++++
 packages/core/src/gh-cli.ts                        | 21 ++++++-
 .../app/components/__tests__/ReportModal.test.tsx  |  5 ++
 .../dashboard/src/__tests__/artifact-media.test.ts | 20 ++++++
 .../__tests__/github-upload-image-asset.test.ts    | 39 ++++++++++++
 .../__tests__/report-pipeline-screenshots.test.ts  | 67 ++++++++++++++++++++
 .../dashboard/src/__tests__/report-routes.test.ts  | 36 ++++++++++-
 packages/dashboard/src/artifact-media.ts           | 32 ++++++++++
 packages/dashboard/src/github.ts                   | 57 +++++++++++++++++
 packages/dashboard/src/issue-image-attachments.ts  |  6 +-
 packages/dashboard/src/report-pipeline.ts          | 72 ++++++++++++++++++----
 .../dashboard/src/routes/register-report-routes.ts | 29 ++++++---
 .../src/routes/register-task-workflow-routes.ts    | 24 +-------
 15 files changed, 401 insertions(+), 50 deletions(-)

Fusion-Task-Id: FN-8333

Fusion-Task-Lineage: b706810d-2fec-4053-b57a-1128e5c16e94

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 18:45:27 -07:00
gsxdsm
18f1cb743a FN-8308: add selectable GitHub Discussions report targets
Enable configurable GitHub Issue or Discussion destinations for in-app reports.

- Add report target and Discussion category settings with localized controls.
- Validate target overrides before Help shortcuts and route them through report filing.
- Discover and validate GitHub Discussion categories through GraphQL.
- Cover target validation on both draft and file routes.

Files changed:
 .changeset/fn-8308-report-discussions.md           |  7 +++
 docs/dashboard-guide.md                            |  7 +++
 .../core/src/__tests__/settings-parity.test.ts     |  9 +++
 packages/core/src/index.gate.ts                    |  2 +-
 packages/core/src/index.ts                         |  2 +-
 packages/core/src/settings-schema.ts               |  4 ++
 packages/core/src/types.ts                         | 10 ++++
 packages/dashboard/app/api/report.ts               | 13 +++-
 packages/dashboard/app/components/ReportModal.tsx  |  9 ++-
 .../__tests__/SettingsModal.general.test.tsx       | 18 ++++++
 .../settings/sections/GeneralSection.tsx           | 16 ++++-
 .../src/__tests__/github-discussions.test.ts       | 44 ++++++++++++++
 .../src/__tests__/report-pipeline.test.ts          | 70 +++++++++++++++++++++-
 .../dashboard/src/__tests__/report-routes.test.ts  | 19 ++++++
 packages/dashboard/src/github.ts                   | 37 ++++++++++--
 packages/dashboard/src/index.ts                    |  4 +-
 packages/dashboard/src/report-pipeline.ts          | 41 +++++++++----
 .../dashboard/src/routes/register-report-routes.ts | 32 ++++++++--
 packages/i18n/locales/en/app.json                  | 26 +++++++-
 packages/i18n/locales/es/app.json                  | 26 +++++++-
 packages/i18n/locales/fr/app.json                  | 26 +++++++-
 packages/i18n/locales/ko/app.json                  | 26 +++++++-
 packages/i18n/locales/zh-CN/app.json               | 26 +++++++-
 packages/i18n/locales/zh-TW/app.json               | 26 +++++++-
 24 files changed, 453 insertions(+), 47 deletions(-)

Fusion-Task-Id: FN-8308

Fusion-Task-Lineage: f5ac1b67-ecbc-4765-88c7-c524c7e943bf

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 18:37:45 -07:00
gsxdsm
48ff33e515 FN-8398: show enabled Compound Engineering navigation
Expose installed, enabled Compound Engineering views consistently across dashboard navigation.

- Refresh plugin dashboard views when plugin lifecycle events arrive.
- Scope dashboard-view discovery to the active project loader.
- Cover desktop, header, mobile, hook, and route behavior.

Files changed:
 .changeset/fn-8398-compound-engineering-nav.md     |  7 +++
 .../app/components/__tests__/Header.test.tsx       | 29 +++++++++
 .../components/__tests__/LeftSidebarNav.test.tsx   | 27 ++++++++-
 .../app/components/__tests__/MobileNavBar.test.tsx | 21 +++++++
 .../__tests__/usePluginDashboardViews.test.ts      | 69 ++++++++++++++++++++++
 .../dashboard/app/hooks/usePluginDashboardViews.ts | 20 +++++++
 .../dashboard/src/__tests__/routes-system.test.ts  | 44 ++++++++++++++
 .../src/routes/register-plugins-automation.ts      | 13 +++-
 8 files changed, 225 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-8398

Fusion-Task-Lineage: ffcfe801-6fcf-47a9-857a-78668ecc7246

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 18:00:47 -07:00
gsxdsm
365874f7f9 FN-8406: consolidate Command Center report actions
Move the guided report flow to System while ensuring its menu reliably overlays dashboard content.

- Portal the shared ReportActionMenu with a defined dropdown/modal stacking scale.
- Make System the sole Command Center report home and retain Copy diagnostics as a local action.
- Update regression coverage, documentation, and the published package changeset.

Files changed:
 .changeset/fn-8406-report-home-zindex.md           |   7 ++
 docs/dashboard-guide.md                            |   4 +-
 .../dashboard/app/components/ReportActionMenu.css  |   5 +-
 .../dashboard/app/components/ReportActionMenu.tsx  |  72 ++++++++++++-
 .../components/__tests__/ReportActionMenu.test.tsx |  12 +++
 .../components/command-center/CommandCenter.css    |  32 ------
 .../components/command-center/CommandCenter.tsx    |  59 ++++-------
 .../__tests__/CommandCenter.test.tsx               |   8 +-
 .../__tests__/SystemControlsArea.test.tsx          |  94 +----------------
 .../command-center/areas/SystemControlsArea.tsx    | 112 ++++-----------------
 packages/dashboard/app/styles.css                  |  11 ++
 11 files changed, 144 insertions(+), 272 deletions(-)

Fusion-Task-Id: FN-8406

Fusion-Task-Lineage: 957a77b0-fb04-4024-9506-225fec562f5d

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 17:39:43 -07:00
gsxdsm
bfdd16b90a FN-8407: keep mailbox header actions inline on mobile
Keep Mailbox title and header actions on one compact mobile row.

- Align the mobile title, unread badge, and action controls inline with safe text truncation.
- Cover the mobile layout rules and 320px browser geometry across mailbox states.

Files changed:
 packages/dashboard/app/components/MailboxModal.css | 30 ++++++----
 .../app/components/__tests__/MailboxView.test.tsx  | 10 +++-
 .../dashboard/scripts/browser-layout-smoke.mjs     | 67 ++++++++++++++++++++++
 3 files changed, 94 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-8407

Fusion-Task-Lineage: 742d2043-6093-4fe9-a27e-029572218e42

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 17:31:37 -07:00
gsxdsm
b07f207b00 FN-8403: extract automation and plugin route registrars
Move automation and plugin HTTP handlers out of the routes aggregator into focused domain modules.

- Extract live automation streaming and step-execution helpers
- Register automation, routine, webhook, and plugin handlers through the domain registrar
- Document plugin route ordering and update modular-route baselines

Files changed:
 packages/dashboard/src/routes.ts                   | 2779 ++------------------
 packages/dashboard/src/routes/README.md            |    3 +-
 .../dashboard/src/routes/automation-live-run.ts    |  322 +++
 .../src/routes/automation-step-execution.ts        |  445 ++++
 .../src/routes/plugin-bundled-runtimes.ts          |   88 +
 .../src/routes/register-plugins-automation.ts      | 1540 ++++++++++-
 scripts/lib/routes-modular-baseline.json           |    2 +-
 scripts/line-count-baseline.json                   |    2 +-
 8 files changed, 2604 insertions(+), 2577 deletions(-)

Fusion-Task-Id: FN-8403

Fusion-Task-Lineage: 2072d39b-6335-4163-a56a-7d418edc9095

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 17:25:02 -07:00
gsxdsm
e4a032d9d9 FN-8399: expose incomplete migration status on dashboard
Expose durable SQLite-to-PostgreSQL migration state through dashboard health and banners.

- Read per-project running and failed migration markers from PostgreSQL
- Surface degraded migration state in health endpoints and dashboard banners
- Preserve migration context across CLI and runtime startup paths
- Document the recovery workflow and add a patch changeset

Files changed:
 .changeset/FN-8399-migration-status-dashboard.md   |  7 +++
 docs/storage.md                                    |  5 ++
 packages/cli/src/commands/daemon.ts                | 19 +++++++
 packages/cli/src/commands/desktop.ts               |  6 +++
 packages/cli/src/commands/serve.ts                 | 20 +++++++-
 packages/core/src/index.ts                         |  2 +
 packages/core/src/postgres/index.ts                |  2 +
 packages/core/src/postgres/sqlite-migrator.ts      | 43 ++++++++++++++++
 packages/dashboard/app/api/health.ts               |  7 ++-
 .../app/components/dashboard/DashboardBanners.tsx  | 18 ++++++-
 .../dashboard/__tests__/DashboardBanners.test.tsx  | 12 ++++-
 .../__tests__/dashboard-postgres-health.test.ts    | 45 +++++++++++++++++
 .../dashboard/src/dashboard-postgres-health.ts     | 58 ++++++++++++++++++++++
 packages/dashboard/src/server.ts                   | 27 ++++++++--
 packages/engine/src/project-engine-manager.ts      |  4 ++
 packages/engine/src/project-runtime.ts             |  9 +++-
 packages/engine/src/runtimes/in-process-runtime.ts |  1 +
 17 files changed, 275 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-8399

Fusion-Task-Lineage: e196d6c4-ea9a-48ba-bedc-9e6fa44c33d3

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 16:52:02 -07:00
gsxdsm
a9c7a6bcc0 FN-8371: store report screenshot artifacts
Store opted-in report screenshots as validated local artifacts rather than GitHub attachments.

- Add multipart report attachment upload with PNG/JPEG validation and provenance metadata.
- Carry validated artifact references through report drafts and filing flows without binary egress.
- Update report UI, tests, documentation, and release metadata.

Files changed:
 .changeset/report-screenshot-artifacts.md          |   7 +
 docs/dashboard-guide.md                            |   2 +-
 packages/core/src/index.gate.ts                    |   2 +-
 packages/core/src/index.ts                         |   2 +-
 packages/core/src/types.ts                         |   7 +
 packages/dashboard/app/api/report.ts               |  14 +-
 packages/dashboard/app/components/ReportModal.css  |   3 +-
 packages/dashboard/app/components/ReportModal.tsx  |  41 ++---
 .../app/components/__tests__/ReportModal.test.tsx  |  58 +++++--
 packages/dashboard/app/utils/report-capture.ts     |  47 ++----
 .../src/__tests__/report-pipeline.test.ts          |  94 ------------
 .../dashboard/src/__tests__/report-routes.test.ts  | 123 +++++++++++----
 packages/dashboard/src/report-pipeline.ts          | 128 +++-------------
 .../dashboard/src/routes/register-report-routes.ts | 169 +++++++--------------
 14 files changed, 279 insertions(+), 418 deletions(-)

Fusion-Task-Id: FN-8371

Fusion-Task-Lineage: 48d0e94d-602f-43e2-a63f-cb497221ac29

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 16:44:40 -07:00
gsxdsm
e04608d62c FN-8396: fix task detail inline icon sizing
Normalize Task Detail inline action icons across every responsive breakpoint.

- Apply scoped tokenized SVG sizing that includes wrapped provider icons.
- Add source and browser-layout coverage for optional-control variants at mobile, tablet, and desktop widths.
- Add a patch changeset for the responsive icon-sizing fix.
Files changed:
 .changeset/fn-8396-task-detail-tablet-icon-size.md |  7 +++
 .../__tests__/browser-layout-smoke-fixture.test.ts | 18 ++++++
 .../dashboard/app/components/TaskDetailModal.css   | 14 +++++
 .../__tests__/TaskDetailModal.rendering.test.tsx   | 25 ++++++++
 ...etailModal.responsive-and-dependencies.test.tsx | 16 ++++++
 .../dashboard/scripts/browser-layout-smoke.mjs     | 67 ++++++++++++++++++++++
 6 files changed, 147 insertions(+)

Fusion-Task-Id: FN-8396

Fusion-Task-Lineage: 3cd0e5e6-7edf-4dc7-aa71-0586cca6e6ec

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 16:36:42 -07:00
gsxdsm
efa9580b93 FN-8366: enforce end-to-end project scoping
Ensure asynchronous dashboard data and real-time streams remain bound to their active project context.

- Resolve SSE and badge WebSocket stores through the canonical project resolver
- Guard agents, artifacts, and documents hooks against stale project responses and events
- Add scoped cache handling, regression coverage, and architecture documentation

Files changed:
 docs/architecture.md                               |  7 ++++
 .../app/hooks/__tests__/useAgents.test.ts          | 24 +++++++++++
 .../app/hooks/__tests__/useArtifacts.test.ts       | 47 ++++++++++++++++++++++
 .../app/hooks/__tests__/useDocuments.test.ts       | 34 ++++++++++++++++
 packages/dashboard/app/hooks/useAgents.ts          | 47 +++++++++++++++++-----
 packages/dashboard/app/hooks/useArtifacts.ts       | 26 +++++++++---
 packages/dashboard/app/hooks/useDocuments.ts       | 18 ++++++++-
 .../dashboard/app/hooks/useProjectContextGuard.ts  | 38 +++++++++++++++++
 .../routes-context-project-identity.test.ts        | 12 ++++++
 packages/dashboard/src/server.ts                   | 21 +++++++---
 10 files changed, 251 insertions(+), 23 deletions(-)

Fusion-Task-Id: FN-8366
Fusion-Task-Lineage: 0fcd38c1-727f-4511-8209-5d70cbf9eb0d
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 16:29:39 -07:00
gsxdsm
d768501274 FN-8372: fix html2canvas dependency resolution
Allow the dashboard screenshot utility to resolve its bundled html2canvas types.

- Declare html2canvas with the compatible caret range in dashboard metadata.
- Add a patch changeset documenting the dashboard build fix.

Files changed:
 .changeset/fn-8372-html2canvas.md | 7 +++++++
 packages/dashboard/package.json   | 2 +-
 pnpm-lock.yaml                    | 2 +-
 3 files changed, 9 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8372

Fusion-Task-Lineage: ca4d2ff6-7c23-474a-a271-ff7d329b4bbe

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 16:21:56 -07:00
gsxdsm
3e376b98ba FN-8369: centralize GitHub issue import deduplication
Use provenance-first deduplication consistently across dashboard, CLI, and extension GitHub imports.

- Prioritize persisted sourceIssue and legacy metadata over editable descriptions.
- Reuse the dashboard deduplication helper for CLI and extension imports.
- Prevent duplicate issue creation within a dashboard batch import.

Files changed:
 .changeset/fn-8369-github-import-dedup.md          |  7 ++++++
 packages/cli/src/__tests__/extension.test.ts       | 27 ++++++++++++++++++++++
 packages/cli/src/commands/__tests__/task.test.ts   | 20 ++++++++++------
 packages/cli/src/extension.ts                      | 25 +++++++++++---------
 packages/dashboard/src/__tests__/github.test.ts    | 26 ++++++++++++++++-----
 packages/dashboard/src/__tests__/routes-github.test.ts | 22 ++++++++++++++++++
 packages/dashboard/src/github.ts                   | 27 +++++++++++++---------
 7 files changed, 119 insertions(+), 35 deletions(-)

Fusion-Task-Id: FN-8369

Fusion-Task-Lineage: 8eb6d19d-bd0e-487a-9f11-8945d744b7df

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 16:07:34 -07:00
gsxdsm
e0e395a715 FN-8365: enforce dashboard route registrar mount order
Keep dashboard API registration modular while preserving Express route precedence.

- Route all top-level dashboard registrars through a runtime-checked canonical mount sequence
- Add mount-order and inline-route-ratchet coverage with CI enforcement
- Document registrar ownership and mount-order conventions

Files changed:
.github/workflows/pr-checks.yml                    |   3 +
AGENTS.md                                          |   2 +
package.json                                       |   5 +-
packages/dashboard/src/routes.ts                   | 136 +++++-----
packages/dashboard/src/routes/README.md            | 276 ++++++++++-----------
packages/dashboard/src/routes/__tests__/create-api-routes-mount-order.test.ts |  66 +++++
packages/dashboard/src/routes/create-api-routes-mount-sequence.ts |  54 ++++
scripts/__tests__/check-routes-modular.test.mjs    |  28 +++
scripts/check-routes-modular.mjs                   |  65 +++++
scripts/lib/routes-modular-baseline.json           |   3 +
10 files changed, 433 insertions(+), 205 deletions(-)

Fusion-Task-Id: FN-8365

Fusion-Task-Lineage: 9c36a263-ed5e-4524-8ea5-71ed3f3e34d9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 15:53:07 -07:00
gsxdsm
d940bf3d5c FN-8358: add roadmap-item structure previews
Enable native previews and hosted navigation for roadmap items.
- Extend native structure references and API resolution through the roadmap adapter.
- Register the bundled Roadmaps view across desktop and mobile navigation.
- Cover roadmap preview availability, navigation, and route behavior.

Files changed:
 ...n-8358-roadmap-item-native-structure-preview.md |  7 ++++
 docs/dashboard-guide.md                            |  6 ++--
 packages/core/src/types.ts                         | 24 ++++++++-----
 packages/dashboard/app/App.tsx                     | 24 ++++++++-----
 .../dashboard/app/components/LeftSidebarNav.tsx    | 12 +++----
 .../app/components/NativeStructurePreview.tsx      | 10 ++++--
 .../app/components/__tests__/App.test.tsx          | 13 ++++---
 .../app/components/__tests__/Header.test.tsx       |  5 ++-
 .../components/__tests__/LeftSidebarNav.test.tsx   |  5 ++-
 .../app/components/__tests__/MobileNavBar.test.tsx |  4 +--
 .../__tests__/NativeStructurePreview.test.tsx      | 40 ++++++++++++++++------
 .../__tests__/registerBundledPluginViews.test.tsx  | 24 ++++++++++---
 .../app/plugins/registerBundledPluginViews.ts      | 23 +++++++++++++
 packages/dashboard/src/native-structure-preview.ts | 25 +++++++++++++-
 .../native-structure-preview-routes.test.ts        | 31 +++++++++++++++--
 .../src/routes/register-task-workflow-routes.ts    |  4 +--
 packages/dashboard/vite.config.ts                  |  4 +++
 packages/dashboard/vitest.config.ts                |  4 +++
 plugins/fusion-plugin-roadmap/package.json         |  5 +++
 .../fusion-plugin-roadmap/src/dashboard-view.tsx   |  5 +++
 plugins/fusion-plugin-roadmap/src/index.ts         | 14 ++++++--
 21 files changed, 223 insertions(+), 66 deletions(-)

Fusion-Task-Id: FN-8358
Fusion-Task-Lineage: c369ce87-eef0-4d06-bf23-bced9c4363f9
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 15:45:45 -07:00
gsxdsm
bea51f7bdb FN-8348: relocate report actions to settings and command center
Relocate guided reporting from the header into durable project and overview surfaces.

- Add Report entry points to Project General settings and Command Center Overview.
- Preserve guided report modal context through a shared route helper.
- Cover relocated controls and update dashboard guidance.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 packages/dashboard/app/components/Header.tsx       | 33 ++++------------------
 .../dashboard/app/components/SettingsModal.tsx     |  2 +-
 .../app/components/__tests__/Header.test.tsx       |  7 +++++
 .../components/command-center/CommandCenter.css    | 32 +++++++++++++++++++++
 .../components/command-center/CommandCenter.tsx    | 30 +++++++++++++++++++-
 .../__tests__/CommandCenter.test.tsx               | 11 ++++++++
 .../settings/sections/GeneralSection.tsx           | 21 ++++++++++++++
 .../GeneralSection.aiUndoWorkflow.test.tsx         | 20 +++++++++++--
 packages/dashboard/app/utils/reportContextRefs.ts  | 13 +++++++++
 10 files changed, 139 insertions(+), 32 deletions(-)

Fusion-Task-Id: FN-8348

Fusion-Task-Lineage: add1b302-deab-4e17-be2f-832971c1c83d

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 15:12:23 -07:00
gsxdsm
8b6dca4379 FN-8343: add Planning Mode E2E coverage
Add deterministic end-to-end coverage for the Planning Mode plan-creation lifecycle.

- Exercise contextual interview responses, multilingual options, custom input, and answer rewinds
- Ensure premature agent completion cannot finalize a plan before explicit validation
- Verify validation gates task creation and session cleanup

Files changed:
 .../__tests__/planning-e2e-plan-creation.test.ts   | 286 +++++++++++++++++++++
 1 file changed, 286 insertions(+)

Fusion-Task-Id: FN-8343

Fusion-Task-Lineage: 61b8b22e-7d13-4578-ba35-0f2208fcb851

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 14:58:48 -07:00
gsxdsm
da1e445d6b FN-8310: add public-roadmap report deduplication
Add public-roadmap issues as a configurable, reviewable deduplication source for in-app reports.

- Resolve roadmap settings across project, global, and tracking-repository fallbacks
- Search and endorse matching open roadmap issues before filing duplicate reports
- Expose and index roadmap controls with localized default descriptions

Files changed:
 .changeset/fn-8310-public-roadmap-dedupe.md        |  7 ++
 docs/dashboard-guide.md                            |  2 +-
 docs/settings-reference.md                         |  4 +-
 .../core/src/__tests__/settings-parity.test.ts     | 14 +++-
 packages/core/src/settings-schema.ts               |  7 +-
 packages/core/src/types.ts                         | 13 +++-
 packages/dashboard/app/api/report.ts               |  2 +-
 packages/dashboard/app/components/ReportModal.tsx  | 18 ++---
 .../dashboard/app/components/SettingsModal.tsx     | 15 +++-
 .../app/components/__tests__/ReportModal.test.tsx  | 12 ++--
 .../__tests__/SettingsModal.general.test.tsx       |  6 +-
 .../settings/__tests__/section-keys.test.ts        |  5 +-
 .../app/components/settings/save-split.ts          | 14 ++--
 .../app/components/settings/section-keys.ts        |  5 ++
 .../settings/sections/GeneralSection.search.ts     | 34 ++++++---
 .../settings/sections/GeneralSection.tsx           | 29 ++++++--
 .../sections/SourceControlGlobalSection.search.ts  | 27 +++++++
 .../sections/SourceControlGlobalSection.tsx        | 55 ++++++++++----
 .../settings-default-descriptions.test.tsx         |  4 +-
 .../src/__tests__/report-pipeline.test.ts          | 73 ++++++++++++-------
 .../dashboard/src/__tests__/report-routes.test.ts  | 23 +++---
 packages/dashboard/src/report-pipeline.ts          | 84 ++++++++++++++--------
 .../dashboard/src/routes/register-report-routes.ts |  9 +--
 packages/i18n/locales/en/app.json                  | 17 ++++-
 packages/i18n/locales/es/app.json                  | 17 ++++-
 packages/i18n/locales/fr/app.json                  | 17 ++++-
 packages/i18n/locales/ko/app.json                  | 17 ++++-
 packages/i18n/locales/zh-CN/app.json               | 16 ++++-
 packages/i18n/locales/zh-TW/app.json               | 16 ++++-
 29 files changed, 409 insertions(+), 153 deletions(-)

Fusion-Task-Id: FN-8310

Fusion-Task-Lineage: 0efa8d76-e849-4256-bdcd-e9d6dd612e41

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 14:51:49 -07:00
gsxdsm
965f15f5ca FN-8368: enforce browser-safe dashboard core imports
Prevent dashboard code from bypassing Vite's browser-safe core boundary.

- Add an allowlist-backed scanner for dashboard core value imports, including dynamic template imports.
- Run the scanner in test and merge-gate prechecks, with regression coverage and import guidance.
- Document reviewed browser-safe core leaves and Vite alias requirements.

Files changed:
 docs/dashboard-guide.md                            |   6 +
 package.json                                       |   6 +-
 packages/dashboard/vite.config.ts                  |   5 +
 ...no-node-only-core-imports-in-dashboard.test.mjs |  80 ++++++++++
 ...heck-no-node-only-core-imports-in-dashboard.mjs | 167 +++++++++++++++++++++
 .../lib/dashboard-browser-safe-core-modules.json   |  59 ++++++++
 6 files changed, 320 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-8368

Fusion-Task-Lineage: 13e70672-d1da-430c-a360-0a714ad33d9f

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 14:08:51 -07:00
gsxdsm
2302fb8a3d feat: add beta/stable release tracks with switchable update channel (#2345)
## Summary

Fusion can now ship on two release tracks. Betas are cut from `main` as
`vX.Y.Z-beta.N` (npm dist-tag `beta`, GitHub prerelease), stable
releases are promoted to a long-lived `release` branch and published to
`latest`, and users pick their track with the new `updateChannel` global
setting — via **Settings → General → Release channel** or `fn update
--channel <stable|beta>`. Previously everything was single-track: every
publish landed on `latest` and every update surface could only see it.

| | beta | stable |
|---|---|---|
| Cut from | `main` | `release` branch |
| Version | `X.Y.Z-beta.N` (changesets pre-mode) | `X.Y.Z` |
| npm dist-tag | `beta` | `latest` |
| GitHub Release | prerelease | latest |
| Homebrew tap / X draft | skipped | bumped / printed |

## How releasing works now

`pnpm release` prompts for the channel and **defaults to beta**, so
day-to-day releases are betas; stable is always an explicit choice.
Choosing stable from `main` triggers assisted promotion: the script
proposes the newest beta tag reachable from HEAD, verifies `release`
fast-forwards to it, then runs the whole stable release inside a
temporary git worktree on `release` — the primary checkout never leaves
`main`. Changesets pre-mode preserves changeset files across betas, so
the promoted stable release aggregates every changeset since the last
stable into one clean changelog entry.

## Design decisions

- **Every publish path names an explicit `--tag`.** A beta accidentally
landing on `latest` is the one unrecoverable failure of a dual-track
scheme, so nothing relies on npm's implicit default (`release.mjs`,
`version.yml`).
- **Beta channel resolves to semver-max of `latest` and `beta`**, so
beta users are offered each promoted stable once it overtakes their
prerelease. Switching beta → stable never downgrades; `fn update
--channel stable --force` is the explicit escape hatch.
- **One comparator instead of three.** CLI, dashboard, and desktop each
had their own `isRemoteNewer` that ignored prerelease identifiers —
`0.73.0-beta.2`, `-beta.3`, and `0.73.0` all compared equal, which
breaks the moment any beta exists. They now share full SemVer-precedence
helpers (`compareVersions`, `resolveUpdateTargetVersion`) from
`@fusion/core`.
- **Installs pin exact versions** (`@runfusion/fusion@0.73.0-beta.2`),
never a dist-tag, so an install can't silently land on the wrong track.
- **Desktop channels via electron-updater manifests.** Beta tags build
desktop artifacts with `publish.channel=beta` (emitting `beta*.yml`);
the app sets `channel`/`allowPrerelease` from the shared setting,
re-read on every manual check.
- **Update caches are channel-stamped** — a cache written for one
channel is never served to the other, so switching tracks takes effect
on the next check instead of after TTL.

## Test plan

- New unit coverage: SemVer precedence + channel resolution in
`@fusion/core` (30), channel behavior of the dashboard update check (28,
incl. 9 new) and `fn update` (16, incl. 8 new: persist `--channel`,
no-downgrade, `--force`, cache channel mismatch).
- `pnpm verify:fast` green (scoped typecheck, builds, CLI build, boot
smoke); desktop + settings-section suites green.
- `release.mjs` dry-run matrix exercised by hand: channel prompt
(default/override/invalid), branch preflights per channel,
assisted-promotion target selection, fast-forward guard against a
diverged `release` branch, and bootstrap when no `release` branch
exists.
- Not exercised live: an end-to-end publish (needs TTY authorization +
real npm publish). First real run is the first `pnpm release --channel
beta`.

---

[![Compound
Engineering](https://img.shields.io/badge/Built_with-Compound_Engineering-6366f1)](https://github.com/EveryInc/compound-engineering-plugin)
![Claude
Code](https://img.shields.io/badge/Fable_5-D97757?logo=claude&logoColor=white)


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

* **New Features**
* Added beta and stable release channels across CLI, dashboard, and
desktop updates.
* Users can select a channel via Settings or `fn update --channel
<stable|beta>` (stored as a global default).
* Desktop beta releases now generate beta update manifests and publish
as prereleases.
* **Documentation**
* Expanded release-track, settings, and CLI references to explain
channel semantics and workflows.
* **Bug Fixes**
* Updates now pin the resolved version per channel, improve version
comparison, and prevent unintended cross-channel downgrades unless
`--force` is used.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 13:34:25 -07:00
gsxdsm
48b3656bde refactor: package code organization wave 11 (#2333)
## Summary

Wave 11 of package code organization (continues #2328 / wave 10), after
syncing main into the wave10 stack.

### Peels

| New module | Parent |
|---|---|
| `app/api/event-source.ts` | resilient `EventSource` reconnect +
pagehide cleanup |
| `app/api/chat.ts` | chat sessions / rooms / streaming |
| `app/api/projects.ts` | multi-project management client |
| `app/api/agents.ts` | agent CRUD / soul / memory |
| `app/api/workflows.ts` | workflow definition client |
| `app/api/scheduling.ts` | automations + routines |
| `app/api/ai-text.ts` | text refine / import translate / subtasks |
| `app/api/ai-sessions.ts` | AI / planning session client +
`startKeepAlive` |
| `app/api/research.ts` | research + evals client |
| `task-store/branch-and-pr-entities.ts` | rename of `remaining-ops-6` |

Public paths stay stable via `legacy.ts` re-exports (`app/api.ts` →
`legacy`).

### LOC

- `legacy.ts` ~8921 → ~5670

### Shims

- `legacy.ts` → peels above (delete-when: dashboard imports domain
modules)
- `remaining-ops-6` → `branch-and-pr-entities` (rename complete)

## Test plan

- [x] eslint on peeled API modules + legacy
- [x] dashboard app typecheck (`app/api/*` clean)
- [x] core typecheck
- [x] `plugin-setup-api` tests
- [ ] CI merge gate

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

* **New Features**
* Expanded dashboard APIs for agents, AI sessions, chat rooms/sessions,
research runs, projects, workflows, routines/automations, and
scheduling.
* Added AI text refinement/translation, planning title regeneration, and
streamed subtask breakdown with task creation.
* Introduced resilient server-sent-events streaming for chat and other
live updates.
* Added workflow export/import and workflow design support, plus scripts
and workflow configuration controls.
* Added research export and ability to attach research outputs to tasks.

* **Enhancements**
* Missions support clearing an auto-merge override back to project
defaults.
  * Subtasks can now include an optional priority when creating tasks.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-19 12:16:51 -07:00
gsxdsm
aa401123ea fix: make Windows updates and CE personas reliable (#2340)
## Summary

Windows installs with slow native dependencies now get five minutes to
finish, and a real timeout is reported as an actionable terminal retry
instead of a wall of preceding npm deprecation warnings. Registry
`ETIMEDOUT` errors keep their network diagnosis, including after the
legacy-bin `--force` retry.

Compound Engineering personas are now included in the published CLI
bundle, with complete source-to-staged coverage for all persona
definitions and a clear startup error if the bundled assets are missing
or empty.

The PostgreSQL statement visible in the report was validated by the
existing real-Postgres schema reapply test. Its actual `caused by`
detail was truncated, so this PR deliberately makes no speculative
database change.

## Validation

- Dashboard updater tests: 22 passed
- CLI updater tests: 16 passed
- CE persona installer tests: 7 passed
- Published bundle persona assertion: passed against every source
persona
- CLI and CE plugin typechecks: passed
- Changed production/config lint and strict changeset validation: passed
- Real PostgreSQL schema reapply integration test: passed

---

[![Compound
Engineering](https://img.shields.io/badge/Built_with-Compound_Engineering-6366f1)](https://github.com/EveryInc/compound-engineering-plugin)


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

* **Bug Fixes**
* Windows CLI and dashboard updates now allow up to five minutes for
installation and restore Compound Engineering agent personas during npm
installs.
* Update failures now surface clearer, terminal timeout guidance (while
preserving specific network connection diagnostics) and avoid misleading
“deprecated”/generic timeout text.
* Persona assets are reliably included in plugin builds and bunded
persona installation now errors clearly when definitions are missing or
empty.
* **Tests**
* Expanded update and bundling coverage for the new 5-minute timeout and
error-handling scenarios.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-19 12:16:12 -07:00
gsxdsm
b2a7425c76 refactor(cutover 3/3): dashboard + changesets — IR-driven lifecycle cutover (#2335)
Completes the IR-driven lifecycle cutover: **the workflow IR becomes the
single source of truth for task lifecycle.** Node column assignments
move cards at runtime, every lifecycle predicate re-keys on column
traits instead of literal column ids, and the graph exclusively owns
review gates.

Plan (the spec for this work):
[`docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md`](docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md)

## What changed

**IR as runtime authority (R1, R2).** Graph traversal crossing a node
column boundary moves the card through the store's trait-hook `moveTask`
path, attributed `workflowMoveSource: "workflow-graph"` and emitting
`task:column-transition`. This replaces the executor's hardcoded
`moveTask(id, "in-review")` merge boundary and its handoff-invariant
allowlist. Scheduler, hold/release, self-healing, merger and
finalization now key on column traits
(`intake`/`hold`/`wip`/`merge-blocker`/`human-review`/`merge`/`complete`/`archived`/`timing`/`abort-on-exit`/`reset-on-entry`/`stall-detection`),
with rebound targets resolved per KTD-10.

**Single ownership of review gates (R4, R5).** Triage's out-of-graph
Plan Review gate is deleted; the graph is the sole author. `pending`
step results are CAS-claimed leases with owner and staleness floor
(KTD-4), so a crash/restart re-entry can no longer dispatch a second
reviewer and silently discard the losing verdict.

**Graph ownership is unconditional (R9).** The legacy execute fallback
is gone: `maybeExecuteWorkflowGraph` is now `executeWorkflowGraph`
returning `void`, `graphCompletion` is a required parameter, and a store
that cannot resolve a workflow fails closed rather than silently running
nothing. Also deleted, with a tombstone ratchet: `fn_review_step` and
its RETHINK/session-rewind machinery, `workflow-cutover.ts`,
`workflow-authoritative-driver.ts`, `workflow-parity-observer.ts`, and
the `graphCompletionInterceptors` map.

**`reviewLevel` becomes a creation-time preset (R6)** writing
`enabledWorkflowSteps`, with zero runtime reads.

**Upgrade path (R10).** Migration 0026 adds the durable per-node-entry
IR pin (KTD-3) and the one-time adoption stamp (KTD-8);
`planLegacyAdoption` is the single shared decision run by both the
startup sweep and the store-open reconcile, so pre-cutover rows are
adopted instead of freezing. A stale-binary guard refuses to open a
database migrated by a newer binary.

**Operator surfaces (R2, R11).** Four places still closed the column
set: the dashboard coerced every ingested task's column through the
legacy six-id enum (a card in a custom `Merging` column rendered in
**Triage**), `POST /tasks/:id/move` answered 400 for any
workflow-defined column, retry/reset/re-engage/unassign/spec-revise used
hardcoded move targets, and GitHub issue open/closed mapping
literal-compared `done`/`archived`. All now resolve from the task's
workflow by trait, each with a legacy fallback so `builtin:coding` is
byte-identical.

## Evidence

`builtin:coding` keeps its column ids and observable behavior
byte-compatible (R8, KTD-7), pinned by a characterization oracle. A new
**6-column benchmark acceptance suite** drives a user-authored workflow
— `Ideas → Todo → In-progress → In-review → Merging → Done` — asserting
the ordered transition trail, single-mover at the hold→wip seam (KTD-2),
column-role purity (R12), bounded review cycles from workflow config,
and park-in-place on failure (R3). The same fixture is proven
**editor-buildable** through the real save-validation path, plus
negative cases.

Verified locally on this branch, post-rebase:

- `pnpm test:gate` — green (engine-core 294/294, pg-gate 126/126,
ci-workflow 63/63)
- characterization oracle 59/59, tombstones 5/5, 6-column benchmark
11/11
- `tsc --noEmit` clean for `@fusion/core`, `@fusion/engine`,
`@fusion/dashboard` (both `tsconfig.json` and `tsconfig.app.json`)

## Known reds

- **`executor-task-done-invariant` → "moves a cleanly completed task to
in-review via the merge-node boundary"** — red on this branch. A
real-Postgres test whose graph re-entry rebounds the card to
`in-progress` after `execute()` returns. Not in the merge gate, so it
does not gate CI. Honest status: I could **not** verify it green on
pristine `main` — running main's tests in this worktree reuses built
artifacts and produced obviously polluted results, so I am not claiming
"pre-existing". It needs its own look.
- **`html2canvas` / FN-8309 — fixed here by deleting dead code.**
`packages/dashboard/app/utils/capture-screenshot.ts` imported
`html2canvas`, which is not a dependency of `@fusion/dashboard` and is
**not in `pnpm-lock.yaml` at all**, so it had never compiled in CI. The
file had **zero importers**. Main never caught it because PR Checks runs
only on pull requests (main's last PR Checks run was in June) while
main's own pushes run just the non-blocking Full Suite — so the required
**Typecheck** check was failing on *every* PR against main, including
this one. Inherited from `88b0db0f4` (FN-8309). **To restore when the
feature lands its dependency properly:** `git checkout 88b0db0f4 --
packages/dashboard/app/utils/capture-screenshot.ts` and add
`html2canvas` to `packages/dashboard/package.json` in the same change.
- **pg-gate rotating contention** — historically a different file set
each run with zero assertion failures. It passed 126/126 on the final
run here.

Two entries that were on the provisional ledger turned out **not** to be
pre-existing and are fixed in this PR: the
`workflow-graph-optional-step-fix` replan-cap pair were stale assertions
against U3's own contract change (cap-exhausted now *parks*
awaiting-approval and reports handled, rather than silently leaving the
task in place), and `executor-column-agent-seams` /
`executor-fast-mode-workflows` are green.

## Deferred follow-ups

- **Graph does not suspend at the ready-for-release seam.** A parked
`onNodeEntry` returns `void` and the node executes anyway, so within one
walk the card can run In-progress work while still displayed in Todo.
The benchmark models the scheduler explicitly for this reason and says
so at the seam. Making the graph actually suspend is U4-scope follow-up.
- **`needs-replan` reader migration.** Post-U3 the durable write happens
at the graph's own `plan-replan` seam, so the workflow *is* the writer
and the 14 readers form one coherent graph-owned loop — it is the
graph's durable replan signal wearing a legacy name, not un-migrated
legacy. The adoption census guard requiring that literal in
`executor.ts` is correct and stays. Migrating those readers to a
purpose-built run-state signal is a post-cutover naming change with its
own risk budget.
- **U9b seam-node refinement.** The merge substates
(`merging`/`merging-pr`/`merging-fix`) are adopted as `resume-graph`
rather than mapped to an exact re-entry node; naming a precise node
would require resolving the task's IR, which the adoption module
deliberately cannot do.

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


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

* **New Features**
* Workflows now drive task lifecycle columns, transitions, capacity
limits, review gates, and completion behavior—including custom
workflows.
* Tasks created with review levels automatically receive the
corresponding workflow review steps.
* Legacy in-progress tasks are automatically recovered during upgrades.
  * Dashboard status badges now show the active workflow step name.
* Added safeguards for workflow changes, review ownership, database
compatibility, and workflow validation.

* **Bug Fixes**
  * Fixed custom-column rendering and task movement.
* Improved merge-boundary handling and completion for workflows without
merge steps.
* Prevented cards from stalling, moving backward, or exceeding pooled
WIP capacity.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 12:09:12 -07:00