gsxdsm
034827f251
FN-8623: restore CDP touch geometry test lane
...
Restore a dedicated Chromium CDP lane for dashboard touch-geometry coverage.
- Add an opt-in touch-geometry test command and isolated Vitest project.
- Keep the browser-dependent spec out of deep and quality backfill collection.
- Document browser discovery, port, and single-collection requirements.
Files changed:
docs/testing.md | 10 ++-
packages/dashboard/package.json | 1 +
.../__tests__/dashboard-test-config-guard.test.ts | 71 +++++++++++++++++++++-
.../task-modal-touch-resize-browser.test.ts | 5 ++
packages/dashboard/vitest.config.ts | 28 ++++++++-
scripts/lib/test-inventory-spec.json | 3 +-
6 files changed, 114 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-8623
Fusion-Task-Lineage: eafd7497-9302-49a4-8e9e-aa93c9f56a6f
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 18:04:28 -07:00
gsxdsm
62e13f484b
docs: index dashboard-modal-inventory.md in Audit Reports
...
FN-8617 committed docs/dashboard-modal-inventory.md as the canonical
classification of all 45 dashboard modal surfaces (classes A-D) with
file:line evidence and FloatingWindow migration targets, but the docs
index was not updated. Add the Audit Reports entry so the doc is
discoverable from the docs hub.
Verified: orphan scan clean (only known intentional orphans remain);
pnpm --filter @runfusion/fusion test:docs-index passes (2/2).
2026-07-26 17:20:56 -07:00
gsxdsm
2bb8537352
FN-8616: make agent tool-output limits configurable
...
Expose the shared agent tool-output budget as a scoped operator setting with an explicit no-limit option.
- Resolve global and project output caps with a safe finite default and zero sentinel.
- Propagate configured budgets through PI and plugin runtime tool wrappers.
- Add settings controls, localized labels, documentation, and regression coverage.
Files changed:
.changeset/fn-8616-tool-output-budget-setting.md | 7 ++++
docs/agents.md | 4 +-
docs/settings-reference.md | 1 +
.../core/src/__tests__/tool-output-budget.test.ts | 23 ++++++++---
packages/core/src/index.gate.ts | 2 +
packages/core/src/index.ts | 2 +
packages/core/src/settings-schema.ts | 12 ++++++
packages/core/src/tool-output-budget.ts | 31 +++++++++++++--
packages/core/src/types/settings-scope.ts | 8 ++++
.../app/components/settings/save-split.ts | 1 +
.../sections/GlobalGeneralSection.search.ts | 20 ++++++++++
.../settings/sections/GlobalGeneralSection.tsx | 26 ++++++++++++
...lobalGeneralSection.tool-output-budget.test.tsx | 46 ++++++++++++++++++++++
.../settings-default-descriptions.test.tsx | 1 +
.../src/__tests__/agent-session-helpers.test.ts | 20 ++++++++++
.../src/__tests__/runtime-resolution.test.ts | 15 +++++++
.../__tests__/tool-output-budget-wrapper.test.ts | 45 ++++++++++++++++-----
packages/engine/src/agent-runtime.ts | 2 +
packages/engine/src/agent-session-helpers.ts | 18 +++++++--
packages/engine/src/pi.ts | 29 ++++++++++----
packages/engine/src/runtime-resolution.ts | 10 ++++-
packages/i18n/locales/en/app.json | 4 ++
packages/i18n/locales/es/app.json | 6 ++-
packages/i18n/locales/fr/app.json | 6 ++-
packages/i18n/locales/ko/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 | 4 ++
28 files changed, 323 insertions(+), 38 deletions(-)
Fusion-Task-Id: FN-8616
Fusion-Task-Lineage: 3ca99a61-d6ae-48ff-98d2-f14a153aa2b7
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 16:16:27 -07:00
gsxdsm
d3002d1453
FN-8617: restore authoritative dashboard modal inventory
...
Restore the committed source of truth for dashboard modal migration coverage.
- Add the evidence-backed inventory of dashboard modal classifications and migration ownership.
- Link the dashboard guide to the canonical modal inventory.
Files changed:
docs/dashboard-guide.md | 4 ++
docs/dashboard-modal-inventory.md | 103 ++++++++++++++++++++++++++++++++++++++
2 files changed, 107 insertions(+)
Fusion-Task-Id: FN-8617
Fusion-Task-Lineage: 87159726-d574-4f71-bd6f-66cf9f2f9a9e
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 16:05:08 -07:00
gsxdsm
743dc5f46e
FN-8612: remove tablet task modal padding
...
Keep task modals dense on tablets without reducing their touch resize targets.
- Move the Task Detail drag target out of layout flow while preserving its 44px hit area.
- Restore desktop-density New Task header and body padding on tablet resize surfaces.
- Add CSS, unit, and browser coverage for tablet geometry and generic floating windows.
Files changed:
.changeset/fn-8612-tablet-modal-padding.md | 7 +
docs/dashboard-guide.md | 8 +-
.../task-detail-modal-tablet-width.test.ts | 8 +
.../dashboard/app/components/FloatingWindow.css | 40 ++++-
packages/dashboard/app/components/NewTaskModal.css | 14 ++
.../FloatingWindow.touch-geometry.test.tsx | 14 ++
.../app/components/__tests__/NewTaskModal.test.tsx | 8 +
.../app/task-modal-touch-resize-e2e-fixture.tsx | 54 ++++++-
.../task-modal-touch-resize-browser.test.ts | 177 ++++++++++++++++++++-
packages/dashboard/vitest.config.ts | 6 +
10 files changed, 322 insertions(+), 14 deletions(-)
Fusion-Task-Id: FN-8612
Fusion-Task-Lineage: fecd7c48-7b6c-434e-9002-f8f21241120c
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 15:42:53 -07:00
gsxdsm
07c8c95b10
FN-8614: cap agent tool output
...
Bound every engine-injected tool result to preserve agent context capacity.
- Add shared 16,000-character total text budgets with deterministic truncation markers and validated overrides.
- Apply outermost output clamps to Pi and non-Pi plugin tool paths, with semantic caps for high-volume reads.
- Cover budget behavior and document the operator-facing configuration contract.
Files changed:
.changeset/fn-8614-tool-output-budget.md | 7 ++
docs/agents.md | 8 ++
.../core/src/__tests__/tool-output-budget.test.ts | 58 +++++++++++++
packages/core/src/index.gate.ts | 7 ++
packages/core/src/index.ts | 7 ++
packages/core/src/tool-output-budget.ts | 97 ++++++++++++++++++++++
.../src/__tests__/agent-artifact-tools.test.ts | 10 +++
.../src/__tests__/agent-document-tools.test.ts | 10 +++
.../__tests__/agent-task-logs-read-tools.test.ts | 8 ++
.../__tests__/tool-output-budget-wrapper.test.ts | 67 +++++++++++++++
packages/engine/src/agent-session-helpers.ts | 7 +-
packages/engine/src/agent-tools.ts | 43 ++++++++--
packages/engine/src/pi.ts | 54 +++++++++++-
13 files changed, 374 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-8614
Fusion-Task-Lineage: b6a76ccd-d7b4-4b43-af7e-cfd16ffb7fc8
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 14:42:06 -07:00
gsxdsm
a6885b73f2
FN-8606: migrate core workflow modals to shared floating windows
...
Migrate dashboard dialogs to the shared movable and resizable FloatingWindow contract.
- Move core, workflow, Git, planning, and automation modal surfaces to stable floating-window identities with persisted geometry.
- Suspend geometry and floating controls for phone and short-viewport sheets, including Quick Chat.
- Add accessibility wiring, tablet touch targets, migration tests, and operator documentation.
Files changed:
.changeset/fn-8606-floating-window-core-modals.md | 7 +
docs/dashboard-guide.md | 4 +
packages/dashboard/app/App.tsx | 8 +-
.../dashboard/app/components/ActivityLogModal.tsx | 30 ++--
packages/dashboard/app/components/AddNodeModal.tsx | 8 +-
.../dashboard/app/components/ChangesDiffModal.tsx | 35 +++--
.../dashboard/app/components/ConnectNodeModal.tsx | 9 +-
.../dashboard/app/components/FloatingWindow.css | 71 ++++++++-
.../dashboard/app/components/FloatingWindow.tsx | 27 +++-
.../dashboard/app/components/GitManagerModal.tsx | 30 +++-
.../dashboard/app/components/GroupTaskModal.tsx | 8 +-
.../app/components/ModelOnboardingModal.tsx | 28 ++--
.../dashboard/app/components/NodeDetailModal.tsx | 9 +-
.../dashboard/app/components/PlanningModeModal.css | 1 -
.../dashboard/app/components/PlanningModeModal.tsx | 57 +++----
.../app/components/ScheduledTasksModal.tsx | 9 +-
packages/dashboard/app/components/ScriptsModal.css | 1 -
packages/dashboard/app/components/ScriptsModal.tsx | 32 ++--
.../dashboard/app/components/SettingsModal.css | 1 -
.../dashboard/app/components/SettingsModal.tsx | 58 ++++---
.../app/components/WorkflowAddStepModal.css | 15 --
.../app/components/WorkflowAddStepModal.tsx | 46 +++---
.../components/__tests__/ActivityLogModal.test.tsx | 33 ++--
.../app/components/__tests__/AddNodeModal.test.tsx | 12 +-
.../components/__tests__/ChangesDiffModal.test.tsx | 78 +++++-----
.../components/__tests__/ConnectNodeModal.test.tsx | 7 +
.../components/__tests__/FloatingWindow.test.tsx | 173 ++++++++++++++++++++-
.../components/__tests__/GitManagerModal.test.tsx | 30 ++--
.../components/__tests__/GroupTaskModal.test.tsx | 9 ++
.../__tests__/ModelOnboardingModal.test.tsx | 18 ++-
.../components/__tests__/NodeDetailModal.test.tsx | 9 ++
.../__tests__/PlanningModeModal.autosize.test.tsx | 30 ++--
.../__tests__/ScheduledTasksModal.test.tsx | 21 ++-
.../app/components/__tests__/ScriptsModal.test.tsx | 15 +-
.../__tests__/SettingsModal.mobileClose.test.tsx | 25 ++-
.../__tests__/WorkflowAddStepModal.test.tsx | 7 +
.../floatingWindowMigration.test-helpers.ts | 126 +++++++++++++++
37 files changed, 828 insertions(+), 259 deletions(-)
Fusion-Task-Id: FN-8606
Fusion-Task-Lineage: dab0df2d-73f4-4b0f-bec3-a45016310c91
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 14:37:35 -07:00
gsxdsm
827b145fa1
FN-8611: persist manual import translations
...
Persist manual GitHub and GitLab import translations across preview sessions.
- Add durable translation cache reads and identity-aware translation requests.
- Route manual translations through the translation budget with actionable API errors.
- Restore cached previews automatically and cover API/UI behavior with tests.
Files changed:
.changeset/fn-8611-manual-import-translations.md | 7 ++
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/api/ai-text.ts | 52 ++++++--
packages/dashboard/app/api/legacy.ts | 2 +
.../dashboard/app/components/GitHubImportModal.tsx | 14 ++-
.../components/GitHubImportTranslateControls.tsx | 39 +++++-
.../__tests__/GitHubImportModal.test.tsx | 42 +++++++
packages/dashboard/src/ai-translate.ts | 23 ++++
.../register-ai-text-assistant-routes.test.ts | 135 +++++++++++++++++----
.../routes/register-ai-text-assistant-routes.ts | 131 ++++++++++++++------
10 files changed, 370 insertions(+), 77 deletions(-)
Fusion-Task-Id: FN-8611
Fusion-Task-Lineage: 00a84f43-4469-4bc5-bbb6-8245d8d79781
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 13:05:23 -07:00
gsxdsm
47087342fc
FN-8605: harden tablet touch window controls
...
Make shared floating dashboard windows reliably movable and resizable on tablet touch viewports.
- Apply a tablet-aware 44px drag and resize hit-target contract to FloatingWindow.
- Preserve phone full-screen sheets below 768px while retaining desktop-hybrid geometry.
- Add geometry, browser touch, and viewport boundary coverage with captured visual evidence.
- Document the shared modal touch contract and release the dashboard fix.
Files changed:
.changeset/fn-8605-floating-window-touch.md | 7 ++
docs/dashboard-guide.md | 5 +
docs/testing.md | 2 +-
.../dashboard/app/components/FloatingWindow.css | 116 ++++++++++++++----
.../dashboard/app/components/FloatingWindow.tsx | 56 ++++++++-
.../components/__tests__/FloatingWindow.test.tsx | 80 +++---------
.../FloatingWindow.touch-geometry.test.tsx | 136 +++++++++++++++++++++
.../FloatingWindowStack.cross-type.test.tsx | 2 +-
.../app/hooks/__tests__/useViewportMode.test.ts | 18 ++-
packages/dashboard/app/hooks/useViewportMode.ts | 7 +-
.../app/task-modal-touch-resize-e2e-fixture.tsx | 39 +++++-
.../__screenshots__/fn-8605/phone-fullscreen.png | Bin 0 -> 11393 bytes
.../e2e/__screenshots__/fn-8605/tablet-after.png | Bin 0 -> 14275 bytes
.../e2e/__screenshots__/fn-8605/tablet-before.png | Bin 0 -> 14308 bytes
.../task-modal-touch-resize-browser.test.ts | 83 +++++++++++++
15 files changed, 453 insertions(+), 98 deletions(-)
Fusion-Task-Id: FN-8605
Fusion-Task-Lineage: 993c7ed8-c3e9-4673-b0b7-5c50746991a7
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 12:51:39 -07:00
gsxdsm
fde3b76a8c
FN-8602: enable tablet touch resizing for task modals
...
Enable touch-driven resizing for task modals on tablet viewports.
- Add tablet touch resize handles and pointer interactions for task and new-task modals.
- Preserve responsive modal sizing while keeping phone layouts fullscreen.
- Add unit, browser, and visual regression coverage with updated documentation.
Files changed:
.changeset/fn-8602-tablet-touch-resize.md | 7 +
docs/dashboard-guide.md | 6 +-
docs/testing.md | 4 +
packages/dashboard/app/components/NewTaskModal.css | 70 ++++++++++
packages/dashboard/app/components/NewTaskModal.tsx | 19 ++-
.../dashboard/app/components/TaskDetailModal.css | 12 ++
.../dashboard/app/components/TaskDetailModal.tsx | 7 +-
.../app/components/__tests__/NewTaskModal.test.tsx | 4 +
...etailModal.responsive-and-dependencies.test.tsx | 1 +
.../hooks/__tests__/useModalResizePersist.test.tsx | 10 +-
.../app/hooks/__tests__/useViewportMode.test.ts | 26 +++-
.../dashboard/app/hooks/useModalResizePersist.ts | 26 +++-
packages/dashboard/app/hooks/useViewportMode.ts | 13 ++
packages/dashboard/app/styles.css | 16 +++
.../app/task-modal-touch-resize-e2e-fixture.html | 5 +
.../app/task-modal-touch-resize-e2e-fixture.tsx | 60 ++++++++
.../__screenshots__/fn-8602/phone-fullscreen.png | Bin 0 -> 43987 bytes
.../e2e/__screenshots__/fn-8602/tablet-after.png | Bin 0 -> 52549 bytes
.../e2e/__screenshots__/fn-8602/tablet-before.png | Bin 0 -> 11500 bytes
.../task-modal-touch-resize-browser.test.ts | 154 +++++++++++++++++++++
20 files changed, 424 insertions(+), 16 deletions(-)
Fusion-Task-Id: FN-8602
Fusion-Task-Lineage: f07ce22f-f529-4be3-ba1b-04063154a1b0
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 12:12:35 -07:00
gsxdsm
cca13737b6
FN-8603: reduce steady-state diagnostic log noise
...
Route routine core, engine, and dashboard diagnostics through debug-gated shared loggers.
- Demote steady-state diagnostic sites while preserving warnings and errors for actionable failures.
- Add cross-package severity contracts and manifest coverage for demoted log sites.
- Document logging severity guidance and add a patch changeset.
Files changed:
.changeset/fn-8603-log-severity.md | 7 ++
docs/diagnostics.md | 20 ++++--
.../__tests__/log-severity-spam-contract.test.ts | 71 ++++++++++++++++++
packages/core/src/activity-analytics.ts | 5 +-
packages/core/src/ai-summarize.ts | 61 +++++++---------
packages/core/src/async-mission-store.ts | 5 +-
packages/core/src/async-secrets-store.ts | 7 +-
packages/core/src/central-core.ts | 17 ++---
packages/core/src/docker-provisioning.ts | 13 ++--
packages/core/src/index.ts | 1 +
packages/core/src/master-key.ts | 9 ++-
packages/core/src/memory-compaction.ts | 29 ++++----
packages/core/src/memory-insights.ts | 7 +-
packages/core/src/migration-orchestrator.ts | 7 +-
packages/core/src/mission-store.ts | 5 +-
packages/core/src/node-discovery.ts | 7 +-
packages/core/src/notification/dispatcher.ts | 9 ++-
.../core/src/plugins/bundled-plugin-install.ts | 11 +--
packages/core/src/reflection-store.ts | 5 +-
packages/core/src/secrets-store.ts | 7 +-
packages/core/src/task-store/agent-logs.ts | 21 +++---
packages/core/src/task-store/async-events.ts | 5 +-
packages/core/src/task-store/async-maintenance.ts | 7 +-
packages/core/src/task-store/comments-ops.ts | 7 +-
packages/core/src/task-store/task-mutation-ops.ts | 11 +--
packages/core/src/task-store/workflow-integrity.ts | 9 ++-
packages/core/src/types/merge-policy.ts | 5 +-
packages/core/src/usage-events.ts | 5 +-
.../__tests__/log-severity-spam-contract.test.ts | 48 +++++++++++++
packages/dashboard/src/ai-refine.ts | 5 +-
packages/dashboard/src/ai-session-diagnostics.ts | 10 +--
packages/dashboard/src/chat.ts | 8 ++-
packages/dashboard/src/devserver-manager.ts | 9 ++-
packages/dashboard/src/file-service.ts | 5 +-
packages/dashboard/src/github-tracking-comments.ts | 7 +-
.../dashboard/src/github-tracking-reconciler.ts | 5 +-
packages/dashboard/src/github-tracking-state.ts | 5 +-
packages/dashboard/src/gitlab-lifecycle.ts | 5 +-
packages/dashboard/src/insights-routes.ts | 9 ++-
packages/dashboard/src/issue-image-attachments.ts | 5 +-
packages/dashboard/src/knowledge-index.ts | 5 +-
packages/dashboard/src/plugin-routes.ts | 7 +-
packages/dashboard/src/routes/board-workflows.ts | 5 +-
packages/dashboard/src/routes/context.ts | 5 +-
.../dashboard/src/routes/register-auth-routes.ts | 13 ++--
.../routes/register-docker-provisioning-routes.ts | 7 +-
.../dashboard/src/routes/register-git-github.ts | 21 +++---
packages/dashboard/src/routes/register-gitlab.ts | 7 +-
.../src/routes/register-session-diff-routes.ts | 9 ++-
.../src/routes/register-settings-memory-routes.ts | 7 +-
.../src/routes/register-setup-activity-routes.ts | 7 +-
.../dashboard/src/routes/register-signal-routes.ts | 5 +-
.../src/routes/register-task-workflow-routes.ts | 11 +--
packages/dashboard/src/runtime-logger.ts | 11 +--
packages/dashboard/src/server.ts | 7 +-
packages/dashboard/src/sse.ts | 8 ++-
packages/dashboard/src/terminal-service.ts | 34 ++++-----
packages/dashboard/src/view-chunk-manifest.ts | 5 +-
.../engine/src/__tests__/log-severity-manifest.ts | 83 ++++++++++++++++++++++
.../__tests__/log-severity-spam-contract.test.ts | 40 ++++++++++-
.../src/__tests__/logger-debug-gating.test.ts | 7 +-
packages/engine/src/goal-anchoring-audit.ts | 5 +-
packages/engine/src/plugin-runner.ts | 44 ++++++------
packages/engine/src/pty-native.ts | 9 ++-
.../engine/src/runtimes/child-process-worker.ts | 4 +-
packages/engine/src/self-healing.ts | 12 ++--
packages/engine/src/worktree-hooks.ts | 10 ++-
67 files changed, 632 insertions(+), 250 deletions(-)
Fusion-Task-Id: FN-8603
Fusion-Task-Lineage: 53901db6-1af2-4bd7-b5ea-49507e048ef2
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 12:01:19 -07:00
gsxdsm
a516c8b409
docs(FN-8600): capture the live-planning-worktree reclaim incident
...
Documents why self-healing force-removed a worktree a planning session was
using and parked the card branch-conflict-unrecoverable: planning gained a task
worktree but never took an active-session lease, so the reclaim sweep's liveness
guard had nothing to see, and a zero-commit branch classifies as
tip-already-merged by construction.
Captures the investigation's dead ends too — including reading maxConcurrent
from a multi-tenant config table without filtering by project_id, which produced
a confidently wrong root cause — and the three ways the first version of the fix
was itself wrong.
CONCEPTS.md: adds planning to the Active-session lease kinds (the entry had gone
stale), states the converse invariant that an unheld path reads as proof nothing
is running, and defines Top-level agent slot — the capacity concept whose
conflation with the worktree limit derailed the first hour of diagnosis.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-26 09:32:22 -07:00
gsxdsm
47d030215c
feat(workflow): run pre-merge review gates in the In review column
...
Code Review and Browser Verification now run with the card in `in-review`
instead of `in-progress`, so the board shows the card under review with the
running step as a badge (matching the Coding (Ideas) preset). Their paired
remediation nodes stay in `in-progress`, so a changes-requested verdict
visibly sends the card back to implementation.
The column move IS the badge switch: the dashboard badge was already
lane-gated on `column === "in-review"`. Applied to the shared stepwise
coding IR, so it is inherited by builtin:coding (the default),
builtin:stepwise-coding, builtin:brainstorming and builtin:coding-ideas;
builtin:legacy-coding keeps its historical placement.
Two consequences handled:
- Capacity: `in-review` has no `wip` trait, so the slot is released during
review and the remediation crossing back into `in-progress` can hit the
non-bypassable in-transaction capacity check. The column boundary now
PARKS the run on a `capacity-exhausted` rejection instead of failing it,
preserving the failed gate result and worktree so the next graph run
retries once a slot frees. Non-capacity rejections still propagate.
- Reopen clears: `applyReopenFieldClears` wiped `workflowStepResults` on
every in-review -> in-progress move, which the remediation crossing now
performs routinely. That destroyed the remediation input, made
`routeRetryableRemediationGraphFailureToPreMergeFix` and
`recoverFailedPreMergeWorkflowStep` silently no-op, and — worse — made
both `getTaskMergeBlocker` branches vacuously false, so a card could
return to `in-review` and be mergeable with its gate never re-run. Now
exempted for graph-owned in-review -> in-progress crossings only;
operator reopens, merge bounces and every -> todo/triage rebound still
clear, so the executor's documented bounce invariant is unchanged.
Adds regression coverage for both (there was previously none for the
reopen clear in either direction), and annotates the unreachable legacy
scheduler dispatch block rather than mirroring the fix into dead code.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-26 02:04:40 -07:00
gsxdsm
fd073e287f
FN-8592: self-heal stranded hold continuations
...
Restore graph-owned plan-review continuations for eligible hold-column cards stranded after planning cancellation.
- Detect real-spec hold cards with no active workflow continuation and re-seed Plan Review safely.
- Serialize workflow continuation seeding, review-result writes, and lease claims to prevent duplicate recovery.
- Add recovery diagnostics, release warnings, regression coverage, and a patch changeset.
Files changed:
.changeset/fn-8592-stranded-hold-continuation.md | 7 +
AGENTS.md | 1 +
docs/architecture.md | 4 +
.../workflow-task-serialization-protocol.test.ts | 119 +++++++++++++
.../workflow-work-items-conditional-seed.test.ts | 191 +++++++++++++++++++++
packages/core/src/store.ts | 5 +-
.../src/task-store/async-workflow-workitems.ts | 123 +++++++++----
packages/core/src/task-store/project-store-ops.ts | 14 ++
.../src/task-store/workflow-task-create-ops.ts | 16 +-
.../src/task-store/workflow-workitems-ops-2.ts | 91 ++++++----
.../src/__tests__/pre-release-plan-review.test.ts | 17 ++
...self-healing-stranded-hold-continuation.test.ts | 171 ++++++++++++++++++
packages/engine/src/hold-release.ts | 57 +++++-
packages/engine/src/plan-review-continuation.ts | 94 ++++++++++
packages/engine/src/runtimes/in-process-runtime.ts | 30 +---
packages/engine/src/self-healing.ts | 100 ++++++++++-
16 files changed, 945 insertions(+), 95 deletions(-)
Fusion-Task-Id: FN-8592
Fusion-Task-Lineage: fe7ffd34-96e4-4418-a879-7418e6293d30
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-26 00:46:07 -07:00
gsxdsm
106c61e6ee
fix(agent-tools): close the fn_delegate_task Deny bypass and the store's window clamp
...
Follow-up to 13a2b2a9d , from a multi-agent review of that commit. Three of its
claims did not hold.
1. fn_delegate_task bypassed the gate entirely (P0). It reaches the same
createAgentTask primitive, was registered unconditionally in both session
lanes, and validated only that the TARGET agent is non-ephemeral — never the
caller. Under Deny an ephemeral worker could enumerate agents and delegate
unlimited tasks. It is now withheld under Deny, and also under
upon_validation: delegation has no proposal channel, so leaving it available
would launder a create past the operator review that policy requires.
2. The widened dedupe window was capped at 5 minutes. The store query in
branch-and-pr-entities.ts carried its own independent `?? 60_000` /
`min(300_000, …)` pair, so widening only duplicate-guard.ts under-delivered
and made the new ceiling unreachable. Both sites now share
FINGERPRINT_WINDOW_DEFAULT_MS / FINGERPRINT_WINDOW_MAX_MS.
3. The pi-extension gate does not fire at all. pi's ExtensionContext carries no
agentId — the read is a speculative cast and only tests supply one, so every
real call short-circuits as a human caller. The fail-closed direction is kept
for the day an identity signal exists, but the limitation is now documented
instead of implied to be enforcement.
Also: the session prompt now states when creation is disabled and names
fn_task_log as the fallback (the base prompt still taught fn_task_create, which
is the same instruction/capability mismatch that fed the retry storm);
suppression emits an `agent:task-create-withheld` run-audit event; and the two
source-text ratchet tests are replaced with behavioral assertions on the tool
list the executor actually hands the model — verified to fail when the guard is
broken, which the string assertions did not.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-25 23:44:56 -07:00
gsxdsm
0c85613313
fix(engine): address code-review findings on the planner/worktree recovery fixes
...
Review of 2dbfe3d31 + 05b704dc6 surfaced real defects in both fixes:
- The unusable-worktree probe composed two helpers across an unnecessary
self-healing -> step-runner import edge, and the directory check added no
discriminating power over the `.git` probe. Replaced with one canonical
hasUsableWorktreeShape beside classifyTaskWorktree, which also applies the
repo-root gate (FN-6861) when a rootDir is available; both call sites pass one.
Its narrower guarantee vs the canonical classifier is now documented and
pinned by tests, including the de-registered shape it cannot see.
- REPLAN_PARK_STATUSES is derived from PLANNING_STAGE_STATUSES instead of
re-listed, so a new durable park status cannot be added to one set only.
- The preserve/clear decision no longer pretends to steer `worktree`: the rebound
is a reopen move, which clears it regardless. Documented, and the test now
asserts the durable row rather than only the updateTask argument.
- `branch` is cleared only when it is the re-derivable canonical fusion/<id>;
a non-canonical branch survives so a card's only commit pointer is not dropped.
- The recovery log named the recorded worktree even when the session had targeted
an AI-merge clean room. It now names the refused path and says whether the
recorded worktree was gone too.
- Added task:auto-recover-worktree-session-metadata so the decision is legible to
agents, not only in human log prose.
- isTaskStillInPlanningStage's parameter type now includes the execution stamps
its implementation reads.
- Test hygiene: real-fs fixtures wrapped in try/finally; changeset dev note
corrected; FN-8361 asserted at the discovery surface, not only in the guard
table.
Also captures the shared bug class in docs/solutions.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-25 23:24:10 -07:00
gsxdsm
351fba1d33
FN-8594: improve project overview mobile reflow
...
Make the project overview usable at small viewport widths while hiding its non-functional mobile task navigation.
- Reflow overview filters, stats, cards, and skeletons for 480px and 380px breakpoints.
- Hide the mobile navigation bar and clear its reserved height outside an active project task view.
- Add regression coverage and document responsive dashboard behavior.
Files changed:
docs/dashboard-guide.md | 5 +-
packages/dashboard/app/App.tsx | 8 +-
.../mobile-feature-access-regression.test.tsx | 22 ++++-
.../project-overview-small-screen.test.ts | 91 ++++++++++++++++++++
packages/dashboard/app/components/MobileNavBar.tsx | 19 ++++-
packages/dashboard/app/components/ProjectCard.css | 58 +++++++++++++
.../dashboard/app/components/ProjectOverview.css | 99 ++++++++++++++++++++++
7 files changed, 294 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-8594
Fusion-Task-Lineage: 0999f6e4-ffe9-4ed6-a471-8e5ba3413029
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-25 23:12:41 -07:00
gsxdsm
99b80ad748
feat(dashboard): add opt-in auto-update and harden restart supervision
...
Add the `autoUpdateAndRestart` global setting (default off, Settings ->
General next to Release channel). When enabled, the dashboard host installs
available updates on the selected channel by itself and requests the
supervised in-place restart. Supervised hosts only: without a parent to
respawn, installing would leave a running process whose code no longer
matches its own install.
Fix two ways the restart affordance could silently do nothing:
- The supervisor now stamps FUSION_SUPERVISOR_PID and supervision is only
counted when that pid is the real parent. FUSION_RESTART_SUPERVISED is
inherited by every process Fusion spawns, so `fn dashboard` launched from
an agent terminal skipped its own supervisor while still advertising
restart support -- a restart request then killed it for good.
- Settings and the update banner probe /system/info on mount and treat
capability as advisory: the button always issues the request and shows the
server's actual refusal instead of sitting disabled after a failed probe.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-25 22:52:53 -07:00
gsxdsm
3597d06380
FN-8578: pin verified Parakeet v3 model asset
...
Enable secure downloads of the upstream Parakeet v3 voice model.
- Pin the archive URL, filename, SHA-256, expected files, and nested extraction layout.
- Accept the archive's BSD tar timestamp format while preserving safe extraction checks.
- Cover download gates and installation behavior, and document the verified model asset.
Files changed:
.changeset/fn-8578-parakeet-v3-asset-pin.md | 7 ++++
docs/dashboard-guide.md | 2 +-
docs/settings-reference.md | 8 ++--
.../src/stt/__tests__/model-manager.test.ts | 46 ++++++++++++++++++++++
.../dashboard/src/stt/__tests__/voice-stt.test.ts | 33 +++++++++++++++-
packages/dashboard/src/stt/model-manager.ts | 13 +++---
packages/dashboard/src/stt/types.ts | 18 +++++++--
7 files changed, 114 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-8578
Fusion-Task-Lineage: ab397190-fa0c-491e-b0f8-0ab6641be95a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-25 08:21:00 -07:00
gsxdsm
2a2b157cb9
FN-8585: fix dashboard composer test source reads
...
Stabilize dashboard composer tests when Vitest launches from the workspace root.
- Resolve dashboard test source fixtures relative to the app directory.
- Migrate affected component tests away from cwd-relative CSS reads.
- Enforce the fixture convention in test hooks and document it.
Files changed:
docs/testing.md | 4 +++
package.json | 6 ++--
.../__tests__/AuthTokenRecoveryDialog.test.tsx | 3 +-
.../components/__tests__/ChatView.mobile.test.tsx | 5 +--
.../__tests__/EngineControlMenu.test.tsx | 11 ++----
.../components/__tests__/FloatingWindow.test.tsx | 5 +--
.../app/components/__tests__/ListView.test.tsx | 5 +--
.../__tests__/MissionInterviewModal.test.tsx | 3 +-
.../app/components/__tests__/MobileNavBar.test.tsx | 3 +-
.../app/components/__tests__/NewTaskModal.test.tsx | 3 +-
.../__tests__/PlanningModeModal.initial.test.tsx | 3 +-
.../PlanningModeModal.ui-interactions.test.tsx | 7 ++--
.../components/__tests__/PrCreateModal.test.tsx | 3 +-
.../__tests__/QuickChat.persist.test.tsx | 3 +-
.../components/__tests__/QuickEntryBox.test.tsx | 3 +-
.../components/__tests__/ReportActionMenu.test.tsx | 9 ++---
.../app/components/__tests__/ReportModal.test.tsx | 3 +-
.../__tests__/ShadcnColorPicker.test.tsx | 3 +-
.../components/__tests__/TerminalModal.test.tsx | 3 +-
.../components/__tests__/ThemeDropdown.test.tsx | 9 ++---
.../__tests__/WorkflowNodeEditor.test.tsx | 5 +--
.../WorkflowOptionalStepsDropdown.test.tsx | 3 +-
.../components/__tests__/WorkflowSwitcher.test.tsx | 5 +--
.../app/components/__tests__/board-mobile.test.tsx | 4 +--
.../__tests__/CommandCenterControls.test.tsx | 6 ++--
.../__tests__/SystemControlsArea.test.tsx | 5 +--
.../__tests__/SystemStatsArea.test.tsx | 3 +-
.../command-center/areas/__tests__/areas.test.tsx | 3 +-
.../__tests__/KeyboardShortcutsSection.test.tsx | 3 +-
.../app/test/__tests__/cssFixture.test.ts | 35 +++++++++++++++++++
packages/dashboard/app/test/cssFixture.ts | 12 +++++++
.../check-no-cwd-relative-dashboard-test-reads.mjs | 39 ++++++++++++++++++++++
32 files changed, 162 insertions(+), 55 deletions(-)
Fusion-Task-Id: FN-8585
Fusion-Task-Lineage: 83a35fb6-a29d-4e97-b282-1054c68b8cc9
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-25 06:22:23 -07:00
gsxdsm
32adc0a153
FN-8573: add voice dictation controls to composers
...
Add shared voice dictation support across chat, planning, and task-creation composers.
- Add browser speech-recognition and composer insertion hooks.
- Provide a reusable mic button with accessible recording states.
- Integrate and test dictation across all supported composer surfaces.
- Document the feature and add a package changeset.
Files changed:
.changeset/fn-8573-voice-dictation-mic.md | 7 +
docs/dashboard-guide.md | 6 +
packages/dashboard/app/components/ChatView.tsx | 44 +++-
.../dashboard/app/components/ComposeChatPanel.tsx | 8 +-
packages/dashboard/app/components/MicButton.css | 5 +
packages/dashboard/app/components/MicButton.tsx | 20 ++
.../dashboard/app/components/PlanningModeModal.tsx | 82 ++++--
.../dashboard/app/components/QuickEntryBox.tsx | 4 +
.../app/components/StandardChatSurface.tsx | 108 +++++---
packages/dashboard/app/components/TaskChatTab.tsx | 4 +
packages/dashboard/app/components/TaskComments.tsx | 66 ++---
packages/dashboard/app/components/TaskForm.tsx | 18 +-
.../app/components/TaskPlannerChatTab.tsx | 7 +
.../app/components/__tests__/MicButton.test.tsx | 28 +++
.../components/__tests__/QuickEntryBox.test.tsx | 5 +
.../app/components/__tests__/TaskForm.test.tsx | 5 +
.../app/components/__tests__/insertAtCaret.test.ts | 25 ++
.../__tests__/voice-dictation-composers.test.tsx | 230 +++++++++++++++++
packages/dashboard/app/components/insertAtCaret.ts | 20 ++
.../hooks/__tests__/useComposerDictation.test.tsx | 58 +++++
.../app/hooks/__tests__/useVoiceDictation.test.tsx | 158 ++++++++++++
.../dashboard/app/hooks/useComposerDictation.ts | 112 +++++++++
.../dashboard/app/hooks/useVoiceDictation.ts | 277 +++++++++++++++++++++
23 files changed, 1204 insertions(+), 93 deletions(-)
Fusion-Task-Id: FN-8573
Fusion-Task-Lineage: 905ae982-3e63-494f-aba8-e3665f00cdda
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-25 05:15:02 -07:00
gsxdsm
11db36187f
FN-8572: add voice input settings and model controls
...
Add project-scoped voice dictation controls with observable local model management.
- Add the Voice Input settings section with opt-in enablement and runtime-safe status handling.
- Add Parakeet v3 model download, removal, progress polling, search, documentation, and regression coverage.
- Add a minor release changeset for Voice Input settings.
Files changed:
.changeset/fn-8572-voice-input-settings.md | 7 ++
docs/dashboard-guide.md | 4 +
docs/settings-reference.md | 1 +
.../dashboard/app/components/SettingsModal.tsx | 7 +-
.../VoiceInputSection.modal-visibility.test.tsx | 19 +++
.../settings/__tests__/VoiceInputSection.test.tsx | 137 +++++++++++++++++++++
.../settings/__tests__/section-keys.test.ts | 1 +
.../search/__tests__/settings-search-index.test.ts | 1 +
.../app/components/settings/search/entries.ts | 2 +
.../app/components/settings/section-keys.ts | 2 +
.../settings/sections/VoiceInputSection.css | 48 ++++++++
.../settings/sections/VoiceInputSection.search.ts | 14 +++
.../settings/sections/VoiceInputSection.tsx | 128 ++++++++++++++++++++
13 files changed, 370 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-8572
Fusion-Task-Lineage: 2d2ad0df-3765-4d19-a6f3-7c2b5ca5df95
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-25 02:51:28 -07:00
gsxdsm
9a2aea6120
FN-8571: add Parakeet STT transcription backend
...
Add a configurable sherpa-onnx Parakeet v3 speech-to-text service and dashboard API.
- Add model download, validation, caching, and lifecycle management for the bundled STT runtime.
- Register multipart-safe voice transcription routes with request-size handling and service-backed responses.
- Expose STT settings, documentation, release metadata, and focused integration coverage.
Files changed:
.changeset/fn-8571-voice-stt-backend.md | 7 +
docs/settings-reference.md | 12 +
.../core/src/__tests__/settings-parity.test.ts | 10 +
packages/core/src/index.ts | 2 +-
packages/core/src/settings-schema.ts | 2 +
packages/core/src/types.ts | 2 +
packages/core/src/types/settings-scope.ts | 19 ++
packages/dashboard/package.json | 3 +
.../voice-body-parser-integration.test.ts | 67 ++++++
packages/dashboard/src/routes.ts | 2 +
packages/dashboard/src/routes/README.md | 74 +++---
.../routes/__tests__/register-voice-routes.test.ts | 159 ++++++++++++
.../src/routes/create-api-routes-mount-sequence.ts | 2 +-
.../dashboard/src/routes/register-voice-routes.ts | 92 +++++++
packages/dashboard/src/server.ts | 21 +-
.../src/stt/__tests__/model-manager.test.ts | 171 +++++++++++++
.../dashboard/src/stt/__tests__/voice-stt.test.ts | 48 ++++
packages/dashboard/src/stt/model-manager.ts | 268 +++++++++++++++++++++
packages/dashboard/src/stt/parakeet-service.ts | 77 ++++++
packages/dashboard/src/stt/types.ts | 14 ++
pnpm-lock.yaml | 65 +++++
21 files changed, 1086 insertions(+), 31 deletions(-)
Fusion-Task-Id: FN-8571
Fusion-Task-Lineage: b11e0cea-9c9c-41d4-a141-c47e5ed56dba
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-25 02:17:31 -07:00
gsxdsm
b31bee03a8
FN-8576: add global quiet flag to CLI
...
Add a global quiet mode that suppresses informational CLI stdout without hiding requested results.
- Parse --quiet/-q and FUSION_QUIET with command and output exemptions.
- Route result output and interactive prompts around the reversible stdout gate.
- Document the flag and cover quiet output, prompts, and argument parsing.
Files changed:
.changeset/fn-8576-cli-quiet-flag.md | 7 ++
docs/cli-reference.md | 8 ++
packages/cli/src/__tests__/bin.test.ts | 15 +++
packages/cli/src/__tests__/cli-quiet-mode.test.ts | 63 +++++++++++++
.../__tests__/cli-quiet-prompt-surfaces.test.ts | 33 +++++++
packages/cli/src/bin.ts | 39 ++++++--
packages/cli/src/commands/experiment-finalize.ts | 3 +-
packages/cli/src/commands/git.ts | 17 ++--
packages/cli/src/commands/goals.ts | 4 +-
packages/cli/src/commands/mission.ts | 8 +-
packages/cli/src/commands/node.ts | 4 +-
packages/cli/src/commands/onboard.ts | 4 +-
packages/cli/src/commands/org-import.ts | 5 +-
packages/cli/src/commands/plugin.ts | 14 ++-
packages/cli/src/commands/port-prompt.ts | 4 +-
packages/cli/src/commands/project.ts | 6 +-
packages/cli/src/commands/research.ts | 3 +-
packages/cli/src/commands/task.ts | 101 +++++++++++---------
packages/cli/src/commands/update.ts | 3 +-
packages/cli/src/commands/workflow.ts | 13 +--
packages/cli/src/output.ts | 104 +++++++++++++++++++++
packages/cli/src/project-resolver.ts | 20 ++--
22 files changed, 388 insertions(+), 90 deletions(-)
Fusion-Task-Id: FN-8576
Fusion-Task-Lineage: 2493d6d5-bbd9-4fc2-b903-950457ef30b0
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-25 00:54:46 -07:00
gsxdsm
0056d75314
FN-8569: surface unrecoverable report health
...
Classify parked direct reports as operator-actionable even when their stored state appears live.
- Add a reusable Reports Health classifier that prioritizes pause markers.
- Clear stale pause markers during live-state resumes without removing diagnostic errors.
- Cover desynchronized report states and document the health invariant.
Files changed:
.../fn-8569-reports-health-error-unrecoverable.md | 7 +++
docs/architecture.md | 1 +
.../agent-store-pause-marker-clear.test.ts | 65 +++++++++++++++++++
packages/core/src/agent-store.ts | 12 ++++
.../src/__tests__/heartbeat-executor.test.ts | 27 ++++++--
.../engine/src/__tests__/reports-health.test.ts | 73 ++++++++++++++++++++++
packages/engine/src/agent-heartbeat.ts | 36 ++++++-----
packages/engine/src/index.ts | 6 ++
packages/engine/src/reports-health.ts | 70 +++++++++++++++++++++
9 files changed, 278 insertions(+), 19 deletions(-)
Fusion-Task-Id: FN-8569
Fusion-Task-Lineage: 37c798a0-1f2b-4221-a0c6-ccbff8d72696
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-24 23:57:49 -07:00
gsxdsm
3c3acbf769
docs(settings): record why global settings are not all in postgres
...
Global settings are already split three ways -- values in settings.json, the
revision journal in postgres, and globalMaxConcurrent/defaultProjectId in
central tables -- so the recurring "finish the cutover" proposal keeps getting
re-litigated from scratch.
Write down the two hard constraints (startup-factory reads
embeddedPostgresMaxConnections to start postgres; createFusionAuthStorage is
synchronous and host-agnostic), the recovery argument, and the one real
motivation for a partial move (multi-node policy consistency), plus the
machine-tier vs operator-policy-tier rule for placing new keys.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-24 22:46:27 -07:00
gsxdsm
8dc6598aa0
feat(auth): let operators choose which Anthropic credential wins
...
An operator can hold a raw Anthropic API key and a Claude subscription OAuth
login at once, and the raw key always won silently. A stale or revoked saved
key therefore shadowed a working subscription and failed every direct Anthropic
call with 401 invalid x-api-key, while both Settings cards still read Active.
Add the global anthropicAuthPreference setting ("api-key" default, preserving
the historical precedence, or "subscription"), read in resolveAnthropicRuntimeApiKey
straight from ~/.fusion/settings.json so it applies without a restart and needs
no settings plumbing through createFusionAuthStorage. Neither value removes a
source: with one credential configured, resolution reaches it either way.
Settings -> Authentication now names the credential in use on the two Anthropic
cards and renders the control, but only when both are actually connected.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-24 22:32:39 -07:00
gsxdsm
8156308695
feat(quick-add): show a visible Start button for waiting-column workflows
...
Replace the hidden long-press/right-click Start menu on Quick Add's Save with a
visible Start button in the action row, rendered only for workflows whose first
visible lane is a hold column (or Coding (Ideas)). Eligibility, the workflow
snapshot, the create-time column override, and the hold-first follow-up move are
unchanged; ineligible workflows render no Start chip or shell.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-24 22:32:30 -07:00
gsxdsm
4b4df1ff30
FN-8565: restore tablet task modal resizing
...
Restore resizable Task Detail and New Task windows on 768px touch tablets.
- Classify known touch tablets separately from phone sheets
- Restore bounded modal geometry and resize grips with keyboard support
- Add regression coverage, documentation, and a patch changeset
Files changed:
.changeset/fn-8565-tablet-task-modal-resize.md | 7 +++
docs/dashboard-guide.md | 5 ++
.../task-detail-modal-tablet-width.test.ts | 15 +++++
packages/dashboard/app/components/NewTaskModal.css | 18 +++++-
packages/dashboard/app/components/NewTaskModal.tsx | 44 +++++++++++++-
.../dashboard/app/components/TaskDetailModal.css | 30 ++++++++++
.../dashboard/app/components/TaskDetailModal.tsx | 40 +++++--------
.../app/components/__tests__/NewTaskModal.test.tsx | 68 +++++++++++++++++++++-
...etailModal.responsive-and-dependencies.test.tsx | 51 ++++++++++++++++
.../hooks/__tests__/useModalResizePersist.test.tsx | 53 ++++++++++++++++-
.../dashboard/app/hooks/useModalResizePersist.ts | 58 +++++++++++++++---
11 files changed, 352 insertions(+), 37 deletions(-)
Fusion-Task-Id: FN-8565
Fusion-Task-Lineage: 7d9bbeb9-0e6a-4ad9-8b4d-e9f3d8aef650
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-24 19:20:16 -07:00
gsxdsm
a9d5b06013
FN-8562: add tags to chat conversations
...
Enable project-scoped reusable tags for Direct chat sessions.
- Add tag storage, migrations, and scoped assignment APIs.
- Add chat sidebar tag creation, assignment, and filtering controls.
- Document tag behavior and cover schema and chat interactions.
- Establish the session project/id candidate key before creating scoped tag foreign keys.
Files changed:
.changeset/fn-8562-chat-conversation-tags.md | 7 ++
docs/dashboard-guide.md | 4 +
docs/storage.md | 2 +
.../src/__tests__/postgres/schema-applier.test.ts | 8 +-
packages/core/src/async-chat-store.ts | 117 ++++++++++++++++++++-
packages/core/src/chat-store.ts | 32 ++++++
packages/core/src/chat-types.ts | 14 +++
packages/core/src/index.gate.ts | 3 +
packages/core/src/index.ts | 3 +
.../postgres/migrations/0036_chat_session_tags.sql | 64 +++++++++++
packages/core/src/postgres/schema-applier.ts | 16 ++-
packages/core/src/postgres/schema/project.ts | 34 ++++++
packages/dashboard/app/api.ts | 1 +
packages/dashboard/app/api/chat.ts | 18 ++++
packages/dashboard/app/components/ChatView.css | 17 +++
packages/dashboard/app/components/ChatView.tsx | 70 +++++++++++-
.../__tests__/ChatView.core-interactions.test.tsx | 27 +++++
.../dashboard/app/hooks/__tests__/useChat.test.ts | 1 +
packages/dashboard/app/hooks/useChat.ts | 52 ++++++++-
.../dashboard/src/routes/register-chat-routes.ts | 70 ++++++++++++
20 files changed, 550 insertions(+), 10 deletions(-)
Fusion-Task-Id: FN-8562
Fusion-Task-Lineage: 4efe798c-0865-451a-adbd-6b85f9f8b149
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-24 18:09:32 -07:00
gsxdsm
03cfc2dfc8
FN-8561: add lifecycle dates to task cards
...
Show localized creation and completion dates directly on task cards.
- Render compact, locale-aware lifecycle timestamps with accessible full-date titles.
- Persist archive timestamps for completed archived-task fallbacks and add coverage.
- Add translated labels, documentation, and a minor release changeset.
Files changed:
.changeset/fn-8561-task-card-dates.md | 7 +++
docs/dashboard-guide.md | 1 +
.../__tests__/archive-entry-serialization.test.ts | 35 ++++++++++++++
packages/core/src/task-store/serialization.ts | 8 ++++
packages/core/src/types/task-core.ts | 5 ++
packages/dashboard/app/components/TaskCard.css | 27 +++++++++++
packages/dashboard/app/components/TaskCard.tsx | 55 ++++++++++++++++++++++
.../__tests__/TaskCard.host-inventory.test.tsx | 21 +++++++++
.../app/components/__tests__/TaskCard.test.tsx | 17 +++++++
.../dashboard/app/i18n/__tests__/format.test.ts | 19 +++++++-
packages/dashboard/app/i18n/format.ts | 38 +++++++++++++++
packages/i18n/locales/en/app.json | 4 ++
packages/i18n/locales/es/app.json | 4 ++
packages/i18n/locales/fr/app.json | 4 ++
packages/i18n/locales/ko/app.json | 4 ++
packages/i18n/locales/zh-CN/app.json | 4 ++
packages/i18n/locales/zh-TW/app.json | 4 ++
17 files changed, 256 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-8561
Fusion-Task-Lineage: 474b949b-d8e7-469a-b564-00acae66e58a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-24 11:15:43 -07:00
gsxdsm
c5a8421533
FN-8560: forward desktop test telemetry flags
...
Desktop test execution now preserves CI reporter and JSON output flags.
- Forward caller-selected Vitest reporters and output files through the desktop test wrapper.
- Add coverage for reporter syntax and shard timing command forwarding.
- Document desktop timing artifact requirements.
Files changed:
docs/testing.md | 7 ++++-
packages/desktop/scripts/__tests__/test-args.test.ts | 36 ++++++++++++++++++++++
packages/desktop/scripts/test-args.ts | 13 ++++++++
packages/desktop/scripts/test.ts | 3 +-
scripts/__tests__/ci-test-shard.test.mjs | 9 ++++++
5 files changed, 66 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-8560
Fusion-Task-Lineage: 2a89b28d-39f6-4949-aec2-1123c36126cf
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-24 05:30:45 -07:00
gsxdsm
973c978f91
FN-8557: preserve terminal geometry on tablets
...
Keep floating terminal controls available on touch tablets across responsive and keyboard viewport changes.
- Classify known tablet screens separately from phone fallbacks.
- Restore tablet floating and docked geometry at the 768px breakpoint with larger touch resize targets.
- Cover keyboard-shrunken and breakpoint tablet interactions, and document the responsive behavior.
Files changed:
docs/dashboard-guide.md | 2 +-
.../dashboard/app/components/TerminalModal.css | 76 +++++++++--
.../dashboard/app/components/TerminalModal.tsx | 33 ++---
.../components/__tests__/TerminalModal.test.tsx | 150 +++++++++++++++++++++
.../app/hooks/__tests__/useViewportMode.test.ts | 14 ++
packages/dashboard/app/hooks/useViewportMode.ts | 33 ++++-
6 files changed, 277 insertions(+), 31 deletions(-)
Fusion-Task-Id: FN-8557
Fusion-Task-Lineage: cd334682-e70a-4531-ab53-c5c0898f0bf1
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-24 00:59:42 -07:00
gsxdsm
faeb491ea4
fix(dashboard): harden terminal paste contract and manual-start button per review
...
Review follow-up to 907e8d03e (ce-code-review, 8 personas):
- Ctrl/Cmd+V with no clipboard API (or after a denied read) now returns
false WITHOUT preventDefault: xterm skips key handling and the browser's
default paste fires xterm's helper-textarea listener once. Returning true
made non-mac xterm inject \x16 and cancel the native paste (verified
against xterm 5.5.0 _keyDown).
- A denied clipboard read sets a sticky ref so later pastes use the native
path instead of being preventDefaulted into zero delivery.
- Custom-path delivery goes through terminal.paste() to restore bracketed
paste and newline normalization.
- 'Start terminal' surfaces createTab failures in the error banner and
disables while a create is in flight (no duplicate PTY sessions).
- normalizeActiveTab() extracted so storage-read and server-validation
share one all-inactive tie-break; failure-path regression test added.
- Rewrote docs/solutions/ui-bugs/xterm-async-font-remeasure-paste-dedupe.md
to the current paste contract (was prescribing the pre-#1902 behavior).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-23 19:46:02 -07:00
gsxdsm
dfb9ca6630
FN-8543: enforce bounded generated-fix remediation
...
Keep generated fix chains within their root retry budget and preserve intervention stops.
- Track retry counts and stop reasons on the canonical root feature.
- Persist project-isolated lineage stops across generated-fix removal and archive paths.
- Serialize stop recording with generated-fix admission and expose conflict-safe mission resume behavior.
Files changed:
.changeset/fn-8543-bounded-fix-lineage.md | 7 +
docs/missions.md | 6 +-
.../__tests__/postgres/mission-store.pg.test.ts | 72 +++++++
packages/core/src/async-mission-store-queries.ts | 91 ++++++++-
packages/core/src/async-mission-store.ts | 206 ++++++++++++++++++---
packages/core/src/index.ts | 2 +-
packages/core/src/mission-store.ts | 10 +
packages/core/src/mission-types.ts | 7 +
.../0035_fn_8543_mission_lineage_stop.sql | 31 ++++
packages/core/src/postgres/schema-applier.ts | 18 +-
packages/core/src/postgres/schema/project.ts | 21 +++
.../core/src/task-store/archive-lifecycle-2.ts | 15 +-
.../core/src/task-store/async-archive-lineage.ts | 10 +-
packages/dashboard/src/mission-routes.ts | 14 +-
packages/engine/src/mission-execution-loop.ts | 30 ++-
15 files changed, 495 insertions(+), 45 deletions(-)
Fusion-Task-Id: FN-8543
Fusion-Task-Lineage: 24c03d63-5914-4072-aa17-16862432fc78
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 16:12:44 -07:00
Victor Canô
0c085bf444
fix(engine): pushAfterMerge no longer strands approved merges when the remote diverges ( #2407 )
...
## Problem
With `pushAfterMerge` enabled (and `mergeStrategy` other than
`pull-request`), if `origin/<integration-branch>` advances externally
between the local squash-merge and the push, the divergence path opens a
clean-room `git pull --rebase` and an AI agent resolves and stages the
conflicts — but the flow could end there: no `git rebase --continue`, no
push, and no surfaced error.
Because finalize runs *before* the push, the task is already `done`, so
a reviewed, approved merge is silently left container-only, and every
subsequent merge on the project stalls the same way. Separately, an
abort mid-push (`MergeAbortedError`) was swallowed with only a
process-log warning — no task-log entry, no run-audit event.
## Change
- **Deterministic regression coverage** for the conflicting-divergence
path (real-git fixture) proving the rebase runs to completion and the
push lands (refs converge), plus abort/termination scenarios.
- **Recovery-branch safety net:** before the clean-room rebase starts,
the pre-rebase local squash is force-pushed to a per-task remote branch
`fusion/<task-id>-stranded`, so approved content is never container-only
— even across process death or abort. Deleted after a successful target
push; retained on failure/abort as the recovery source.
- **Never-silent outcomes:** every non-pushed outcome (failure or abort)
writes a durable task-log entry and a `push:origin` run-audit event. The
audit contract now documents `push:origin` as polymorphic (dashboard
Smart Push vs. automated post-merge push) and enumerates the automated
path's outcomes, including the new `"aborted"` shutdown case.
- **Cleanup hardening:** `isRebaseInProgress` now probes Git's
worktree-specific `rebase-merge`/`rebase-apply` state directories
(async, timeout-guarded) so a completed rebase can't receive a spurious
second `--continue`; unfinished rebases are cleaned up.
Out of scope by design: withholding the "merge confirmed" state until
the push succeeds — the `FNXC:MergePush` invariant ("a push problem can
never park or roll back a landed merge") is deliberate; the recovery
branch + surfacing satisfy the data-preservation intent without breaking
it.
## Files
`packages/engine/src/merger-ai.ts`, `packages/engine/src/merger.ts`,
`packages/engine/src/run-audit.ts`, new/updated tests under
`packages/engine/src/__tests__/`, `docs/settings-reference.md`,
`docs/dashboard-guide.md`, `AGENTS.md`, and a labeled changeset.
## Validation
`tsc --noEmit` clean; engine divergence + merger suites pass (41 tests);
rebased onto current `main` with no conflicts.
---
_Developed with Claude Code, under human supervision and review._
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Prevented approved post-merge pushes from becoming stranded when the
remote diverges by using a recovery-branch workflow and safer cleanup.
* Improved behavior and reporting when pushes are aborted or fail after
merge, including clearer non-fatal status and audit outcomes.
* **Documentation**
* Expanded push-after-merge and dashboard Smart Push documentation with
recovery-branch and `push:origin`/`push:recovery-branch` outcome
semantics.
* **Tests**
* Added end-to-end regression tests for divergent/conflicting AI
push-after-merge flows, including abort and worktree cleanup
verification.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Victor Cano <victortroz@gmail.com >
Co-authored-by: Claude <noreply@anthropic.com >
2026-07-23 15:55:03 -07:00
gsxdsm
e5caea542a
FN-8544: gate mission remediation behind autopilot
...
Keep mission validation report-only until an operator explicitly enables autopilot.
- Gate validator-created remediation features and task dispatch behind mission autopilot.
- Audit attributed status and autopilot transitions atomically across mission stores.
- Expose mission autonomy controls and document the opt-in lifecycle.
Files changed:
.changeset/fn-8544-mission-autonomy-audit.md | 7 ++
docs/missions.md | 10 +-
packages/cli/src/extension.ts | 26 ++++-
.../__tests__/postgres/mission-store.pg.test.ts | 27 +++++
packages/core/src/async-mission-store.ts | 70 +++++++++++--
packages/core/src/index.gate.ts | 3 +
packages/core/src/index.ts | 3 +
packages/core/src/mission-store.ts | 113 +++++++++++++--------
packages/core/src/mission-types.ts | 22 ++++
.../dashboard/app/components/MissionManager.tsx | 1 +
packages/dashboard/src/mission-routes.ts | 25 +++--
.../src/__tests__/agent-mission-tools.test.ts | 17 +++-
.../src/__tests__/mission-execution-loop.test.ts | 21 ++++
packages/engine/src/agent-heartbeat.ts | 4 +-
packages/engine/src/agent-tools.ts | 30 +++++-
packages/engine/src/executor.ts | 5 +-
packages/engine/src/mission-autopilot.ts | 51 +++++-----
packages/engine/src/mission-execution-loop.ts | 49 ++++++---
packages/engine/src/triage.ts | 5 +-
19 files changed, 377 insertions(+), 112 deletions(-)
Fusion-Task-Id: FN-8544
Fusion-Task-Lineage: 23a69923-5a19-407e-9fe2-8973c166ee9a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 15:25:09 -07:00
gsxdsm
e7c9b2ac80
FN-8542: separate milestone acceptance from feature validation
...
Keep feature validation scoped to linked feature assertions while evaluating milestone acceptance at rollup.
- Add assertion scope and origin provenance with database migration support
- Synchronize milestone acceptance prose to a canonical milestone assertion
- Prevent milestone assertions from affecting feature verdicts and document the completion contract
- Cover scoped validation and milestone rollup behavior with core and engine tests
Files changed:
.changeset/fn-8542-feature-validation-scope.md | 7 +
docs/missions-completion-contract.md | 25 +-
docs/missions.md | 6 +-
.../mission-store.sync-loop-transition.test.ts | 53 +++++
packages/core/src/async-mission-store-queries.ts | 17 +-
packages/core/src/async-mission-store.ts | 58 ++++-
packages/core/src/mission-store.ts | 118 +++++++++-
packages/core/src/mission-types.ts | 25 ++
.../core/src/postgres/migrations/0000_initial.sql | 2 +
.../0034_milestone_assertion_provenance.sql | 30 +++
packages/core/src/postgres/schema-applier.ts | 24 +-
packages/core/src/postgres/schema/project.ts | 1 +
.../src/__tests__/mission-execution-loop.test.ts | 161 ++++++++++++-
packages/engine/src/mission-execution-loop.ts | 262 ++++++++++++++++-----
14 files changed, 700 insertions(+), 89 deletions(-)
Fusion-Task-Id: FN-8542
Fusion-Task-Lineage: cf112d31-376a-456e-be08-225eab5de393
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 14:39:44 -07:00
gsxdsm
2978ec4973
FN-8551: add accessible agent heartbeat controls
...
Add per-agent and project-wide heartbeat enablement controls.
- Add preserved runtime configuration helpers and heartbeat controls across agent list, board, and org-chart views.
- Add bulk enable/disable actions, accessible labels, localized copy, documentation, and release metadata.
- Cover heartbeat mutations through dashboard, route, scheduler, and layout smoke tests.
Files changed:
.changeset/fn-8551-agent-heartbeat-controls.md | 7 +
docs/dashboard-guide.md | 2 +
packages/dashboard/app/api/agents.ts | 12 ++
packages/dashboard/app/api/legacy.ts | 2 +
.../dashboard/app/components/AgentDetailView.tsx | 14 +-
packages/dashboard/app/components/AgentsView.css | 11 ++
packages/dashboard/app/components/AgentsView.tsx | 186 ++++++++++++++++-----
.../AgentDetailView.advanced-settings.test.tsx | 29 ++++
.../__tests__/AgentDetailView.test-helpers.ts | 2 +
.../app/components/__tests__/AgentsView.test.tsx | 68 ++++++++
.../dashboard/scripts/browser-layout-smoke.mjs | 54 ++++++
.../src/routes/__tests__/agent-core-routes.test.ts | 69 ++++++++
.../src/__tests__/heartbeat-scheduler.test.ts | 21 +++
packages/i18n/locales/en/app.json | 19 ++-
packages/i18n/locales/es/app.json | 19 ++-
packages/i18n/locales/fr/app.json | 19 ++-
16 files changed, 484 insertions(+), 50 deletions(-)
Fusion-Task-Id: FN-8551
Fusion-Task-Lineage: 2d4c8a15-a444-47b6-b57c-f41fc4163155
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 14:32:58 -07:00
gsxdsm
3d0ce2ed3a
FN-8545: enforce mission lineage task admission
...
Protect feature bootstrap task creation with mission-lineage admission rules.
- Restrict supervised agents to linked autonomous mission features
- Atomically claim defined feature tasks and preserve duplicate ownership
- Lock defined feature claims to prevent concurrent bootstrap inserts
- Document admission behavior and add PostgreSQL and delegation coverage
Files changed:
.changeset/fn-8545-mission-admission.md | 7 +
docs/agents.md | 6 +
docs/missions.md | 12 +-
.../__tests__/postgres/mission-store.pg.test.ts | 119 ++++++++++++
packages/core/src/async-mission-store.ts | 203 +++++++++++++++++++--
packages/core/src/duplicate-guard.ts | 14 +-
packages/core/src/mission-store.ts | 15 ++
packages/core/src/task-store/task-creation.ts | 152 ++++++++++-----
.../src/__tests__/agent-tools-delegation.test.ts | 152 ++++++++++++++-
packages/engine/src/agent-tools.ts | 151 ++++++++++++++-
10 files changed, 753 insertions(+), 78 deletions(-)
Fusion-Task-Id: FN-8545
Fusion-Task-Lineage: c6e1b46d-f434-4b07-93bc-27e1f6b491b1
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 14:21:29 -07:00
gsxdsm
15b5441afc
FN-8548: keep GitHub import actions on one mobile row
...
Keep all selected GitHub issue actions touch-safe and visible on a single mobile row.
- Group detail action controls separately from the comment composer and make their mobile tracks shrinkable.
- Add responsive browser-smoke coverage at 320px, 390px, and 412px plus modal structure tests.
- Document the mobile behavior and add a patch changeset.
Files changed:
.changeset/fn-8548-mobile-github-import-actions.md | 7 +
docs/dashboard-guide.md | 8 +-
.../dashboard/app/components/GitHubImportModal.css | 42 +++++-
.../dashboard/app/components/GitHubImportModal.tsx | 80 ++++++------
.../__tests__/GitHubImportModal.test.tsx | 50 ++++++++
packages/dashboard/app/styles.css | 11 +-
.../dashboard/scripts/browser-layout-smoke.mjs | 142 ++++++++++++++++++++-
7 files changed, 290 insertions(+), 50 deletions(-)
Fusion-Task-Id: FN-8548
Fusion-Task-Lineage: 8fab6a1d-0ca9-4246-9707-e1fc84ca58e5
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 13:28:19 -07:00
gsxdsm
e734ed8a48
FN-8541: expose actionable validator diagnostics
...
Surface normalized, secret-safe validator evidence and assertion verdicts across mission events and remediation work.
- Normalize, redact, bound, and render per-assertion validation diagnostics in shared core APIs.
- Attach verdict-driven diagnostics to failure events and generated fixes while suppressing duplicate triage noise.
- Display validator evidence in Mission activity and document the operator workflow.
- Add core and engine coverage for evidence, mixed blocked verdicts, and triage behavior.
Files changed:
.changeset/fn-8541-validator-diagnostics.md | 7 ++
docs/missions.md | 17 +++
.../mission-store.validation-diagnostics.test.ts | 65 ++++++++++
packages/core/src/async-mission-store.ts | 8 +-
packages/core/src/index.gate.ts | 10 ++
packages/core/src/index.ts | 10 ++
packages/core/src/mission-store.ts | 10 +-
packages/core/src/mission-types.ts | 136 +++++++++++++++++++++
.../dashboard/app/components/MissionManager.css | 21 ++++
.../dashboard/app/components/MissionManager.tsx | 56 +++++++++
packages/dashboard/app/components/mission-types.ts | 3 +
.../src/__tests__/mission-execution-loop.test.ts | 44 +++++++
.../mission-validator-behavioral-posture.test.ts | 37 +++++-
packages/engine/src/mission-execution-loop.ts | 117 +++++++++++++-----
14 files changed, 501 insertions(+), 40 deletions(-)
Fusion-Task-Id: FN-8541
Fusion-Task-Lineage: b226fc34-f35c-4ce5-bcb5-e418529caaa7
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 13:21:10 -07:00
gsxdsm
0d355f371c
FN-8547: add local OpenAI-compatible provider onboarding
...
Add guided onboarding for OpenAI-compatible local model providers.
- Add custom/local provider prompts and atomic models registry updates.
- Preserve registry fields, validate endpoint configuration, and support Qwen thinking compatibility.
- Document setup and cover registry persistence with onboarding tests.
Files changed:
.changeset/fn-8547-local-provider-onboarding.md | 7 +
docs/cli-reference.md | 13 ++
docs/settings-reference.md | 35 ++++-
packages/cli/src/commands/__tests__/onboard.test.ts | 55 ++++++-
packages/cli/src/commands/onboard.ts | 161 ++++++++++++++++++++-
5 files changed, 261 insertions(+), 10 deletions(-)
Fusion-Task-Id: FN-8547
Fusion-Task-Lineage: 740221de-fce8-43ae-a095-13b8abf1904a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 12:31:55 -07:00
gsxdsm
84d7306bd3
FN-8546: fix ideation candidate discovery
...
Expose persisted ideation candidate identities so agents can select a candidate for convergence.
- Render candidate IDs, provenance, source references, and content in show and diverge responses.
- Cover discover-to-converge behavior, duplicate content, empty sessions, and missing sessions.
- Document the direct candidate-ID convergence workflow and add a patch changeset.
Files changed:
.changeset/fn-8546-ideation-candidate-ids.md | 7 ++
docs/agent-tool-surface-full-loop.md | 4 +-
docs/ideation/persisted-diverge-converge.md | 6 +-
.../src/__tests__/agent-ideation-tools.test.ts | 93 +++++++++++++++++++---
packages/engine/src/agent-tools.ts | 23 +++++-
5 files changed, 116 insertions(+), 17 deletions(-)
Fusion-Task-Id: FN-8546
Fusion-Task-Lineage: 7232701f-5c6b-40fc-8d46-d65b97af9c0a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 12:26:02 -07:00
gsxdsm
c4292b25ef
FN-8539: make Planning Mode selection-driven
...
Make Planning Mode refine repository-grounded plans through successive operator choices.
- Offer concrete directions and Other for vague planning openers
- Rebuild running plans around selected options, multi-selections, and Other responses
- Add selection-loop coverage and operator documentation
Files changed:
.changeset/fn-8539-option-driven-planning.md | 7 ++
docs/dashboard-guide.md | 2 +-
.../__tests__/planning-infinite-interview.test.ts | 131 ++++++++++++++++++++-
.../planning-interview-formatters.test.ts | 37 ++++--
packages/dashboard/src/planning.ts | 34 +++---
5 files changed, 185 insertions(+), 26 deletions(-)
Fusion-Task-Id: FN-8539
Fusion-Task-Lineage: 585bae1e-6d9e-4733-b787-77b70a7d1259
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 12:08:58 -07:00
gsxdsm
3f976e3dca
FN-8538: give Planning Mode a dedicated collaborative prompt
...
Planning Mode now uses a standalone collaborative prompt rather than inherited task-triage instructions.
- Resolve the Planning Mode default independently of workflows and triage assignments.
- Preserve explicit full-system prompt overrides and update prompt-setting documentation.
- Cover dedicated prompt behavior and add the published-package changeset.
Files changed:
.changeset/fn-8538-planning-prompt.md | 7 +++
docs/dashboard-guide.md | 3 +-
.../core/src/__tests__/prompt-overrides.test.ts | 7 +++
packages/core/src/prompt-overrides.ts | 8 ++-
packages/dashboard/app/utils/builtinPrompts.ts | 8 ++-
.../__tests__/planning-infinite-interview.test.ts | 60 +++++++++++++++++++++-
.../__tests__/planning-prompt-resolution.test.ts | 47 ++++++++++-------
packages/dashboard/src/planning.ts | 46 +++++------------
8 files changed, 130 insertions(+), 56 deletions(-)
Fusion-Task-Id: FN-8538
Fusion-Task-Lineage: 36e0665d-7995-4bc5-9c73-948f7f4e9131
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 11:41:15 -07:00
gsxdsm
b4856e3c1e
fix: separate Docker app root from project mount so -v host mounts work ( #2414 )
...
The runner stage installed the application at /project, which was also the
documented bind-mount point — mounting a host project there shadowed the CLI
and the container exited with MODULE_NOT_FOUND on packages/cli/dist/bin.js.
- Install the app under /app and run the entrypoint by absolute path.
- Reserve /workspace (empty in the image, container workdir) as the project
mount point.
- Update docs/docker.md: mount at /workspace, and document that embedded
Postgres/global state lives in /home/node/.fusion with a named-volume
example so persistence actually captures it.
Verified: image builds; `docker run -v host:/workspace` boots, embedded
Postgres initializes, /api/health returns ok.
Fixes #2414
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-23 09:50:24 -07:00
gsxdsm
42fe154abe
FN-8533: add mobile planning comment actions
...
Make contextual plan comments reachable from the mobile action rail and restore focus after editing.
- Add responsive desktop and mobile comment triggers with contextual styling and documentation.
- Preserve the selected quote and restore the remounted trigger after canceling or adding a comment.
- Cover action placement, focus restoration, and browser interaction behavior.
Files changed:
.changeset/fn-8533-mobile-planning-comments.md | 7 ++
docs/dashboard-guide.md | 2 +-
.../dashboard/app/components/PlanningModeModal.css | 20 ++++
.../dashboard/app/components/PlanningModeModal.tsx | 44 ++++++-
.../__tests__/PlanningModeModal.css.test.ts | 10 ++
.../PlanningModeModal.planning-flow.test.tsx | 40 +++++--
.../PlanningModeModal.ui-interactions.test.tsx | 5 +
.../dashboard/app/planning-browser-e2e-fixture.tsx | 3 +-
.../src/__tests__/planning-browser-e2e.test.ts | 133 +++++++++++++++++++--
packages/dashboard/vitest.config.ts | 11 +-
scripts/lib/test-quarantine.json | 5 -
11 files changed, 242 insertions(+), 38 deletions(-)
Fusion-Task-Id: FN-8533
Fusion-Task-Lineage: e0d561be-ecc8-456e-807e-a1dc677b5d9c
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 09:33:25 -07:00
gsxdsm
d2e41e490f
FN-8534: honor workflow planning-model precedence
...
Honor selected workflow planning models for Planning Mode sessions.
- Resolve selected workflow planning lanes against the project baseline.
- Route complete request and workflow pairs through canonical planning-model resolution.
- Cover new and draft planning sessions, test mode, and settings documentation.
Files changed:
.changeset/fn-8534-planning-workflow-model.md | 7 ++
docs/settings-reference.md | 2 +
.../__tests__/workflow-settings-resolver.test.ts | 73 ++++++++++++++++
packages/core/src/index.gate.ts | 1 +
packages/core/src/index.ts | 1 +
packages/core/src/workflow-settings-resolver.ts | 80 +++++++++++-------
.../src/__tests__/routes-planning.test.ts | 97 ++++++++++++++++++++++
.../src/routes/register-planning-subtask-routes.ts | 48 ++++++++---
8 files changed, 267 insertions(+), 42 deletions(-)
Fusion-Task-Id: FN-8534
Fusion-Task-Lineage: e6b5b546-b9f1-49c5-b680-90f24e856458
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 08:53:06 -07:00
gsxdsm
ebbb5948ab
FN-8529: add contextual plan review comments
...
Enable operators to submit selected-plan suggestions through the existing Planning Mode revision flow.
- Capture text selections, batch suggestions, and retain retryable comment submissions in the Planning Mode UI.
- Validate bounded comment payloads and format them for the existing planning session update path.
- Document the workflow and add coverage for ordering, retry behavior, and selection boundaries.
Files changed:
.changeset/fn-8529-planning-comments.md | 7 +
docs/dashboard-guide.md | 4 +
packages/dashboard/app/api/legacy.ts | 1 +
packages/dashboard/app/api/planning.ts | 9 +-
.../dashboard/app/components/PlanningModeModal.css | 86 ++++++++++++
.../dashboard/app/components/PlanningModeModal.tsx | 144 ++++++++++++++++++++-
.../PlanningModeModal.planning-flow.test.tsx | 39 ++++++
.../PlanningModeModal.ui-interactions.test.tsx | 10 ++
.../__tests__/planning-infinite-interview.test.ts | 62 +++++++++
packages/dashboard/src/planning.ts | 76 ++++++++++-
.../src/routes/register-planning-subtask-routes.ts | 27 +++-
11 files changed, 455 insertions(+), 10 deletions(-)
Fusion-Task-Id: FN-8529
Fusion-Task-Lineage: c7064d76-effd-4597-a2b4-03f344dd59b9
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-07-23 00:56:47 -07:00