Fusion Agent
612195fde6
FN-022: add workflow selection and start action
...
Add workflow-aware task creation controls and a guarded Start action for quick task intake.
- Add workflow selection and resolved board metadata loading to New Task modal.
- Support starting eligible tasks in their workflow destination with clear success or partial-failure feedback.
- Wire move-task handling through modal callers and cover workflow/start behavior with tests and documentation.
Files changed:
.changeset/fn-022-new-task-workflow-start.md | 7 +
docs/dashboard-guide.md | 4 +-
packages/dashboard/app/components/AppModals.tsx | 1 +
packages/dashboard/app/components/NewTaskModal.tsx | 158 +++++++++++++++--
.../dashboard/app/components/QuickEntryBox.tsx | 5 +-
packages/dashboard/app/components/TaskForm.tsx | 28 ++-
.../app/components/__tests__/AppModals.test.tsx | 33 +++-
.../app/components/__tests__/NewTaskModal.test.tsx | 192 ++++++++++++++++++++-
.../app/utils/__tests__/quickAddStart.test.ts | 16 +-
packages/dashboard/app/utils/quickAddStart.ts | 15 ++
10 files changed, 441 insertions(+), 18 deletions(-)
Fusion-Task-Id: FN-022
Fusion-Task-Lineage: ce794b44-3c31-4bfc-a259-ecfd78531be1
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
4d7e7dba4c
FN-021: expose model-supported thinking levels, including max
...
Expose thinking-level options from model capabilities through API, workflows, and dashboard controls.
- Add model-supported thinking-level metadata, including max, across core and model routes.
- Propagate capability-aware levels through planning, agent creation, and chat/task UI.
- Update localized labels, documentation, tests, dependencies, and add a release changeset.
Files changed:
.changeset/fn-021-thinking-levels.md | 7 ++++
docs/settings-reference.md | 8 +++-
docs/workflow-steps.md | 8 ++--
packages/core/src/__tests__/openai-models.test.ts | 1 +
.../core/src/__tests__/thinking-levels.test.ts | 4 +-
packages/core/src/__tests__/workflow-ir.test.ts | 2 +-
packages/core/src/ai/openai-models.ts | 5 ++-
packages/core/src/types/board/board.ts | 8 ++--
.../app/api/agents/agent-import-generation.ts | 4 +-
.../dashboard/app/api/planning/models-usage.ts | 13 +++++++
packages/dashboard/app/api/planning/planning.ts | 5 ++-
.../dashboard/app/components/AgentDetailView.tsx | 2 +-
.../app/components/ChatThinkingLevelControl.tsx | 28 +++++++++++---
.../app/components/CustomModelDropdown.tsx | 29 ++++++++++----
packages/dashboard/app/components/NewTaskModal.tsx | 4 +-
.../dashboard/app/components/TaskDetailModal.tsx | 4 +-
.../__tests__/AgentDetailView.test-helpers.ts | 2 +-
.../__tests__/AgentOnboardingModal.test.tsx | 2 +-
.../__tests__/ChatThinkingLevelControl.test.tsx | 27 ++++++++++++-
.../__tests__/CustomModelDropdown.test.tsx | 33 +++++++++++++++-
.../__tests__/ModelSelectionModal.test.tsx | 3 +-
.../components/__tests__/NewAgentDialog.test.tsx | 2 +
.../components/__tests__/QuickEntryBox.test.tsx | 3 +-
.../components/agent-presets/agentCreatePayload.ts | 3 +-
.../settings/sections/GlobalModelsSection.tsx | 8 ++--
packages/dashboard/package.json | 2 +-
.../dashboard/src/__tests__/chat-manager.test.ts | 8 ++--
packages/dashboard/src/__tests__/chat.test.ts | 2 +-
...-model-routes-openai-codex-supplemental.test.ts | 44 +++++++++++++++++++++-
.../src/__tests__/routes-automation.test.ts | 4 +-
.../dashboard/src/__tests__/routes-tasks.test.ts | 8 ++--
packages/dashboard/src/agent-generation.ts | 9 +++--
packages/dashboard/src/agent-onboarding.ts | 8 ++--
packages/dashboard/src/routes.ts | 14 ++++++-
.../src/routes/register-chat-room-routes.ts | 2 +-
.../dashboard/src/routes/register-model-routes.ts | 43 ++++++++++++++++-----
packages/i18n/locales/en/app.json | 1 +
packages/i18n/locales/es/app.json | 1 +
packages/i18n/locales/fr/app.json | 1 +
packages/i18n/locales/ko/app.json | 1 +
packages/i18n/locales/pt-BR/app.json | 1 +
packages/i18n/locales/zh-CN/app.json | 1 +
packages/i18n/locales/zh-TW/app.json | 1 +
packages/i18n/src/resources.d.ts | 1 +
pnpm-lock.yaml | 6 +--
45 files changed, 289 insertions(+), 84 deletions(-)
Fusion-Task-Id: FN-021
Fusion-Task-Lineage: af1b0e09-6375-4f0c-9501-66a10c8b9168
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
2fe3382279
FN-020: add queued Planner Chat message management
...
Add browser-local queued follow-up management to Planner Chat while preserving ordered, session-scoped dispatch.
- Queue follow-up messages during active responses and dispatch them FIFO after completion or Stop reconciliation.
- Add editing, reordering, deletion, duplicate-safe force-send, persistence, responsive styling, documentation, translations, and regression coverage.
Files changed:
docs/dashboard-guide.md | 2 +
.../app/components/TaskPlannerChatTab.css | 84 ++++++
.../app/components/TaskPlannerChatTab.tsx | 301 ++++++++++++++++++---
.../__tests__/TaskPlannerChatTab.test.tsx | 216 +++++++++++++++
packages/i18n/locales/en/app.json | 13 +
packages/i18n/locales/es/app.json | 13 +
packages/i18n/locales/fr/app.json | 13 +
packages/i18n/locales/ko/app.json | 13 +
packages/i18n/locales/pt-BR/app.json | 13 +
packages/i18n/locales/zh-CN/app.json | 13 +
packages/i18n/locales/zh-TW/app.json | 13 +
packages/i18n/src/resources.d.ts | 13 +
12 files changed, 673 insertions(+), 34 deletions(-)
Fusion-Task-Id: FN-020
Fusion-Task-Lineage: 5627cdbd-00dd-4e17-a4bd-53d49efa836d
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
b17c6de32b
FN-019: recognize custom providers and refresh model catalogs
...
Add support for custom AI providers and refresh the built-in model catalog from settings.
- Recognize custom provider configuration in provider status and onboarding readiness.
- Add bounded model-catalog refresh endpoints and settings controls with localized copy.
- Cover provider discovery, cache refresh, routes, and authentication UI behavior with tests.
Files changed:
.changeset/fn-019-provider-catalog.md | 7 ++
docs/dashboard-guide.md | 6 ++
.../dashboard/app/__tests__/api-models.test.ts | 29 +++++++++
.../dashboard/app/api/settings/provider-status.ts | 15 +++++
...thenticationSection.modelsCacheRefresh.test.tsx | 46 +++++++++++++-
.../__tests__/AuthenticationSection.test.tsx | 10 +++
.../settings/sections/AuthenticationSection.css | 20 ++++++
.../settings/sections/AuthenticationSection.tsx | 37 ++++++++++-
.../app/hooks/__tests__/useAuthOnboarding.test.ts | 29 +++++++++
.../app/hooks/__tests__/useSetupReadiness.test.ts | 14 ++++
packages/dashboard/app/hooks/useAuthOnboarding.ts | 9 +--
packages/dashboard/app/hooks/useSetupReadiness.ts | 8 ++-
.../register-model-routes-refresh-bounding.test.ts | 74 ++++++++++++++++++++++
.../dashboard/src/__tests__/routes-auth.test.ts | 18 ++++++
.../dashboard/src/routes/register-auth-routes.ts | 17 ++++-
.../dashboard/src/routes/register-model-routes.ts | 22 ++++++-
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 ++
24 files changed, 397 insertions(+), 12 deletions(-)
Fusion-Task-Id: FN-019
Fusion-Task-Lineage: 1e9daf0e-8aa8-4205-9fc7-686fbdd5bd35
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
6a28811d1a
FN-012: sort tasks in every board column
...
Add independent task ordering controls across all board lanes and keep archive pagination aligned with the selected order.
- Add arrival and task-ID sorting to every board column, including archived tasks.
- Thread bounded, server-backed archive sorting through the API, store, hook, and UI.
- Preserve selected archive order for subsequent pages and add localized labels, typings, tests, and dashboard documentation.
Files changed:
.changeset/fn-012-column-task-sorting.md | 7 ++
docs/dashboard-guide.md | 17 +--
.../postgres/archive-pagination.pg.test.ts | 19 ++++
packages/core/src/__tests__/task-priority.test.ts | 13 +++
packages/core/src/async-stores/async-archive-db.ts | 18 ++--
packages/core/src/index.gate.ts | 2 +
packages/core/src/index.ts | 2 +
packages/core/src/store.ts | 2 +-
.../core/src/task-store/archive-lifecycle-2.ts | 13 ++-
packages/core/src/tasks/task-priority.ts | 41 +++++---
packages/core/src/types.ts | 2 +-
packages/dashboard/app/App.tsx | 4 +-
packages/dashboard/app/api/tasks/tasks.ts | 3 +
packages/dashboard/app/components/Board.tsx | 62 +++++++---
packages/dashboard/app/components/Column.tsx | 54 ++++++----
.../app/components/__tests__/Board.test.tsx | 74 +++++++------
.../app/components/__tests__/Column.test.tsx | 8 +-
.../app/components/dashboard/MainContent.tsx | 6 ++
.../dashboard/app/components/dashboard/types.ts | 5 +
.../dashboard/app/hooks/__tests__/useTasks.test.ts | 61 ++++++++++-
packages/dashboard/app/hooks/useTasks.ts | 116 ++++++++++++++++-----
...task-workflow-routes.archive-pagination.test.ts | 78 ++++++++++++++
.../src/routes/register-task-workflow-routes.ts | 20 ++--
packages/i18n/locales/en/app.json | 5 +
packages/i18n/locales/es/app.json | 7 +-
packages/i18n/locales/fr/app.json | 7 +-
packages/i18n/locales/ko/app.json | 7 +-
packages/i18n/locales/pt-BR/app.json | 7 +-
packages/i18n/locales/zh-CN/app.json | 7 +-
packages/i18n/locales/zh-TW/app.json | 7 +-
packages/i18n/src/resources.d.ts | 5 +
31 files changed, 537 insertions(+), 142 deletions(-)
Fusion-Task-Id: FN-012
Fusion-Task-Lineage: 18dff987-18d5-401d-9fe0-290a71f12e15
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
3ae22c23d1
FN-011: add project chat message width preference
...
Add a project-scoped conversation layout preference and apply full-width rendering consistently across dashboard chat surfaces.
- Add bubbles/full-width project settings with localized Appearance controls.
- Apply the preference to Chat, Activity, Planner Chat, Quick Chat, and docked hosts with responsive safeguards.
- Add regression coverage, documentation, and the published-package changeset.
Files changed:
.changeset/fn-011-chat-message-layout.md | 7 ++++
docs/dashboard-guide.md | 4 ++
.../core/src/__tests__/settings-defaults.test.ts | 14 ++++++-
.../core/src/__tests__/settings-parity.test.ts | 4 ++
packages/core/src/config/settings-schema.ts | 5 +++
packages/core/src/types/settings/settings-scope.ts | 5 +++
packages/dashboard/app/App.tsx | 7 +++-
packages/dashboard/app/components/AppModals.tsx | 5 +++
packages/dashboard/app/components/ChatView.css | 23 +++++++++++
packages/dashboard/app/components/ChatView.tsx | 4 +-
.../dashboard/app/components/SettingsModal.tsx | 14 +++++++
packages/dashboard/app/components/TaskChatTab.css | 42 +++++++++++++++++++++
packages/dashboard/app/components/TaskChatTab.tsx | 4 +-
.../app/components/TaskPlannerChatTab.css | 22 +++++++++++
.../app/components/TaskPlannerChatTab.tsx | 4 +-
.../components/__tests__/ChatView.core.test.tsx | 34 +++++++++++++++++
.../__tests__/SettingsModal.general.test.tsx | 42 +++++++++++++++++++++
.../app/components/__tests__/TaskChatTab.test.tsx | 31 +++++++++++++++
.../__tests__/TaskPlannerChatTab.test.tsx | 32 ++++++++++++++++
.../settings/sections/AppearanceSection.tsx | 24 +++++++++++-
.../sections/__tests__/AppearanceSection.test.tsx | 22 ++++++++++-
.../app/context/ChatMessageLayoutContext.tsx | 16 ++++++++
.../app/hooks/__tests__/useAppSettings.test.ts | 44 ++++++++++++++++++++++
packages/dashboard/app/hooks/useAppSettings.ts | 29 ++++++++++++++
.../app/task-modal-touch-resize-e2e-fixture.tsx | 2 +-
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 | 4 ++
33 files changed, 471 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-011
Fusion-Task-Lineage: d858d00f-e05b-4dc2-8ddb-cfc5b9973871
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
d295202768
FN-013: establish i18n lint baseline and localize dashboard copy
...
Add a production i18n lint baseline while replacing dashboard copy with translation keys.
- Localize task, board, mailbox, report, graph, settings, and shared dashboard surfaces.
- Regenerate locale catalogs and resource types for the migration keys.
- Add the i18n lint-baseline regression test and contributor guidance.
Files changed:
.changeset/fn-013-i18n-lint-baseline.md | 7 +
docs/i18n-contributing.md | 11 +
.../dashboard/app/components/ActiveAgentsPanel.tsx | 2 +-
.../dashboard/app/components/AgentDetailView.tsx | 2 +-
packages/dashboard/app/components/Board.tsx | 19 +-
packages/dashboard/app/components/ChatView.tsx | 2 +-
.../dashboard/app/components/ComposeChatPanel.tsx | 14 +-
packages/dashboard/app/components/DockTaskList.tsx | 16 +-
.../dashboard/app/components/FloatingWindow.tsx | 6 +-
.../dashboard/app/components/GitHubImportModal.tsx | 4 +-
.../dashboard/app/components/KnowledgeGraphPanel.tsx | 21 +-
packages/dashboard/app/components/ListView.tsx | 2 +-
.../app/components/MailboxArtifactAttachment.tsx | 16 +-
packages/dashboard/app/components/MailboxModal.tsx | 12 +-
.../app/components/MailboxStructuralItem.tsx | 13 +-
.../app/components/MailboxTaskProposal.tsx | 10 +-
.../app/components/MailboxTaskRecommendations.tsx | 12 +-
packages/dashboard/app/components/MailboxView.tsx | 14 +-
packages/dashboard/app/components/MermaidDiagram.tsx | 4 +-
packages/dashboard/app/components/MeshTopology.tsx | 6 +-
.../dashboard/app/components/MessageComposer.tsx | 24 +-
.../app/components/NativeStructurePreview.tsx | 14 +-
packages/dashboard/app/components/ProviderLoginDialog.tsx | 24 +-
packages/dashboard/app/components/ReportActionMenu.tsx | 6 +-
packages/dashboard/app/components/ReportModal.tsx | 26 +-
packages/dashboard/app/components/TaskChatTab.tsx | 10 +-
packages/dashboard/app/components/TaskDetailModal.tsx | 28 +-
.../app/components/TaskVerificationStatus.tsx | 10 +-
.../dashboard/app/components/WhatsAppChatPairingPanel.tsx | 38 +-
.../components/command-center/CommandCenter.tsx | 4 +-
.../components/command-center/IdeationPanel.tsx | 12 +-
.../components/settings/sections/McpServersCard.tsx | 2 +-
.../components/settings/sections/MemorySection.tsx | 4 +-
.../app/task-modal-touch-resize-e2e-fixture.tsx | 28 +-
packages/i18n/locales/en/app.json | 247 +++++++-
packages/i18n/locales/es/app.json | 256 +++++++-
packages/i18n/locales/fr/app.json | 256 +++++++-
packages/i18n/locales/ko/app.json | 256 +++++++-
packages/i18n/locales/pt-BR/app.json | 705 ++++++++++++++++++++
packages/i18n/locales/zh-CN/app.json | 256 +++++++-
packages/i18n/locales/zh-TW/app.json | 256 +++++++-
.../i18n/src/__tests__/i18n-lint-baseline.test.ts | 31 +
packages/i18n/src/resources.d.ts | 229 ++++++-
43 files changed, 2627 insertions(+), 288 deletions(-)
Fusion-Task-Id: FN-013
Fusion-Task-Lineage: 846ac221-c7c3-4ff0-a30d-69479b614765
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
561e0f4cd8
FN-015: remove legacy lane-columns CSS
...
Remove the retired lane compatibility selector while preserving live Board scrolling and overscroll behavior.
- Remove legacy .lane-columns styling from Lane.css.
- Update mobile Board regression fixtures and solution documentation for current workflow-column paths.
- Add a patch changeset documenting the internal cleanup.
Files changed:
.changeset/fn-015-removal.md | 7 ++++
...-board-ios-horizontal-overscroll-containment.md | 32 +++++++++--------
.../__tests__/board-mobile-column-swipe.test.ts | 11 +++---
.../__tests__/board-mobile-overscroll-containment.test.ts | 28 ++++++++-------
packages/dashboard/app/components/Lane.css | 41 +++-------------------
5 files changed, 51 insertions(+), 68 deletions(-)
Fusion-Task-Id: FN-015
Fusion-Task-Lineage: 78128638-a319-4589-8cdd-a6497efe226f
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
c0966fb3c2
FN-010: animate mobile board column releases
...
Smooth mobile Board releases now settle continuously on the existing reachable column target.
- Animate directional and nearest-column corrections with safe immediate fallbacks.
- Cancel in-flight settling and restore styles on unmount while preserving snap wiring.
- Update regression coverage, mobile board documentation, and the published fix changeset.
Files changed:
.changeset/fn-010-smooth-mobile-board-release.md | 7 ++
docs/dashboard-guide.md | 5 +-
.../app/components/__tests__/board-mobile.test.tsx | 3 +-
.../hooks/__tests__/useColumnScrollSnap.test.ts | 109 +++++++++++++++++++--
.../dashboard/app/hooks/useColumnScrollSnap.ts | 46 ++++++---
5 files changed, 146 insertions(+), 24 deletions(-)
Fusion-Task-Id: FN-010
Fusion-Task-Lineage: 16d3810b-8498-4436-8c41-12676778408a
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
e0ffd31e83
FN-009: add desktop Board mouse-drag navigation
...
Add safe desktop click-drag panning to the Board while preserving existing card and touch interactions.
- Add the mouse-pan hook with pointer capture, intent threshold, and click suppression.
- Wire panning and cursor states into Board surfaces with regression coverage.
- Document the interaction and publish the feature changeset.
Files changed:
.changeset/fn-009-board-mouse-pan.md | 7 +
docs/dashboard-guide.md | 2 +
packages/dashboard/app/components/Board.css | 11 ++
packages/dashboard/app/components/Board.tsx | 19 ++-
.../app/components/__tests__/Board.test.tsx | 78 +++++++++-
.../app/hooks/__tests__/useBoardMousePan.test.tsx | 164 +++++++++++++++++++++
packages/dashboard/app/hooks/useBoardMousePan.ts | 151 +++++++++++++++++++
7 files changed, 429 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-009
Fusion-Task-Lineage: 0f0bee56-cbb8-4e8d-b866-51d439ab9655
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
200b31089e
FN-004: fix remote access token handoff
...
Ensure freshly generated Remote Access links authenticate against current global settings.
- Synchronize global-settings caches across token writers and readers
- Resolve remote-login tokens from canonical global settings
- Cover token handoff behavior and document persistent-token semantics
Files changed:
.changeset/fn-004-remote-token-auth.md | 7 +
docs/remote-access.md | 6 +-
.../core/src/__tests__/global-settings.test.ts | 41 +++-
.../postgres/settings-persistence.pg.test.ts | 37 ++++
packages/core/src/config/global-settings.ts | 46 ++++-
.../app/__tests__/auth-token-capture.test.ts | 32 ++++
.../app/__tests__/settings-save-split.test.ts | 4 +
.../src/__tests__/remote-login-handoff.test.ts | 213 +++++++++++++++++++++
.../src/__tests__/routes-remote-access.test.ts | 4 +
.../src/routes/register-settings-memory-routes.ts | 9 +
packages/dashboard/src/server.ts | 10 +-
11 files changed, 400 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-004
Fusion-Task-Lineage: 1a64c345-a590-474e-afbf-af5e5d6df979
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
cc6f389e71
FN-003: consolidate model overrides and Docker tooling
...
Consolidate model override settings while adding supported operator tools to the Docker image.
- Group project and workflow model overrides in the Settings interface with updated search metadata, translations, tests, and documentation.
- Install gh, tailscale, and cloudflared from signed vendor repositories and cover the Docker configuration.
- Add release changesets for the settings and container capabilities.
Files changed:
.changeset/docker-operator-tooling.md | 7 +
.changeset/fn-003-model-override-organization.md | 7 +
Dockerfile | 36 ++++-
docs/dashboard-guide.md | 6 +-
docs/settings-reference.md | 9 +-
.../app/__tests__/settings-sections.test.tsx | 10 ++
.../__tests__/SettingsModal.models-auth.test.tsx | 2 +-
.../settings/sections/GlobalModelsSection.tsx | 16 +-
.../settings/sections/ProjectModelsSection.tsx | 171 +++++++++++----------
packages/dashboard/src/shared/settings-sections.ts | 6 +-
packages/i18n/locales/en/app.json | 5 +
.../dockerfile-workspace-manifests.test.mjs | 22 +++
12 files changed, 200 insertions(+), 97 deletions(-)
Fusion-Task-Id: FN-003
Fusion-Task-Lineage: 4df75b7f-f8dd-472c-b343-d06800d6c615
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
643a4098ab
FN-001: add Velvet dashboard color theme
...
Add the Velvet plum/burgundy theme across dashboard and desktop startup.
- Register Velvet in persisted theme options and pre-hydration validators
- Define dark/light palette tokens, selector swatch, and regression coverage
- Document the theme and add a minor CLI changeset
Files changed:
.changeset/fn-001-velvet-theme.md | 6 ++
docs/dashboard-guide.md | 5 +-
docs/settings-reference.md | 2 +-
packages/core/src/types/ui/execution-and-ui.ts | 2 +
.../dashboard/app/__tests__/velvet-theme.test.ts | 101 +++++++++++++++++++++
.../dashboard/app/components/ThemeSelector.css | 14 +++
packages/dashboard/app/components/themeOptions.ts | 1 +
packages/dashboard/app/index.html | 2 +-
packages/dashboard/app/public/theme-data.css | 86 +++++++++++++++++-
packages/desktop/src/renderer/index.html | 1 +
10 files changed, 215 insertions(+), 5 deletions(-)
Fusion-Task-Id: FN-001
Fusion-Task-Lineage: a57d7458-b598-48e3-b4ed-cc082f32197d
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
gsxdsm
3dea1bb851
FN-9172: isolate executor run-audit emissions
...
Keep executor lifecycle transitions moving when run-audit sinks fail or stall.
- Add a shared bounded, best-effort executor audit emission seam.
- Route executor lifecycle audit writes through sink isolation.
- Cover absent, throwing, rejecting, hanging, and late-settling sinks.
- Document the emitter policy and publish a patch changeset.
Files changed:
.changeset/fn-9172-executor-run-audit-isolation.md | 7 +
AGENTS.md | 7 +
docs/run-audit.md | 6 +-
.../src/__tests__/emit-bounded-run-audit.test.ts | 58 +++++
.../executor-run-audit-emitter-isolation.test.ts | 252 +++++++++++++++++++++
.../src/executor/acquire-session-registry-path.ts | 5 +-
.../engine/src/executor/completion-finalization.ts | 3 +-
.../engine/src/executor/create-task-done-tool.ts | 3 +-
.../engine/src/executor/emit-bounded-run-audit.ts | 48 ++++
.../executor/emit-merge-boundary-unproven-audit.ts | 68 ++----
.../engine/src/executor/execute-workflow-graph.ts | 5 +-
.../engine/src/executor/handle-graph-failure.ts | 18 +-
...dle-stale-in-review-parse-pause-abort-replay.ts | 7 +-
...ndle-stale-in-review-plan-pause-abort-replay.ts | 7 +-
.../maybe-dispatch-workflow-work-engine.ts | 7 +-
.../src/executor/no-merge-complete-column.ts | 3 +-
.../reenter-paused-aborted-workflow-node.ts | 7 +-
.../src/executor/required-artifact-recovery.ts | 3 +-
packages/engine/src/executor/run-implementation.ts | 5 +-
19 files changed, 433 insertions(+), 86 deletions(-)
Fusion-Task-Id: FN-9172
Fusion-Task-Lineage: 80c67c36-3bbb-4274-ac4c-9808c4cda3ce
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 20:35:19 -07:00
gsxdsm
84d9a59e7e
FN-9169: retry Windows worktree cleanup failures
...
Make clean-room removal resilient to transient Windows filesystem locks without weakening worktree ownership safeguards.
- add bounded errno-based directory removal retries with Windows read-only recovery
- reuse cleanup retries across AI merge teardown, self-healing sweeps, and native backend fallback
- preserve residual registrations and expose retry outcomes through cleanup audit metadata
- cover retry, idempotency, residual, and ownership-aware cleanup behavior
Files changed:
.../fn-9169-windows-ai-merge-worktree-cleanup.md | 7 +
docs/architecture.md | 4 +-
.../engine/src/__tests__/merger-ai-cleanup.test.ts | 195 ++++++++++++++++++++-
.../__tests__/self-healing-tempdir-sweep.test.ts | 109 ++++++++++--
.../engine/src/__tests__/worktree-backend.test.ts | 39 ++++-
.../src/__tests__/worktree-removal-retry.test.ts | 64 +++++++
packages/engine/src/merge/merger-ai-worktree.ts | 103 ++++++-----
packages/engine/src/self-healing.ts | 26 ++-
packages/engine/src/worktree/worktree-backend.ts | 15 +-
.../engine/src/worktree/worktree-removal-retry.ts | 110 ++++++++++++
10 files changed, 592 insertions(+), 80 deletions(-)
Fusion-Task-Id: FN-9169
Fusion-Task-Lineage: 4719bd4f-27bf-4a2b-8f31-350658523127
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 20:25:18 -07:00
gsxdsm
7ded57e550
FN-9167: clear interrupted manual merge status
...
Prevent interrupted manual merges from leaving tasks stranded in a transient merging state.
- track locally owned merge stamps and clear them through fenced abort cleanup
- handle SIGINT, SIGTERM, and SIGHUP for foreground task merges with documented exit behavior
- reconcile only age-proven orphan stamps before manual CLI and UI-only dashboard merges
- cover merge stamp authorization, signal cleanup, and mock completeness with regression tests
- add a patch changeset and operator documentation
Files changed:
.../fn-9167-interrupted-manual-merge-stamp.md | 7 +
docs/cli-reference.md | 1 +
docs/task-management.md | 2 +-
.../task-command-github-import-tracking.test.ts | 3 +
packages/cli/src/commands/__tests__/task.test.ts | 179 +++++-
packages/cli/src/commands/dashboard.ts | 3 +
packages/cli/src/commands/task.ts | 138 +++--
.../merge-orphan-durable-write-inventory.json | 608 +++++++++++----------
.../src/__tests__/merge-active-status.test.ts | 49 ++
packages/engine/src/index.ts | 2 +
.../engine/src/merge/clear-orphaned-merge-stamp.ts | 80 +++
packages/engine/src/merge/merger-ai.ts | 12 +
packages/engine/src/project-engine.ts | 20 +-
13 files changed, 735 insertions(+), 369 deletions(-)
Fusion-Task-Id: FN-9167
Fusion-Task-Lineage: 554380e2-ce55-4e7a-89fd-f5c24341937b
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 20:17:42 -07:00
gsxdsm
416c6a0215
FN-9170: Preserve structured merge failure sentinels
...
Keep merge-unavailable intact across workflow merge dispatch so graph routing receives the engine's structured result.
- preserve merge-unavailable alongside implementation-incomplete during primitive classification
- cover direct and legacy merge paths, audit context, normalization, and non-terminal retry behavior
- document the structured sentinel invariant and add a patch changeset
Files changed:
.changeset/fn-9170-merge-unavailable.md | 7 ++
docs/architecture.md | 2 +
.../merge-unavailable-classification.test.ts | 113 +++++++++++++++++++++
.../src/__tests__/workflow-merge-nodes.test.ts | 47 ++++++++-
.../engine/src/workflows/workflow-merge-nodes.ts | 13 ++-
5 files changed, 176 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-9170
Fusion-Task-Lineage: 99cc501f-8a25-49f5-b81a-74dd2e6e872b
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 20:08:05 -07:00
gsxdsm
2a31505823
FN-9163: Add repositories to existing workspace tasks
...
Enable validated workspace membership additions and make active tasks discover new repositories safely.
- add idempotent direct-child Git repository validation and workspace configuration updates
- expose repository discovery and addition through Settings and dashboard API routes
- refresh workspace membership during acquisition while blocking additions after review or landing begins
- document the workflow and cover core, dashboard, and engine behavior with focused tests
Files changed:
.changeset/fn-9163-workspace-add-repo.md | 7 ++
docs/dashboard-guide.md | 2 +
docs/settings-reference.md | 2 +-
docs/workspaces.md | 12 +-
.../core/src/__tests__/workspace-add-repo.test.ts | 12 ++
packages/core/src/git/git-repository.ts | 68 ++++++++++-
packages/core/src/index.gate.ts | 3 +
packages/core/src/index.ts | 3 +
packages/dashboard/app/api/agents/agents.ts | 11 +-
.../settings/sections/GeneralSection.tsx | 3 +
.../settings/sections/WorkspaceReposCard.css | 6 +
.../settings/sections/WorkspaceReposCard.tsx | 46 ++++++++
.../__tests__/workspace-repos-card.test.tsx | 49 ++++++++
.../src/__tests__/workspace-add-repo-route.test.ts | 65 ++++++++++
.../dashboard/src/routes/register-git-github.ts | 35 +++++-
.../__tests__/workspace-add-repo-midflight.test.ts | 131 +++++++++++++++++++++
packages/engine/src/agent-tools.ts | 27 ++++-
packages/engine/src/executor/deps-bags.ts | 44 ++++++-
packages/engine/src/executor/run-implementation.ts | 2 +
19 files changed, 512 insertions(+), 16 deletions(-)
Fusion-Task-Id: FN-9163
Fusion-Task-Lineage: 7456f55f-b7c8-4076-994f-42994d8babb0
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 19:59:04 -07:00
gsxdsm
3b0a6b795f
FN-9162: Group workspace worktrees under configurable roots
...
Configure collision-safe workspace and repository subfolders beneath custom worktree roots.
- add shared workspace layout helpers and export them through runtime and gate barrels
- route acquisition, pinning, cleanup, archive, and extension discovery through grouped paths
- allow absolute worktree roots in settings and document the workspace layout
- protect shared-root containers from destructive sweeps and cover multi-repository behavior
Files changed:
.changeset/fn-9162-workspace-worktree-root.md | 7 ++
docs/settings-reference.md | 2 +-
docs/workspaces.md | 6 ++
.../extension-workspace-worktree-root.test.ts | 81 +++++++++++++++++
packages/cli/src/extension.ts | 53 ++++++++++-
packages/core/src/__tests__/pi-extensions.test.ts | 46 +++++++++-
.../core/src/__tests__/worktree-layout.test.ts | 49 ++++++++++
packages/core/src/index.gate.ts | 13 +++
packages/core/src/index.ts | 9 ++
packages/core/src/plugins/pi-extensions.ts | 12 ++-
packages/core/src/task-store/archive-lifecycle.ts | 11 +--
packages/core/src/tasks/worktree-layout.ts | 77 ++++++++++++++++
.../dashboard/app/components/SettingsModal.tsx | 4 +-
.../settings/sections/WorktreesSection.tsx | 2 +-
.../worktree-acquisition-workspace.test.ts | 55 ++++++++++-
.../engine/src/__tests__/worktree-paths.test.ts | 19 +++-
.../engine/src/__tests__/worktree-pinning.test.ts | 17 ++++
.../engine/src/__tests__/worktree-pool.test.ts | 19 +++-
.../src/executor/workspace-main-checkout-guard.ts | 2 +-
packages/engine/src/self-healing.ts | 20 +++-
.../engine/src/worktree/worktree-acquisition.ts | 101 +++++++++++++++------
packages/engine/src/worktree/worktree-names.ts | 14 +--
packages/engine/src/worktree/worktree-paths.ts | 75 ++++++++++++---
packages/engine/src/worktree/worktree-pinning.ts | 10 +-
packages/engine/src/worktree/worktree-pool.ts | 44 ++++++---
25 files changed, 656 insertions(+), 92 deletions(-)
Fusion-Task-Id: FN-9162
Fusion-Task-Lineage: b5f5e247-577c-4357-9ffe-97e2447b4fd4
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 19:46:35 -07:00
gsxdsm
5ba0b0cffc
FN-9168: Record terminal merge-boundary parks in run audit
...
Add failure-isolated audit visibility for merge-boundary proof failures without changing terminal park behavior.
- Emit a redacted event from retry-boundary and graph-terminal park paths.
- Bound audit sink latency and isolate absent, throwing, rejecting, or hung sinks.
- Add reason-code coverage, catalogue documentation, and a patch changeset.
Files changed:
.changeset/fn-9168-merge-boundary-audit.md | 7 ++
AGENTS.md | 1 +
docs/run-audit.md | 1 +
.../src/__tests__/executor-graph-boundary.test.ts | 33 ++++++---
.../__tests__/merge-boundary-unproven-park.test.ts | 78 +++++++++++++++++++-
.../executor/emit-merge-boundary-unproven-audit.ts | 82 ++++++++++++++++++++++
.../engine/src/executor/handle-graph-failure.ts | 23 +++++-
.../executor/route-graph-merge-failure-to-retry.ts | 36 +++++++++-
.../engine/src/executor/workflow-merge-boundary.ts | 38 ++++++++--
.../engine/src/run-audit/run-audit-catalogue.ts | 5 +-
packages/engine/src/util/run-audit.ts | 10 +++
11 files changed, 293 insertions(+), 21 deletions(-)
Fusion-Task-Id: FN-9168
Fusion-Task-Lineage: cdeb5c1f-4b22-4531-878e-b18955e6ea5a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 19:34:53 -07:00
gsxdsm
d280fa6f54
FN-9166: preserve implementation-incomplete merge failures
...
Keep structured incomplete-implementation failures intact so graph recovery can resume or fail closed without retrying a no-op merge.
- Preserve normalized implementation-incomplete reasons during direct merge-attempt classification.
- Cover primitive, legacy seam, resumable, fail-closed, and cancellation paths.
- Document the merge-boundary invariant and add a patch changeset.
Files changed:
.../fn-9166-preserve-implementation-incomplete.md | 7 ++
docs/architecture.md | 2 +-
.../merge-node-paused-abort-retryable.test.ts | 76 ++++++++++++++++++++++
.../__tests__/workflow-merge-cancellation.test.ts | 15 ++++-
.../src/__tests__/workflow-merge-nodes.test.ts | 46 +++++++++++++
.../engine/src/workflows/workflow-merge-nodes.ts | 13 +++-
6 files changed, 155 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-9166
Fusion-Task-Lineage: 1b7946bf-62e3-42f0-8c8c-09230fef22bb
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 19:12:28 -07:00
gsxdsm
ef35fb8e5a
FN-9164: select per-repository workspace base branches
...
Workspace worktrees now honor and persist the appropriate base branch for each sub-repository throughout their lifecycle.
- Resolve requested bases per repository, normalize remote-only refs, and fall back safely to repository integration branches.
- Reuse recorded bases for landing, recovery, and revert flows with privacy-safe audit breadcrumbs.
- Surface base and fallback details in task UI, documentation, tests, and release notes.
Files changed:
.changeset/fn-9164-workspace-base-branch.md | 7 +
AGENTS.md | 1 +
docs/task-management.md | 2 +-
docs/workspaces.md | 8 +-
packages/core/src/types/task/task-core.ts | 12 ++
.../dashboard/app/components/TaskDetailModal.css | 14 ++
.../app/components/WorkspaceWorktreesSummary.tsx | 2 +
.../__tests__/WorkspaceWorktreesSummary.test.tsx | 13 ++
.../src/routes/register-task-workflow-routes.ts | 2 +
.../task-revert.workspace.real-git.test.ts | 25 +++
.../src/__tests__/workspace-base-branch.test.ts | 93 +++++++++++
.../worktree-acquisition-workspace.test.ts | 27 ++++
packages/engine/src/execution/task-revert.ts | 58 +++++--
packages/engine/src/merge/merger-ai.ts | 30 +++-
packages/engine/src/self-healing.ts | 50 +++++-
packages/engine/src/util/run-audit.ts | 6 +
.../engine/src/worktree/workspace-base-branch.ts | 180 +++++++++++++++++++++
.../engine/src/worktree/worktree-acquisition.ts | 62 ++++---
18 files changed, 548 insertions(+), 44 deletions(-)
Fusion-Task-Id: FN-9164
Fusion-Task-Lineage: 487a1c77-32cb-47dd-bf43-297a146951ba
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 18:57:33 -07:00
gsxdsm
179f08c2d4
FN-9158: recover Windows antivirus-blocked PostgreSQL payloads
...
Recover quarantined or truncated embedded PostgreSQL runtime files and explain Windows Defender remediation.
- Validate materialized payload inventory with v3 markers and repair mismatches atomically.
- Surface actionable error 4551 diagnostics through startup failures.
- Add regression coverage, operator documentation, and a patch changeset.
Files changed:
...-9158-windows-av-blocked-embedded-pg-payload.md | 7 +
...ndows-antivirus-blocks-embedded-postgres-dll.md | 27 +++
docs/storage.md | 4 +
.../__tests__/postgres/embedded-lifecycle.test.ts | 139 +++++++++++++-
.../src/__tests__/postgres/startup-factory.test.ts | 19 ++
packages/core/src/postgres/embedded-lifecycle.ts | 208 ++++++++++++++++++++-
packages/core/src/postgres/startup-factory.ts | 30 +--
7 files changed, 414 insertions(+), 20 deletions(-)
Fusion-Task-Id: FN-9158
Fusion-Task-Lineage: ec2c97d7-0797-49c1-b875-6b147ff26917
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 18:50:27 -07:00
gsxdsm
944ca642ee
FN-9154: add fail-closed PostgreSQL hygiene reporting
...
Add an offline PostgreSQL cluster-hygiene report that records trustworthy campaign admission evidence.
- Parse provenance envelopes and fail closed on missing, malformed, cross-cluster, or stale-marker evidence.
- Classify campaign databases and owner liveness without authorizing destructive cleanup.
- Document the capture workflow and cover measured, malformed, liveness, marker, and unrelated-name cases.
Files changed:
docs/testing.md | 27 +++
.../pg-cluster-hygiene-report/count-mismatch.txt | 9 +
.../fixtures/pg-cluster-hygiene-report/empty.txt | 0
.../pg-cluster-hygiene-report/liveness-absent.txt | 7 +
.../pg-cluster-hygiene-report/liveness-alive.txt | 8 +
.../pg-cluster-hygiene-report/liveness-dead.txt | 8 +
.../pg-cluster-hygiene-report/malformed.txt | 11 ++
.../pg-cluster-hygiene-report/markers-stale.txt | 8 +
.../fixtures/pg-cluster-hygiene-report/mixed.txt | 17 ++
.../pg-cluster-hygiene-report/no-banner.txt | 1 +
.../pg-cluster-hygiene-report/post-state.txt | 7 +
.../pg-cluster-hygiene-report/pre-state.txt | 8 +
.../pg-cluster-hygiene-report/truncated.txt | 7 +
.../__tests__/pg-cluster-hygiene-report.test.mjs | 171 +++++++++++++++++
scripts/pg-cluster-hygiene-report.mjs | 212 +++++++++++++++++++++
15 files changed, 501 insertions(+)
Fusion-Task-Id: FN-9154
Fusion-Task-Lineage: fca5a025-9460-4850-8ac9-891d563b3d04
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 18:44:29 -07:00
gsxdsm
7b55a02e51
FN-9157: fix workflow merge boundary proof and retry routing
...
Make workflow merge admission accept valid foreach completion and terminate retries when proof is unavailable.
- Treat fully terminal live foreach steps as implementation proof for Review Level 0 workflows.
- Preserve merge-boundary-unproven as a terminal graph failure and park blocked retries visibly.
- Add unit, graph-boundary, and PostgreSQL regression coverage plus operator documentation and a patch changeset.
Files changed:
.changeset/fn-9157-merge-boundary.md | 7 +++
docs/architecture.md | 4 ++
docs/workflow-steps.md | 6 ++
.../src/__tests__/workflow-merge-proof.test.ts | 11 +++-
packages/core/src/workflow-merge-proof.ts | 20 +++++--
.../src/__tests__/executor-graph-boundary.test.ts | 64 +++++++++++++++++++++-
...xecutor-merge-boundary-foreach-proof.pg.test.ts | 10 ++++
.../__tests__/merge-boundary-unproven-park.test.ts | 48 ++++++++++++++++
.../create-authoritative-workflow-primitives.ts | 13 ++++-
.../create-authoritative-workflow-seams.ts | 6 +-
.../executor/evaluate-workflow-merge-boundary.ts | 18 +++++-
.../executor/route-graph-merge-failure-to-retry.ts | 26 ++++++++-
packages/engine/src/executor/task-predicates.ts | 2 +
.../engine/src/executor/workflow-merge-boundary.ts | 29 +++++++---
.../engine/src/workflows/workflow-merge-nodes.ts | 13 +++++
15 files changed, 253 insertions(+), 24 deletions(-)
Fusion-Task-Id: FN-9157
Fusion-Task-Lineage: 7c68dfe2-28fb-4353-9ae6-df0ddbaf799a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 18:16:49 -07:00
gsxdsm
7dfce1cc16
FN-9160: Prevent draft storage quota exhaustion
...
Make browser draft restoration best-effort so oversized or quota-blocked writes never interrupt task creation.
- cap free-text draft persistence at 64,000 bytes and warn once when restoration is unavailable
- make scoped storage operations throw-safe with bounded retries and stale volatile-state reclamation
- extend quota, composer, modal persistence, and chat draft coverage and document the storage policy
- add a patch changeset for the operator-facing fix
Files changed:
.changeset/fn-9160-quick-entry-quota.md | 7 ++
docs/storage.md | 31 +++---
.../dashboard/app/components/InlineCreateCard.tsx | 25 ++++-
.../dashboard/app/components/QuickEntryBox.tsx | 25 ++++-
.../components/__tests__/ChatView.draft.test.tsx | 36 +++++-
.../components/__tests__/InlineCreateCard.test.tsx | 20 ++++
.../components/__tests__/QuickEntryBox.test.tsx | 36 +++++-
.../app/hooks/__tests__/modalPersistence.test.ts | 28 +++--
packages/dashboard/app/hooks/modalPersistence.ts | 29 ++---
.../app/utils/__tests__/projectStorage.test.ts | 88 ++++++++++++++-
packages/dashboard/app/utils/projectStorage.ts | 122 +++++++++++++++++++--
11 files changed, 384 insertions(+), 63 deletions(-)
Fusion-Task-Id: FN-9160
Fusion-Task-Lineage: 63481936-91f1-4e7a-b27c-c3c5f49014dd
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 18:08:55 -07:00
gsxdsm
fb77eef7a9
FN-9150: Capture abandoned PostgreSQL timeout boundaries
...
Capture elapsed and join evidence for PostgreSQL test boundaries that Vitest abandons before settlement.
- emit unique boundary join keys, progress ladders, terminal records, and payload-free watchdog breaches
- classify ladder-only, breach, and unobservable lifecycle evidence in the loaded-failure census
- cover abandoned and superseded body windows and document the corrective campaign findings
Files changed:
...res-loaded-lane-unrelated-failure-population.md | 33 ++++++-
docs/testing.md | 14 ++-
.../__test-utils__/pg-timeout-boundary-observer.ts | 108 ++++++++++++++++++---
.../__tests__/pg-timeout-boundary-observer.test.ts | 98 ++++++++++++++++++-
.../__tests__/pg-loaded-failure-census.test.mjs | 30 ++++++
scripts/pg-loaded-failure-census.mjs | 71 ++++++++++++--
6 files changed, 327 insertions(+), 27 deletions(-)
Fusion-Task-Id: FN-9150
Fusion-Task-Lineage: fc2e9f99-7739-4d86-99f4-713a78f53e57
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 10:10:39 -07:00
gsxdsm
a1977e052b
FN-9149: Add PostgreSQL timeout-boundary diagnostics
...
Instrument the opt-in PostgreSQL test harness to attribute loaded-lane timeout failures without changing default behavior.
- Add bounded setup, body, and teardown watchdog probes with host, cluster, and template evidence.
- Wire observer records into the harness and loaded-failure census with explicit suppression and attribution handling.
- Cover observer inertness, boundary behavior, and census joins while documenting the 27-worker campaign findings.
Files changed:
...res-loaded-lane-unrelated-failure-population.md | 31 +-
docs/testing.md | 27 ++
.../core/src/__test-utils__/pg-test-harness.ts | 113 +++++-
.../__test-utils__/pg-timeout-boundary-observer.ts | 451 +++++++++++++++++++++
.../pg-test-harness-observer-inertness.test.ts | 31 ++
.../__tests__/pg-timeout-boundary-observer.test.ts | 177 ++++++++
.../__tests__/pg-loaded-failure-census.test.mjs | 31 ++
scripts/pg-loaded-failure-census.mjs | 101 ++++-
8 files changed, 934 insertions(+), 28 deletions(-)
Fusion-Task-Id: FN-9149
Fusion-Task-Lineage: 4df4ee28-5369-41ae-bb0c-e7e9ae78d873
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 08:41:14 -07:00
gsxdsm
161edaa694
FN-9148: add PostgreSQL loaded-failure census
...
Add retained-log census tooling and evidence for PostgreSQL loaded-lane timeout investigations.
- Parse complete Vitest logs and optional diagnostics without opening PostgreSQL or running tests.
- Classify failing files, lifecycle positions, failure shapes, backend headroom, waits, and watchdog data.
- Cover high-failure, healthy, malformed-diagnostics, and truncated-log cases with fixtures.
- Document the reproduced population, unsupported remedies, and successor measurement requirements.
Files changed:
...res-loaded-lane-unrelated-failure-population.md | 80 ++++++++++
docs/testing.md | 8 +
.../fixtures/pg-loaded-failure-census/high-run.txt | 77 +++++++++
.../fixtures/pg-loaded-failure-census/high.jsonl | 4 +
.../fixtures/pg-loaded-failure-census/low-run.txt | 4 +
.../pg-loaded-failure-census/truncated-run.txt | 2 +
.../__tests__/pg-loaded-failure-census.test.mjs | 65 ++++++++
scripts/pg-loaded-failure-census.mjs | 172 +++++++++++++++++++++
8 files changed, 412 insertions(+)
Fusion-Task-Id: FN-9148
Fusion-Task-Lineage: c632a9d0-b823-4416-ab46-0d834e850007
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 06:24:01 -07:00
gsxdsm
687990c0a6
FN-9146: document PostgreSQL flake campaign evidence
...
Document the bounded investigation results for active core PostgreSQL suite-only flakes.
- Record per-lane outcomes and sampled cluster-capacity evidence for entries 1, 2, and 7.
- Clarify reproduced, unreproduced, and unattributed statuses without changing quarantine policy.
- Ratchet campaign completeness, ownership, and documentation-link coverage in the register tests.
Files changed:
.../suite-only-flakes-observed-register.md | 71 +++++++++++++++++-
docs/testing.md | 4 +
scripts/__tests__/observed-flake-register.test.mjs | 85 ++++++++++++++++++++--
3 files changed, 148 insertions(+), 12 deletions(-)
Fusion-Task-Id: FN-9146
Fusion-Task-Lineage: d5de3fac-48d6-4ee7-ae09-173007d234e5
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 05:38:54 -07:00
gsxdsm
91daa37162
FN-9147: synchronize script test baselines
...
Align script-test expectations and documentation with the current validator and dashboard test inventory.
- Add the pre-JSON anchor validator to the verify-fast baseline.
- Ratchet documented pretest validators against canonical order and membership.
- Remove deleted dashboard tests from timing data.
Files changed:
docs/testing.md | 22 +++++++++-
scripts/__tests__/verify-fast.test.mjs | 76 +++++++++++++++++++++++++++++++++-
scripts/test-timings.json | 2 -
3 files changed, 95 insertions(+), 5 deletions(-)
Fusion-Task-Id: FN-9147
Fusion-Task-Lineage: fdb33c60-e019-402b-b91b-ba0f0f971350
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 05:23:41 -07:00
gsxdsm
ed2cbd08a1
FN-9145: clarify active flake register states
...
Reorganize the suite-only flake register around its current decision state.
- Separate active observations, gate evictions, and archived closed records while preserving entry anchors.
- Mark entry 1 as an escalated second sighting and restore FN-9126/FN-9131, FN-9128, and FN-9127 ownership.
- Add regression checks for active counts, exact states and owners, and testing-guide anchors.
Files changed:
.../suite-only-flakes-observed-register.md | 189 +++++++++++++--------
scripts/__tests__/observed-flake-register.test.mjs | 65 +++++++
2 files changed, 181 insertions(+), 73 deletions(-)
Fusion-Task-Id: FN-9145
Fusion-Task-Lineage: 39b3292a-db48-4be4-878c-7d2b026abae3
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 04:16:48 -07:00
ischindl
72877c8cf9
fix(RUFU-074): idle backoff + jitter for the task-deleted outbox consumer ( #3471 )
...
**Problem:** Each dashboard/engine project consumer polled
`task_deleted` outbox on a fixed 5s setInterval, so ~44 per-project
consumers thundered together on the same cadence — an idle DB query
storm and CPU hot-spot even when projects were paused/idle.
**Fix:** The outbox consumer reschedules itself from each poll outcome:
an idle poll (zero events) grows the next delay by
`TASK_DELETED_OUTBOX_BACKOFF_STEP_MS` toward `MAX_POLL_MS`, with ±20%
jitter so the consumers de-synchronize; a poll that delivered events
resets to the fast base. A paused/idle project drains its outbox and
backoff alone drops the DB load.
**Includes:** regression test (bounded jitter + idle growth),
performance changeset, solution doc, deploy handoff script.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Performance**
- Reduced unnecessary idle polling by gradually increasing the polling
interval, up to 60 seconds, with bounded timing variation.
- Restored the faster 5-second polling cadence when new events, waits,
or transient errors occur.
- Preserved event ordering, delivery guarantees, acknowledgements, and
independent behavior across concurrent consumers.
- **Documentation**
- Added guidance on polling behavior, deployment verification, and
monitoring targets.
- **Tests**
- Added coverage for backoff growth, jitter limits, event bursts,
concurrent consumers, error handling, retries, and clean shutdown.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-18 22:11:47 -07:00
ischindl
f195ff5b3d
feat(RUFU-081): add Prometheus-format /metrics system observability endpoint ( #3475 )
...
**Problem:** Fusion had no Prometheus-scrapeable metrics surface, so
production CPU/health/DB/fleet observability had to be inferred from
logs and ad-hoc monitoring.
**Fix:** Expose a Prometheus-text `/metrics` HTTP endpoint on the
dashboard with runtime + domain samplers: request latency quantiles
(p50/p95/max), last-request-age freeze indicator, CPU user/system,
RSS/heap, child-process spawn rates by kind, git children count, PG tps,
active/idle/total projects, running agents, and board task counts.
Scraped at 5s by the existing Prometheus/Grafana stack
(fusion-observability).
**Includes:** full test coverage for the Prometheus text parser and each
sampler.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added a public, unauthenticated `/metrics` endpoint with
Prometheus-formatted dashboard, runtime, process, database, and domain
metrics.
* Added request latency, resource usage, child-process, project
activity, agent, and task metrics.
* Metrics remain available in headless mode and provide stable snapshots
without triggering additional data writes or on-demand I/O.
* **Documentation**
* Documented metric families, sampling behavior, and degraded-operation
handling.
* **Tests**
* Added comprehensive coverage for collection, formatting, parsing,
endpoint behavior, and sampler lifecycle.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-18 22:11:22 -07:00
gsxdsm
f12b9f8463
fix: wait for the dev server rather than tunnelling a guessed port
...
When the dev child had not reported a bound port within 60s, the wrapper fell
back to the configured port and published a tunnel to it. In the case the
port fix exists for — a container whose own Fusion owns 4040 — that hands out
a dev-looking URL serving a completely different instance, with only a
passing "which may not be it" warning to show for it.
Observed with a dev server stopped on the interactive `Run central db now?
(Y/n)` prompt: it never listens, so it never reports, so the tunnel published
the container's Fusion instead.
A missing tunnel is a visible problem that explains itself; a tunnel to the
wrong app is a silent one. The wrapper now waits, unbounded, printing a
notice once a minute that names the interactive-prompt case. An explicit
--tunnel=PORT still publishes immediately, since it names a target the dev
child knows nothing about.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 20:38:48 -07:00
gsxdsm
9f10767254
feat: share terminal sessions across browsers
...
Terminal PTYs already lived in a server-side registry whose WebSocket attach
supports several viewers, but the tab list is per-browser localStorage and a
browser with no stored tabs skipped the session listing entirely (FN-7686's
cold-open optimization) and spawned its own PTY. Two people on one Fusion —
or one person in a second browser — therefore never saw each other's
terminals and quietly accumulated parallel sessions.
- A zero-tab client adopts the server's sessions, oldest first, so every
client converges on the same set. A client with stored tabs still only
validates them; adopting there would resurrect tabs the user closed here.
- FN-7686's guarantee weakens from "never waits" to "waits at most
ADOPT_LIST_TIMEOUT_MS (1.5s), then behaves exactly as before": auto-create
fires on a 0ms timer, so a background list can never win that race. Its
regression test and comment now state the bounded contract.
- Closing a tab asks which close was meant — detach here (PTY keeps running
for other viewers) or end the session for everyone. alwaysAsk is set: this
gates an informed choice and both wrong answers are destructive. Desktop
and mobile close controls both route through it.
- A footer Reopen control lists sessions the server still runs that this
browser is not showing and reattaches to them, so detaching is not a
one-way door.
Also fixes a multi-viewer data bug: the attach called
getScrollbackAndClearPending(), discarding queued output and deleting a slice
of every already-attached viewer's live stream. It now flushes pending output
to existing viewers first, then reads scrollback for the newcomer, so each
viewer receives it exactly once.
Drive-by: closeTab's dependency array was empty while its body reads
projectId, freezing it at the first render's project.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 19:13:53 -07:00
gsxdsm
ee57f8a3b9
fix: print the dashboard token with the dev tunnel URL
...
`pnpm dev --tunnel` published a bare URL under a "public, unauthenticated"
header. That label was wrong for the flag's own default target: --tunnel with
no port aims at the dashboard, which is bearer-token gated, so the recipient
of a shared link got a 401 with no token to supply.
resolveDevTunnelAuth() now classifies the target and the banner says what is
actually true of it:
token dashboard with auth on — prints the token and a ?token= link,
resolved from FUSION_DASHBOARD_TOKEN, FUSION_DAEMON_TOKEN,
then ~/.fusion/settings.json
token-pending first run, token not minted yet — defers to the dashboard's
own startup banner
no-auth --no-auth is on; the dashboard really is open
foreign a non-dashboard port; Fusion has no auth to lend it, the only
genuinely ungated case
Auth resolves at banner time rather than flag-parse time so a token the dev
child mints on a first authenticated run is already readable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 18:21:50 -07:00
gsxdsm
7423555c46
feat(dev): pnpm dev --tunnel publishes the dev server over a quick tunnel
...
Operator case: someone works inside a remote Fusion (a container, a shared box),
starts a dev server there, and needs to view it from their own browser. The dev
server binds inside that machine, so without a tunnel the only options are port
publishing or a VPN — both needing cooperation from whoever owns the host.
pnpm dev --tunnel # tunnels the dashboard port (PORT, default 4040)
pnpm dev --tunnel=5173 # tunnels a Vite dev server instead
pnpm dev --tunnel dashboard # tunnel the default port AND run the dashboard
FUSION_DEV_TUNNEL=1 pnpm dev
Cloudflare QUICK tunnels are usable here precisely because a dev server is HTTP:
no account, no domain, no card. The TCP endpoints that SSH would have needed
require a card (ngrok) or a domain plus Zero Trust (Cloudflare) — that asymmetry
is why this exists for HTTP only, and it is recorded in the module header so the
next person does not retry the SSH variant.
Design decisions:
- Tunnel failure is NON-FATAL. A missing cloudflared or a tunnel that never
publishes a URL logs and is skipped; losing a preview URL must never cost the
operator their dev loop.
- Watch-mode restarts reuse the existing tunnel. A fresh quick tunnel hands out a
different hostname each time, which would invalidate an already-shared link.
- `--tunnel` consumes a following token only when it is numeric, so
`--tunnel dashboard` forwards `dashboard` to the dev command rather than
tunnelling port NaN. That is the bug this flag shape invites, so it is tested.
Verified end to end in a container: a dev server bound to 127.0.0.1 inside it was
fetched from the public internet through the tunnel (200, correct body). Also
confirmed that tunnelling the DASHBOARD port does not weaken auth — unauthenticated
requests through the tunnel return 401 for /api/tasks, /api/settings and
/api/artifacts, with only /api/health open by design.
Adding two fields to parseDevWrapperArgs' return broke two existing strict toEqual
assertions; those were updated rather than loosened to toMatchObject. 27 tests pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 17:18:56 -07:00
gsxdsm
b18c9d7594
FN-9144: Preserve test velocity measurement verdicts
...
Make test-velocity investigation notes durable across report regeneration and concurrent history updates.
- add idempotent note targeting for historical measurement entries
- serialize history mutations with bounded stale-lock recovery
- render all annotated cycles and record the W33 gate variance verdict
- document the generated-report workflow and cover retention/concurrency behavior
Files changed:
.../merge-gate-w33-walltime-regression.md | 15 ++
docs/test-velocity-baseline.md | 12 ++
docs/testing.md | 2 +
scripts/__tests__/test-velocity-baseline.test.mjs | 153 +++++++++++++-
scripts/test-velocity-baseline.mjs | 221 +++++++++++++++------
scripts/test-velocity-history.json | 6 +
6 files changed, 349 insertions(+), 60 deletions(-)
Fusion-Task-Id: FN-9144
Fusion-Task-Lineage: e3869e40-2cbc-4e5b-844e-9091da96b652
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-18 08:08:24 -07:00
ischindl
0540686599
fix(RUFU-073): thread a per-tick task workflow-selection cache through scheduler reads ( #3470 )
...
**Problem:** Scheduler was re-reading each task's
`task_workflow_selection` once per park-resolution (sweep, hold-release,
moved, unpause/wake), causing a nonstop PostgreSQL query storm (~232
idx_scan/s) on idle polling — a major engine CPU hot-spot.
**Fix:** Memoize the workflow selection per scheduler tick/event —
thread a shared, per-event selection cache through
`resolveWorkflowIrForTask` and all park-resolution handlers, then throw
it away. Each task resolves its parked columns with at most one read of
`task_workflow_selection` per tick. A selection write is always observed
on the next event's fresh cache (never a global/infinite LRU).
**Includes:** regression test asserting the once-per-tick read
invariant, performance changeset + per-tick-cache solution doc,
deploy+verify handoff script, and the parallel quarantine-ledger merge
(origin FN-9125 + RUFU-072 OOM entries both retained).
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Performance Improvements**
* Reduced repeated workflow-selection reads during scheduler ticks and
related event processing.
* Improved scheduler and health API responsiveness through per-operation
caching and read deduplication.
* Preserved existing behavior, including retry handling for failed reads
and synchronous data-store support.
* **Documentation**
* Added architectural guidance covering workflow-selection performance,
caching behavior, and verification criteria.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-18 00:10:46 -07:00
gsxdsm
0a50e2142d
FN-9143: inherit selected workflow in New Task dialog
...
Make every New Task entry point seed the dialog from the active Board or List workflow.
- Resolve implicit workflow selection through the modal manager while preserving explicit choices and All workflows behavior.
- Forward selected workflow IDs from List view and navigation-backed dialog entry points.
- Add cross-surface regression coverage, operator documentation, and a patch changeset.
Files changed:
.changeset/fn-9143-new-task-selected-workflow.md | 7 +++
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/App.tsx | 4 +-
packages/dashboard/app/components/AppModals.tsx | 4 +-
packages/dashboard/app/components/Column.tsx | 4 +-
.../dashboard/app/components/LeftSidebarNav.tsx | 4 +-
packages/dashboard/app/components/ListView.tsx | 7 ++-
.../components/__tests__/LeftSidebarNav.test.tsx | 1 +
.../app/components/__tests__/ListView.test.tsx | 13 +++--
.../new-task-dialog-selected-workflow.test.tsx | 46 ++++++++++++++++++
.../dashboard/app/components/dashboard/types.ts | 2 +-
.../app/hooks/__tests__/useModalManager.test.ts | 55 ++++++++++++++++++++++
packages/dashboard/app/hooks/useModalManager.ts | 19 ++++++--
13 files changed, 148 insertions(+), 20 deletions(-)
Fusion-Task-Id: FN-9143
Fusion-Task-Lineage: 43951c5d-24d2-4243-826a-c6f416607882
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-17 20:54:43 -07:00
gsxdsm
83a33be353
feat(dashboard): persistent sign-in dialog for paste-back provider logins
...
Operator report: during a container login there was nowhere obvious to paste the
redirect URL and no sign of what the app was waiting on. The flow was split
across a pre-flight confirm that warned about paste-back and vanished, a card
that shrank to a disabled "Waiting for login…" chip, and the paste field
rendered inline in that card below the fold of a scrolling modal.
ProviderLoginDialog now opens with the flow and stays until it ends: a two-step
progress list, a button to re-open a lost sign-in tab, the paste field, and the
terminal outcome inline instead of a toast that disappears while the operator is
in another browser tab.
Three defects found and fixed while verifying it in a real container:
- It sank behind the onboarding modal and clicks landed on the modal instead.
createPortal relocates the DOM node but NOT the React tree, so pointer events
bubbled to the host FloatingWindow, which raises itself to a fresh
nextFloatingZ() on every pointerdown — each click in the dialog lifted the
window above it. Fixed by rendering the dialog as a sibling of the window,
claiming z once on open (it was calling nextFloatingZ() inline on every render
of a modal that re-renders on a 2s poll), and stopping propagation on the
overlay. Ratcheted for every portaled .modal-overlay.
- Spacing did not match any other dialog: it hand-rolled header/action padding
instead of using .modal-header/.modal-actions, and padded each child
separately. Every row now shares var(--modal-padding) — verified at a uniform
17px inset across header, steps, paste prompt, field, Submit, and actions.
- The paste field was invisible (.form-input fills with var(--surface), and so
does .modal — measured #0c0c0e on #0c0c0e), Submit was a 25px row-density
btn-sm, and both could scroll out of reach. The field now sinks to var(--bg)
with var(--border-strong), Submit takes standard control padding, and the
paste region is pinned outside the scroll area.
Dialog anatomy rules (spacing primitives, portal/stacking) documented in
docs/dashboard-guide.md.
Verified: 441 dashboard tests including 4 new dialog tests, eslint, dashboard
typecheck, and the rendered dialog measured in a container build.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-17 20:47:28 -07:00
gsxdsm
bb11e493f7
fix(auth): restore Codex login and promote outboard resize targets
...
Operator report from a containerized dashboard: OpenAI Codex login never opened
a browser window at all, and floating windows still needed the FN-8015 follow-up.
- pi's `AuthPrompt` is a discriminated union — text, secret, select, manual_code —
and FusionAuthStorage.login's interaction shim flattened every variant into
`onPrompt({message, placeholder})`, discarding `type` and a select's `options`.
pi's Codex `login()` OPENS with `prompt({type:"select"})` (Browser vs Device
code) before emitting any auth URL, so the dashboard answered the method picker
with the promise that waits for a pasted code — input the UI never solicits,
because nothing had been surfaced yet. The flow hung until the route's 30s
kickoff timeout: "Login initiation timed out", no window. The route's
onSelect/selectOauthOption has had the right answer since FN-5917, but the
callback was dead code from the moment login moved to pi's ModelRuntime.
Verified against a real container: the login endpoint now returns Codex's
auth.openai.com URL in 0.03s instead of timing out after 30s.
- Promote FN-8766's outboard east/NE/SE resize targets from Task Detail to every
desktop window. With FN-8015's body gutter deleted, a hosted scrollbar sits
flush against the painted edge where those hit zones used to cover it (issue
#2140 ); moving the targets outside the shell keeps it grabbable without
insetting anything. That needs the host to stop clipping, so the body and its
direct child inherit the corner radius — only 8 of ~30 callers set that
themselves — and phones re-assert clipping since they hide every handle.
- Document the fixed OAuth callback ports (Anthropic 53692, Codex 1455) and
PI_OAUTH_CALLBACK_HOST for Docker: without them the browser callback cannot
reach the container's loopback listener, which is why subscription logins
appeared to fail there.
Verified: 14989 dashboard tests, 58 engine auth-storage tests (4 new, covering
each prompt type), pnpm test:gate, eslint, and both typechecks all pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-17 17:38:26 -07:00
gsxdsm
2fa6ca28d8
fix(docker): make a default docker build + documented run actually work
...
Three defects found while bringing up a container from a clean checkout:
- The dashboard's vite build (~5.7k modules) exceeded V8's default old-space on a
stock Docker Desktop VM and aborted the image build with "Ineffective
mark-compacts near heap limit" (exit 134). Raise the ceiling for that RUN only.
- The documented `-v fusion-home:/home/node/.fusion` mount seeded a root-owned
named volume over a path absent from the image, so embedded Postgres initdb hit
"Permission denied", the supervisor burned its 4 restarts, and the container went
unhealthy on first run. Pre-create the directory node-owned so a fresh named
volume inherits it; document that bind mounts still need a host-side chown.
- Drop the dependency-graph plugin's tsconfig path mapping for the taskStuck module
deleted in 2eae0b2507 / 29d94e0fa3 .
Verified: full `docker build` from a clean export of this tree succeeds unpatched,
and a run against brand-new named volumes with no manual chown reaches health=healthy
with /api/health 200.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-17 16:24:15 -07:00
ischindl
c84924b99a
fix(RUFU-076): stop self-healing git storm on paused projects and bound repair sweeps ( #3473 )
...
**Problem:** Self-healing repeatedly spawned git children
(status/rev-parse/for-each-ref) for paused/idle projects on every sweep,
and certain repair sweeps ran unbounded — a spawn/git storm that spiked
CPU and I/O on the production host.
**Fix:** Bound self-healing git work for paused projects (skip/cooldown)
and cap the repair sweeps so the engine stops churning git processes
when there is nothing actionable. Includes in-process-runtime pause-gate
+ self-healing pause-storm regression tests.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Bug Fixes**
- Paused projects no longer trigger Git-intensive self-healing
maintenance.
- Pause and unpause transitions now correctly stop and resume
maintenance scheduling.
- Global and engine-level pauses are handled consistently.
- **Improvements**
- Active-project Git maintenance is limited to an hourly cadence,
reducing unnecessary activity.
- Merge-metadata recovery is capped at 25 items per cycle for more
predictable processing.
- Database and filesystem housekeeping continues during pauses.
- **Documentation**
- Updated architecture and runtime documentation to describe pause-aware
maintenance behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-17 15:05:10 -07:00
gsxdsm
2b99b365de
FN-9141: rescue plugin-runner tests and enforce quarantine lockstep
...
Rescue the plugin-runner suite before deletion while making quarantine records mechanically consistent.
- preserve logger assertions across worker-reused mock cleanup with a stable hoisted logger
- remove the rescued suite from the quarantine ledger and Vitest exclusion
- enforce ledger-to-exclude lockstep and cover missing or dangling quarantine entries
- document the reproduction evidence, rescue disposition, and strict checker behavior
Files changed:
.../suite-only-flakes-observed-register.md | 14 +-
docs/testing.md | 17 +-
.../engine/src/__tests__/plugin-runner.test.ts | 37 ++--
packages/engine/vitest.config.ts | 14 +-
scripts/__tests__/check-quarantine-ledger.test.mjs | 217 +++++++++---------
scripts/__tests__/ci-test-shard-timings.test.mjs | 5 +-
scripts/check-quarantine-ledger.mjs | 245 +++++++++++++--------
scripts/lib/test-quarantine.json | 10 +-
8 files changed, 314 insertions(+), 245 deletions(-)
Fusion-Task-Id: FN-9141
Fusion-Task-Lineage: 5b0549bf-3cc6-495e-bf99-a30a2dffb029
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-17 05:25:17 -07:00
gsxdsm
6d7b4a3ac3
FN-9140: make Vitest timeout ownership surveys deterministic
...
Replace ambiguous setup-boundary observations with calibrated, repeatable timeout ownership evidence.
- record fixture lifecycle events in an append-only JSONL ledger with process-safe ordering
- classify four timeout-budget arms across repeated isolate-mode cells and fail closed on incomplete evidence
- expand connectionless unit coverage and document the terminal insufficient-data survey result
Files changed:
.../test-failures/postgres-ddl-admission-bound.md | 2 +
.../vitest-setup-boundary-timeout-ownership.md | 37 +++
docs/testing.md | 2 +-
scripts/__tests__/pg-setup-boundary-probe.test.mjs | 195 ++++++++----
scripts/pg-setup-boundary-probe.mjs | 341 ++++++++++++---------
5 files changed, 371 insertions(+), 206 deletions(-)
Fusion-Task-Id: FN-9140
Fusion-Task-Lineage: 9c6970b8-af80-400a-b2b2-49718d4fe87f
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-16 22:47:53 -07:00
gsxdsm
2c3a47368f
FN-9136: Characterize PostgreSQL fork database reuse
...
Characterize safe per-fork PostgreSQL database reuse while documenting why the production experiment remains reverted.
- add a bounded pool primitive with reset, verification, discard, and ownership fencing
- cover recycling, poison handling, capacity, and reclaim namespace behavior
- align PostgreSQL campaign documentation with the dead-fork leak rejection
Files changed:
.../test-failures/postgres-ddl-admission-bound.md | 4 +-
.../suite-only-flakes-observed-register.md | 4 +-
docs/testing.md | 4 +-
.../core/src/__test-utils__/pg-fork-db-pool.ts | 184 +++++++++++++++++++++
.../__tests__/pg-fork-db-pool-ownership.test.ts | 36 ++++
.../core/src/__tests__/pg-fork-db-pool.test.ts | 60 +++++++
6 files changed, 287 insertions(+), 5 deletions(-)
Fusion-Task-Id: FN-9136
Fusion-Task-Lineage: 9e14e0eb-d957-4207-977e-2d913e78750f
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-16 22:06:38 -07:00
gsxdsm
1a3e68de5d
FN-9139: add bounded PostgreSQL pre-admission measurement
...
Establish an inert PostgreSQL setup signal and repeatable evidence tooling without changing harness behavior.
- add explicit setup participation semantics and inertness coverage
- survey Vitest setup boundaries with isolated report-only fixtures
- bound interleaved campaigns by process group and campaign deadline
- reject missing backend samples and enable candidate diagnostics
- document the rejected boundary result and successor protocol
Files changed:
.../test-failures/postgres-ddl-admission-bound.md | 15 ++
docs/testing.md | 10 ++
packages/core/package.json | 2 +-
.../src/__test-utils__/pg-setup-participation.ts | 22 +++
.../src/__tests__/pg-setup-participation.test.ts | 21 +++
.../__tests__/vitest-setup-pg-inertness.test.ts | 10 ++
packages/core/vitest.pg.config.ts | 10 ++
.../__tests__/pg-preadmission-campaign.test.mjs | 63 +++++++
scripts/__tests__/pg-setup-boundary-probe.test.mjs | 92 ++++++++++
scripts/pg-preadmission-campaign.mjs | 194 +++++++++++++++++++++
scripts/pg-setup-boundary-probe.mjs | 182 +++++++++++++++++++
11 files changed, 620 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-9139
Fusion-Task-Lineage: 2cf8ccbf-37f9-4fdc-8e8f-326df823e1cd
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-16 21:09:58 -07:00
gsxdsm
8bb56a2185
FN-9134: add drift-resistant PostgreSQL DDL lane metric
...
Add a report-only acceptance metric and terminal evidence for PostgreSQL DDL structural experiments.
- require seven ordered control/candidate pairs with green Vitest summaries and zero leaked databases
- reject missing tests, failed summaries, nonzero exits, and unhandled runner errors
- document the no-improvement campaign result and retain the next candidate direction
- cover timing statistics, ordering, leak rejection, and runner-log validation
Files changed:
.../test-failures/postgres-ddl-admission-bound.md | 8 ++
.../suite-only-flakes-observed-register.md | 2 +-
docs/testing.md | 24 ++++
scripts/__tests__/pg-ddl-lane-metric.test.mjs | 62 +++++++++
scripts/pg-ddl-lane-metric.mjs | 139 +++++++++++++++++++++
5 files changed, 234 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-9134
Fusion-Task-Lineage: 3466ebf8-7125-475b-9574-6c4c92198bb3
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-16 20:17:12 -07:00