Commit Graph

3167 Commits

Author SHA1 Message Date
Fusion Agent
eb299666c2 FN-214: add Cozy Cartoon dashboard theme
Add a Cozy Cartoon theme with synchronized dashboard and desktop styling, controls, documentation, and regression coverage.

- Add the pastel light and cozy-night dark palettes with theme selector previews.
- Apply rounded, oversized controls while preserving compact action-row sizing.
- Document the theme and update theme types, metadata, and tests.

Files changed:
 .changeset/fn-214-cozy-cartoon-theme.md            |   6 +
 docs/dashboard-guide.md                            |   5 +-
 docs/settings-reference.md                         |   3 +-
 packages/core/src/types/ui/execution-and-ui.ts     |   2 +
 .../app/__tests__/cozy-cartoon-theme.test.ts       | 294 +++++++++++++++++++++
 .../quick-entry-action-row-height-parity.test.tsx  |   1 +
 .../quick-entry-workflow-trigger-height.test.tsx   |   1 +
 .../dashboard/app/components/ThemeSelector.css     |  16 ++
 .../components/__tests__/ThemeDropdown.test.tsx    |   2 +-
 .../components/__tests__/ThemeSelector.test.tsx    |   2 +-
 .../__tests__/CommandCenterControls.test.tsx       |  11 +-
 packages/dashboard/app/components/themeOptions.ts  |   1 +
 packages/dashboard/app/index.html                  |   2 +-
 packages/dashboard/app/public/theme-data.css       |  97 +++++++
 packages/dashboard/app/styles.css                  |   9 +
 packages/desktop/src/renderer/index.html           |   1 +
 16 files changed, 446 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-214

Fusion-Task-Lineage: f56cbadd-bbf0-4eb0-83b5-89d3fefd6f47

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 08:06:35 +00:00
Fusion Agent
532fabc1ac FN-212: restore Respecify and require plan approval per task
Restore plan revision from approval holds and add persistent per-task approval controls across the workflow.

- Add task-level approval resolution, persistence, migration, and workflow gating.
- Restore the Respecify action with plan-preserving revision behavior.
- Add approval overlays, shared dialogs, localized copy, and regression coverage.

Files changed:
 .changeset/fn-212-respecify-and-plan-approval.md   |   7 +
 docs/architecture.md                               |   2 +-
 docs/dashboard-guide.md                            |   8 +-
 docs/settings-reference.md                         |   3 +-
 docs/task-management.md                            |   8 +-
 docs/workflow-steps.md                             |   4 +-
 packages/core/src/__tests__/plan-approval.test.ts  |  30 +++
 .../src/__tests__/postgres/schema-applier.test.ts  |  40 +++-
 .../postgres/task-lifecycle-e2e.pg.test.ts         |  10 +
 .../__tests__/task-require-plan-approval.test.ts   |  51 +++++
 packages/core/src/index.gate.ts                    |   2 +-
 packages/core/src/index.ts                         |   2 +-
 packages/core/src/planner/plan-approval.ts         |  33 ++-
 .../0070_fn_212_task_require_plan_approval.sql     |   3 +
 packages/core/src/postgres/postgres-health.ts      |   2 +
 packages/core/src/postgres/schema-applier.ts       |  26 ++-
 packages/core/src/postgres/schema/project.ts       |   2 +
 packages/core/src/store.ts                         |   2 +-
 .../core/src/task-store/branch-and-pr-entities.ts  |   2 +-
 packages/core/src/task-store/persistence.ts        |   6 +
 packages/core/src/task-store/serialization.ts      |   4 +
 packages/core/src/task-store/task-creation.ts      |   4 +
 packages/core/src/task-store/task-update.ts        |   9 +
 packages/core/src/types/task/task-core.ts          |  12 ++
 packages/core/src/types/workflow/workflow-steps.ts |   2 +-
 packages/dashboard/app/api/tasks/task-steer.ts     |   9 +-
 packages/dashboard/app/components/ListView.tsx     |  17 +-
 packages/dashboard/app/components/NewTaskModal.tsx |  11 +-
 .../dashboard/app/components/QuickEntryBox.tsx     |  28 ++-
 .../app/components/RespecifyPlanDialog.css         |  49 +++++
 .../app/components/RespecifyPlanDialog.tsx         | 120 +++++++++++
 packages/dashboard/app/components/TaskCard.css     |  57 ++++-
 packages/dashboard/app/components/TaskCard.tsx     | 115 +++++++++-
 .../dashboard/app/components/TaskContextMenu.tsx   |  12 ++
 .../dashboard/app/components/TaskDetailModal.tsx   |  16 ++
 packages/dashboard/app/components/TaskForm.tsx     |  21 +-
 .../ListView.plan-approval-overlay.test.tsx        |  18 ++
 .../NewTaskModal.plan-approval-toggle.test.tsx     |  21 ++
 .../app/components/__tests__/NewTaskModal.test.tsx |  27 +++
 .../QuickEntryBox.plan-approval-toggle.test.tsx    |  27 +++
 .../components/__tests__/QuickEntryBox.test.tsx    |  38 +++-
 .../__tests__/RespecifyPlanDialog.test.tsx         | 105 +++++++++
 .../TaskCard.plan-approval-host-inventory.test.tsx |  29 +++
 .../TaskCard.plan-approval-overlay.test.tsx        | 104 +++++++++
 .../components/__tests__/TaskContextMenu.test.tsx  |  14 ++
 .../__tests__/TaskRetry.host-inventory.test.tsx    |  12 +-
 .../dashboard/app/utils/planApprovalPreference.ts  |  16 ++
 packages/dashboard/app/utils/projectStorage.ts     |   1 +
 .../routes-task-respecify-preserve-plan.test.ts    | 226 +++++++++++++++++++
 .../src/routes/register-task-workflow-routes.ts    |  57 +++--
 .../triage-per-task-plan-approval.test.ts          | 240 +++++++++++++++++++++
 packages/engine/src/triage.ts                      |   4 +-
 packages/i18n/locales/en/app.json                  |  21 ++
 packages/i18n/locales/es/app.json                  |  23 +-
 packages/i18n/locales/fr/app.json                  |  23 +-
 packages/i18n/locales/ko/app.json                  |  23 +-
 packages/i18n/locales/pt-BR/app.json               |  23 +-
 packages/i18n/locales/zh-CN/app.json               |  23 +-
 packages/i18n/locales/zh-TW/app.json               |  23 +-
 packages/i18n/src/resources.d.ts                   |  21 ++
 60 files changed, 1797 insertions(+), 51 deletions(-)

Fusion-Task-Id: FN-212

Fusion-Task-Lineage: e2f46a8d-5724-4330-9fdb-dc33fd4b93bc

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 07:42:26 +00:00
Fusion Agent
e24b10973e FN-213: preserve task branch provenance during reclaim
Keep task branches and worktrees safely attached when reclaim encounters non-conflict failures.

- Preserve branch and checkout provenance during self-healing reclaim.
- Narrow conflict escalation and rebind relocated worktrees from Git metadata.
- Add regression coverage for merger and self-healing reclaim paths.
- Document the branch-write provenance behavior.

Files changed:
 .../fn-213-branch-write-provenance-reclaim.md      |   7 +
 docs/architecture.md                               |   6 +-
 .../branch-write-provenance-store-stub.ts          |  26 +++
 packages/engine/src/__tests__/merger-ai.test.ts    |  35 +++-
 .../merger-finalize-unproven.real-git.test.ts      |  53 +++++-
 .../pr-conflict-reclaim.test.ts                    |  11 +-
 .../worktree-metadata-reconcile.test.ts            |  55 +++++-
 .../self-healing-ghost-branch-recovery.test.ts     | 107 ++++++++++-
 .../self-healing-pr-conflict.test.ts               |  81 +++++++-
 .../self-healing-reclaim-live-zero-commits.test.ts |  88 ++++++++-
 .../self-healing-reclaim-paused-review.test.ts     |  15 +-
 .../task-branch-write-origin-census.test.ts        | 207 +++++++++++++++++----
 packages/engine/src/merger.ts                      |   9 +-
 packages/engine/src/self-healing.ts               |  55 ++++++
 14 files changed, 691 insertions(+), 64 deletions(-)

Fusion-Task-Id: FN-213

Fusion-Task-Lineage: b9b86b75-4965-484d-b964-ef415568f0cc

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 07:14:39 +00:00
Fusion Agent
38ed1d25e5 FN-209: add external block status and safe recovery
Add durable external-block state and safe resume handling across storage, engine, dashboard, and tests.

- Persist external-block metadata and migration support for frozen tasks.
- Freeze execution, scheduling, and self-healing resources while preserving exact resume state.
- Add dashboard notices/actions, resume routes, localized copy, and regression coverage.
- Preserve lifecycle containment and attributable automatic-move logging during the merge.

Files changed:
 .changeset/fn-209-external-block-status.md         |   7 +
 AGENTS.md                                          |   1 +
 docs/architecture.md                               |   6 +
 docs/dashboard-guide.md                            |   4 +
 docs/run-audit.md                                  |   4 +
 ...xternal-block-and-remaining-lifecycle-drifts.md |  29 +++
 docs/storage.md                                    |   4 +
 docs/task-management.md                            |   6 +
 .../core/src/__tests__/live-agent-count.test.ts    |  19 ++
 .../postgres/queued-episode-transition.pg.test.ts  |   2 +-
 .../src/__tests__/postgres/schema-applier.test.ts  |   6 +-
 .../core/src/__tests__/task-external-block.test.ts |  81 +++++++
 packages/core/src/agents/live-agent-count.ts       |  15 +-
 packages/core/src/index.gate.ts                    |  10 +
 packages/core/src/index.ts                         |  10 +
 .../migrations/0069_fn_209_task_external_block.sql |   3 +
 packages/core/src/postgres/schema-applier.ts       |  27 ++-
 packages/core/src/postgres/schema/project.ts       |   2 +
 packages/core/src/store.ts                         |   2 +-
 .../core/src/task-store/branch-and-pr-entities.ts  |   2 +-
 packages/core/src/task-store/persistence.ts        |   4 +-
 packages/core/src/task-store/reset-lifecycle.ts    |   3 +-
 packages/core/src/task-store/serialization.ts      |   1 +
 packages/core/src/task-store/task-mutation-ops.ts  |   2 +-
 packages/core/src/task-store/task-row-mappers.ts   |   2 +-
 packages/core/src/task-store/task-update.ts        |   5 +
 packages/core/src/tasks/task-external-block.ts     |  64 ++++++
 packages/core/src/types.ts                         |  10 +
 packages/core/src/types/task/task-core.ts          |   8 +
 packages/dashboard/app/App.tsx                     |   2 +-
 packages/dashboard/app/components/AppModals.tsx    |   1 +
 packages/dashboard/app/components/Board.tsx        |   6 +-
 packages/dashboard/app/components/Column.tsx       |   5 +-
 packages/dashboard/app/components/DockTaskList.tsx |   3 +
 packages/dashboard/app/components/ListView.tsx     |   7 +
 packages/dashboard/app/components/TaskCard.css     |  76 +++++++
 packages/dashboard/app/components/TaskCard.tsx     |  86 +++++++-
 .../dashboard/app/components/TaskDetailModal.tsx   |   4 +
 .../dashboard/app/components/WorktreeGroup.tsx     |   4 +
 .../__tests__/ListView.external-block.test.tsx     |  41 ++++
 ...TaskCard.external-block-host-inventory.test.tsx |  37 ++++
 .../__tests__/TaskCard.external-block.test.tsx     |  90 ++++++++
 .../TaskDetailModal.external-block.test.tsx        |  39 ++++
 .../app/components/dashboard/MainContent.tsx       |   5 +
 .../app/components/overflowViewRegistry.tsx        |   2 +
 .../app/components/useRightDockController.tsx      |   4 +
 .../utils/__tests__/taskStatusBadgeLabel.test.ts   |   6 +
 .../dashboard/app/utils/taskStatusBadgeLabel.ts    |   4 +
 .../routes-task-external-block-resume.test.ts      | 213 +++++++++++++++++++
 .../src/__tests__/task-retry-stage-route.test.ts   |   3 +-
 .../src/routes/register-task-workflow-routes.ts    |   9 +
 .../src/routes/task-external-block-resume.ts       | 112 ++++++++++
 ...executor-external-block-session-failure.test.ts |  77 +++++++
 .../__tests__/executor-task-done-blocked.test.ts   |  54 +++++
 .../external-block-freeze-contract.test.ts         |  51 +++++
 .../__tests__/pipeline-smoke/_pipeline-drivers.ts  |  21 +-
 .../__tests__/pipeline-smoke/_pipeline-harness.ts  | 126 ++++++++++-
 .../pipeline-smoke/_pipeline-scenarios.ts          |  22 +-
 .../pipeline-smoke/_pipeline-terminal-state.ts     |   3 +
 .../pipeline-nominal-and-review.pipeline.test.ts   |   2 +-
 .../pipeline-resilience.pipeline.test.ts           |   2 +-
 .../pipeline-terminal-state.pipeline.test.ts       |  10 +
 .../scheduler-external-block-resources.test.ts     |  57 +++++
 .../__tests__/scheduler-overlap-starvation.test.ts |   8 +-
 .../self-healing-external-block-immunity.test.ts   | 236 +++++++++++++++++++++
 .../self-healing-leaked-slot-reaper.test.ts        |  21 ++
 packages/engine/src/execution-block-classifier.ts  |  39 ++++
 .../src/executor/clear-phantom-executor-binding.ts |   7 +-
 .../engine/src/executor/create-task-done-tool.ts   |  69 +++++-
 packages/engine/src/executor/execution-prompt.ts   |   1 +
 .../route-graph-failure-to-execution-resume.ts     |   6 +-
 packages/engine/src/executor/run-implementation.ts |  93 ++++++--
 .../src/executor/task-executor-session-facades.ts  |   2 +-
 packages/engine/src/runtimes/in-process-runtime.ts |   2 +-
 packages/engine/src/scheduler.ts                   |  16 +-
 packages/engine/src/self-healing.ts                |  22 +-
 packages/engine/src/util/run-audit.ts              |   3 +
 packages/i18n/locales/en/app.json                  |  11 +-
 packages/i18n/locales/es/app.json                  |  11 +-
 packages/i18n/locales/fr/app.json                  |  11 +-
 packages/i18n/locales/ko/app.json                  |  11 +-
 packages/i18n/locales/pt-BR/app.json               |  11 +-
 packages/i18n/locales/zh-CN/app.json               |  11 +-
 packages/i18n/locales/zh-TW/app.json               |  11 +-
 packages/i18n/src/resources.d.ts                   |  11 +-
 85 files changed, 2067 insertions(+), 69 deletions(-)

Fusion-Task-Id: FN-209

Fusion-Task-Lineage: cf7811bb-94f8-4f7a-8a2f-468f19074b9b

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 05:54:10 +00:00
Fusion Agent
26f2a2080a FN-207: contain lifecycle moves within valid workflow paths
Contain task lifecycle movement within the workflow graph so cards cannot wander between columns.

- Enforce directional transition and containment policies across task, recovery, merge, and workspace flows.
- Centralize lifecycle move execution, provenance, reason logging, and live-column rebound handling.
- Add regression, forbidden-path, remediation-placement, and workspace reuse coverage.

Files changed:
 .changeset/fn-207-lifecycle-containment.md         |   7 +
 AGENTS.md                                          |   2 +
 docs/architecture.md                               |   1 +
 docs/workflow-steps.md                             |   2 +
 .../__tests__/lifecycle-direction-policy.test.ts   |  88 ++++++
 .../lifecycle-move-provenance-emit.test.ts         | 107 +++++++
 .../__tests__/remediation-step-placement.test.ts   |  51 ++++
 packages/core/src/index.gate.ts                    |  11 +-
 packages/core/src/index.ts                         |  21 +-
 packages/core/src/store.ts                         |  25 +-
 packages/core/src/task-store/lifecycle-ops.ts      |  21 +-
 packages/core/src/task-store/moves.ts              |  28 +-
 .../core/src/task-store/remediation-step-ops.ts    |  19 +-
 .../core/src/tasks/remediation-step-placement.ts   |  43 +++
 .../src/workflows/workflow-lifecycle-direction.ts  | 167 +++++++++++
 .../src/workflows/workflow-lifecycle-traits.ts     |  32 +++
 .../src/workflows/workflow-transition-policy.ts    |  56 +++-
 .../auto-recovery-branch-worktree.test.ts          |  25 +-
 .../executor-browser-verification.test.ts          |   6 +-
 ...ecutor-execution-policy-renamed-columns.test.ts |  19 +-
 .../__tests__/executor-graph-requeue-gate.test.ts  |  16 +-
 .../src/__tests__/executor-step-session.test.ts    |  20 +-
 .../__tests__/fix-steps-from-failed-gates.test.ts  |  66 ++++-
 .../__tests__/lifecycle-containment-resume.test.ts | 142 +++++++++
 .../__tests__/lifecycle-forbidden-paths.test.ts    | 319 +++++++++++++++++++++
 .../__tests__/lifecycle-move-legibility.test.ts    | 157 ++++++++++
 .../__tests__/lifecycle-move-reason-census.test.ts | 101 +++++++
 .../__tests__/merger-ai-renamed-columns.test.ts    |  28 +-
 packages/engine/src/__tests__/merger-ai.test.ts    |  22 +-
 .../merger-finalize-unproven.real-git.test.ts      |  26 +-
 .../auto-revive-and-watchdog.test.ts               |  10 +-
 .../merge-node-paused-abort-retryable.test.ts      |  14 +-
 .../worktree-incomplete-session-start.test.ts      |  13 +-
 .../engine/src/__tests__/replan-target.test.ts     |  48 +++-
 .../__tests__/restart-recovery-coordinator.test.ts |   9 +-
 .../__tests__/review-history-preservation.test.ts  |  32 ++-
 .../src/__tests__/reviewer-workspace.test.ts       |   6 +-
 .../src/__tests__/self-healing-trait-rekey.test.ts |  15 +-
 packages/engine/src/__tests__/self-healing.test.ts | 163 ++++++++++-
 .../verification-failure-named-remediation.test.ts |  54 ++--
 .../workflow-graph-optional-step-fix.test.ts       |  62 +++-
 .../workflow-merge-rebound-live-e2e.pg.test.ts     |   2 +-
 .../engine/src/__tests__/workspace-merger.test.ts  |   6 +-
 .../workspace-node-worktree-reuse.test.ts          | 188 ++++++++++++
 .../src/auto-recovery-handlers/branch-worktree.ts  |  28 +-
 .../src/auto-recovery-handlers/contamination.ts    |  30 +-
 .../engine/src/execution/lifecycle-move-log.ts     |  77 +++++
 packages/engine/src/execution/lifecycle-move.ts    |  63 ++++
 packages/engine/src/execution/replan-target.ts     |  51 +++-
 .../executor/append-review-remediation-steps.ts    |  72 ++++-
 ...block-outer-dispatch-when-ephemeral-disabled.ts |   1 +
 .../src/executor/bounce-verification-failure.ts    |  53 ++--
 .../engine/src/executor/completion-finalization.ts |   1 +
 .../engine/src/executor/create-task-done-tool.ts   |  29 +-
 .../src/executor/dependency-dispatch-gate.ts       |   1 +
 .../executor/ensure-graph-custom-node-worktree.ts  |  19 +-
 .../engine/src/executor/handle-graph-failure.ts    |   7 +-
 .../engine/src/executor/recover-completed-task.ts  |   4 +-
 .../request-pre-merge-optional-step-fix.ts         |  40 ++-
 .../src/executor/required-artifact-recovery.ts     |   7 +-
 .../src/executor/review-convergence-ladder.ts      |   5 +-
 .../route-graph-failure-to-execution-resume.ts     |  28 +-
 .../engine/src/executor/run-graph-custom-node.ts   |  30 +-
 packages/engine/src/executor/run-implementation.ts |   6 +-
 .../engine/src/executor/workflow-rerun-bounce.ts   |  54 ++--
 .../engine/src/executor/workflow-rerun-watchdog.ts |   6 +-
 .../src/healing/restart-recovery-coordinator.ts    |  30 +-
 packages/engine/src/merge/merger-ai.ts             |  66 +++--
 packages/engine/src/merger.ts                      |  46 +--
 .../__tests__/notification-service.test.ts         |  13 +-
 packages/engine/src/project-engine.ts              |   7 +-
 .../src/recovery/foreign-only-contamination.ts     |  30 +-
 packages/engine/src/scheduler.ts                   |   4 +-
 packages/engine/src/self-healing.ts                | 120 +++++---
 .../self-healing/auto-recover-worktree-session.ts  |  32 ++-
 .../engine/src/workflow-column-boundary-hooks.ts   |   1 +
 .../workflow-node-runners/parse-steps-runner.ts    |  10 +-
 scripts/lib/lifecycle-column-census-baseline.json  |   3 +-
 78 files changed, 2750 insertions(+), 474 deletions(-)

Fusion-Task-Id: FN-207

Fusion-Task-Lineage: a64a49f7-e06b-4b33-94c6-d43a4b027610

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 05:12:39 +00:00
Fusion Agent
156919e8ae FN-211: route duplicates to a selected workflow
Let task duplication target an explicit workflow and make Planning Mode use the settings default workflow.

- Add workflow selection through duplicate-task APIs, store operations, and dashboard actions.
- Add workflow picker and confirmation UI across task cards, lists, detail views, and grouped worktrees.
- Route Planning Mode task creation through the configured default workflow.
- Add localized labels, documentation, changeset metadata, and focused tests.

Files changed:
 .changeset/fn-211-duplicate-workflow-picker.md     |   7 +
 docs/dashboard-guide.md                            |   2 +
 docs/task-management.md                            |   1 +
 .../__tests__/duplicate-workflow-selection.test.ts |  48 +++++++
 .../postgres/refine-duplicate-task.pg.test.ts      | 101 +++++++++++++++
 packages/core/src/index.ts                         |   8 ++
 packages/core/src/store.ts                         |   4 +-
 .../src/task-store/duplicate-workflow-selection.ts |  43 +++++++
 packages/core/src/task-store/project-store-ops.ts  |  70 ++++++++--
 .../dashboard/app/api/tasks/tasks-lifecycle.ts     |  14 +-
 packages/dashboard/app/components/AppModals.tsx    |   2 +-
 packages/dashboard/app/components/Board.tsx        |   2 +-
 packages/dashboard/app/components/Column.tsx       |   2 +-
 .../dashboard/app/components/ConfirmDialog.css     |  13 ++
 .../dashboard/app/components/ConfirmDialog.tsx     |  21 +++
 packages/dashboard/app/components/ListView.tsx     |  25 ++--
 .../dashboard/app/components/PlanningModeModal.tsx |  23 +++-
 packages/dashboard/app/components/TaskCard.tsx     |  27 ++--
 .../dashboard/app/components/TaskDetailModal.tsx   |  27 ++--
 .../dashboard/app/components/WorktreeGroup.tsx     |   2 +-
 .../components/__tests__/ConfirmDialog.test.tsx    |  54 +++++++-
 .../app/components/__tests__/ListView.test.tsx     |  39 +++++-
 .../PlanningModeModal.workflow-routing.test.tsx    | 143 +++++++++++++++++++++
 .../app/components/__tests__/TaskCard.test.tsx     |  25 +++-
 .../TaskDetailModal.definition-actions.test.tsx    |  65 ++++++++--
 .../__tests__/TaskDetailModal.test-helpers.ts      |   4 +
 .../dashboard/app/components/dashboard/types.ts    |   2 +-
 .../app/components/useRightDockController.tsx      |   2 +-
 .../app/hooks/__tests__/useConfirm.test.ts         |  51 +++++++-
 packages/dashboard/app/hooks/useConfirm.ts         |  50 ++++++-
 packages/dashboard/app/hooks/useTasks.ts           |   4 +-
 .../utils/__tests__/duplicateTaskAction.test.ts    |  83 ++++++++++++
 .../__tests__/duplicateWorkflowChoices.test.ts     |  96 ++++++++++++++
 .../dashboard/app/utils/duplicateTaskAction.ts     |  73 +++++++++++
 .../app/utils/duplicateWorkflowChoices.ts          |  34 +++++
 .../src/__tests__/routes-planning.test.ts          |  49 +++++++
 .../routes-tasks-duplicate-workflow.test.ts        |  85 ++++++++++++
 .../src/routes/register-planning-subtask-routes.ts |  12 +-
 .../src/routes/register-task-workflow-routes.ts    |  18 ++-
 packages/engine/src/agent-tools.ts                 |   2 +-
 packages/i18n/locales/en/app.json                  |   5 +-
 packages/i18n/locales/es/app.json                  |   3 +-
 packages/i18n/locales/fr/app.json                  |   3 +-
 packages/i18n/locales/ko/app.json                  |   3 +-
 packages/i18n/locales/pt-BR/app.json               |   3 +-
 packages/i18n/locales/zh-CN/app.json               |   3 +-
 packages/i18n/locales/zh-TW/app.json               |   3 +-
 packages/i18n/src/resources.d.ts                   |   5 +-
 48 files changed, 1250 insertions(+), 111 deletions(-)

Fusion-Task-Id: FN-211

Fusion-Task-Lineage: 9dc84520-39ff-4c60-b4ac-b7be81574ff9

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 04:55:17 +00:00
Fusion Agent
1ffd20263e FN-210: show initiating prompt in Planning Mode history
Expose the prompt that started a Planning Mode session wherever its history is reviewed.

- Add a reusable read-only PlanningSessionPrompt display for history, errors, and plan-review Q&A.
- Integrate prompt rendering and responsive styling into PlanningModeModal.
- Document the Planning Mode history behavior and add a minor release changeset.
- Cover populated, missing, long, and responsive prompt states with dashboard tests.

Files changed:
 .changeset/fn-210-planning-session-prompt.md       |   7 +
 docs/dashboard-guide.md                            |   3 +
 .../dashboard/app/components/PlanningModeModal.css |   9 +
 .../dashboard/app/components/PlanningModeModal.tsx |  26 +-
 .../app/components/PlanningSessionPrompt.css       |  29 +++
 .../app/components/PlanningSessionPrompt.tsx       |  37 +++
 .../PlanningModeModal.session-prompt.test.tsx      | 280 +++++++++++++++++++++
 .../__tests__/PlanningSessionPrompt.test.tsx       |  48 +++
 8 files changed, 435 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-210
Fusion-Task-Lineage: 08201db3-7b1b-4567-95e0-1e97dc3a7ae6
Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 04:06:49 +00:00
Fusion Agent
becaacccc4 FN-208: add task history reports to task details
Add a History tab that presents per-stage task reports and persists the underlying report data.

- Add task-step report storage, migration, serialization, and execution summaries.
- Render per-stage report accordions with localized labels in TaskDetailModal.
- Add dashboard, core, engine, and schema regression coverage.

Files changed:
 .changeset/fn-208-task-history-tab.md              |   7 +
 docs/dashboard-guide.md                            |   1 +
 .../src/__tests__/postgres/schema-applier.test.ts  |   5 +-
 .../core/src/__tests__/task-step-reports.test.ts   | 161 +++++++++++++++++++
 packages/core/src/index.gate.ts                    |   3 +-
 packages/core/src/index.ts                         |   3 +-
 .../migrations/0068_fn_208_task_step_reports.sql   |   3 +
 packages/core/src/postgres/schema-applier.ts       |  26 ++-
 packages/core/src/postgres/schema/project.ts       |   1 +
 packages/core/src/store.ts                         |   2 +-
 packages/core/src/task-store/merge-queue-ops.ts    |  18 ++-
 packages/core/src/task-store/persistence.ts        |   4 +-
 packages/core/src/task-store/serialization.ts      |   1 +
 packages/core/src/task-store/task-row-mappers.ts   |   2 +-
 packages/core/src/types.ts                         |   2 +
 packages/core/src/types/task/task-core.ts          |   3 +
 packages/core/src/types/task/task-log.ts           |  14 ++
 packages/core/src/workflows/task-step-reports.ts   |  49 ++++++
 .../dashboard/app/components/TaskDetailModal.tsx   |  37 ++++-
 .../dashboard/app/components/TaskHistoryTab.css    | 161 +++++++++++++++++++
 .../dashboard/app/components/TaskHistoryTab.tsx    | 119 ++++++++++++++
 .../TaskDetailModal.attachments-and-tabs.test.tsx  |  18 ++-
 ...skDetailModal.models-progress-workflow.test.tsx |  46 ++++++
 .../components/__tests__/TaskHistoryTab.test.tsx   |  84 ++++++++++
 .../app/utils/__tests__/taskHistory.test.ts        |  98 ++++++++++++
 packages/dashboard/app/utils/taskHistory.ts        | 174 +++++++++++++++++++++
 .../src/__tests__/executor-step-summary.test.ts    |  89 +++++++++++
 packages/engine/src/agent-tools.ts                 |  10 +-
 .../engine/src/executor/create-task-update-tool.ts |  12 +-
 packages/engine/src/executor/execution-prompt.ts   |   2 +-
 packages/i18n/locales/en/app.json                  |  46 ++++++
 packages/i18n/locales/es/app.json                  |  48 +++++-
 packages/i18n/locales/fr/app.json                  |  48 +++++-
 packages/i18n/locales/ko/app.json                  |  48 +++++-
 packages/i18n/locales/pt-BR/app.json               |  48 +++++-
 packages/i18n/locales/zh-CN/app.json               |  48 +++++-
 packages/i18n/locales/zh-TW/app.json               |  48 +++++-
 packages/i18n/src/resources.d.ts                   |  46 ++++++
 38 files changed, 1501 insertions(+), 34 deletions(-)

Fusion-Task-Id: FN-208

Fusion-Task-Lineage: 62318171-9316-4369-8294-07b3b9dd283d

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 02:55:51 +00:00
Fusion Agent
c0e99dff10 FN-206: collapse task recovery to retry, reset, and delete
Simplify task recovery into three predictable operator actions across the dashboard and lifecycle APIs.

- Replace restart-stage recovery with Retry, Reset, and Delete actions.
- Update task cards, lists, detail views, menus, translations, routes, and documentation.
- Add focused retry behavior tests and remove obsolete restart-stage coverage.

Files changed:
 .changeset/fn-206-removal.md                       |   7 ++
 docs/dashboard-guide.md                            |  10 +-
 docs/task-management.md                            |   2 +-
 packages/core/src/tasks/task-column-restart.ts     |   6 +-
 packages/dashboard/app/App.tsx                     |   9 +-
 packages/dashboard/app/api/legacy.ts               |   1 -
 .../dashboard/app/api/tasks/tasks-lifecycle.ts     |   8 --
 packages/dashboard/app/components/AppModals.tsx    |   3 +-
 packages/dashboard/app/components/Board.tsx        |   6 +-
 packages/dashboard/app/components/Column.tsx       |   5 +-
 packages/dashboard/app/components/ListView.tsx     |  50 +++------
 packages/dashboard/app/components/TaskCard.tsx     |  82 ++++----------
 .../dashboard/app/components/TaskContextMenu.tsx   |  81 +++-----------
 .../dashboard/app/components/TaskDetailModal.tsx   | 120 ++++++++-------------
 .../dashboard/app/components/WorktreeGroup.tsx     |   6 +-
 .../__tests__/RestartStage.host-inventory.test.tsx |  20 ----
 .../app/components/__tests__/TaskCard.test.tsx     |  35 +++---
 .../components/__tests__/TaskContextMenu.test.tsx  |  64 ++++-------
 .../__tests__/TaskDetailModal.rendering.test.tsx   |  17 +--
 ...etailModal.responsive-and-dependencies.test.tsx |  11 +-
 .../components/__tests__/TaskDetailModal.test.tsx  |  35 ++++--
 .../__tests__/TaskRetry.host-inventory.test.tsx    |  23 ++++
 .../app/components/dashboard/MainContent.tsx       |   7 +-
 .../dashboard/app/components/dashboard/types.ts    |   1 -
 .../app/components/useRightDockController.tsx      |   2 -
 packages/dashboard/app/hooks/useTasks.ts           |   6 +-
 .../app/task-modal-touch-resize-e2e-fixture.tsx    |   4 +-
 .../app/utils/__tests__/taskRetryCopy.test.ts      |  27 +++++
 packages/dashboard/app/utils/taskRecovery.ts       |   5 +
 packages/dashboard/app/utils/taskRetryCopy.ts      |  60 +++++++++++
 .../routes-task-retry-stale-merge-status.test.ts   |   4 +-
 ...oute.test.ts => task-retry-stage-route.test.ts} |  96 +++++++++++++----
 .../src/routes/register-task-workflow-routes.ts    |  63 +++++++----
 .../dashboard/src/routes/task-restart-stage.ts     |  37 ++++---
 packages/i18n/locales/en/app.json                  |  27 ++---
 packages/i18n/locales/es/app.json                  |  27 ++---
 packages/i18n/locales/fr/app.json                  |  27 ++---
 packages/i18n/locales/ko/app.json                  |  27 ++---
 packages/i18n/locales/pt-BR/app.json               |  27 ++---
 packages/i18n/locales/zh-CN/app.json               |  27 ++---
 packages/i18n/locales/zh-TW/app.json               |  27 ++---
 packages/i18n/src/resources.d.ts                   |  25 +++--
 42 files changed, 589 insertions(+), 538 deletions(-)

Fusion-Task-Id: FN-206

Fusion-Task-Lineage: 7ddc5f34-aaf3-4472-8663-6a5d12f40b6d

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 01:42:27 +00:00
Fusion Agent
b802d4b3fb FN-205: keep the activity feed live and harden resume diagnostics
Keep task activity updates fresh while making resume diagnostics tolerate missing or invalid task identifiers.

- Preserve live activity-feed freshness during task hydration and modal updates.
- Centralize resume trigger handling and prevent malformed diagnostics requests from returning 400 errors.
- Expand dashboard regression coverage and document the updated behavior.

Files changed:
 .changeset/fn-205-feed-freshness.md                |   7 +
 docs/dashboard-guide.md                            |   2 +
 docs/diagnostics.md                                |   6 +-
 .../dashboard/app/components/TaskDetailModal.tsx   | 124 ++++++--
 ...TaskDetailModal.feed-stripped-snapshot.test.tsx | 311 ++++++++++++++++++---
 .../__tests__/TaskDetailModal.test-helpers.ts      |  10 +-
 .../components/__tests__/TaskDetailModal.test.tsx  |  38 +--
 .../__tests__/useTasks-hydration-freshness.test.ts |  63 +++++
 packages/dashboard/app/hooks/useTasks.ts           |  20 +-
 .../utils/__tests__/resumeInstrumentation.test.ts  |  34 ++-
 .../dashboard/app/utils/resumeInstrumentation.ts   |  18 +-
 .../__tests__/register-diagnostics-routes.test.ts  |  39 ++
 .../src/routes/register-diagnostics-routes.ts      |  15 +-
 packages/dashboard/src/shared/resume-triggers.ts   |  28 ++
 14 files changed, 577 insertions(+), 138 deletions(-)

Fusion-Task-Id: FN-205

Fusion-Task-Lineage: dc2e0fd3-741e-4560-91bc-14a31f688d5c

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-28 00:56:25 +00:00
Fusion Agent
d16c8d650b FN-204: add task stage restart controls
Add an operator restart action that reruns a task from its current workflow stage.

- Add core stage-restart planning and task lifecycle API support.
- Expose restart controls across board, list, detail, and grouped task views.
- Add localized labels, documentation, and route/core regression coverage.

Files changed:
 .changeset/fn-204-restart-stage.md                 |   7 +
 docs/dashboard-guide.md                            |   8 +-
 .../core/src/__tests__/task-column-restart.test.ts | 112 +++++++
 packages/core/src/index.gate.ts                    |  10 +
 packages/core/src/index.ts                         |  10 +
 packages/core/src/tasks/task-column-restart.ts     | 176 +++++++++++
 packages/dashboard/app/App.tsx                     |   7 +-
 packages/dashboard/app/api/legacy.ts               |   1 +
 .../dashboard/app/api/tasks/tasks-lifecycle.ts     |   8 +
 packages/dashboard/app/components/AppModals.tsx    |   2 +
 packages/dashboard/app/components/Board.tsx        |  10 +-
 packages/dashboard/app/components/Column.tsx       |   5 +-
 packages/dashboard/app/components/ListView.tsx     |  22 +-
 packages/dashboard/app/components/TaskCard.tsx     |  24 ++
 .../dashboard/app/components/TaskContextMenu.tsx   |  13 +
 .../dashboard/app/components/TaskDetailModal.tsx   |  25 ++
 .../dashboard/app/components/WorktreeGroup.tsx     |   8 +-
 .../__tests__/RestartStage.host-inventory.test.tsx |  20 ++
 .../components/__tests__/TaskContextMenu.test.tsx  |  11 +
 .../app/components/dashboard/MainContent.tsx       |  11 +-
 .../dashboard/app/components/dashboard/types.ts    |   1 +
 .../app/components/useRightDockController.tsx      |   2 +
 packages/dashboard/app/hooks/useTasks.ts           |   6 +-
 .../app/task-modal-touch-resize-e2e-fixture.tsx    |   4 +-
 .../src/__tests__/task-restart-stage-route.test.ts | 322 +++++++++++++++++++++
 .../src/routes/register-task-workflow-routes.ts    |  21 ++
 .../dashboard/src/routes/task-restart-stage.ts     | 166 +++++++++++
 packages/engine/src/index.ts                       |   1 +
 packages/i18n/locales/en/app.json                  |   6 +
 packages/i18n/locales/es/app.json                  |   6 +
 packages/i18n/locales/fr/app.json                  |   6 +
 packages/i18n/locales/ko/app.json                  |   6 +
 packages/i18n/locales/pt-BR/app.json               |   6 +
 packages/i18n/locales/zh-CN/app.json               |   6 +
 packages/i18n/locales/zh-TW/app.json               |   6 +
 packages/i18n/src/resources.d.ts                   |   6 +
 36 files changed, 1044 insertions(+), 17 deletions(-)

Fusion-Task-Id: FN-204

Fusion-Task-Lineage: dd8a4493-0db8-41c3-8fe3-cf8ff30e59d5

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 23:33:27 +00:00
Fusion Agent
97fcc5a7ad FN-203: support safe workspace task reset
Enable reset to cancel and clean up workspace tasks without deleting the coordinator directory.

- Plan per-repository reset targets using workspace layout and ownership checks
- Reserve, cancel, and remove workspace worktrees safely while clearing leases and land intents
- Document and test workspace reset behavior and publication cleanup

Files changed:
 .changeset/fn-203-workspace-task-reset.md          |   7 +
 docs/dashboard-guide.md                            |   6 +-
 docs/workspaces.md                                 |   6 +
 .../postgres/task-reset-publication.pg.test.ts     |  41 +++
 .../core/src/__tests__/task-reset-targets.test.ts  | 134 +++++++++
 packages/core/src/index.gate.ts                    |   2 +
 packages/core/src/index.ts                         |   2 +
 packages/core/src/task-store/reset-lifecycle.ts    |  16 ++
 packages/core/src/tasks/task-reset-targets.ts      | 103 +++++++
 .../task-reset-workspace-lifecycle.test.ts         | 306 +++++++++++++++++++++
 .../src/routes/register-task-workflow-routes.ts    | 200 +++++++++-----
 11 files changed, 753 insertions(+), 70 deletions(-)

Fusion-Task-Id: FN-203

Fusion-Task-Lineage: ac2406cb-6199-4c6b-82aa-d4790a677e6b

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 22:26:42 +00:00
gsxdsm
8fa9acbd6d FN-9216: add the Flexoki dashboard theme
Add the Flexoki palette as a fully persisted dashboard theme across web and desktop.

- register Flexoki in shared theme types, selectors, startup validators, and preview swatches
- define coordinated dark and light token palettes with regression coverage
- document theme availability and add a minor release changeset

Files changed:
 .changeset/fn-9216-flexoki-theme.md                |   6 ++
 docs/dashboard-guide.md                            |   5 +-
 docs/settings-reference.md                         |   3 +-
 packages/core/src/types/ui/execution-and-ui.ts     |   2 +
 .../dashboard/app/__tests__/flexoki-theme.test.ts  | 102 +++++++++++++++++++++
 .../dashboard/app/components/ThemeSelector.css     |  15 +++
 .../components/__tests__/ThemeDropdown.test.tsx    |   2 +-
 .../components/__tests__/ThemeSelector.test.tsx    |   2 +-
 .../__tests__/CommandCenterControls.test.tsx       |   2 +-
 packages/dashboard/app/components/themeOptions.ts  |   2 +
 packages/dashboard/app/index.html                  |   3 +-
 packages/dashboard/app/public/theme-data.css       |  85 +++++++++++++++++
 packages/desktop/src/renderer/index.html           |   2 +
 13 files changed, 224 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-9216

Fusion-Task-Lineage: cd89ff1a-6b08-4e3d-9103-993f04d583f3

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-27 14:36:04 -07:00
gsxdsm
0fd247b589 FN-9214: deliver secret values in model-visible tool content
Make policy-approved fn_secret_get reads visible to calling agents without weakening refusal paths.

- Include revealed plaintext in tool content for automatic and redeemed approval reads while retaining details.value.
- Keep denied, pending, missing, and ambiguous outcomes plaintext-free and audit metadata sanitized.
- Add PostgreSQL-backed regression coverage, shared secret-store test setup, documentation, and a patch changeset.

Files changed:
 .changeset/fn-9214-secret-get-value-delivery.md    |   7 ++
 docs/architecture.md                               |   2 +-
 docs/secrets.md                                    |  11 ++-
 .../__tests__/extension-permission-gates.test.ts   |  43 ++-------
 .../extension-secret-get-value-delivery.test.ts    | 101 +++++++++++++++++++++
 packages/cli/src/__tests__/pg-extension-harness.ts |  18 +++-
 packages/cli/src/extension.ts                      |  17 +++-
 7 files changed, 156 insertions(+), 43 deletions(-)

Fusion-Task-Id: FN-9214

Fusion-Task-Lineage: 2738aa00-9e67-4282-b950-01ed33431cfc

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-27 14:36:04 -07:00
gsxdsm
25f24c7439 FN-9215: scope skill discovery to selected projects
Resolve skill inventory and catalog installation state against the dashboard's selected project.

- create project-rooted package managers for daemon, dashboard, and serve entry points
- discover and deduplicate project-local Fusion, Pi, and agent skills with stable precedence
- annotate catalog entries as installed and refresh catalog state after installation
- document project-scoped behavior and add CLI, route, adapter, desktop, and mobile coverage

Files changed:
 .changeset/fn-9215-project-scoped-skills.md        |   7 +
 docs/dashboard-guide.md                            |   6 +-
 .../__tests__/skills-package-manager.test.ts       |  50 +++++++
 packages/cli/src/commands/daemon.ts                |   2 +
 packages/cli/src/commands/dashboard.ts             |   2 +
 packages/cli/src/commands/serve.ts                 |   2 +
 .../cli/src/commands/skills-package-manager.ts     |  15 +++
 packages/dashboard/app/components/SkillsView.tsx   |  10 +-
 .../app/components/__tests__/SkillsView.test.tsx   |   7 +-
 .../__tests__/skills-view-mobile.test.tsx          |  23 ++++
 .../__tests__/skills-adapter-project-scope.test.ts |  94 +++++++++++++
 .../__tests__/register-agent-skills-routes.test.ts | 146 +++++++++++++++++++--
 .../src/routes/register-agent-skills-routes.ts     |   8 +-
 packages/dashboard/src/skills-adapter.ts           | 109 ++++++++++++---
 14 files changed, 440 insertions(+), 41 deletions(-)

Fusion-Task-Id: FN-9215

Fusion-Task-Lineage: 79da1b10-f317-4df9-af49-1d65b0825c55

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-27 14:36:04 -07:00
Fusion Agent
906692006a FN-202: add workspace merge parity coverage
Verify workspace main-checkout completion handling and multi-repository merge parity through documentation and regression coverage.

- Document workspace completion and merge parity expectations.
- Cover main-checkout guard wedges, lifecycle parity, and workspace merger behavior.

Files changed:
 docs/settings-reference.md                         |   1 +
 docs/workspaces.md                                 |   2 +
 .../executor-workspace-main-checkout-guard.test.ts | 147 +++++++++++++-
 .../__tests__/workspace-lifecycle-parity.test.ts   | 102 +++++++++-
 .../engine/src/__tests__/workspace-merger.test.ts  | 219 ++++++++++++++++++++-
 5 files changed, 464 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-202

Fusion-Task-Lineage: 0e0eda72-40c8-45f8-a767-18c27a6ad6d1

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 21:35:29 +00:00
Fusion Agent
5c111be5f2 FN-198: remove task move affordances from dashboard
Remove manual task-movement controls throughout the dashboard while preserving task detail and workflow behavior.

- Remove Move to controls and supporting handlers from board, list, card, context-menu, and task-detail surfaces.

- Update localized strings, documentation, responsive styling, and affected tests.

- Add regression coverage and a release changeset for the dashboard affordance removal.

Files changed:

 .changeset/fn-198-removal.md                       |   7 +
 docs/dashboard-guide.md                            |   6 +-
 docs/task-management.md                            |   8 +-
 packages/dashboard/app/App.tsx                     |   3 +-
 .../task-detail-modal-tablet-width.test.ts         |  10 +-
 packages/dashboard/app/components/AppModals.tsx    |   1 -
 packages/dashboard/app/components/Board.tsx        |   2 +-
 packages/dashboard/app/components/Column.tsx       |  94 +---
 packages/dashboard/app/components/Lane.tsx         |   2 +-
 packages/dashboard/app/components/ListView.tsx     | 103 +---
 packages/dashboard/app/components/TaskCard.tsx     | 125 +----
 .../dashboard/app/components/TaskContextMenu.tsx   | 222 +--------
 .../dashboard/app/components/TaskDetailModal.css   | 118 +----
 .../dashboard/app/components/TaskDetailModal.tsx   | 269 +----------
 .../app/components/__tests__/Column.test.tsx       |  57 +--
 .../app/components/__tests__/ListView.test.tsx     |  32 --
 .../app/components/__tests__/TaskCard.test.tsx     | 286 +----------
 .../components/__tests__/TaskContextMenu.test.tsx  | 181 ++-----
 .../TaskDetail.mobile-transition.test.tsx          |   4 -
 .../TaskDetailModal.allow-resurrection.test.tsx    |   4 -
 .../TaskDetailModal.attachments-and-tabs.test.tsx  |  44 +-
 .../TaskDetailModal.create-pr-e2e.test.tsx         |   2 -
 .../TaskDetailModal.create-pr-integration.test.tsx |   2 -
 .../__tests__/TaskDetailModal.create-pr.test.tsx   |   8 -
 .../TaskDetailModal.custom-fields.test.tsx         |   3 -
 .../TaskDetailModal.definition-actions.test.tsx    |  69 +--
 ...TaskDetailModal.feed-stripped-snapshot.test.tsx |   1 -
 ...TaskDetailModal.github-tracking-header.test.tsx |   1 -
 ...ailModal.github-tracking-renamed-lanes.test.tsx |   1 -
 .../TaskDetailModal.github-tracking-stale.test.tsx |   7 -
 .../TaskDetailModal.gitlab-tracking.test.tsx       |   2 -
 ...lModal.inline-editing-and-integrations.test.tsx |  99 +---
 ...skDetailModal.models-progress-workflow.test.tsx |  36 --
 .../TaskDetailModal.oversight-controls.test.tsx    |  40 +-
 .../TaskDetailModal.oversight-mobile.test.tsx      |  18 -
 .../TaskDetailModal.plan-summary.test.tsx          |   3 -
 .../TaskDetailModal.popup-hidden-gating.test.tsx   |   1 -
 .../__tests__/TaskDetailModal.pr-tab.test.tsx      |   3 -
 .../__tests__/TaskDetailModal.refine.test.tsx      |   1 -
 .../__tests__/TaskDetailModal.rendering.test.tsx   | 411 ++++------------
 .../TaskDetailModal.resolved-columns.test.tsx      |   1 -
 ...etailModal.responsive-and-dependencies.test.tsx |  88 +---
 .../__tests__/TaskDetailModal.spec-lock.test.tsx   |   3 -
 .../__tests__/TaskDetailModal.summary-tab.test.tsx |  15 -
 .../TaskDetailModal.tab-persistence.test.tsx       |   1 -
 .../TaskDetailModal.tab-relocation.test.tsx        |   1 -
 .../TaskDetailModal.task-activity-chat.test.tsx    |   8 -
 .../components/__tests__/TaskDetailModal.test.tsx  |  37 --
 .../TaskDetailModal.worktree-terminal.test.tsx     |   4 -
 .../__tests__/core-modals-mobile.test.tsx          |  15 +-
 .../task-move-affordance-removed.test.tsx          | 526 +++++++++++++++++++++
 .../__tests__/workflow-resolved-columns.test.tsx   | 169 +------
 .../app/components/dashboard/MainContent.tsx       |   1 -
 .../app/components/useRightDockController.tsx      |   4 +-
 .../app/task-modal-touch-resize-e2e-fixture.tsx    |   3 +-
 packages/i18n/locales/en/app.json                  |  44 +-
 packages/i18n/locales/es/app.json                  |  44 +-
 packages/i18n/locales/fr/app.json                  |  44 +-
 packages/i18n/locales/ko/app.json                  |  44 +-
 packages/i18n/locales/pt-BR/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                   |  42 +-
 63 files changed, 884 insertions(+), 2628 deletions(-)

Fusion-Task-Id: FN-198

Fusion-Task-Lineage: 21198580-6146-47e7-ae91-6a878e2edd3e

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 21:35:29 +00:00
Fusion Agent
017ebd5059 FN-201: park workspace review revisions for human resolution
Preserve multi-repository review findings and route unresolved REVISE outcomes to human review.

- Qualify workspace findings by repository for durable scope and remediation tracking.
- Preserve findings through graph outcomes and stabilize remediation signatures.
- Park multi-repository review revisions for human resolution with regression coverage.

Files changed:
 .changeset/fn-201-workspace-review-findings.md     |   7 +
 docs/workflow-steps.md                             |   2 +-
 .../__tests__/workspace-review-findings.test.ts    | 198 +++++++++++++++++
 .../workspace-review-remediation-routing.test.ts   | 235 +++++++++++++++++++++
 .../executor/append-review-remediation-steps.ts    | 116 +++++++++-
 .../request-pre-merge-optional-step-fix.ts         |   7 +-
 .../engine/src/executor/run-graph-custom-node.ts   |  54 +++--
 .../src/executor/workspace-review-per-repo.ts      |  46 +++-
 .../src/executor/workspace-review-remediation.ts   |   7 +-
 9 files changed, 638 insertions(+), 34 deletions(-)

Fusion-Task-Id: FN-201

Fusion-Task-Lineage: cb83c4cc-b6fc-4e4c-bd3d-5c855bf2093b

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 21:35:29 +00:00
Fusion Agent
c4e775eb43 FN-200: reuse unified chat model and keep thinking popover open
Reuse the unified Direct Chat model and thinking-level popover behavior across Task Chat surfaces.

- Share the unified model selector and thinking control with Task Chat.
- Keep the thinking popover open while selecting a model and align responsive styling.
- Update documentation and regression coverage for the shared behavior.

Files changed:
 .../fn-200-unified-chat-model-thinking-popover.md  |   7 +
 docs/dashboard-guide.md                            |   8 +-
 .../app/components/ChatThinkingLevelControl.tsx    | 172 +++++++++++++++------
 packages/dashboard/app/components/ChatView.tsx     |   1 +
 .../app/components/TaskPlannerChatTab.css          |  50 ++----
 .../app/components/TaskPlannerChatTab.tsx          |  47 +++---
 .../ChatThinkingLevelControl.portal.test.tsx       |   5 +-
 .../__tests__/ChatThinkingLevelControl.test.tsx    | 168 ++++++++++++++++++--
 .../__tests__/ChatView.thinking-level.test.tsx     |   4 +
 ...etailModal.responsive-and-dependencies.test.tsx |   9 +-
 .../__tests__/TaskPlannerChatTab.test.tsx          |  86 ++++++++++-
 11 files changed, 420 insertions(+), 137 deletions(-)

Fusion-Task-Id: FN-200
Fusion-Task-Lineage: 16e9fbc7-89bf-4492-bed3-c30cdbf85393
Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 21:35:29 +00:00
Fusion Agent
54403ffae9 FN-197: split task detail tabs and report file-scope blockers
Move task attachments, dependencies, blocking, and specification content into focused task-detail tabs while exposing overlapping files as a merge blocker.

- Relocate task-detail definition sections into dedicated tabs with updated responsive styling and localization.
- Add file-scope overlap reporting through dashboard routes and engine scheduling integrations.
- Update affected tests, documentation, and the published-package changeset.

Files changed:
 .changeset/fn-197-task-detail-tab-split.md         |    7 +
 docs/dashboard-guide.md                            |    4 +-
 packages/dashboard/app/api/legacy.ts               |    3 +
 packages/dashboard/app/api/tasks/tasks.ts          |   14 +
 packages/dashboard/app/components/TaskDetailModal.css   |   41 +
 packages/dashboard/app/components/TaskDetailModal.tsx   | 1192 +++++++++++---------
 packages/dashboard/app/components/__tests__/TaskDetailModal.attachments-and-tabs.test.tsx  |   45 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.definition-actions.test.tsx    |   12 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.github-tracking-header.test.tsx |    4 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.github-tracking-renamed-lanes.test.tsx |    2 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.github-tracking-stale.test.tsx |   16 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.gitlab-tracking.test.tsx       |    4 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.inline-editing-and-integrations.test.tsx |   87 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.rendering.test.tsx             |   20 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.responsive-and-dependencies.test.tsx |   30 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.spec-lock.test.tsx             |   18 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.tab-persistence.test.tsx      |    2 +-
 packages/dashboard/app/components/__tests__/TaskDetailModal.tab-relocation.test.tsx        |  198 +++
 packages/dashboard/app/components/__tests__/TaskDetailModal.test-helpers.ts                |    2 +
 packages/dashboard/app/components/__tests__/TaskDetailModal.test.tsx                       |   42 +-
 packages/dashboard/src/__tests__/routes-task-overlap-blocker-report.test.ts                 |   61 +
 packages/dashboard/src/routes/register-task-workflow-routes.ts                               |   17 +
 packages/engine/src/__tests__/file-scope-overlap-report.test.ts                              |   67 ++
 packages/engine/src/execution/file-scope-overlap-report.ts                                   |   79 ++
 packages/engine/src/index.ts                                                                 |   13 +
 packages/engine/src/scheduler.ts                                                             |   48 +
 packages/i18n/locales/en/app.json                                                           |   18 +
 packages/i18n/locales/es/app.json                                                           |   19 +
 packages/i18n/locales/fr/app.json                                                           |   19 +
 packages/i18n/locales/ko/app.json                                                           |   19 +
 packages/i18n/locales/pt-BR/app.json                                                        |   19 +
 packages/i18n/locales/zh-CN/app.json                                                        |   19 +
 packages/i18n/locales/zh-TW/app.json                                                        |   19 +
 packages/i18n/src/resources.d.ts                                                           |   48 +
 34 files changed, 1463 insertions(+), 745 deletions(-)

Fusion-Task-Id: FN-197

Fusion-Task-Lineage: b328ef8c-9445-4154-b401-464d777e1e6e

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 21:35:29 +00:00
Fusion Agent
1d08fcb30d FN-196: restore the New Task modal Start button
Restore the New Task modal's discoverable Start action with validated workflow routing.

- Keep Start visible but disabled until a description is entered.
- Support atomic Coding (Ideas) creation and eligible manual-intake promotion.
- Track Start submission state and expand regression coverage and documentation.

Files changed:
 .changeset/fn-196-new-task-modal-start.md          |   7 +
 docs/dashboard-guide.md                            |   3 +
 packages/dashboard/app/components/NewTaskModal.tsx |  29 ++-
 packages/dashboard/app/components/TaskForm.tsx     |   5 +
 .../app/components/__tests__/NewTaskModal.test.tsx | 219 +++++++++++++++++++--
 .../app/components/__tests__/TaskForm.test.tsx     |  21 +-
 6 files changed, 263 insertions(+), 21 deletions(-)

Fusion-Task-Id: FN-196

Fusion-Task-Lineage: f3b7ff36-8a41-4189-b1c2-6dcf1f18287a

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 21:35:29 +00:00
Fusion Agent
808f4c603b FN-199: request detailed reasoning summaries
Request detailed reasoning bodies for Responses-family model traces while preserving provider fallback behavior.\n\n- Shape supported Responses payloads to request detailed reasoning summaries.\n- Retry once with the prior payload when detailed summaries are rejected.\n- Preserve titled trace bodies across dashboard surfaces and document the setting.\n\nFiles changed:\n .changeset/fn-199-reasoning-summary.md             |   7 +
 docs/dashboard-guide.md                            |   2 +-
 docs/settings-reference.md                         |   4 +
 .../__tests__/ThinkingTrace.surfaces.test.tsx      |  19 +++
 .../components/__tests__/ThinkingTrace.test.tsx    |   4 +
 .../src/__tests__/pi-reasoning-summary.test.ts     | 150 +++++++++++++++++++++
 .../__tests__/reasoning-summary-payload.test.ts    | 102 ++++++++++++++
 .../src/execution/reasoning-summary-payload.ts     |  72 ++++++++++
 packages/engine/src/pi.ts                          |  48 +++++++
 9 files changed, 407 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-199

Fusion-Task-Lineage: a3179f05-e709-4bae-9f4a-5507810717d8

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 21:35:29 +00:00
Fusion Agent
c31c15a8cd FN-195: add plain-language delivery summaries
Add a plain-language What This Delivers summary to task planning prompts and present task details summary-first.

- Add policy and prompt guidance for concise delivery summaries.
- Collapse the task Definition tab into a summary-first plan presentation.
- Add summary extraction, responsive styling, documentation, changeset, and regression coverage.

Files changed:
 .changeset/fn-195-what-this-delivers.md            |   7 +
 AGENTS.md                                          |   1 +
 docs/contributing.md                               |   4 +
 docs/dashboard-guide.md                            |   2 +-
 packages/core/src/__tests__/agent-prompts.test.ts  |  40 +++-
 .../__tests__/original-description-policy.test.ts  |  28 +++
 packages/core/src/agents/agent-prompts.ts          |  26 ++-
 .../core/src/tasks/original-description-policy.ts  |   6 +
 .../dashboard/app/components/TaskDetailModal.css   |  16 ++
 .../dashboard/app/components/TaskDetailModal.tsx   |  56 +++++-
 .../TaskDetailModal.plan-summary.test.tsx          | 177 +++++++++++++++++++++
 .../app/utils/__tests__/taskPlanSummary.test.ts    | 114 +++++++++++++
 packages/dashboard/app/utils/taskPlanSummary.ts    | 118 ++++++++++++++
 packages/engine/src/__tests__/triage.test.ts       |  18 ++-
 14 files changed, 598 insertions(+), 15 deletions(-)

Fusion-Task-Id: FN-195
Fusion-Task-Lineage: a816797b-6f16-4613-9403-665fd19b73ed
Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 21:35:29 +00:00
Fusion Agent
1936c78774 FN-194: prevent involuntary Kanban scroll from text selection
Prevent native text-selection autoscroll from competing with intentional Board panning while preserving editable controls.

- Suppress selection across Board surfaces and restore it for editable descendants.
- Document the scrolling behavior and add CSS and component coverage for responsive and grouped columns.
- Add a patch changeset for the dashboard behavior fix.

Files changed:
 .changeset/fn-194-board-text-selection.md          |   7 +
 docs/dashboard-guide.md                            |   5 +-
 .../app/__tests__/board-text-selection.test.ts     |  86 ++++++++++++
 packages/dashboard/app/components/Board.css        |  20 ++-
 packages/dashboard/app/components/Board.tsx        |   5 +
 .../__tests__/Board.text-selection.test.tsx        | 144 +++++++++++++++++++++
 6 files changed, 264 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-194

Fusion-Task-Lineage: 65f46bed-76f1-4e5f-9dce-7e6ce26b5fa5

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 21:35:29 +00:00
Fusion Agent
e213b94f25 FN-193: open pop-out chats on their originating thread
Ensure chat pop-out windows open on the requested conversation and remain visibly separated without corrupting shared geometry.

- Initialize pop-out chat state from the originating session.
- Preserve per-window cascade offsets and shrink presentation geometry only when necessary.
- Document the behavior and add focused regression coverage.

Files changed:
 .../fn-193-chat-window-thread-and-cascade.md       |   7 +
 docs/dashboard-guide.md                            |   8 +-
 packages/dashboard/app/App.tsx                     |   8 +-
 packages/dashboard/app/components/ChatView.tsx     |   3 +
 .../dashboard/app/components/FloatingWindow.tsx    | 102 ++++++++--
 .../__tests__/ChatView.core-contracts.test.tsx     |  17 +-
 .../__tests__/ChatView.new-chat-default.test.tsx   |  39 +++-
 .../ChatView.pop-out-host-inventory.test.tsx       |  12 ++
 .../FloatingWindow.cascade-separation.test.tsx     | 102 ++++++++++
 .../components/__tests__/FloatingWindow.test.tsx   | 127 +++++++++---
 .../PoppedOutChatWindows.cascade.test.tsx          |  28 +++
 .../PoppedOutChatWindows.opens-on-thread.test.tsx  | 221 +++++++++++++++++++++
 .../PoppedOutChatWindows.stacking.test.tsx         |   3 +-
 .../__tests__/PoppedOutChatWindows.test.tsx        |   4 +-
 .../__tests__/useChat.initial-session.test.ts      | 194 ++++++++++++++++++
 packages/dashboard/app/hooks/useChat.ts            |  12 +-
 16 files changed, 823 insertions(+), 64 deletions(-)

Fusion-Task-Id: FN-193

Fusion-Task-Lineage: d5dc3ea4-1041-4e3a-b665-378bdf32d669

Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-27 21:35:29 +00:00
Fusion Agent
286dd0a7ae fix(workspace): block completion only on main-checkout commits
Uncommitted edits in a sub-repo main checkout no longer refuse `fn_task_done`.
They emit `worktree:workspace-main-checkout-edit` with `outcome:"warned"`,
`reason:"uncommitted-only"`, and their evidence enum instead.

Two measured reasons. The workspace land path is the same `landOneRepo` /
`landSquash` mechanic as single-repo, with `projectRootDir` set to the sub-repo
main checkout, so a dirty tree there is already stashed (untracked included) ->
fast-forwarded -> restored under `merger.allowDirtyLocalCheckoutSync`; refusing
completion for a state the very next stage is built to absorb stops the board
for nothing. And an in-scope status entry carried no timing evidence at all, so
an operator editing the same feature was indistinguishable from an agent that
skipped `fn_acquire_repo_worktree` -- while the refusal named an operator-only
remedy in a message addressed to the agent, so the card could only loop.

The dangerous cases keep their refusals: a task-attributed commit still returns
`main_checkout_edit` (it would reach the shared branch unreviewed), and work
that exists only in a main checkout still fails the acquired-worktree
`no_commits` invariant that actually proves delivery.
2026-08-27 21:35:29 +00:00
Fusion Agent
5769d5cd61 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	packages/dashboard/app/components/DockTaskList.tsx
2026-08-27 02:53:58 +00:00
Fusion Agent
7e537989dc Merge remote-tracking branch 'origin/main'
# Conflicts:
#	packages/core/src/__tests__/settings-defaults.test.ts
#	packages/dashboard/app/components/ChatView.tsx
2026-08-27 02:50:06 +00:00
gsxdsm
922e93cf2b FN-9213: Display reverted tasks as in-column labels
Keep reverted work in its workflow lane while preserving visible resolution controls across dashboard surfaces.

- remove separate reverted sections from the board, list, and right dock
- label reverted tasks in normal list groups and retain Delete and Revise actions
- deduplicate reverted rows during optimistic/refetch overlap and cover desktop and mobile behavior
- document the updated workflow and add a patch changeset

Files changed:
 .changeset/fn-9213-reverted-label-not-column.md    |  7 +++
 docs/dashboard-guide.md                            |  4 +-
 packages/dashboard/app/components/Board.tsx        | 61 ++++++++------------
 packages/dashboard/app/components/Column.tsx       |  9 ++-
 packages/dashboard/app/components/DockTaskList.tsx | 34 +++++------
 packages/dashboard/app/components/ListView.css     |  5 ++
 packages/dashboard/app/components/ListView.tsx     | 41 ++++++++-----
 packages/dashboard/app/components/TaskCard.css     |  1 -
 .../app/components/__tests__/Board.test.tsx        | 47 ++++++++++++---
 .../app/components/__tests__/DockTaskList.test.tsx |  9 ++-
 .../app/components/__tests__/ListView.test.tsx     | 67 ++++++++++++++++++++++
 .../app/components/__tests__/TaskCard.test.tsx     | 13 +++++
 12 files changed, 216 insertions(+), 82 deletions(-)

Fusion-Task-Id: FN-9213

Fusion-Task-Lineage: 3626da0d-185b-4f4a-b59f-72cfdcd1b60c

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-26 19:45:18 -07:00
Fusion Agent
ea869ff38f fix(FN-186): give pipeline-smoke tasks process-unique ids and drain execution on teardown
S05 now covers builtin:coding-ideas-v2. 5/5 consecutive full lanes.

Two harness defects, both of which made a CORRECT engine refusal look like a flake.

1. Task ids collided. The serial lived on the harness instance and reset with it, so
   every test's first task was `FN-182-S05-1`. The engine's process-wide state —
   `executingTaskLock`, `activeSessionRegistry.pathsForTask`, worktree registrations —
   is keyed by task id, so a straggler from the previous test answered for the NEXT
   test's identically-named task and handed it a worktree under the PREVIOUS fixture.
   The serial now lives on the module.

2. Teardown forgot in-flight work instead of waiting for it. `ProjectEngine.stop()`
   clears timers but does not await an execution already inside `execute()`, and the
   harness then called `activeSessionRegistry.clear()` — which hides a live session
   rather than ending it. `dispose()` now drains `executingTaskLock` and the registry
   for its own task ids, bounded, and THROWS on expiry: a straggler that outlives the
   budget is a real defect, and a silent continue would restore the leak.

Throughout this, the product was right. The executor detected the foreign worktree,
refused it (`outside_worktrees_dir`), retried, exhausted its budget and failed
visibly. That refusal is the desired behaviour and was never the bug — the harness
was manufacturing the condition.

Budget re-baselined 150s -> 175s for attributable growth: a 7th file (the remediation
drive) and S05 on V2, one of the longest scenarios. Five runs at 140.1-148.4s left
under 2s of headroom against the old ceiling, which is a flake waiting to happen. The
standing rule is unchanged and now has three precedents: growth must be nameable, or
it is a regression to fix rather than a budget to raise.

pnpm lint 0 errors, test:gate, verify:fast, engine-pipeline-smoke 90/90, and five
consecutive full runs: 146.0s, 142.6s, 148.5s, 144.8s, 146.3s of the 175s budget.
2026-08-25 21:42:36 +00:00
Fusion Agent
94f660e672 fix(FN-WF): stop a failed merge stranding review-column tasks, and widen V2 coverage
Two review-seal defects, both found by running builtin:coding-ideas-v2 through the
whole scenario matrix rather than the nominal path alone.

1. A DETERMINISTIC verification gate was sealed as write-capable. It needs a
   worktree because it runs the project's test/build commands there, but it only
   reads the tree — `verification-gate.ts` has no mutation path.
   `workflowNodeRequiresWorktree` conflates "needs a worktree" with "writes", and
   its inline-fix branch matches on the node NAME (`/review|verification/i`), so a
   gate named "Verification" was refused after any approval.

2. A gate that already `passed` or was `skipped` was refused on replay. A
   post-approval requeue — a merge conflict, a transient merge failure — walks the
   graph back through gates whose output is already inside the approved tree.
   Refusing them converts a retryable merge into a terminal wedge; re-running them
   would rewrite the tree the review approved. "Already produced, already
   reviewed" now resolves as satisfied. A gate with no result still hits the
   refusal, which is the case the seal exists for.

Measured by pipeline-smoke S13, where a conflicting merge left the card cycling on
documentation-delivery with `workspace-review-seal-required` instead of retrying.

Coverage: builtin:coding-ideas-v2 now runs 16 of the 19 declared scenarios plus
the multi-repository workspace drive, up from 1. The duration budget is
re-baselined 90s -> 150s, and the workload growth is itemised in docs/testing.md:
17 added scenario executions and a second project shape, 124.95s measured against
76.9s for the smaller matrix. Three consecutive full runs: 116.9s, 115.6s, 119.8s.

NOT covered, deliberately and stated rather than hidden: S07 (unactionable review
rejection), S13 (scripted merge-conflict resolution) and S17 (restart resilience)
still run on the original workflows only. S07 and S13 do not converge on V2, and
S17 produced one intermittent post-merge failure in four full-lane runs — a flake
is not something to ship or to paper over, so those three stay uncovered until
they are understood.
2026-08-24 16:21:30 +00:00
gsxdsm
68c466a6ab FN-9209: Gate chat focus behind an experimental flag
Make per-conversation chat memory focus opt-in while preserving stored focus values for compatibility.

- Add the chatFocus experimental setting, exports, documentation, and release changeset.
- Hide and disable focus controls and commands across chat and task-planner composers when the flag is off.
- Apply persisted focus scopes to memory recall only when enabled, with regression coverage for both flag states.

Files changed:
 .changeset/fn-9209-chat-focus-experimental-flag.md |   7 ++
 docs/memory-backend-integration.md                 |   6 +-
 docs/settings-reference.md                         |   3 +-
 .../core/src/__tests__/settings-defaults.test.ts   |   9 +-
 packages/core/src/config/experimental-features.ts  |   7 ++
 packages/core/src/index.gate.ts                    |   2 +-
 packages/core/src/index.ts                         |   2 +-
 packages/core/src/types.ts                         |   7 ++
 packages/dashboard/app/components/ChatView.tsx     |  37 ++++---
 .../dashboard/app/components/SettingsModal.tsx     |   1 +
 .../app/components/TaskPlannerChatTab.tsx          |  62 ++++++++---
 .../__tests__/ChatView.chat-focus-flag.test.tsx    | 122 +++++++++++++++++++++
 .../__tests__/ChatView.focus-chip.test.tsx         |   2 +-
 .../TaskPlannerChatTab.chat-focus-flag.test.tsx    | 108 ++++++++++++++++++
 .../__tests__/TaskPlannerChatTab.test.tsx          |   5 +-
 .../app/components/__tests__/chat-commands.test.ts |   7 +-
 .../app/components/__tests__/focus-command.test.ts |  13 ++-
 packages/dashboard/app/components/chat-commands.ts |  11 ++
 .../chat-memory-focus-reachability.test.ts         |  16 ++-
 packages/dashboard/src/chat.ts                     |  30 ++---
 20 files changed, 394 insertions(+), 63 deletions(-)

Fusion-Task-Id: FN-9209

Fusion-Task-Lineage: d58296be-a5f9-4b8c-bf4a-03f7f9100efe

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 21:47:40 -07:00
Fusion Agent
bde81ad4ff feat(FN-182): add deterministic AI-free pipeline smoke lane
Opt-in `pnpm smoke:pipeline` lane replaying 19 declared scenarios across
builtin:coding-ideas and the builtin:coding non-regression floor, driving the
real engine: disposable local Git repositories, throwaway PostgreSQL store,
production graph dispatch, ProjectEngine merge admission, real worktree
acquisition, and deterministic mock-provider scripts under testMode.

Each scenario declares one closed terminal state (merged-done, inert-intake,
parked, manual-hold, no-op-merge); an undeclared terminal fails the run, and
five wedge detectors (W1-W5) reject contradictory parks, finalization loops,
severed sessions, unreachable waits, and quiescence without progress.

Differential proof: on the pre-FN-180 tree (95ea06b48) exactly S05, S06, S09,
S10 and S16 fail across both workflows with behavioral assertions, and pass
after FN-180 — the FN-175/FN-177 incident classes are reproduced mechanically.

The declared duration budget is re-baselined 70s -> 90s at landing. The harness
did not degrade: the identical branch measured 61.8-64.1s against the
pre-integration main and 73.2-80.2s against the same main after 65 upstream
commits, with growth in transform, import and test phases the lane does not own.
docs/testing.md records the measurements, the cause, and the file-consolidation
lever to reach for before the budget is touched again.

Excluded from engine-default and engine-core; the merge gate is unchanged and
CI runs the lane non-blocking after merge.

Fusion-Task-Id: FN-182
2026-08-24 04:19:21 +00:00
Fusion Agent
8e8e3233c6 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	docs/dashboard-guide.md
#	packages/core/src/__tests__/postgres/schema-applier.test.ts
#	packages/core/src/__tests__/task-merge.test.ts
#	packages/core/src/merge/task-merge.ts
#	packages/core/src/postgres/schema-applier.ts
#	packages/core/src/task-store/merge-queue-ops.ts
#	packages/dashboard/app/__tests__/App.keyboard-shortcuts.test.tsx
#	packages/dashboard/app/components/ChatView.css
#	packages/dashboard/app/components/ChatView.tsx
#	packages/dashboard/app/components/__tests__/ChatView.core-contracts.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.core-interactions.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.core.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.draft.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.message-edit.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.mobile-render.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.mobile.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.new-chat-default.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.rooms.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.scroll-to-top.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.sessions-rooms.test.tsx
#	packages/dashboard/app/components/__tests__/ChatView.thinking-level.test.tsx
#	packages/engine/src/__tests__/executor-step-session.test.ts
#	packages/engine/src/__tests__/merge-abort-clears-transient-status.test.ts
#	packages/engine/src/__tests__/merger-ai-cleanup.test.ts
#	packages/engine/src/__tests__/merger-merge-lifecycle.test.ts
#	packages/engine/src/__tests__/workspace-merger.test.ts
#	packages/engine/src/merge/auto-merge-finalization.ts
#	packages/engine/src/merge/merger-ai.ts
#	packages/engine/src/project-engine.ts
#	packages/engine/src/run-audit/run-audit-catalogue.ts
#	packages/engine/src/self-healing.ts
#	packages/engine/src/worktree/review-diff-fingerprint.ts
#	packages/i18n/locales/es/app.json
#	packages/i18n/locales/fr/app.json
#	packages/i18n/locales/ko/app.json
#	packages/i18n/locales/pt-BR/app.json
#	packages/i18n/locales/zh-CN/app.json
#	packages/i18n/locales/zh-TW/app.json
2026-08-24 03:55:34 +00:00
gsxdsm
456f7b370b docs(test-failures): retract the connection-exhaustion cause, record the failed reproduction
Measured 14 backend connections against max_connections=100, so the api-lane
hook timeouts are not connection exhaustion; the PostgreSQL Failed query lines
are a torn-down reconciler polling after the fact. Full 15-lane run at 23,584
tests reproduced nothing, and the DDL admission gate never degraded, so that
mechanism is unsupported too. Records what a future attempt must capture.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 20:08:43 -07:00
gsxdsm
72f0bbb503 docs: record dashboard api-lane PostgreSQL contention as a suite-infrastructure flake pattern
Three consecutive full-lane runs on the same tree each failed a DIFFERENT file,
every one passing in isolation, with hook timeouts arriving alongside PostgreSQL
'Failed query' warnings from two api lanes sharing one database. That is the same
class FN-9131 investigated for core's loaded PostgreSQL directory.

Deliberately not quarantined: quarantine is file-level and the failing file moves,
so it would evict healthy coverage without touching the cause. Recorded with the
evidence so the next person does not re-derive it, and so the rescue is aimed at
the lane runner's connection/concurrency budget rather than at whichever test lost
the race that run.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 18:45:31 -07:00
Fusion Agent
cb16f418c7 FN-183: ensure local integration branch readiness
Guarantee projects have a usable local integration branch ref across creation, import, and merge workflows.

- Add shared integration-branch readiness and repository initialization helpers.
- Wire project registration, CLI commands, central storage, and merge execution to establish the ref.
- Document the behavior and cover CLI, dashboard, core, and engine integration paths.

Files changed:
 .changeset/fn-183-integration-branch-readiness.md  |   7 +
 docs/architecture.md                               |   2 +-
 docs/cli-reference.md                              |   4 +-
 docs/getting-started.md                            |   2 +-
 docs/settings-reference.md                         |   2 +-
 .../auto-git-init-project-registration.md          |  21 +++
 docs/workspaces.md                                 |   2 +-
 packages/cli/src/commands/__tests__/init.test.ts   |  70 +++++--
 .../cli/src/commands/__tests__/project.test.ts     |  22 +++
 packages/cli/src/commands/init.ts                  |  26 ++-
 packages/cli/src/commands/project.ts               |  20 ++
 packages/core/src/__tests__/git-repository.test.ts | 190 +++++++++++++++++++
 .../__tests__/integration-branch-readiness.test.ts |  94 ++++++++++
 packages/core/src/central/central-core.ts          |  65 +++++--
 packages/core/src/git/git-repository.ts            | 112 ++++++++++--
 .../core/src/git/integration-branch-readiness.ts   | 201 +++++++++++++++++++++
 packages/core/src/index.gate.ts                    |  14 ++
 packages/core/src/index.ts                         |  14 ++
 packages/core/src/merge/task-merge.ts              |   2 +-
 .../register-project-git-readiness.test.ts         | 132 +++++++++++++-
 .../src/routes/register-project-routes.ts          |  31 +++-
 .../src/__tests__/integration-branch.test.ts       | 135 ++++++++++++++
 packages/engine/src/__tests__/merger-ai.test.ts    |  21 +++
 packages/engine/src/merge/integration-branch.ts    | 127 ++++++++++++-
 packages/engine/src/merge/merger-ai.ts             |  25 ++-
 25 files changed, 1273 insertions(+), 68 deletions(-)

Fusion-Task-Id: FN-183
Fusion-Task-Lineage: ee63d45a-3406-4064-b16f-a2fe6dc0ad86
Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-24 01:20:23 +00:00
gsxdsm
5378bca7f6 test: fix the dashboard quality runner's self-spawning tests
Running the dashboard's REAL test command (`run-quality-tests.mjs`, which shards
into 15 lanes) surfaced two failures that a plain `vitest run` never shows —
worth noting on its own, since measuring around a package's own command is how
a suite gets called green on a number the project does not produce.

`scripts/__tests__/run-quality-tests.test.ts` spawns the package's own
`pnpm --filter @fusion/dashboard test` to prove the package-command wiring. Inside
a full lane run that child inherited a Corepack environment that stopped to ask
about downloading pnpm, so it never launched, the lane log came back empty, and
the assertion read 0 launched projects. It passed in isolation only because that
shell had already resolved pnpm. Both spawn sites now set
COREPACK_ENABLE_DOWNLOAD_PROMPT=0; nothing about the assertions changed.

Also records PlanningModeModal.planning-flow as a suite-only flake rather than
forcing it green: it fails only in lane `app:backfill-3` under four concurrent
6GB shards, passes 83/83 in isolation, and picked a DIFFERENT case on each of two
runs — a render-settle timing problem, not a product defect. Recorded as a first
sighting; a repeat of the same case is an on-sight quarantine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 18:03:38 -07:00
gsxdsm
64cb17c100 FN-9204: advertise a valid memory MCP server version
Make the built-in memory MCP server complete the SDK-validated initialize handshake.

- Include a non-empty version in fusion-memory serverInfo responses.
- Cover the real SDK handshake, malformed-response skip path, and JSON-RPC envelopes.
- Document the protocol requirement and add a patch changeset.

Files changed:
 .changeset/fn-9204-memory-mcp-handshake.md         |   7 ++
 docs/mcp.md                                        |   2 +
 .../__tests__/mcp-memory-server-spawn.test.ts      |   5 +-
 .../mcp/__tests__/memory-mcp-handler.test.ts       |   7 +-
 packages/core/src/memory/mcp/memory-mcp-handler.ts |   8 +-
 .../src/__tests__/mcp-memory-handshake.test.ts     | 120 +++++++++++++++++++++
 6 files changed, 146 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-9204

Fusion-Task-Lineage: 0f68bdd5-56fe-4fdb-867f-2a5e0ea4de65

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 17:17:08 -07:00
gsxdsm
28a0ebc382 docs: index three Stash memory backend docs orphaned by #3494
Add memory-backend-integration.md to Architecture & Development (plus its
missing docs-index back-link) and performance/spawn-storm-attribution.md
and research/stash-vector-search-evaluation.md to Audit Reports. All three
were added by 8fcf4bdbaa without README index entries; test:docs-index
passes and the CLI Printing Press invariant remains 2 (Audit Reports).
2026-08-23 17:17:07 -07:00
Phil Larson
c9f3f11a72 fix: allow worktree agents to read user skills (#3506)
## Summary

- allow worktree sessions to read the standard user skill root at
`~/.agents/skills`
- keep sibling `~/.agents` files and all write/edit/Bash access outside
the exception
- canonicalize existing path components so symlinks cannot escape an
allowed skill root
- document the boundary and add a patch changeset

This extends the same host-skill consistency fixed in #2384: Fusion
should not tell an agent to load a skill and then block the skill body.

## Test plan

- [x] 15 worktree-boundary tests
- [x] `pnpm --filter @fusion/engine typecheck`
- [x] scoped ESLint
- [x] changeset and FNXC date checks
- [x] `pnpm verify:fast` (20 steps, including build and boot smoke)
- [x] CLI CI-shape test (72 tests)

## Local gate notes

`pnpm test:gate` passed all static checks, 432 engine-core tests, and
184 core unit tests. Its PostgreSQL lane could not authenticate locally
(`empty password returned by client`). The full
`pi-create-fn-agent.test.ts` run also reaches an unrelated
dashboard-chat principal assertion failure already present at the exact
`origin/main` SHA; the 15 boundary tests pass.


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

- **New Features**
- Worktree agents can read and search skills installed in the standard
`~/.agents/skills` directory.

- **Bug Fixes**
- Preserved worktree protections for writing, editing, and Bash
operations.
- Blocked access to unrelated files and prevented symlink-based boundary
escapes across supported path operations.
  - Improved access validation for paths that do not yet exist.

- **Documentation**
- Updated worktree boundary documentation to describe skill access and
its restrictions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-23 16:53:10 -07:00
ischindl
8fcf4bdbaa feat: Stash memory backend — session capture, per-chat backfill, opt-in vector search (#3494)
## Summary

Adds the **Stash memory backend** (`memory.backendType=stash`) that
connects Fusion's agent memory to the
[Stash](https://github.com/Fergana-Labs/stash) product — *knowledge
bases for the agent era* ([product site:
joinstash.ai](https://joinstash.ai)). Fusion becomes a first-class Stash
client: complete chat sessions and finished tasks are captured into
Stash, memory is recalled during chat, and Stash sessions are kept in
sync with the dashboard (including deletes and archival).

**Product:** <https://github.com/Fergana-Labs/stash> ·
[joinstash.ai](https://joinstash.ai)

## What's included

### 1. Stash memory backend (RUFU-068 / RUFU-121)
- New `StashMemoryBackend` (`memory.backendType=stash`) with `stashUrl`
/ `stashApiKey` settings (global secrets-store `stash-api-key` +
per-project override).
- **Complete-chat-session capture** keyed by ChatSession id.
- Sessions are classified into **per-project folders** (get-or-create,
`external_key fusion-<projectId>`, 1h per-process cache) and
**soft-deleted with their chat** via `DELETE /api/chat/sessions/:id`.
- Per-conversation **memory-focus** read-time scoping (new
`0066_chat_session_memory_focus.sql` migration — sequence renumbered
0059→0060→0061→0065→0066 as origin/main claimed the lower numbers);
event metadata enriched with `project` / `project_name` / `chat_title`.
- Recall queries normalized to single-keyword / explicit-OR ASCII (≤100
chars); shared normalizer export reused by per-turn recall.

### 2. Per-task executor transcript capture (RUFU-122)
Finished or failed tasks upload their executor transcript
(`agent-log.jsonl`) to Stash as a task session.

### 3. Bulk archive Stash sync (RUFU-125)
Archived task-planner chats soft-delete their Stash sessions on bulk
archival (paged). The snapshot of doomed session ids is taken *before*
the local bulk delete, and the Stash sync runs fire-and-forget so a
Stash stall can never delay local archival.

### 4. Per-chat "Preserve to Stash" backfill (RUFU-136)
A per-chat action that backfills a chat's full history into Stash, with
client-side idempotency and a pre-check that skips already-uploaded
content (fail-closed, no duplicate upload on transport failure).
- **Session-folder naming fix:** the first project folder is now named
"Fusion — &lt;project name&gt;" instead of the bare "Fusion" fallback
(the backfill now resolves the central-registry project name,
best-effort, never blocking the upload).

### 5. Opt-in semantic (vector) recall (RUFU-126)
`stashVectorSearch` setting (default `false` — **zero behavior change
until enabled**). For multi-word queries the backend tries Stash's
semantic-search endpoint first, then falls back byte-identically to the
keyword path. Definitive 404/405/501/503 responses are negatively cached
per process. Requires a patched Stash server (new endpoint +
`sentence-transformers` + embedding backfill); unpatched servers are
transparently bypassed after the first 404.

## Safety
- **Opt-in / inert by default:** the default backend remains `qmd`; the
Stash backend is inert until `memoryBackendType=stash` + `stashUrl` are
set.
- All Stash I/O is **best-effort, fail-closed, and non-blocking** — a
Stash outage never blocks chat, task completion, or archival. No
run-audit content is emitted.

## Testing
- Backfill + delete-sync suites (20/20), Stash backend suite (68/68),
executor memory / session capture suites, `memory-focus-recalling`,
description-guard — all green.
- `tsc` clean across core / engine / dashboard.
- Live verification: bulk backfill of 21/24 chats completed; the
"Preserve to Stash" action is idempotent on re-run.

## Changesets
- `@runfusion/fusion` **minor** — Stash memory backend + capture
(RUFU-068/121), per-task transcript (RUFU-122), bulk archive sync
(RUFU-125), per-chat backfill (RUFU-136), opt-in vector search
(RUFU-126)
- `@runfusion/fusion` **patch** — backfill session-folder naming fix


## Rebase Note (2026-08-23)

Rebased onto `origin/main` `3f448f7292` (v0.77.0-beta.7). Conflicts
resolved additively:
- `packages/core/src/postgres/schema-applier.ts` + test — upstream's
0062-0065 migrations (task/subtask splitting removal, AI merge review
reconciliation, task repository scope, FN-149 review convergence)
unioned with this PR's `chat_sessions.memory_focus` migration, which is
**renumbered 0065 → 0066** (upstream's FN-149 shipped 0065 canonically
on origin/main); `SCHEMA_BASELINE_VERSION` advances to `0066`.
- `packages/dashboard/app/components/ChatView.tsx` — upstream's docked
chat sidebar resize handlers unioned with the RUFU-136 "Preserve to
Stash" backfill handler.
- New commit: `settings.memory.*` stash-backend i18n keys added to all 6
secondary locales (RUFU-121/122 parity fix; `pnpm i18n:status` no longer
reports any violation introduced by this PR).

**Deploy note (operator environments that already ran a pre-rebase build
of this PR):** the memory-focus SQL may already be in the schema under
ledger row `0065`. Remap that row to `0066` (`UPDATE
fusion_schema_migrations SET version = '0066' WHERE version = '0065';`)
*before* first boot of a 0066-ceiling binary — otherwise the fresh
upstream `0065_fn_149_review_convergence_stage.sql` would be skipped as
"already applied". Clean databases (no prior memory-focus row) need no
action.

**CI note — Lint (lifecycle-column census) is red on the merge base:**
`pnpm check:lifecycle-columns --strict` fails identically on pure
`origin/main` `3f448f7292` with
`packages/core/src/db/legacy-adoption.ts: 0 -> 3` (3 column guards in
the U9b legacy-adoption table without a baseline entry or
`DELIBERATE-LITERAL` marker). Verified by running the census on a clean
origin/main checkout — inherited from the base, not introduced by this
PR. Fix belongs upstream; tracked separately.

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

* **New Features**
* Added Stash memory integration with project configuration and optional
semantic search.
  * Added per-chat memory focus controls and a `/focus` command.
  * Added “Preserve to Stash” for uploading complete chat history.
  * Added automatic chat, task transcript, and completion-event capture.
* Added project-specific Stash session folders and archive/delete
synchronization.
* **Bug Fixes**
* Improved Stash folder naming and handling of missing branches during
no-commit tasks.
* **Documentation**
* Added setup, configuration, integration, vector-search, and
performance guidance.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Fusion <noreply@runfusion.ai>
Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com>
2026-08-23 16:46:14 -07:00
gsxdsm
9d1bd393d8 FN-9202: Unify dashboard banner styling
Standardize dashboard notices on a shared, token-driven banner shell.

- Add a reusable Banner primitive with consistent tones, layouts, actions, and dismissal behavior.
- Migrate dashboard notification banners away from bespoke shells and left accent borders.
- Document and test banner styling invariants, including token-only CSS lengths and colors.
- Add a patch changeset for the published dashboard bundle.

Files changed:
 .changeset/fn-9202-banner-style-unification.md     |   7 ++
 docs/dashboard-guide.md                            |   4 +
 .../app/__tests__/banner-style-consistency.test.ts |  25 ++++
 .../app/components/ApprovalNotificationBanner.css  |  10 --
 .../app/components/ApprovalNotificationBanner.tsx  |   5 +-
 packages/dashboard/app/components/Banner.css       |  81 ++++++++++++
 packages/dashboard/app/components/Banner.tsx       |  78 ++++++++++++
 .../app/components/CapacityRiskBanner.css          |  50 +-------
 .../app/components/CapacityRiskBanner.tsx          |  39 +++---
 .../app/components/CliBinaryInstallBanner.css      | 126 ++-----------------
 .../app/components/CliBinaryInstallBanner.tsx      |  14 +--
 .../app/components/DbCorruptionBanner.css          |  18 +--
 .../app/components/DbCorruptionBanner.tsx          |   5 +-
 .../app/components/EngineStatusBanner.css          |  94 ++------------
 .../app/components/EngineStatusBanner.tsx          |  48 +++----
 .../app/components/EngineUnavailableBanner.css     |  42 +------
 .../app/components/EngineUnavailableBanner.tsx     |  21 ++--
 .../app/components/MergeAdvanceNotice.css          | 129 +++----------------
 .../app/components/MergeAdvanceNotice.tsx          |  36 +++---
 .../app/components/MigrationInProgressBanner.css   |  25 ----
 .../app/components/MigrationInProgressBanner.tsx   |  19 +--
 .../app/components/OAuthReloginBanner.css          |  53 +-------
 .../app/components/OAuthReloginBanner.tsx          |  26 +---
 .../app/components/SessionNotificationBanner.css   |  16 +--
 .../app/components/SessionNotificationBanner.tsx   |   5 +-
 .../app/components/SetupWarningBanner.css          | 106 +---------------
 .../app/components/SetupWarningBanner.tsx          |  31 +----
 .../app/components/SqliteMigrationBanner.css       |  40 +-----
 .../app/components/SqliteMigrationBanner.tsx       |  33 ++---
 .../app/components/TaskIdIntegrityBanner.css       |  18 +--
 .../app/components/TaskIdIntegrityBanner.tsx       |   5 +-
 .../dashboard/app/components/TestModeBanner.css    |  18 ---
 .../dashboard/app/components/TestModeBanner.tsx    |  12 +-
 .../app/components/UpdateAvailableBanner.css       | 139 +++------------------
 .../app/components/UpdateAvailableBanner.tsx       |  22 ++--
 .../app/components/__tests__/Banner.test.tsx       |  48 +++++++
 36 files changed, 450 insertions(+), 998 deletions(-)

Fusion-Task-Id: FN-9202

Fusion-Task-Lineage: 14762201-55e5-4124-a897-9667c3a1ab84

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 16:00:53 -07:00
gsxdsm
4475342145 docs: record a first-sighting PG setup-hook flake in the observed register
`handoff-to-review-atomicity.pg.test.ts` aborted its `beforeAll` at the 15s
budget on the first `pnpm test:gate` of a session; not reproduced in 8 later
runs across three shapes (gate x2, pg-gate x3, isolated x3).

Same mode as entries 6 and 7, but narrower: it happened under the capped
four-fork lane with two selected files, so fork oversubscription does not
explain it. Recorded the cold-cluster correlation as a hypothesis rather than a
finding — reproducing it means stopping the embedded cluster, and this host runs
a live Fusion instance.

Discloses that the failing run's full output was lost to a tail pipe, and that
inline quarantine was unavailable regardless (quarantinedCoreTests must stay
empty); eviction of a transactional-invariant gate file is owner-escalated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 15:45:31 -07:00
gsxdsm
39812f4898 test: quarantine one suite-only flake, record another, fix the lockstep guard
Full engine suite at a97aa84a20: 3 failures out of 12,414. All three diagnosed:

- self-healing-pending-wedge-notification's marker-selection case fails ONLY in
  a full-suite run (expects 1 elapsed marker, sees 2) and passes deterministically
  alone. This is its SECOND sighting, so per AGENTS.md it is an on-sight
  quarantine with no further discretion: ledger entry + matching vitest exclude,
  same commit, 2026-09-06 deletion deadline.
- spec-drift-reconciler's exponential-backoff case shows the same shape on a
  FIRST sighting, so it is recorded in the observed register instead of evicting
  that file's other passing coverage. Both are timer-driven reconciler tests that
  only fail alongside other suites, pointing at cross-file fake-timer state.
- merge-orphan-durable-write-inventory drift was pure lineHint movement (19
  changed, zero newly unclassified entries) after product edits shifted lines.
  Regenerated.

Also fixes check-quarantine-ledger.mjs, which could not see the exclude I added:
its comment stripper treated the `/**` inside glob literals like "node_modules/**"
and "src/**/*.slow.test.ts" as a block-comment opener and deleted through to the
next "*/", swallowing whole array literals and every entry after them. It now
scans string-aware, so the lockstep check actually holds. Nothing was appeased:
no timeout widened, no retry added, no assertion relaxed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 15:43:00 -07:00
gsxdsm
3d37cfa7db FN-9201: Prevent mobile nav lift when the iOS keyboard opens
Keep mobile bottom chrome pinned or hidden during keyboard focus transitions, including landscape phone layouts.

- track keyboard-focus intent before visual viewport metrics settle
- clamp focused iOS viewport offsets so fixed bars remain behind the keyboard
- cover runtime bootstrap, landscape integration, nav, focus, and offset behavior
- document the mobile keyboard layout contract and add a patch changeset

Files changed:
 .changeset/fn-9201-mobile-nav-keyboard-lift.md     |  7 ++
 docs/dashboard-guide.md                            |  4 +-
 packages/dashboard/app/App.tsx                     | 43 ++++++++--
 ...ile-nav-keyboard-landscape.integration.test.tsx | 91 ++++++++++++++++++++
 .../__tests__/icb-inline-script.runtime.test.ts    | 74 ++++++++++++++++
 .../mobile-bottom-bars-keyboard-layout.test.ts     | 15 +++-
 .../viewport-compensation-keyboard.test.ts         |  5 +-
 .../__tests__/MobileNavBar.keyboard-lift.test.tsx  | 65 ++++++++++++++
 .../__tests__/useKeyboardFocusPending.test.tsx     | 99 ++++++++++++++++++++++
 .../dashboard/app/hooks/useKeyboardFocusPending.ts | 43 ++++++++++
 packages/dashboard/app/index.html                  | 12 ++-
 .../utils/__tests__/mobileBarKeyboardFlags.test.ts | 22 +++++
 .../app/utils/__tests__/viewportOffset.test.ts     | 32 +++++++
 .../dashboard/app/utils/mobileBarKeyboardFlags.ts  | 10 ++-
 packages/dashboard/app/utils/viewportOffset.ts     |  8 ++
 15 files changed, 510 insertions(+), 20 deletions(-)

Fusion-Task-Id: FN-9201

Fusion-Task-Lineage: 4b3b01d3-8968-432b-9537-a63ee6bbde31

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 11:40:06 -07:00
gsxdsm
324145c1e1 test: repair engine fixtures that predate shipped product guards
The engine suite's failures are not independent bugs; they are a handful of
systemic drifts where a guard shipped and its fixtures were never updated.

- Required pre-merge gates (FN-158): the door refuses a card whose enabled
  optional groups produced no result, and the built-in workflow enables Plan and
  Code Review by default. Merge-mechanics fixtures now declare an explicit empty
  list, stating the intent they always had. group-merge-coordinator's
  "post-Code-Review member" instead gets real PASSING workflowStepResults,
  because recording the pass is what that fixture actually means.
- Branch-write provenance: the shared reliability fixture creates a task with a
  branch, which now requires an explicit origin. It stands in for an
  engine-created branch, so it says so.
- updateTaskAtomic: a production write seam missing from several fake stores,
  copied from the faithful fake in merger-ai.test.ts.
- Durable-write inventory: eight unclassified TaskStore surfaces classified,
  including the two batched reads this branch added.
- workflow-graph-merge-region-collapse asserted completion-summary AFTER
  code-review; the IR wires it before, and production logs agree.

merger-ai.test.ts alone goes 37 -> 0. Engine failures 288 -> ~200.

Also records a first-sighting suite-only flake in the observed register per the
standing rule, rather than quarantining a file with substantial coverage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 10:18:50 -07:00
gsxdsm
52d124bde2 FN-9195: Keep the chat composer visible above iOS keyboards
Keep Chat input reachable across software-keyboard viewport changes.

- Track visual viewport changes across phones, tablets, compact docks, and narrow floating Chat hosts.
- Clamp thread height using the measured host offset while preserving iOS focus behavior.
- Add regression coverage, shared viewport test helpers, operator documentation, and a patch changeset.

Files changed:
 .changeset/fn-9195-chat-ios-keyboard-composer.md   |   7 +
 docs/dashboard-guide.md                            |   2 +-
 packages/dashboard/app/components/ChatView.css     |  44 +--
 packages/dashboard/app/components/ChatView.tsx     |  43 ++-
 .../__tests__/ChatView.ios-keyboard.test.tsx       | 335 +++++++++++++++++++++
 .../components/__tests__/ChatView.test-harness.tsx | 103 ++++++-
 6 files changed, 506 insertions(+), 28 deletions(-)

Fusion-Task-Id: FN-9195

Fusion-Task-Lineage: cdada0cc-af6c-4cf8-8ffd-0940d280b07a

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 09:55:53 -07:00
gsxdsm
3857e0dc14 FN-9198: Fix narrow chat switcher dropdown rendering
Anchor the direct-conversation switcher to the visible thread header across narrow Chat surfaces.

- position narrow-host switcher menus relative to the thread header
- cover mobile, compact dock, floating, desktop, and empty-menu states
- add the shared 2px spacing token and document the corrected behavior
- add a patch changeset for the published Fusion package

Files changed:
 .../fn-9198-chat-title-switcher-menu-anchor.md     |   7 +
 docs/dashboard-guide.md                            |   2 +-
 .../app/components/ChatThreadTitleSwitcher.css     |  11 +-
 .../__tests__/ChatView.title-switcher.test.tsx     | 144 ++++++++++++++++++++-
 packages/dashboard/app/styles.css                  |   2 +
 5 files changed, 160 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-9198

Fusion-Task-Lineage: 9a1132d2-9b1a-4150-918a-085b42b22e02

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-23 09:21:10 -07:00
Fusion Agent
1e805ee872 FN-177: fix empty thinking trace sections
Make chat and transcript thinking traces readable when providers emit headings without body content.

- Inline body-less headings instead of rendering empty accordion sections.
- Add raw trace and section controls with localized labels across chat surfaces.
- Update styling, documentation, locale resources, and regression coverage.

Files changed:
 .changeset/fn-177-thinking-trace-empty-sections.md |   7 ++
 docs/dashboard-guide.md                            |   2 +-
 .../app/components/StandardChatSurface.tsx         |   2 +-
 packages/dashboard/app/components/TaskChatTab.tsx  |   2 +-
 .../dashboard/app/components/ThinkingTrace.css     |   5 +-
 .../dashboard/app/components/ThinkingTrace.tsx     |  74 ++++++++---
 .../app/components/WorkflowResultsTab.tsx          |   2 +-
 .../MilestoneSliceInterviewModal.test.tsx          |  22 +++
 .../__tests__/MissionInterviewModal.test.tsx       |  14 ++
 .../PlanningModeModal.planning-flow.test.tsx       |  26 +++
 .../app/components/__tests__/TaskChatTab.test.tsx  |  19 +++
 .../__tests__/ThinkingTrace.host-inventory.test.ts |  42 +++++
 .../__tests__/ThinkingTrace.surfaces.test.tsx      |  96 +++++++++++++-
 .../components/__tests__/ThinkingTrace.test.tsx    | 136 ++++++++++++++-------
 .../components/__tests__/WorkflowResultsTab.test.tsx |   9 ++
 packages/dashboard/app/test/cssFixture.ts          |   8 ++
 packages/i18n/locales/en/app.json                  |   2 +
 packages/i18n/locales/es/app.json                  |   4 +-
 packages/i18n/locales/fr/app.json                  |   4 +-
 packages/i18n/locales/ko/app.json                  |   4 +-
 packages/i18n/locales/pt-BR/app.json               |   4 +-
 packages/i18n/locales/zh-CN/app.json               |   4 +-
 packages/i18n/locales/zh-TW/app.json               |   4 +-
 packages/i18n/src/resources.d.ts                   |   2 +
 24 files changed, 415 insertions(+), 79 deletions(-)

Fusion-Task-Id: FN-177
Fusion-Task-Lineage: 5fa5a228-339c-4e7b-8b0e-f2eb4fdcacce
Co-authored-by: Fusion <noreply@runfusion.ai>
2026-08-23 14:05:04 +00:00