From 2c7df1bd782188ae20f0f0ac9c8a01004be3507e Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Sun, 12 Jul 2026 13:10:52 -0700 Subject: [PATCH] FN-7875: split archived pre-0.50 release notes out of root CHANGELOG.md Adds a deterministic changelog-archive split so scripts/release.mjs stops regenerating one ever-growing root CHANGELOG.md and instead keeps only current release notes at the root while durably archiving pre-0.50.0 history. - Add scripts/lib/changelog-archive.mjs with partitionVersionsByCutoff (splits a version-ordered list at the 0.50.0 cutoff, preserving order and treating non-parseable keys as archived) and archivePointerLine (renders the "older releases" pointer appended to the current changelog). - Rework scripts/release.mjs's syncRootChangelog to build CHANGELOG.md (current versions + archive pointer) and a new CHANGELOG-archive.md (versions before 0.50.0) via a shared buildRootChangelogLines/normalizeChangelogLines helper instead of one monolithic file. - Add scripts/__tests__/changelog-archive.test.mjs covering cutoff partitioning, boundary/patch handling, non-parseable keys, custom cutoffs, and the archive pointer text. - Regenerate CHANGELOG.md (now only 0.50.0+) and add CHANGELOG-archive.md containing the pre-0.50.0 history moved out of the root file. Files changed: CHANGELOG-archive.md | 10882 +++++++++++++++++++++++ CHANGELOG.md | 11717 ++----------------------- scripts/__tests__/changelog-archive.test.mjs | 58 + scripts/lib/changelog-archive.mjs | 56 + scripts/release.mjs | 49 +- 5 files changed, 11710 insertions(+), 11052 deletions(-) Fusion-Task-Id: FN-7875 Fusion-Task-Lineage: 220e6aa1-54fb-4800-a86e-6d8d21f6bf18 Co-authored-by: Fusion (runfusion.ai) --- CHANGELOG-archive.md | 10882 +++++++++++++++ CHANGELOG.md | 11703 +---------------- scripts/__tests__/changelog-archive.test.mjs | 58 + scripts/lib/changelog-archive.mjs | 56 + scripts/release.mjs | 49 +- 5 files changed, 11703 insertions(+), 11045 deletions(-) create mode 100644 CHANGELOG-archive.md create mode 100644 scripts/__tests__/changelog-archive.test.mjs create mode 100644 scripts/lib/changelog-archive.mjs diff --git a/CHANGELOG-archive.md b/CHANGELOG-archive.md new file mode 100644 index 0000000000..b79a8d2793 --- /dev/null +++ b/CHANGELOG-archive.md @@ -0,0 +1,10882 @@ +# Fusion changelog archive + +Archived release notes before 0.50.0. This file is auto-synced from each `packages/*/CHANGELOG.md` by `scripts/release.mjs` — do not edit by hand. + +## 0.49.0 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.49.0 +- @fusion/engine@0.49.0 +- @fusion/i18n@0.39.12 +- @fusion-plugin-examples/cli-printing-press@0.1.29 +- @fusion-plugin-examples/compound-engineering@0.1.12 +- @fusion-plugin-examples/dependency-graph@0.1.43 +- @fusion-plugin-examples/roadmap@0.1.31 +- @fusion-plugin-examples/cursor-runtime@0.1.31 +- @fusion-plugin-examples/droid-runtime@0.1.38 +- @fusion-plugin-examples/hermes-runtime@0.2.62 +- @fusion-plugin-examples/openclaw-runtime@0.2.62 +- @fusion-plugin-examples/paperclip-runtime@0.2.62 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.49.0 +- @fusion/dashboard@0.49.0 +- @fusion/engine@0.49.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.49.0 +- @fusion/pi-claude-cli@0.49.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.49.0 + +### @runfusion/fusion + +#### Minor Changes + +- 7772ab3: summary: Add a default-on, toggleable pre-merge Code Review step to the built-in coding workflows. + category: feature + dev: New `code-review` optional-group node (defaultOn:true, toolMode readonly, gateMode advisory, phase pre-merge) on the pre-merge success path (execute → browser-verification → code-review → review) of both the built-in coding and stepwise coding workflows. Runs for every coding task by default (seeded into enabledWorkflowSteps via resolveDefaultOnOptionalGroupIds) but is toggleable off per task; advisory so it does not change merge outcomes (operators can promote it to a blocking gate). Also fixes default-workflow task creation to seed default-on optional groups for interpreter-deferred built-ins (previously dropped). Reuses the shared prompt-gate verdict machinery (no engine verification code). The `code-review` WORKFLOW_STEP_TEMPLATE is also available in the editor palette. +- 744aa2c: summary: Verification now runs only the tests affected by a task's changed files, so merge/step checks finish in seconds. + category: feature + dev: New deriveFileScopedPnpmTestCommand maps changed test files (and co-located tests of changed source) to a per-package `pnpm --filter exec vitest run ` command; inferDefaultTestCommand uses it (overriding even an explicit testCommand) when the new project setting scopeVerificationToChangedFiles (default true) is on and git context is available, falling back to the configured command when no tests resolve. The thin merge-gate suite remains the cross-cutting safety net. +- 98a5052: summary: Record signed signal connectors in Command Center incident metrics. + category: feature + dev: Adds connector incident ingestion and /api/command-center/signals/connectors configuration status. +- e46ea00: summary: Add an engine-disconnected dashboard banner with one-click Start engine. + category: feature + dev: Adds project-scoped engine status/start API routes and dashboard-only guidance for UI-only launches. +- 9a2709d: summary: Show provider icons next to Command Center model names. + category: feature + dev: Infers provider icons from model ids for Command Center model tables and bar charts; pie charts remain text-only. +- 4cc9c2f: summary: Preview images, videos, audio, and PDFs directly in the Files modal. + category: feature + dev: Adds browser-native previews backed by workspace-safe file download URLs. +- 541f1f6: summary: Add optional workflow-step quick dropdowns to task creation surfaces. + category: feature + dev: Surfaces active workflow optional steps in QuickEntryBox and NewTaskModal create payloads. +- 79c602d: summary: Add core MCP server settings model with project/global precedence and secret references. + category: feature + dev: New @fusion/core MCP config types, validators, resolveEffectiveMcpServers, secret-resolver seam, and Claude Desktop import/export. Secret material stored only as Fusion-managed secret references. +- 6c94ee0: summary: Forward configured MCP servers to all AI lanes and add reachability validation. + category: feature + dev: Adds runtime MCP support gating, materialized MCP forwarding, and POST /api/mcp/validate. +- 429143e: summary: Add `fn mcp` CLI to manage MCP servers, import Claude Desktop config, and export Fusion MCP JSON. + category: feature + dev: New `packages/cli/src/commands/mcp.ts`; reuses @fusion/core resolveEffectiveMcpServers, validation, and import/export; sensitive fields stored as secret references via SecretsStore, never plaintext. +- 301f25d: summary: Add MCP server management UI in Settings with global/project scopes, validation, and import/export. + category: feature + dev: New SettingsModal sections global-mcp/mcp + McpServersCard; consumes @fusion/core MCP foundation and POST /api/mcp/validate; sensitive fields bind to secret references only. +- 2ce208e: summary: Automations popup is now movable and resizable like other Fusion pop-outs. + category: feature + dev: ScheduledTasksModal modal presentation now renders inside the shared FloatingWindow (windowKey "automation", persistGeometryKey "floating-window:automation"); embedded presentation unchanged. Mobile stays full-screen by CSS. +- 8131d54: summary: Automation AI steps now run with all tools by default, with a per-step tool selector and live run output. + category: feature + dev: Adds AutomationStep.allowedTools + AUTOMATION_SELECTABLE_TOOLS (core); toolsAllowlist on createFnAgent (engine); SSE GET /automations/:id/run/stream and /routines/:id/run/stream (dashboard). +- dd1b960: summary: Enabled optional workflow steps now run and show in task progress reliably. + category: feature + dev: Fixes FN-7039. `Store.optionalGroupIdSet` falls back to `builtin:coding` (matching the executor's unselected-task resolution) so a toggled built-in group id (e.g. `browser-verification`) is no longer materialized into a legacy `WS-xxx` step row the graph never matches. Create-time optional-step controls (QuickEntryBox, TaskForm) resolve `builtin:coding` when no project default workflow is set, so the toggles appear. First unit of the broader graph-native workflow-step refactor. +- 2442032: summary: Make Remote Access settings visible without enabling an experimental flag. + category: feature + dev: Graduates the Settings UI section while leaving remoteAccess provider/token gating unchanged. +- f685518: summary: Auto-discover MCP servers from Claude/Cursor/Windsurf/VS Code and opt-in to enable them in Settings. + category: feature + dev: New @fusion/core mcp-discovery source resolution + parser, @fusion/engine discoverMcpServers fs reader, GET /api/mcp/discovered route, and a discovered region in McpServersCard. Read-only/opt-in; discovered secrets become Fusion secret references, never plaintext. +- 1d860ec: summary: Adjust the global concurrency cap from the footer and dashboard; settings grouped by global vs project scope. + category: feature + dev: Added a Global Max Concurrent slider (wired to fetch/updateGlobalConcurrency) to EngineControlMenu (footer) and the dashboard CommandCenterControls Concurrency card, with debounced saves matching the existing project sliders. SchedulingSection now groups fields under labeled "Global — all projects" and "This project" subheadings with scope badges so the global cap is not mistaken for a per-project setting (clearer on mobile). + +#### Patch Changes + +- c7cbae1: summary: Keep task-detail Chat and Workflow tabs aligned on displayed model names. + category: fix + dev: Extracts dashboard effective model display resolution for shared Chat, Agent Log, and Workflow tab use. +- 50a9471: summary: Fix random fusion crashes when multiple dashboards/CLIs run on one host. + category: fix + dev: Central DB (~/.fusion/fusion-central.db) now uses journal_mode=DELETE instead of WAL. WAL coordinates concurrent processes via a memory-mapped `-shm` wal-index that SIGBUSes a reader (walIndexReadHdr / `cluster_pagein past EOF`) on macOS/APFS when another process resizes it mid-checkpoint, killing the node process with no JS stack. DELETE mode removes the `-shm` mmap surface and coordinates via POSIX locks (busy_timeout absorbs the added writer serialization). Per-project DBs (db.ts) are unchanged. See central-db.ts open() and central-db.test.ts regression. +- b293525: summary: Fix unreadable info-toast contrast and dashboard CSS token regressions. + category: fix + dev: Tokenized raw rgba/undefined CSS vars across ~15 dashboard component stylesheets, defined missing --border-strong / right-dock width tokens, enrolled the shadcn-custom light theme in the dark-text toast correction (WCAG AA). Also repairs ~19 stale dashboard tests that trailed intentional product changes (workflowColumns graduation, onboarding flow, theme relabels, header divider removal). +- c20c4b7: summary: Fix global settings (including the global concurrency cap) intermittently resetting to defaults. + category: fix + dev: Several production call sites built `new CentralCore(store.getFusionDir())`, pointing the central/global DB at the project's `.fusion/` instead of `~/.fusion/` and spawning stray per-project central DBs seeded with default global settings that shadowed real global state. Added `TaskStore.getGlobalSettingsDir()`, routed the secrets store plus the secrets/proxy/node/secrets-sync/settings-sync dashboard routes through it, and added a `resolveGlobalDir()` guard that throws on a project-local `.fusion/` dir (parent is a git repo) so the regression can't silently recur. Existing stray DBs were operator-quarantined. +- d08e8db: summary: Restore dashboard Settings helper copy and TaskChat tool-call labels. + category: fix + dev: Repairs changed-only dashboard assertions for navigation, pause routes, TaskChat, and theme selector parity. +- 6df4043: summary: Preserve the selected workflow when Missions creates tasks. + category: fix + dev: Missions now shares the header workflow selector with Planning and passes workflowId through mission triage APIs. +- f5e1b96: summary: Add a Worktrees setting for copying repository files into new task worktrees. + category: feature + dev: Adds project setting `worktreeCopyFiles`; release with the standard changeset workflow, not manual versioning. +- 0744ab3: summary: Restore animated loading spinners across the Fusion dashboard. + category: fix + dev: Dashboard spinner utilities now use a collision-proof keyframe and tests guard component CSS chunks. +- 9fabc9d: summary: Ignore hidden dot paths in overlap scheduling by default with a Settings toggle. + category: fix + dev: Adds project setting `ignoreHiddenOverlapPaths` and keeps `overlapIgnorePaths` as an additional explicit filter. +- 0049fb9: summary: Make browser and Android Back close dashboard task detail before leaving the current view. + category: fix + dev: Updates dashboard task-detail history entries for full-panel and modal detail flows. +- 4880a0f: summary: Fix Command Center token usage updating live without manual refresh. + category: fix + dev: Analytics polling now revalidates in the background when prior data exists so token cards, charts, and model rows stay mounted during live refresh. +- 419d58f: summary: Prevent Planning Mode summary buttons from overlapping on tablet screens. + category: fix + dev: Adds a tablet responsive CSS contract for Planning Mode summary action wrapping. +- a0954c7: summary: Make Plan Mission with AI desktop modal movable and recover cleanly from stream failures. + category: fix + dev: Dashboard mission interview now uses floating desktop geometry and normalizes terminal SSE errors into one retry state. +- 575e211: summary: Prevent Planning Mode from crashing on malformed AI summary arrays. + category: fix + dev: Normalizes planning summaries, question options, subtasks, and dependency arrays at UI/API boundaries. +- f1b3bd8: summary: Allow Planning Mode generations to continue while meaningful AI output is progressing. + category: fix + dev: Replaces the fixed Planning Mode generation cap with inactivity and repeated-output detection. +- 7e7b0c6: summary: Recover mission AI planning from transient stream interruptions. + category: fix + dev: MissionInterviewModal refetches active session state before showing permanent stream errors. +- 0c53f46: summary: Stop showing branch reattachment warnings in Task Detail. + category: fix + dev: Removes stale TaskDetailModal rebind-banner CSS/mocks and covers missing-branch workspace shapes. +- d984fce: summary: Fix discarding mission interview drafts from the Missions view. + category: fix + dev: Preserves project and owning-tab scope for mission interview draft discard requests. +- ef6e459: summary: Fix excessive spacing in the embedded Automations pane. + category: fix + dev: Top-pack embedded Automations grid rows and add regression coverage for the list/detail layout. +- 2d2dd50: summary: Fix mobile Missions back navigation from mission detail tabs. + category: fix + dev: Tracks mission detail visibility for mobile history entries instead of selected mission IDs. +- 3513d5f: summary: Keep New Task mobile dialog controls tappable while the keyboard is open. + category: fix + dev: Restores hit testing for the NewTaskModal sheet and bounds mobile picker dropdowns. +- 4dab2b6: summary: Exclude engine-down time from task duration badge and stats. + category: fix + dev: Adds engineLastActiveAt heartbeat and startup reconcile-engine-downtime-active-timing recovery. +- 977000c: summary: Restore horizontal scrolling for mobile task detail tabs. + category: fix + dev: Keeps the task-detail tab strip scrollable across Board modal and List embedded surfaces. +- 3f66e55: summary: Fix workflow editor so the Browser Verification block shows connected edges. + category: fix + dev: optional-group/foreach/loop container nodes now render connectable handles without adjacent layer overlap in WorkflowNodeEditor. +- f5b588c: summary: Retry transient ntfy publish failures so one-shot task notifications are less likely to be lost. + category: fix + dev: Adds bounded ntfy fetch retries for network, timeout, 5xx, and 429 failures with a per-attempt timeout. +- 45727f1: summary: Command Center date-range presets now correctly filter charts. + category: fix + dev: Honors open-ended Command Center analytics bounds and serializes All time explicitly. +- 775a1f8: summary: Make the AI session needs-input banner compact and hide it on Missions or Planning. + category: fix + dev: Shrinks SessionNotificationBanner CSS and tests the DashboardBanners visibility guard. +- ea3cfee: summary: Prevent long Skills list rows from overflowing the left pane. + category: fix + dev: Constrains SkillsView discovered-skill name, path, and source rows with ellipsis truncation. +- 0ae4499: summary: Open dependency Graph tasks in the shared movable task pop-out. + category: fix + dev: Routes graph plugin task-open callbacks through MainContent popOutTaskDetail while preserving non-graph plugin modal behavior. +- f3f20ac: summary: Preview image, video, audio, and PDF files natively in the right-dock Files viewer. + category: fix + dev: Reuses the shared file-preview classification and download route in DockFilesView. +- 6415eed: summary: Match the optional steps dropdown trigger to shared task creation buttons. + category: fix + dev: Reuses the dashboard `.btn .btn-sm` trigger styling for WorkflowOptionalStepsDropdown. +- b6b5583: summary: Workflow and automation steps now use the configured project Execution model instead of the default. + category: fix + dev: Workflow/AI-prompt step model resolution now consults the execution lane (resolveExecutorSessionModel / resolveExecutionSettingsModel) instead of resolveProjectDefaultModel, fixing executeWorkflowStep (executor.ts), cron-runner.ts, and dashboard routes.ts. FN-7039. +- 2c46cdc: summary: Fix task Workflow tab showing "Step definition not found." for Code Review and other optional steps. + category: fix + dev: WorkflowResultsTab configuredSteps now shows the not-found message only when a step id is absent from the step lookup, not when a found optional-group step has an empty description. +- ea5e12e: summary: Quick task input no longer refocuses itself after you add a task. + category: fix + dev: Removed QuickEntryBox post-submit focus restoration (FNXC:QuickEntryFocus); supersedes FN-6217/FN-6219. +- 07209a4: summary: Capitalize the built-in Code Review step name consistently. + category: fix + dev: Updates the compound-engineering built-in workflow node display name and regression coverage. +- da69e03: summary: Remove the quick-entry keyboard hint from the task creation surface. + category: internal + dev: Removes the retired quickEntryHint locale key and QuickEntryBox hint shell/CSS. +- 93da87d: summary: Restore mobile swipe scrolling when touching task-detail tab buttons. + category: fix + dev: Adds detail-tab touch-action pan-x coverage to override the global mobile pan-y lock. +- c0d5353: summary: Restore horizontal swiping on Agent Detail tabs on mobile touch devices. + category: fix + dev: Adds `.agent-detail-tab` touch-action pan-x coverage because the global mobile pan-y lock is non-inherited. +- 59fc94b: summary: Fix slash/namespaced skill commands not loading in chat and agent sessions. + category: fix + dev: skill-resolver requested-name matching now reduces a/b, a/b/SKILL.md, and source::a/b forms to the bare token like the dashboard bareSkillName, scoped to requested-name matching (allow/exclude path matching unchanged). +- afa33b7: summary: Fix task-detail Workflow tabs so inherited workflow graphs and step details populate. + category: fix + dev: Resets stale task workflow selection/results on task switches and aliases optional step template IDs. +- d03d6c2: summary: Keep Graph tasks visible when cached workflow assignments reference deleted workflows. + category: fix + dev: Treat stale Graph `taskWorkflowIds` entries as default-workflow assignments during workflow filtering. +- 42f46a1: summary: Fix npm install failure caused by bundled plugins referencing private @fusion packages. + category: fix + dev: Sanitizes copied plugin and vendored extension manifests in tsup.config.ts before publishing. +- 7a3a9a9: summary: Rename the Remote Access settings section (drops the stale "& Node Sync" suffix). + category: fix + dev: The standalone Node Sync settings section is unchanged. +- e48c75c: summary: Mobile: hide the executor footer and remove the empty gap above the keyboard while typing. + category: fix + dev: computeMobileBarKeyboardFlags no longer iOS-gates footerHidden, so Android keyboard-open now hides ExecutorStatusBar and drops the reserved footer+nav padding-bottom (composer sits flush above the keyboard). footerKeyboardOpen stays iOS-only. Supersedes FN-5707's Android gate. +- c202053: summary: Fix Planning Mode not scrolling on mobile so action buttons stay reachable. + category: fix + dev: The global mobile `.modal-lg`/`.modal:not(.confirm-dialog)` 100dvh rule was matching the embedded Planning shell (`.planning-modal--embedded`) and stretching it past its bounded `.planning-view` pane, clipping the footer under `overflow:hidden`. Mobile rule now qualifies as `.planning-view.open .planning-modal--embedded` (specificity 0,3,0) and re-pins `max-height:100%` so the inner flex scroll chain works. +- efa5d9b: summary: Verification (merge/step gate) timeout now scales with command scope instead of a flat 10 minutes. + category: fix + dev: verification-utils runVerificationCommand derives its default from the command — package-scoped (pnpm --filter/-F) gets 300s, workspace-scoped gets 900s — matching fn_run_verification (DEFAULT_TIMEOUT_PACKAGE_SEC/WORKSPACE_SEC). Project verificationCommandTimeoutMs still overrides; the 1800s hard cap still applies. Fixes workspace-scoped suites being killed as a 10-min infra timeout during merge/step verification. +- 7cd660f: summary: Fix stale overlap-blocker repair edge cases and dashboard display synchronization. + category: fix + dev: Adds effective write-scope repair handling for scheduler/file-scope lease consistency. +- 9a2e8a7: summary: Post-merge workflow steps now run once via the workflow graph instead of the merger. + category: internal + dev: Flips `experimentalFeatures.graphNativePostMerge` DEFAULT-ON so the graph is the sole post-merge owner; the legacy merger post-merge path (`runPostMergeWorkflowSteps`/`hasEnabledPostMergeWorkflowSteps`) is inert under the flag (kept until U7c). DB migration 130 rewrites legacy compiled `workflow_steps` enable ids (templateId ∈ built-in optional-group ids: browser-verification, code-review) to the graph node ids in tasks' `enabledWorkflowSteps` (idempotent, de-duped). `workflow_steps` table is retained. +- 347842f: summary: Retire the legacy workflow-steps store; workflow steps now run entirely graph-native. + category: internal + dev: U7c removes the last readers/writers of the legacy `workflow_steps` table and drops it via migration 131 (SCHEMA_VERSION 130→131, idempotent DROP). Removed: store CRUD (`create`/`update`/`delete`/`getWorkflowStep`), the workflow-compilation materializer (`materializeWorkflowSteps`), `migrateLegacyWorkflowSteps` + its `POST /api/workflows/migrate-legacy-steps` route and the editor's on-open migration notice, and the merger legacy post-merge execution path (worktree + prompt/script step run). Pre/post-merge steps record into `task.workflowStepResults`; `selectTaskWorkflow` now seeds `enabledWorkflowSteps` with default-on optional-group node ids only (the graph runs the workflow IR directly). `listWorkflowSteps()` returns only the in-memory plugin palette. Executor revive sources gate-ness from the recorded result status, not the table. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [c7cbae1] +- Updated dependencies [50a9471] +- Updated dependencies [7772ab3] +- Updated dependencies [744aa2c] +- Updated dependencies [b293525] +- Updated dependencies [c20c4b7] +- Updated dependencies [98a5052] +- Updated dependencies [e46ea00] +- Updated dependencies [d08e8db] +- Updated dependencies [6df4043] +- Updated dependencies [f5e1b96] +- Updated dependencies [0744ab3] +- Updated dependencies [9fabc9d] +- Updated dependencies [0049fb9] +- Updated dependencies [9a2709d] +- Updated dependencies [4880a0f] +- Updated dependencies [4cc9c2f] +- Updated dependencies [419d58f] +- Updated dependencies [a0954c7] +- Updated dependencies [575e211] +- Updated dependencies [f1b3bd8] +- Updated dependencies [7e7b0c6] +- Updated dependencies [0c53f46] +- Updated dependencies [d984fce] +- Updated dependencies [ef6e459] +- Updated dependencies [2d2dd50] +- Updated dependencies [3513d5f] +- Updated dependencies [4dab2b6] +- Updated dependencies [977000c] +- Updated dependencies [3f66e55] +- Updated dependencies [541f1f6] +- Updated dependencies [f5b588c] +- Updated dependencies [45727f1] +- Updated dependencies [775a1f8] +- Updated dependencies [79c602d] +- Updated dependencies [6c94ee0] +- Updated dependencies [429143e] +- Updated dependencies [301f25d] +- Updated dependencies [ea3cfee] +- Updated dependencies [0ae4499] +- Updated dependencies [f3f20ac] +- Updated dependencies [6415eed] +- Updated dependencies [2ce208e] +- Updated dependencies [8131d54] +- Updated dependencies [b6b5583] +- Updated dependencies [dd1b960] +- Updated dependencies [2c46cdc] +- Updated dependencies [ea5e12e] +- Updated dependencies [07209a4] +- Updated dependencies [da69e03] +- Updated dependencies [93da87d] +- Updated dependencies [c0d5353] +- Updated dependencies [59fc94b] +- Updated dependencies [afa33b7] +- Updated dependencies [d03d6c2] +- Updated dependencies [42f46a1] +- Updated dependencies [2442032] +- Updated dependencies [7a3a9a9] +- Updated dependencies [f685518] +- Updated dependencies [1d860ec] +- Updated dependencies [e48c75c] +- Updated dependencies [c202053] +- Updated dependencies [efa5d9b] +- Updated dependencies [7cd660f] +- Updated dependencies [9a2e8a7] +- Updated dependencies [347842f] + - @runfusion/fusion@0.49.0 + +## 0.48.0 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.48.0 +- @fusion/engine@0.48.0 +- @fusion/i18n@0.39.11 +- @fusion-plugin-examples/cli-printing-press@0.1.28 +- @fusion-plugin-examples/compound-engineering@0.1.11 +- @fusion-plugin-examples/dependency-graph@0.1.42 +- @fusion-plugin-examples/roadmap@0.1.30 +- @fusion-plugin-examples/cursor-runtime@0.1.30 +- @fusion-plugin-examples/droid-runtime@0.1.37 +- @fusion-plugin-examples/hermes-runtime@0.2.61 +- @fusion-plugin-examples/openclaw-runtime@0.2.61 +- @fusion-plugin-examples/paperclip-runtime@0.2.61 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.48.0 +- @fusion/dashboard@0.48.0 +- @fusion/engine@0.48.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.48.0 +- @fusion/pi-claude-cli@0.48.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.48.0 + +### @runfusion/fusion + +#### Minor Changes + +- d7f3c70: summary: Add a workflow dropdown to filter tasks in the dependency Graph view. + category: feature + dev: Scopes plugin-hosted graph tasks through the dashboard workflow assignment payload. + +#### Patch Changes + +- a20235b: summary: Fix release pipeline so binaries and desktop installers publish again. + category: fix + dev: github-release job sparse-checks-out CHANGELOG.md (was missing a checkout, so the release-notes step threw ENOENT and published 0 assets on v0.47.0); desktop esbuild build externalizes @fusion/engine so it no longer tries to bundle node-pty's native .node binaries. +- 214a60c: summary: Let quick-entry text use the full entry box width instead of wrapping early. + category: fix + dev: Adds a QuickEntryBox-specific textarea padding override and CSS cascade regression coverage. +- 5a192ec: summary: Add a New Task dialog picker that seeds prompts from current-remote GitHub issues and PRs. + category: feature + dev: Reuses existing GitHub remote, issue, and pull list endpoints; PR prompts direct agents to address review comments. +- a554ceb: summary: Match Quick Chat and Terminal typography in the dashboard footer. + category: fix + dev: Footer launcher CSS now shares inherited font and color contracts between Quick Chat and Terminal. +- d359306: summary: Prevent Create PR metadata generation from hanging and provide editable fallback content. + category: fix + dev: Bounds PR metadata generation and validates non-empty PR bodies before GitHub PR creation. +- 29530b5: summary: Widen tablet Chat View agent response bubbles for easier reading. + category: fix + dev: Uses ChatView container queries to target assistant, streaming, and failure bubbles without widening user or Quick Chat bubbles. +- eb3833a: summary: Retire dual-observe as a workflow-authoritative cutover prerequisite. + category: fix + dev: Cutover readiness now uses the authoritative flag plus clean populated parity summaries; stale dual-observe settings remain inert. +- 3ae053e: summary: Keep Planning Mode malformed AI responses retryable instead of stranding sessions. + category: fix + dev: Hardens planning JSON candidate selection and persists bounded parse failures as retryable AI-session errors. +- f918896: summary: Keep Git Manager tabs reachable in mobile and docked layouts. + category: fix + dev: Makes the shared Git Manager tablist a non-wrapping horizontal touch scroller in mobile and embedded narrow containers. +- bd5a779: summary: Remove helper guidance above the task chat composer. + category: fix + dev: Task chat placeholders now carry active/idle/done composer guidance without an extra status shell. +- 7a00811: summary: Open Mission Manager mission-delete confirmations in the standard modal dialog. + category: fix + dev: Routes mission list and detail delete affordances through ConfirmDialogProvider with regression coverage. +- e473ba6: summary: Make the task Changes tab inline diff panel wider on narrow screens. + category: fix + dev: Reclaims task-detail body padding for compact inline diff lists with mobile CSS contract coverage. +- e702185: summary: Equalize mobile bottom navigation side spacing. + category: fix + dev: Adds tokenized MobileNavBar horizontal padding while preserving ICB and safe-area behavior. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [a20235b] +- Updated dependencies [d7f3c70] +- Updated dependencies [214a60c] +- Updated dependencies [5a192ec] +- Updated dependencies [a554ceb] +- Updated dependencies [d359306] +- Updated dependencies [29530b5] +- Updated dependencies [eb3833a] +- Updated dependencies [3ae053e] +- Updated dependencies [f918896] +- Updated dependencies [bd5a779] +- Updated dependencies [7a00811] +- Updated dependencies [e473ba6] +- Updated dependencies [e702185] + - @runfusion/fusion@0.48.0 + +## 0.47.0 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.47.0 +- @fusion/engine@0.47.0 +- @fusion/i18n@0.39.10 +- @fusion-plugin-examples/cli-printing-press@0.1.27 +- @fusion-plugin-examples/compound-engineering@0.1.10 +- @fusion-plugin-examples/dependency-graph@0.1.41 +- @fusion-plugin-examples/roadmap@0.1.29 +- @fusion-plugin-examples/cursor-runtime@0.1.29 +- @fusion-plugin-examples/droid-runtime@0.1.36 +- @fusion-plugin-examples/hermes-runtime@0.2.60 +- @fusion-plugin-examples/openclaw-runtime@0.2.60 +- @fusion-plugin-examples/paperclip-runtime@0.2.60 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.47.0 +- @fusion/dashboard@0.47.0 +- @fusion/engine@0.47.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.47.0 +- @fusion/pi-claude-cli@0.47.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.47.0 + +### @runfusion/fusion + +#### Minor Changes + +- a6252e5: Merger unification (master-plan U0): `runAiMerge` (the FN-5633 clean-room AI merge path) is now the **sole** merge path. The engine dispatch, the `fn task merge` CLI command, and the UI-only (`--no-engine`) dashboard merge all route through `runAiMerge`; the legacy `aiMergeTask` pipeline is soft-deprecated (body retained, `@deprecated`). The `merger.mode` setting is now **inert and deprecated** — the type and field are retained as published surface, but the `"deterministic"` value no longer selects a different pipeline; observing it logs a one-time deprecation warning and proceeds via the unified AI merge path. A new shared `assertNotWorkspaceTaskMerge` guard rejects workspace-mode tasks (populated `workspaceWorktrees`) at every merge entry point with a clear error until per-repo merge support (master-plan U6) lands. +- e5382f0: **Breaking:** the `WorkflowOptionalStep` type, previously exported from `@runfusion/fusion`, is removed — any consumer importing it must migrate to `optional-group` nodes / `ResolvedWorkflowOptionalStep`. + + Retire the legacy optional-step DECLARATION model now that optional steps are graph-native `optional-group` nodes. Remove the `WorkflowOptionalStep` type and the `WorkflowIrV2.optionalSteps` IR field, drop the workflow node editor's optional-step declaration authoring panel (sidebar section, mobile tab, and collapse state), and stop threading an `optionalSteps` array through `flowToIr`/`serializeGraph`. A legacy persisted `optionalSteps` key on an old v2 workflow row is now tolerated (ignored, not validated) at parse so old rows still load as v2, and the rollback-downgrade heuristic still treats such a row as v2. The per-task optional-step toggle surfaces are unchanged — they continue to list and toggle optional steps sourced from `optional-group` nodes via `resolveWorkflowOptionalSteps` (`ResolvedWorkflowOptionalStep`). + +- e17e9bc: Add `X-Session-Id` and `X-Session-Affinity` request headers to all LLM chat completion requests. These let LLM gateways sticky-route consecutive requests from the same conversation to the same backend, and let observability tools (Langfuse, Arize, etc.) group the otherwise-stateless API calls of a session into a single multi-turn trace. Both headers carry the same stable identifier — the task id when available (stable across pause/resume), otherwise the pi session id. (#1675) +- 2019e5a: summary: Structured changeset format with AI-distilled release notes for cleaner, user-facing changelogs. + category: feature + dev: Changeset bodies now use labeled fields (summary, category, dev). A linter enforces the format in the PR gate. Release notes are distilled into grouped, end-user-facing sections. See .changeset/README.md for the format guide. +- 9c6b4dd: Workflow editor: add a Help section to the node detail pane. Every node now documents what it does, how to configure it, and its inputs/outputs/edges — including the engine-managed merge-lifecycle nodes (auto-merge gate, branch-group member integration, branch-group promotion, PR and recovery nodes), which are surfaced read-only with an "Engine-managed" badge. +- 0c031b8: Workflow editor: optional steps are now graph-native. A new `optional-group` container node (foreach/loop-style) holds a subgraph the executor runs once when the group is enabled for a task (per-task `enabledWorkflowSteps` + workflow `defaultOn`) and bypasses when disabled. All seven built-in add-ons (documentation-review, qa-check, security-audit, performance-review, accessibility-check, browser-verification, frontend-ux-design) are insertable from the node-editor palette as a node or wrapped in an optional-group. The built-in coding and stepwise-coding workflows now express `browser-verification` as an optional-group. Optional-group enable resolution correctly handles id collisions with add-on template ids, so a group's enable state is not silently bypassed during task creation/update. (The legacy declaration-based optional-steps model is retired in a sibling changeset; only the `workflow-step` seam infrastructure removal remains a follow-up.) +- 023e4b0: Workspace tasks no longer render blank in the dashboard. Task cards and the task + detail view now surface a workspace task's acquired per-sub-repo worktrees as a + read-only "N repos acquired" placeholder and flat repo → worktree/branch list, + instead of an empty branch area (no `task.worktree`/`task.branch`). +- 8f4098e: Add workspace mode: open a folder of git repositories as a single Fusion + project. The agent acquires per-repo worktrees on demand via + `fn_acquire_repo_worktree` as it discovers it needs to work in each sub-repo. +- 12d33c5: Workspace mode (Phase A / U2): harden per-repo worktree acquisition. Each sub-repo worktree now gets the task identity guard installed (single-repo parity), a per-repo base commit SHA captured local-first against that sub-repo's resolved integration branch (shared `integrationBranch` override stripped so each repo falls through to its own `origin/HEAD`), and same-sub-repo acquisition exclusivity registered in the path-keyed active-session registry. Re-acquiring an already-acquired `(taskId, repo)` is idempotent, and acquisition failures surface an error plus an audit event instead of silently stalling. +- 64e87f9: Workspace mode (Phase C U3): serialize concurrent same-sub-repo lands with a per-repo file-scope lease. When two workspace tasks try to land onto the SAME sub-repo's local integration ref at the same time, the merge phase now registers the sub-repo's absolute path in the path-keyed active-session registry under a distinct `workspace-repo-land` kind before each land and releases it in a `finally` (on land success or failure — no stuck lock). A second task contending for the same sub-repo fast-fails with a retryable `WorkspaceRepoLandBusyError`, which the existing partial-land auto-retry-then-park dispatch handles (consume a `mergeRetry`, re-enqueue with backoff, then operator-park). Disjoint sub-repos lease different paths and never serialize against each other. The lease prevents clean-room ai-merge worktree collisions; ref correctness is already guaranteed by `advanceIntegrationBranchRef`'s CAS (concurrent-advance → rebuild). +- 09bd01b: Workspace mode Phase A (U1): executor session scoping. In workspace mode the executor now skips the root worktree acquisition and every rootDir git preflight (base-commit capture, contamination, worktree-liveness), runs the agent session rooted at the browse-only workspace root, and tracks acquired sub-repo worktrees as a per-task set. Single-repo tasks are unchanged (one-element set, byte-for-byte preflight parity). +- fc9423e: Workspace mode (Phase B, U1): per-repo post-session change capture, contamination detection, and worktree-invariant verification. In workspace mode the executor now loops `task.workspaceWorktrees`, reusing `captureModifiedFiles` per sub-repo (diffing each against its own `baseCommitSha`, with a merge-base fallback when undefined) to aggregate repo-prefixed `task.modifiedFiles` and surface per-repo contamination, and un-stubs `verifyWorktreeInvariants` to assert each acquired worktree's git toplevel and `fusion/` branch. Single-repo behavior is unchanged. +- 81edbee: Workspace mode (Phase B, U2): per-repo review at both review entry points plus per-repo `fn_task_done` completion + scope-leak verification. In workspace mode both review call sites (the in-session `fn_review_step` tool and the step-inversion review seam) now loop the single-cwd `reviewStep` once per acquired sub-repo (cwd = each repo's worktree) and aggregate the repo-tagged verdicts as a conjunction — the task is reviewed only when every sub-repo approves, and the first failing sub-repo's verdict (with repo-tagged findings) drives the existing verdict→edge mapping. `fn_task_done` now verifies worktree invariants per acquired repo and iterates the scope-leak guard per sub-repo (cwd = repo worktree, repo `baseCommitSha`), blocking completion on any sub-repo carrying off-scope changes and naming the repo. Adds a minimal shared repo-prefix-derivation helper (`workspace-paths.ts`). Single-repo behavior is unchanged. + + Phase-B hardening: the per-repo scope-leak guard now fails CLOSED — a thrown capture/diff error in any sub-repo refuses `fn_task_done` (naming the repo) instead of failing open, and a scoped task that acquired zero sub-repo worktrees is blocked rather than silently passing. A legitimate per-repo `.changeset/` file is no longer falsely flagged off-scope (the always-allowed carve-out now runs against the repo-local path). Per-repo review stops at the first non-APPROVE sub-repo so a later repo's reviewer error can't mask an already-determined REVISE/RETHINK. Per-repo capture failures are isolated (one repo's error no longer drops the whole modified-files write), and the reported offending/failing repo is now deterministic (sorted repo iteration). Single-repo behavior remains unchanged. + +- 744ed09: Workspace mode Phase C (U1): per-repo merge loop. Extract `landOneRepo` from the + `runAiMerge` clean-room land closure (single-repo behavior unchanged) and add + `landWorkspaceTask`, which lands each acquired sub-repo's `fusion/` branch onto + that repo's OWN local integration ref (re-resolved per repo with overrides stripped), + land-as-you-go with no remote push. The engine merge dispatch and the user-facing + CLI/dashboard merge doors now route workspace tasks through this loop instead of + throwing; `store.mergeTask`, `aiMergeTask`, and the `runAiMerge` chokepoint keep + throwing `WorkspaceTaskMergeError` as defense-in-depth. +- 7544346: Workspace mode Phase C (U2): per-repo landed predicate, finalize-once, and idempotent + auto-retry-then-park. `landWorkspaceTask` now records each sub-repo's `landedSha` after + its branch advances that repo's local integration ref, and on a re-run SKIPS any repo + whose recorded `landedSha` is an ancestor of (or equals) its current integration tip — so + an interrupted multi-repo land retries only the un-landed repos and never re-advances an + already-landed ref. When every acquired repo's landed predicate holds, the task moves to + `done` EXACTLY ONCE via the task-global finalize path with an aggregate `mergeDetails` + (representative `commitSha` + a `workspaceLandedShas` map). A partial land (some repos + unlanded) does not move the task done; the engine merge dispatch surfaces it as a + retryable failure that consumes a `mergeRetry` and auto-retries the merge (skipping landed + repos) up to the configured max, then operator-parks the task as failed. +- 7cd204e: Workspace mode Phase D (U1): workspace-aware self-healing. The existing merging-status reconcilers no longer mis-finalize a partial-landed workspace task (recoverInterruptedMergingTasks now clears the transient `merging` status and re-enqueues the idempotent per-repo land instead of running the single-commit finalize over the non-git workspace root), and recoverMergeableReviewTasks now admits workspace tasks (task.worktree is null). Adds three reconcilers: partial-land recovery (re-enqueue via enqueueMerge, FORK-A unrecoverable → park failed; guarded by autoMerge:false + user-pause + workspace-aware liveness), phantom `workspace-repo-land` lease reclaim (new `entriesByKind` registry seam), and per-repo worktree cleanup from stored paths (no temp walk). New run-audit events: `task:reconcile-workspace-partial-land`(`-no-action`), `task:reclaim-phantom-workspace-land-lease`, `task:reconcile-orphaned-workspace-worktree`. + + Phase D P1 TOCTOU fix (merge-queue dispatch blind spot): the workspace partial-land and phantom-land-lease reconcilers now consult a new `ProjectEngine.isMergePending(taskId)` seam (true if the task is in the engine's in-memory `mergeQueue` or `mergeActive`). This closes the dequeue→rawMerge window where a workspace task is being merged but no other liveness signal fires yet (the id is shifted out of `mergeQueue` while `activeMergeTaskId` / `merging` status / the `workspace-repo-land` lease are not yet set inside `landWorkspaceTask`). The partial-land reconciler skips a merge-pending candidate (emitting `task:reconcile-workspace-partial-land-no-action` with reason `merge-pending`) instead of launching a second concurrent `landWorkspaceTask` (double-squash risk, since a same-task land lease is not contention), and lease reclaim leaves a merge-pending owner's not-yet-registered lease alone. Wired via `InProcessRuntime.setMergePendingProvider`; undefined (unwired) is treated as not-pending so existing guards still apply. + + Phase D review hardening: every single-commit-finalize self-healing site is now workspace-gated so a partial-landed workspace task can never be marked fully merged on one repo's commit — `recoverStuckMergeDeadlocks` (the twin of recoverInterruptedMergingTasks), `recoverOrphanOnlyScopeViolations`, `recoverAlreadyMergedReviewTasks`, `recoverBranchMisboundInReviewTasks`, and `recoverDoneTaskMergeMetadata` all skip workspace tasks and defer recovery to the workspace partial-land reconciler. The partial-land reconciler now bounds its `enqueueMerge` re-enqueue (parks `failed` after repeated queue rejections instead of looping forever) and treats a branch-gone-and-not-landed sub-repo as unrecoverable even when a stale unreachable `landedSha` is present. Phantom land-lease reclaim now only reclaims a demonstrably TERMINAL owner (never an `in-progress` executing task that registered its lease early). Orphan per-repo worktree removal failures are now engine-logged and retry-bounded. The canonical `isRepoLanded` predicate moved to a new dependency-free `workspace-land-predicate` module, dissolving the self-healing ↔ merger-ai import cycle (public export preserved). + +#### Patch Changes + +- 038ac30: Saved agent tool-output details now default off to reduce persisted log payloads, while timeline rows remain logged and detailed tool arguments/results stay available via the global `persistAgentToolOutput: true` opt-in. +- 627bdcf: Harden the workspace per-repo land loop against partial-failure races. A lost `landedSha` DB write after a sub-repo's integration ref already advanced no longer silently continues — it escalates to a retryable partial-land error, and the landed predicate now recognizes an already-landed repo via its `Fusion-Task-Id` trailer on retry, so a re-run never produces a second squash commit. The land lease is now taskId-aware across registry kinds: a merging task can no longer clobber an executing task's acquire lease on a shared sub-repo (any foreign-task holder is treated as contention), and the active-session registry rejects foreign-task overwrites instead of silently clobbering. The transient `merging` status is always reset before any throw escapes the land loop (no stuck-`merging` leak), and finalize re-reads the latest task and no longer swallows the merge-details persist failure (no finalizing on a stale row). + + Harden the workspace merge dispatch and user-facing merge doors. The partial-land retry catch now fails closed when the task row can't be read (DB outage no longer triggers an indefinite retry storm). The merge-confirmed reachability fast-path skips workspace tasks (whose recorded commitSha lives in a sub-repo, not the workspace root) so a fully-landed workspace task is no longer demoted/parked. The dashboard and CLI merge doors now report `merged: true` (and `mergeConfirmed`/`commitSha`) when a workspace fully lands, mirroring the engine result. Transient sub-repo land-lease contention (`WorkspaceRepoLandBusyError`) is re-enqueued with capped backoff on a separate bounded counter instead of burning the merge-retry quota, so pure contention can't park a never-failed task. Retry backoff is capped at 60s. + +- 3a71237: Address Phase C workspace merge-loop review feedback. A sub-repo recognized as already-landed via the `Fusion-Task-Id` trailer fallback (when its `landedSha` persist was lost) now resolves and re-records a concrete `landedSha`, so finalize no longer drops it and mis-reports a fully-landed workspace task as a no-op (`mergeConfirmed:false`). A manual merge that hits sub-repo land-lease contention now surfaces the busy error to the user without consuming the persisted `mergeRetries` quota (matching the auto path's separate busy counter). The partial-land retry persists the incremented retry count before arming the backoff timer — a failed write now fails closed instead of looping without consuming budget — and clears the stale busy-contention counter when a real partial land supersedes transient busy failures. The CLI and dashboard merge doors use the shared `isWorkspaceTask` predicate instead of re-inlining the workspace check, and integration-branch shell interpolation in base-commit capture uses POSIX single-quote escaping. +- e9a6955: Fix narrow right-sidebar Dev Server preview overlap by replacing the inline preview with an accessible modal launcher when the dock is very narrow, while keeping inline preview for full-page, mobile viewport, and expanded pop-out hosts. +- 7b60539: Fix ntfy test notifications to honor unsaved Settings form config so users can enable ntfy, enter a valid topic/server/token, and send a test notification before saving. +- cf2f3ba: Close task detail dialogs and embedded task-detail hosts immediately after delete confirmations complete, while delete requests continue reporting success or error toasts asynchronously. +- b9821ee: Stack task-detail Chat agent headers above output blocks in the List View split-pane detail pane while preserving full-width desktop chat layout. +- f062819: Fix multiworkspace tasks failing to complete. `task.workspaceWorktrees` is now durably persisted (it previously had no SQLite column, so `fn_acquire_repo_worktree`'s write was dropped on every persist and `fn_task_done` always reported "acquired no sub-repo worktrees"). Concurrent workspace tasks no longer collide on the shared browse-root active-session path — each task gets a task-scoped session key, so a second workspace task no longer fails with "active-session path … is held by …". + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [038ac30] +- Updated dependencies [627bdcf] +- Updated dependencies [3a71237] +- Updated dependencies [e9a6955] +- Updated dependencies [7b60539] +- Updated dependencies [cf2f3ba] +- Updated dependencies [b9821ee] +- Updated dependencies [a6252e5] +- Updated dependencies [f062819] +- Updated dependencies [e5382f0] +- Updated dependencies [e17e9bc] +- Updated dependencies [2019e5a] +- Updated dependencies [9c6b4dd] +- Updated dependencies [0c031b8] +- Updated dependencies [023e4b0] +- Updated dependencies [8f4098e] +- Updated dependencies [12d33c5] +- Updated dependencies [64e87f9] +- Updated dependencies [09bd01b] +- Updated dependencies [fc9423e] +- Updated dependencies [81edbee] +- Updated dependencies [744ed09] +- Updated dependencies [7544346] +- Updated dependencies [7cd204e] + - @runfusion/fusion@0.47.0 + +## 0.46.0 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.46.0 +- @fusion/engine@0.46.0 +- @fusion/i18n@0.39.9 +- @fusion-plugin-examples/cli-printing-press@0.1.26 +- @fusion-plugin-examples/compound-engineering@0.1.9 +- @fusion-plugin-examples/dependency-graph@0.1.40 +- @fusion-plugin-examples/roadmap@0.1.28 +- @fusion-plugin-examples/cursor-runtime@0.1.28 +- @fusion-plugin-examples/droid-runtime@0.1.35 +- @fusion-plugin-examples/hermes-runtime@0.2.59 +- @fusion-plugin-examples/openclaw-runtime@0.2.59 +- @fusion-plugin-examples/paperclip-runtime@0.2.59 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.46.0 +- @fusion/dashboard@0.46.0 +- @fusion/engine@0.46.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.46.0 +- @fusion/pi-claude-cli@0.46.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.46.0 + +### @runfusion/fusion + +#### Minor Changes + +- 41f3b04: Add a Command Center Productivity control for previewing and applying historical LOC backfills from the dashboard. +- efb94c8: Add editable global model pricing overrides, a one-click LiteLLM pricing refresh, and override-aware Command Center cost estimates. + +#### Patch Changes + +- f6e9deb: Stop Planning Mode from automatically focusing the initial text entry when it opens, preventing mobile keyboards from appearing until the user explicitly focuses the textarea. +- 466cf9c: Dispose completed spawned child agent sessions so execution memory is released promptly after `fn_spawn_agent` children finish, keep artifact registry listing metadata-only so large inline artifacts are not loaded during agent execution, bound structured tool-result log previews before serialization, reduce dashboard SSE keepalive churn, and keep the dashboard TUI performance timeline drained during long-running execution. +- d06e316: Fix Command Center Recharts line and pie graphs rendering blank when their cards initially report unusable responsive dimensions. +- a670f5c: Restore core task lifecycle compatibility for workflow-column transitions, deferred title summarization fixtures, workflow IR rollback persistence, and capacity-aware task movement. +- fe536b2: Fix stale durable agent task assignments for tasks parked behind file-scope lease queues, including Reports Health Check rendering and self-healing reconciliation. +- 736ec6d: Fix mobile mailbox message selection so stale deep links no longer override the user's selected message. +- 945f0f1: Pass project fallback model settings into triage spec reviewer sessions so global default overrides are honored during review. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [f6e9deb] +- Updated dependencies [466cf9c] +- Updated dependencies [d06e316] +- Updated dependencies [a670f5c] +- Updated dependencies [fe536b2] +- Updated dependencies [736ec6d] +- Updated dependencies [945f0f1] +- Updated dependencies [41f3b04] +- Updated dependencies [efb94c8] + - @runfusion/fusion@0.46.0 + +## 0.45.0 + +### @fusion/core + +#### Patch Changes + +- 26ebb92: Fix `reconcileOrphanedTaskDirs` silently resurrecting long-deleted tasks onto the live board after a restart ("all task IDs reset / starting over"). + + The sweep re-imports `.fusion/tasks//` directories that have no DB row, to recover heartbeat-created dirs that race store init or rows lost to a recent DB corruption. But it didn't distinguish a genuinely-recent orphan from an ancient deleted-task dir that merely lingered on disk. Modern deletes leave a soft-delete tombstone (caught by `taskIdExistsAnywhere`), but legacy hard-deletes left no tombstone — so a months-old `task.json` with no DB row was re-imported as a live task, surfacing old low-numbered IDs (FN-001, FN-002, …) at the top of the board. + + Reconcile now gates recovery on a recency window (`task.json` modified within the last 7 days). Older orphan dirs are skipped with reason `stale-orphan-dir-beyond-recency-window` and left for explicit recovery (unarchive/restore) or directory cleanup, while heartbeat-race and recent-corruption recovery still work. + +- 7e7eb62: Harden the orphan-worktree and stale-task-dir cleanup fixes (code-review follow-up). + + - **executor.ts (P0):** the stale-conflict recovery's `rm(worktreePath, { recursive, force })` had no bounds check. `worktreePath` can originate from a git worktree admin entry that resolves outside `.worktrees/`, so an out-of-bounds or symlinked path could be force-removed. The recovery now refuses unless the path is inside the configured worktrees dir, is not a symlink (checked via `realpathSync`), is not a registered git worktree, and is not actively owned — and it re-verifies liveness inside the catch rather than trusting the error string. It also excludes `spawn` failures (e.g. `spawn git ENOENT` when git is missing) so a missing-binary error is no longer misread as a successful stale-path cleanup. + - **worktree-pool.ts:** `resolveGitdirPointer` is replaced by `dotGitPointerIsDangling`, which reaps **only** when a `.git` link's gitdir target is confirmed missing. A real `.git` directory, an unparseable pointer, or any read/stat failure now returns "not dangling" (conservative) so a transient read error on a live worktree's `.git` can't cause a force-remove. Removes the `string | "directory" | null` sentinel union. + - **core store.ts:** the `reconcileOrphanedTaskDirs` recency window is now bypassed when the live task table is empty (the corruption/restore case — surviving `task.json` files keep old mtimes), and when a corrupt `fusion.db` was auto-recovered on startup, so `.recover` row loss is not stranded by the gate. Adds an `ignoreRecencyWindow` option for explicit callers. + - Tests for all of the above: executor recovery + out-of-bounds refusal, unparseable `.git` skip, recency boundary, empty-DB/forced bypass. + +### @fusion/dashboard + +#### Patch Changes + +- Updated dependencies [26ebb92] +- Updated dependencies [7e7eb62] + - @fusion/core@0.45.0 + - @fusion/engine@0.45.0 + - @fusion/i18n@0.39.8 + - @fusion-plugin-examples/cli-printing-press@0.1.25 + - @fusion-plugin-examples/compound-engineering@0.1.8 + - @fusion-plugin-examples/dependency-graph@0.1.39 + - @fusion-plugin-examples/roadmap@0.1.27 + - @fusion-plugin-examples/cursor-runtime@0.1.27 + - @fusion-plugin-examples/droid-runtime@0.1.34 + - @fusion-plugin-examples/hermes-runtime@0.2.58 + - @fusion-plugin-examples/openclaw-runtime@0.2.58 + - @fusion-plugin-examples/paperclip-runtime@0.2.58 + +### @fusion/desktop + +#### Patch Changes + +- Updated dependencies [26ebb92] +- Updated dependencies [7e7eb62] + - @fusion/core@0.45.0 + - @fusion/dashboard@0.45.0 + - @fusion/engine@0.45.0 + +### @fusion/engine + +#### Patch Changes + +- Updated dependencies [26ebb92] +- Updated dependencies [7e7eb62] + - @fusion/core@0.45.0 + - @fusion/pi-claude-cli@0.45.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- Updated dependencies [26ebb92] +- Updated dependencies [7e7eb62] + - @fusion/core@0.45.0 + +### @runfusion/fusion + +#### Minor Changes + +- 26e5514: Add the `factory-mono` dashboard color theme, a monochrome Factory variant with red accents and neutralized glow effects. +- 130fea2: Ask first-run users whether to create an optional first persistent agent after project registration, with CEO as the default template, skip support, and no duplicate GitHub star prompt. +- 70cce18: Add the `fn_agent_set_instructions` extension tool so managing agents can update direct or indirect reports' inline or file-backed instructions with org-hierarchy authorization. +- 8dd9697: Add an operator-triggered Command Center Productivity LOC backfill API and client for historical commit-association diff stats. +- f13aaa1: Add a Command Center GitHub resolved-issues detail list and expose the resolved issue rows in the GitHub analytics endpoint payload and CSV export. +- c158dda: Add the `xhigh` reasoning effort level to model settings and task/agent selectors. Claude CLI adapters pass the value through to runtime mapping, where non-Opus models use `high` effort and Opus models use `max` effort. +- 52924ba: Add a built-in lead-generation workflow with custom lead columns, fields, and stage prompts. +- 7f3e942: Add a built-in Design workflow that gates UI-heavy work with a design/UX review before standard review and merge. +- 281ce35: Add a built-in Marketing workflow with content-specific columns and prompts for brief, drafting, editorial review, and publishing. +- fbce59b: Add a core artifact registry data model and store APIs for persisted artifact metadata with on-disk binary storage. +- af06170: Add `fn_artifact_register`, `fn_artifact_list`, and `fn_artifact_view` agent tools for publishing and discovering multi-type artifacts, with best-effort dashboard user inbox notifications on registration. +- ef48895: Add dashboard artifact registry read APIs, client helpers, and a Documents-view Artifacts media gallery for images, videos, audio, documents, and generic artifacts. +- 58f7588: Add a Shadcn Custom dashboard theme with persisted, sanitized design-token color picker overrides across Settings and Command Center theme selectors. +- f80a785: Add pricing entries for OpenAI Codex models used through the `openai-codex` provider, so Command Center token analytics can estimate costs for Codex runs instead of showing them as unavailable. + + This is marked minor because it expands the set of priced models surfaced by the published CLI/dashboard without changing existing pricing behavior. + +- 09acfbb: Allow users to manually pause and unpause agent-assigned tasks from the dashboard task detail view and API. +- 4fec139: Move Stash Recovery into the Git Manager Recovery tab and remove the standalone top-level Stash Recovery view from dashboard navigation. +- 5b33da9: Move desktop toolbar tools into the right sidebar tools rail. The right dock now hosts Activity, Activity Log, Import from GitHub, Git Manager, Files, and Automation, and no longer duplicates left-sidebar content views. +- 7034b55: Move the dashboard terminal launcher to the footer executor status bar and add docked plus floating resizable terminal modes on desktop/tablet while preserving mobile fullscreen terminal behavior. +- a913881: Make the dashboard right dock persistent by default with an in-dock collapse toggle, and remove duplicate Header right-dock toggle behavior. +- 7fd14eb: Rename the task detail Documents tab to Artifacts and add a task-scoped media artifact gallery alongside existing task documents. +- 496167c: Polish dashboard navigation, floating modal, file browser, chat footer, agent role, insights, and list-view action surfaces for a more consistent responsive UI. +- eb3477a: Add a Command Center System node selector so local and registered remote node telemetry can be inspected from the dashboard. +- 59d3eee: Add estimated human hours saved to Command Center Productivity analytics, UI stats, and CSV exports. +- 2dc36d9: Import Tasks PR preview now shows the full comment thread and per-check status (with success/failure/pending indicators) for the selected pull request, fetched on selection and cached per PR. The body still renders immediately while checks and comments stream in. +- 7ef3817: Start the AI engine by default in `pnpm local`, keep dashboard `--dev` engine-on unless `--no-engine` is passed, start desktop local runtimes with engines, and show dashboard instructions when Fusion is launched without an engine. +- 7ddf58d: Sync workflow setting values across nodes in settings push, pull, receive, and status flows. +- 8640a74: The shared markdown renderer (GitHub PR/issue bodies + comments, mailbox, chat) now renders embedded raw HTML and mermaid diagrams. Raw HTML (`
`/``, ``, ``, tables) renders as real elements via `rehype-raw`, with `rehype-sanitize` stripping XSS (script/style/iframe, event handlers, `javascript:` URLs) since these bodies come from GitHub; HTML comments (``) are dropped. Fenced ```mermaid blocks render as actual diagrams via a lazy-loaded `mermaid` import (kept out of the main bundle, loaded only when a diagram is present), falling back to the raw code block on parse error and following the dashboard theme. +- 4fd8d44: Polish dashboard navigation and app chrome, add responsive chat/file/modal behavior, refine roadmaps, missions, task details, workflow defaults, theme defaults, and sidebar/header styling. +- 91180fb: Close the validator reaper→slice deadlock and harden every validation re-drive site for the new behavioral-verification posture. A reaped, task-less "done" feature (left in `loopState="validating"`/`needs_fix`+`error`) is now re-driven by recovery to a terminal pass/fail/inconclusive verdict instead of livelocking the slice, milestone, and mission. Adds an adversarial reliability suite enumerating every re-drive entry point (normal `processTaskOutcome`, each `recoverActiveMissions` branch, and the stale-run reaper) and asserting source-tree git-cleanliness, zero duplicate Fix Features, a terminal verdict, and no `error`-state deadlock. Documents the non-mutating verification run, the first-class `inconclusive` verdict, and the adversarial default-to-fail posture across `docs/missions.md`, `docs/missions-completion-contract.md`, and `CONCEPTS.md`. +- da5fea6: Add Shadcn color-variant dashboard themes for blue, green, red, purple, pink, orange, yellow, mono, and black variants. +- e19f7c2: Add a Shadcn dashboard color theme with zinc neutral tokens, sans-serif typography, 1px borders, subtle flat shadows, and solid primary buttons. +- b20a25c: Add the `shadcn-gray-blue` dashboard color theme with slate blue-gray surfaces and a muted slate-blue accent. +- 4672203: Add a Shadcn Gray dashboard color theme with a fully neutral zinc-gray accent. +- 12aae94: Add Shadcn Mono Red/Blue/Green/Purple/Pink/Orange/Yellow dashboard color themes and migrate legacy `shadcn-mono` selections to `shadcn-mono-red`. +- dc0064b: Dashboard navigation and panel redesign (desktop/tablet; mobile unchanged): + + - **Right sidebar**: a single show/hide toggle now lives in the top header (replacing the tablet overflow menu); the dock is hidden when closed and no longer keeps a persistent icon rail or in-dock collapse button. Its tools (Files — now the default/first tab, Activity, Activity Log, Git Manager) render inline inside the dock instead of opening popup modals. Files opens inline with a pop-out to the resizable file modal. The embedded Git Manager adapts to its width (compact horizontal tab strip in the dock, full two-pane in the wide pop-out). The dependency graph no longer appears in the dock. + - **Left sidebar**: New Task button matches the item-highlight box; footer spacing between Collapse and Settings; divider before the secondary section removed with uniform row spacing. New main-content destinations — Workflows, Import Tasks (GitHub import, with the GitHub mark), and Automations (two-pane, Command Center styling) — render in the main panel instead of as modals. + - **Embedded views**: Planning Mode embeds without modal chrome (no header/close/shadow), fills the full content area, and renders correctly on mobile; the board WorkflowSwitcher is available in Planning. Dev Server header matches Command Center. Insights header wraps so actions don't overlap. List view's left pane can be dragged much narrower with two-line title wrapping. + - **Other**: the docked terminal no longer blurs or blocks the page behind it; the footer Terminal button renders as plain text like the running-state trigger; the workflow selector matches the project selector's styling, height, and font size; the Automations screen uses theme color tokens. + +- 5697d2c: Skills view detail pane: render SKILL.md as Markdown (GFM + sanitized HTML + mermaid), compact the referenced-files area while showing all files, and make each file clickable to view its content with a "Back to SKILL.md" affordance. Adds a `GET /api/skills/:id/file` endpoint for per-file content. +- 5117944: Add Command Center Productivity task-duration analytics, dashboard stat cards, and CSV export rows for completed-task active execution time. +- d4e91d4: Add workflow optional steps: workflows can declare optional step templates that tasks toggle on/off per task, with a workflow-level default. The built-in coding and stepwise-coding workflows expose agent browser verification as an optional step (the stepwise workflow gains a pre-merge workflow-step seam so enabled steps actually run). Optional steps are authorable in the node editor, preserved across node-editor saves, and selectable from a steps dropdown in both the quick-add card and the full New Task modal. + +#### Patch Changes + +- c8a82e7: Auto-continue the agent session after an engine-internal pause/resume abort instead of re-queueing the task to todo. When the engine tears down in-flight work (hard-cancel) and the workflow graph run ends with the task back in `todo`, the executor now retries the agent session in place — bounded by the existing graph-resume retry budget with backoff, falling back to a benign re-queue only after retries are exhausted. Before re-dispatching, it re-checks the task at fire time and aborts the auto-continue if the task was paused, moved, or deleted during the backoff window, so genuine user/global/task pauses are never resumed against the operator's intent. The transient reclassification clears any stale `failed` status and emits an `Auto-recovered:` log so no spurious failure notification fires. +- ee9c8ab: Align dashboard view chrome and inner-pane spacing across Chat, Mailbox, Workflows, Artifacts-adjacent controls, Goals, and Compound Engineering. +- ce6c0fb: Polish dashboard view chrome: align Dashboard, Import Tasks, Automations, Chat, and docked Files editor controls with the shared view header and toolbar styling. +- 7635ba8: Fix a false "engine not running" banner when another fusion process on the same machine already owns the engine. The dashboard's health check only counted engines this process started, so a second launch (e.g. `pnpm dev dashboard` alongside an already-running `fusion`) that was correctly refused the per-machine engine singleton lock reported the engine as unavailable — even though one was running. The `ProjectEngineManager` now tracks engines owned by another process (detected via `EngineAlreadyRunningError` from the singleton lock) and exposes `hasRunningEngine()`, which the dashboard health endpoint uses so the banner reflects machine-level truth. Reconciliation still retries so this process takes over if the other exits, and the "refusing to start" log is emitted once per project instead of on every reconciliation tick. +- ce90cc9: Keep Fusion verification progress moving by making targeted script tests honor file arguments, reaping verification subprocess groups after clean exits, and preventing the line-count audit from blocking `pnpm test`. The changed-test runner now caps reverse-dependent fan-out so a foundational-package edit no longer expands into a whole-workspace run, and the executor/verification guidance now directs agents to scope verification to changed files rather than running the full workspace test suite. +- 5a422b0: Fix anthropic-compatible custom providers failing with "No API provider registered for api: anthropic". + + `resolveCustomProviderApiType` mapped the `anthropic-compatible` provider type to the api key `"anthropic"`, but pi-ai registers the Anthropic Messages API under `"anthropic-messages"`. Any custom provider configured as `anthropic-compatible` (self-hosted Claude proxy, gateway, etc.) therefore selected a model whose `api` did not match a registered provider and threw at stream time. Mapped it to `"anthropic-messages"` and added a regression assertion alongside the existing openai-compatible / openai-responses coverage. + +- 2d32760: Clear the stale `failed` status when a pause/resume abort is reclassified as a benign todo re-queue, so the task no longer surfaces as failed on the board and the deferred failure notification is suppressed. Previously a pause-abort parked `status:"failed"` on an earlier non-todo observation stayed dispatchable (the scheduler filters on column+paused, not status), re-entered the benign-todo branch, and was logged benign while the row stayed failed — firing a contradictory failure alert during global pause when self-healing recovery was suppressed. The clear path also emits an `Auto-recovered:`-prefixed log so the notification service proactively cancels the pending failure timer instead of relying only on the fire-time re-check. +- b564ee0: Make the compound-engineering built-in workflow actually load skills and run the full CE flow. Previously the workflow named CE skills at each node but the graph-node execution path (`runGraphCustomNode`) never loaded them: the named skill was only injected as prompt text, the plugin-injected `FUSION_CE_*` runtime env never reached the step session, and `fn_spawn_agent` was never registered for workflow steps, so persona fan-out and skill loading silently no-op'd. Now skill-executor graph steps thread the injected env, load the named skill (discovery + selection via `additionalSkillPaths`), register the spawn tool in coding mode, and receive an engine-injected Fusion workflow-step conventions preamble (await-input for questions, `FUSION_HEADLESS` degrade path, persona fan-out via `systemPromptOverride`). Adds an explicit `unattended` opt-in for `FUSION_HEADLESS`, reconciles the preamble with the gate verdict-JSON contract, and carries `skillName` through the `WorkflowStep` round-trip. +- 8b5b9a7: Fix the persistent non-blocking Full Suite failure caused by the Compound Engineering plugin's `dist-freshness.test.ts`. The test reads the plugin's compiled `dist/settings.js` and `dist/session/orchestrator.js`, but the plugin had no `pretest` build and was absent from `ensure-test-artifacts.mjs`, so on a fresh checkout `dist/` did not exist and the freshness guard threw "dist/ is missing — run pnpm build first". Register the plugin's required artifacts in `ensure-test-artifacts.mjs` and add a `pretest` hook that builds them, matching the other bundled plugins. +- 68c4053: Fix the Droid runtime model discovery spawning a runaway storm of leaked `droid` processes. + + `discoverDroidModels` invoked `droid models --json` / `droid model list --json`, but the droid CLI has no such commands — an unknown subcommand is parsed as a _prompt_, so each call launched a full agent session (a persistent `droid exec --stream-jsonrpc` backend) that never exited. The promise never settled and the process leaked; because the dashboard re-loads the droid extension on every chat-send, these piled up into dozens of orphaned `droid` processes. + + Discovery now reads the catalog from `droid exec --help` (which lists `Available Models:` + `Custom Models:` and exits cleanly), parsed via the new `parseDroidModelsFromHelp` helper. A SIGKILL-on-timeout guard (`DROID_MODEL_DISCOVERY_TIMEOUT_MS`) ensures any wedged spawn is killed and the promise always settles, so a single discovery call can never leak a process again. Verified end-to-end against the real binary (46 models incl. custom, 0 leaked processes). + +- 9101705: Show plugin-contributed skills (e.g. compound-engineering `ce-*`) in the workflow editor. The dashboard's discovered-skills catalog was built only from the disk-scanning package manager, so plugin skills — which the engine materializes for executor sessions separately — never appeared, and built-in workflow nodes that reference them (like `builtin:compound-engineering`) showed "— select skill —" / unresolved. The skills adapter now merges plugin skill contributions into the discovered list (deduped by bare name), and the editor's node summary + skill dropdown match namespaced skillNames (`compound-engineering:ce-work`) against the catalog's two-segment names (`ce-work/SKILL.md`) via a shared bare-name normalizer. +- 3b61ac3: Fix loading spinners that didn't spin across the dashboard. Many loading states (Settings, task tabs, agents, documents, plugins, model pickers, command center, and more) rendered bare "Loading…" text with no spinner — and a couple rendered an unstyled `loading-spinner` div that never showed anything. Added a shared `` component (self-contained animated SVG, no `lucide-react` dependency so it survives partial test mocks) and adopted it across ~45 loading placeholders so every loading state now shows a consistent animated spinner. +- d99246c: Fix macOS system memory usage reporting by deriving host memory used from OS-available memory instead of raw `os.freemem()` pages. +- 438cd75: Fix worktree-creation failures (and the `Workflow graph terminated with failure at node 'execute'` they surface as) caused by leaked orphan worktree directories. + + A directory under `.worktrees/` that survives with a _dangling_ `.git` pointer — present on disk, but the `.git/worktrees/` admin entry it references is gone — is invisible to `git worktree list` and untouched by `git worktree prune`, yet collides with a freshly generated worktree name. When the executor then tries to clean up the "conflict", `git worktree remove --force` fails with `is not a working tree` and the whole `execute` node fails after 3 attempts. + + - **On-demand recovery (`executor.ts`):** the FN-4813 stale-conflict recovery now also treats `is not a working tree` and `ENOENT` (not just `validation failed, cannot remove working tree`) as "no live worktree at this path" — it prunes any admin entry, force-removes the leftover directory, and proceeds with fresh worktree creation instead of failing. + - **Leak prevention (`worktree-pool.ts`):** `reapOrphanWorktrees` previously skipped any dir on the mere _presence_ of a `.git` file ("may be partially registered"), contradicting its own documented invariant. It now resolves the `.git` pointer and only skips when the gitdir target actually exists; a dangling pointer is reaped like any other half-initialized orphan, so these directories no longer accumulate across runs. + +- 9643563: Fix the global pause/resume failure mode that stalled the board: a pause-abort that left a task back in `todo` was parked `status:"failed"` ("operator action required") and leaked its in-memory worktree slot, producing an instant re-fail retry storm and concurrency-starving the whole queue. + + - Root cause: `handleGraphFailure` now treats a pause-abort that has re-queued a task to `todo` as benign (FN-6782) — it no longer parks it failed, clears the `pausedAborted` marker so the next dispatch starts clean, and releases the leaked worktree slot. + - Auto-recovery: a new `recoverPausedAbortFailures` self-healing sweep clears any pause-abort park (`status:"failed"` with "operator action required") still on the board and requeues it for normal scheduling, so the board self-heals without operator intervention. + - Defense-in-depth: a new `reapLeakedConcurrencySlots` self-healing sweep reclaims any in-memory worktree slot whose holder is no longer in-progress (the "in todo yet still a `maxWorktrees` holder" leak), gated by the executor's live-session refusal so it can never pull a worktree out from under a running agent. This recovers a leaked slot from any future/unknown path without an engine restart. + +- 24ff124: Stop edits to `scripts/lib/test-quarantine.json` from forcing `pnpm test` into gate mode. The quarantine list is runtime data, not executable test infra; tripping the shared-infra catch-all dropped affected-package coverage, so a dev's real changes went untested whenever they also touched the quarantine list. Quarantine edits now stay in changed mode and run the affected packages. +- a2342ca: Fix the task detail chat always showing "No agent is working on this task" for in-progress tasks. The active-session check required a persistent `assignedAgentId`/`checkedOutBy`, but in the default ephemeral-agents mode the scheduler never sets those fields, so an actively-executing task always read as idle. An assignment is now sufficient-but-not-necessary: a non-blocked, non-`queued` in-progress task counts as a live agent session on its own (`queued` stays assignment-gated, in-review is unchanged). +- 7e7eb62: Harden the orphan-worktree and stale-task-dir cleanup fixes (code-review follow-up). + + - **executor.ts (P0):** the stale-conflict recovery's `rm(worktreePath, { recursive, force })` had no bounds check. `worktreePath` can originate from a git worktree admin entry that resolves outside `.worktrees/`, so an out-of-bounds or symlinked path could be force-removed. The recovery now refuses unless the path is inside the configured worktrees dir, is not a symlink (checked via `realpathSync`), is not a registered git worktree, and is not actively owned — and it re-verifies liveness inside the catch rather than trusting the error string. It also excludes `spawn` failures (e.g. `spawn git ENOENT` when git is missing) so a missing-binary error is no longer misread as a successful stale-path cleanup. + - **worktree-pool.ts:** `resolveGitdirPointer` is replaced by `dotGitPointerIsDangling`, which reaps **only** when a `.git` link's gitdir target is confirmed missing. A real `.git` directory, an unparseable pointer, or any read/stat failure now returns "not dangling" (conservative) so a transient read error on a live worktree's `.git` can't cause a force-remove. Removes the `string | "directory" | null` sentinel union. + - **core store.ts:** the `reconcileOrphanedTaskDirs` recency window is now bypassed when the live task table is empty (the corruption/restore case — surviving `task.json` files keep old mtimes), and when a corrupt `fusion.db` was auto-recovered on startup, so `.recover` row loss is not stranded by the gate. Adds an `ignoreRecencyWindow` option for explicit callers. + - Tests for all of the above: executor recovery + out-of-bounds refusal, unparseable `.git` skip, recency boundary, empty-DB/forced bypass. + +- 87f18f8: Track real plugin activation events and surface project-scoped Command Center plugin activation analytics instead of placeholder ecosystem counts. +- ee72c94: Move the Command Center Overview SDLC throughput funnel to the bottom of the tab and broaden hand-rolled chart primitive colors to cycle through existing semantic theme tokens. +- 8f052c6: Fix Command Center Activity trend charts so mixed-unit agent/activity series stay visually legible instead of being flattened by high-volume message counts. +- df139ec: Recover in-progress tasks wedged behind stale in-memory executor bindings by clearing the phantom binding and requeueing with progress and worktree preserved. +- e6f6111: Fix terminal shortcut focus preservation so on-screen Ctrl combinations emit control bytes reliably on touch and pointer devices while keeping physical Ctrl behavior intact. +- d4d7623: Rebaseline the dashboard i18n lint guardrail by excluding non-shipping tests and stories, suppressing technical token categories, localizing plugin missing-view copy, and tracking remaining source-copy deferrals with narrow follow-up tasks. +- 98720f3: Fix mobile bottom tab navigation icon spacing so every tab uses an equal-width column across optional tabs, badges, and status dots. +- c4f34ce: Make the Agents view sidebar wider by default on tablet and resizable with per-project persistence on non-mobile layouts. +- b760fa0: Localize remaining plugin, agent, mission, node, research, document, activity, and miscellaneous dashboard strings and remove their i18n lint deferrals. +- bdf95f8: Localized the dashboard workflow/task/setup/PR component cluster and removed the obsolete i18n lint deferrals for those files so the hardcoded-string guardrail scans them again. +- eca96fb: Keep settings section dashboard copy covered by i18n lint by removing the settings/sections deferral and regenerating i18n resource types. +- c808177: Eliminate the legacy board flash before workflow lanes load by caching per-project board workflow metadata and showing a neutral skeleton while metadata resolves. +- 0c0fda1: Keep Command Center inline next to Agents across desktop and tablet header widths instead of moving it into the More views overflow menu. +- c32c925: Repair task-store startup and self-healing consistency by non-destructively re-importing orphaned live `.fusion/tasks/{ID}/task.json` records into the SQLite task index while preserving soft-deleted, archived, and tombstoned IDs. +- d2fc70a: Fix dependency gating so workflow-graph and workflow-authoritative executor dispatches re-check unmet task dependencies before running, requeueing blocked work with `blockedBy` instead of allowing it to advance to review. + + Add self-healing reconciliation for already-advanced `in-review` tasks with unmet dependencies, including the `task:reconcile-in-review-unmet-dependencies` run-audit event and guarded no-action companion. + +- 08d1f09: Recover benign in-review pause/resume abort parks without requiring operator intervention while preserving hard-cancel, pause, and terminal merge safeguards. +- 61ff17a: Harden in-review dependency drift reconciliation so guard-held or failed rebounds emit no-action audit evidence instead of silently wedging dependent tasks. +- 26bd85d: Fix mobile bottom navigation icon alignment so unread indicators use a centered token-sized icon slot without visually skewing tab spacing. +- 37c4cfa: Prevent bundled Droid and Claude CLI auth/presence probes from surfacing unhandled promise rejections when `spawn` throws synchronously, such as when test guards block real AI CLI auth commands. These probes now resolve as unavailable/unauthenticated instead of rejecting from fire-and-forget validation paths. +- 185ff70: Fix the experimental left sidebar Settings button so it remains clear of the fixed executor status footer, and keep project-selector fallback labels readable when translations are incomplete. +- c7b56a5: Stop triage and planning prompts from auto-selecting alternate workflows based on task type; agents now preserve the project default workflow unless the user explicitly requests a specific workflow. +- c18e827: Await CLI extension cached TaskStore shutdown so deferred filesystem writes and SQLite handles drain before fixture or process cleanup. +- 8c478ad: Fix stale board entries after dependency-driven task re-specification moves by syncing the watched task cache after `updateTaskDependencies` writes and defensively deduplicating `listTasks` rows so active task rows win over archived snapshots. +- 47ba99a: Bump the internal @earendil-works pi SDK family from ^0.79.1 to ^0.79.9 for the CLI, dashboard, and engine packages. +- 24c1c02: Fix dashboard toast text colors so Shadcn dark-mode success, info, and error notifications remain readable against their themed backgrounds. +- 1f23a2e: Ensure bundled Droid CLI provider startup registers without waiting for local `droid` probes and harden binary probes so missing, guarded, or hanging spawns resolve to unavailable sentinels instead of delaying engine boot. +- 15d427b: Move Planning Mode into the dashboard sidebar as a first-class embedded view while removing the desktop toolbar affordance. +- 91971b6: Update the built-in compound-engineering workflow so its Review stage runs the `compound-engineering:ce-code-review` skill directly. The redundant generic reviewer seam node was removed, leaving the CE code-review gate as the sole review stage. +- c4c8961: Tasks created from a selected non-default workflow lane now appear on that lane immediately instead of vanishing until the board-workflows metadata refetch catches up. +- 4342172: Built-in compound-engineering workflow prompts now explicitly call out the `/ce-` skill slash command at each stage. +- bb663a4: Improve bundled non-coding workflow prompts so marketing, lead-generation, and design runs produce structured deliverables, with content and design preview artifacts persisted for review. +- f4d2fa2: Hide the dashboard AI subtask-breakdown quick-add button behind the default-off `subtaskBreakdown` experimental feature flag. +- 5191e1f: Prevent the bundled Droid CLI extension from starting local `droid` probes during server boot; validation now runs only when a Droid stream is actually used while existing probe paths remain non-interactive and timeout-bounded. +- 4879996: Restyle the workflow switcher trigger and dropdown to visually match the project selector. +- ec1d29e: Prevent task worktree acquisition from returning the project repository root by enforcing a non-root postcondition across resume, pooled, and fresh checkout paths. +- c229a15: Tighten agent workflow-routing prompt policy so triage and executor agents must not move a task's workflow unless the user explicitly requested it or the agent created that task. Executor prompts now include an explicit `fn_workflow_select` guardrail while preserving workflow selection for tasks agents create. +- 849b40d: Keep workflow IR and effective-settings resolution usable when project identity lookup fails, falling back to declaration defaults instead of propagating the identity error. +- 9218613: Fix auto-merge lifecycle finalization so successful squash commits reliably leave tasks done, clear transient auto-merge state, and preserve actionable failure state when lifecycle updates fail. +- 6e563b9: Revalidate dashboard service-worker assets before falling back to cache so rebuilt tabs cannot stay on stale bundles and render a blank page. +- a1cac3a: Replace the compact Quick Chat implementation with the full Chat modal launcher and configurable footer/FAB/off setting, move the file browser into the shared floating-window shell with a compact New menu and consistent narrow editor toolbar, fit the dependency graph after layout settles, and align chat/mailbox/task-detail expansion plus header/theme polish. +- 67281fe: Fix Import from GitHub remote detection in multi-project dashboards by passing the active `projectId` to the `/api/git/remotes` lookup. The dialog now lists configured GitHub remotes instead of showing "No GitHub remotes detected" when the backend requires project scope. +- a147a98: Prevent global settings updates from overwriting an existing unreadable settings file with defaults, and use provider/CPU icons in task chat agent headers. +- e788537: Raise the minimum agent heartbeat staleness floor from 5 to 10 minutes. Agents go silent during long-running but legitimate work (notably a verification step running a multi-minute test command, where the agent is blocked awaiting the command and cannot tick/heartbeat). The 5-minute floor could misread such a busy agent as dead and reclaim its in-progress task mid-run; 10 minutes gives long operations room before the liveness gate acts. +- 4ed84be: Polish mobile workflow header alignment, task chat provider icons, modal overlay chrome, and shadcn font consistency. +- a6685b7: Check for duplicate tasks from the New Task dialog and show duplicate descriptions in the warning modal. +- f0fbc59: Update first-run onboarding to include an optional first-agent step and clearer temporary-agent task guidance. +- 36b8950: Carry the selected workflow lane through Planning Mode and Subtask Breakdown task creation so saved tasks appear on the active workflow instead of falling back to the main board. +- 93017a3: Preserve task progress when a single-session run is hard-cancelled mid-execution. When the engine aborted in-flight work and bounced the task back to `todo`, the single-session teardown cleared the task `branch` and re-queued without `preserveResumeState` — resetting every step to `pending` and dropping the pointer to commits already on the task branch, so the next dispatch re-planned from Step 0 and the committed work was stranded (observed as a task that "lost all progress" and got stuck). The teardown now keeps the branch and moves with `preserveResumeState` whenever the task has resumable step progress, matching the step-session and pause-park paths, so execution resumes onto the existing branch from the first incomplete step. The worktree is still removed to free its concurrency slot — only the durable pointers (branch + step state) are kept. +- 192a2f2: Preserve unrelated global settings when saving Settings sections, and graduate Chat Rooms, Goals, Memory, Insights, Skills, and Todo to default-on dashboard surfaces. +- 2e3b965: Smooth the mobile Quick Chat fullscreen sheet during Android soft-keyboard viewport resizing while preserving synchronous iOS visualViewport alignment. +- b9b9447: Reset a task's stuck-kill streak on genuine forward progress. `stuckKillCount` was a lifetime counter — incremented by self-healing on each stuck-kill and cleared only by a manual retry — so a long, genuinely-progressing task could be terminalized by accumulation toward the stuck-kill budget. It now resets when a step reaches a terminal forward status (done/skipped), so only consecutive no-progress stalls count toward the budget. +- 192a2f2: Open task-card files changed actions in the inline task detail Changes tab instead of the task modal. +- 5e55d9c: Show provider icons in task detail chat for default-backed executor, reviewer, planner, and merger models. +- 19be91c: Floating modals (the reusable FloatingWindow, the right-dock pop-out, the floating terminal, and the floating New Task dialog) now share a single z-index stack, so tapping any of them brings it to the front above all the others regardless of type. +- 65c4dc5: Graduate workflow columns and the workflow graph executor to the default runtime path. + + Upgrade notes: stale persisted `experimentalFeatures.workflowColumns` and `experimentalFeatures.workflowGraphExecutor` values are ignored by the engine, so prior installs keep dispatching tasks through the workflow runtime after upgrade. `workflowInterpreterDualObserve` remains an internal diagnostic and defaults off. + + If an upgraded project appears stalled, treat `todo` tasks with unmet dependencies, `paused`/`userPaused`, active checkout leases, unavailable assigned nodes, or file-scope overlap as intentionally parked. Eligible `todo` tasks without those blockers should be picked up by the workflow scheduler; eligible `in-progress` rows without a live executor are recovered through the normal orphan-resume/self-healing path. The old Experimental toggles are no longer a rollback switch; use a source rollback/downgrade to the previous release if the workflow runtime itself must be reverted. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [c8a82e7] +- Updated dependencies [ee9c8ab] +- Updated dependencies [ce6c0fb] +- Updated dependencies [7635ba8] +- Updated dependencies [26e5514] +- Updated dependencies [ce90cc9] +- Updated dependencies [130fea2] +- Updated dependencies [5a422b0] +- Updated dependencies [2d32760] +- Updated dependencies [b564ee0] +- Updated dependencies [8b5b9a7] +- Updated dependencies [68c4053] +- Updated dependencies [9101705] +- Updated dependencies [3b61ac3] +- Updated dependencies [d99246c] +- Updated dependencies [438cd75] +- Updated dependencies [9643563] +- Updated dependencies [24ff124] +- Updated dependencies [a2342ca] +- Updated dependencies [7e7eb62] +- Updated dependencies [87f18f8] +- Updated dependencies [70cce18] +- Updated dependencies [8dd9697] +- Updated dependencies [ee72c94] +- Updated dependencies [f13aaa1] +- Updated dependencies [8f052c6] +- Updated dependencies [df139ec] +- Updated dependencies [e6f6111] +- Updated dependencies [c158dda] +- Updated dependencies [d4d7623] +- Updated dependencies [52924ba] +- Updated dependencies [7f3e942] +- Updated dependencies [281ce35] +- Updated dependencies [98720f3] +- Updated dependencies [c4f34ce] +- Updated dependencies [b760fa0] +- Updated dependencies [bdf95f8] +- Updated dependencies [eca96fb] +- Updated dependencies [c808177] +- Updated dependencies [fbce59b] +- Updated dependencies [af06170] +- Updated dependencies [ef48895] +- Updated dependencies [0c0fda1] +- Updated dependencies [c32c925] +- Updated dependencies [d2fc70a] +- Updated dependencies [08d1f09] +- Updated dependencies [61ff17a] +- Updated dependencies [26bd85d] +- Updated dependencies [37c4cfa] +- Updated dependencies [58f7588] +- Updated dependencies [185ff70] +- Updated dependencies [c7b56a5] +- Updated dependencies [c18e827] +- Updated dependencies [8c478ad] +- Updated dependencies [47ba99a] +- Updated dependencies [24c1c02] +- Updated dependencies [f80a785] +- Updated dependencies [09acfbb] +- Updated dependencies [1f23a2e] +- Updated dependencies [4fec139] +- Updated dependencies [5b33da9] +- Updated dependencies [15d427b] +- Updated dependencies [7034b55] +- Updated dependencies [91971b6] +- Updated dependencies [a913881] +- Updated dependencies [c4c8961] +- Updated dependencies [4342172] +- Updated dependencies [bb663a4] +- Updated dependencies [7fd14eb] +- Updated dependencies [f4d2fa2] +- Updated dependencies [5191e1f] +- Updated dependencies [4879996] +- Updated dependencies [ec1d29e] +- Updated dependencies [c229a15] +- Updated dependencies [849b40d] +- Updated dependencies [9218613] +- Updated dependencies [6e563b9] +- Updated dependencies [496167c] +- Updated dependencies [a1cac3a] +- Updated dependencies [eb3477a] +- Updated dependencies [59d3eee] +- Updated dependencies [2dc36d9] +- Updated dependencies [67281fe] +- Updated dependencies [a147a98] +- Updated dependencies [e788537] +- Updated dependencies [7ef3817] +- Updated dependencies [7ddf58d] +- Updated dependencies [8640a74] +- Updated dependencies [4ed84be] +- Updated dependencies [a6685b7] +- Updated dependencies [f0fbc59] +- Updated dependencies [36b8950] +- Updated dependencies [4fd8d44] +- Updated dependencies [93017a3] +- Updated dependencies [91180fb] +- Updated dependencies [192a2f2] +- Updated dependencies [da5fea6] +- Updated dependencies [e19f7c2] +- Updated dependencies [b20a25c] +- Updated dependencies [4672203] +- Updated dependencies [12aae94] +- Updated dependencies [dc0064b] +- Updated dependencies [5697d2c] +- Updated dependencies [2e3b965] +- Updated dependencies [5117944] +- Updated dependencies [b9b9447] +- Updated dependencies [192a2f2] +- Updated dependencies [5e55d9c] +- Updated dependencies [19be91c] +- Updated dependencies [d4e91d4] +- Updated dependencies [65c4dc5] + - @runfusion/fusion@0.45.0 + +## 0.44.0 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.44.0 +- @fusion/engine@0.44.0 +- @fusion/i18n@0.39.7 +- @fusion-plugin-examples/cli-printing-press@0.1.24 +- @fusion-plugin-examples/compound-engineering@0.1.7 +- @fusion-plugin-examples/dependency-graph@0.1.38 +- @fusion-plugin-examples/roadmap@0.1.26 +- @fusion-plugin-examples/cursor-runtime@0.1.26 +- @fusion-plugin-examples/droid-runtime@0.1.33 +- @fusion-plugin-examples/hermes-runtime@0.2.57 +- @fusion-plugin-examples/openclaw-runtime@0.2.57 +- @fusion-plugin-examples/paperclip-runtime@0.2.57 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.44.0 +- @fusion/dashboard@0.44.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.44.0 +- @fusion/pi-claude-cli@0.44.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.44.0 + +### @runfusion/fusion + +#### Minor Changes + +- 6427802: Route Fusion's Claude CLI path through the ACP bridge (`claude-code-cli-acp`) instead of `claude -p` (Route A, dormant behind an OFF-by-default kill-switch). + + - **U10** — forward `mcpServers` on ACP `session/new` through the runtime contract (`AgentRuntimeOptions.mcpServers` + the plugin's `newAcpSession`); defaults to `[]` so existing read-only ACP "ask" turns are unchanged. + - **U11** — `streamViaAcp`: the `pi-claude-cli` provider can drive Claude through the bundled ACP bridge, returning the same `AssistantMessageEventStream` as the `-p` path. Dispatched only when `FUSION_CLAUDE_ACP=1` and a bridge path are present, so the live `-p` path is byte-for-byte untouched by default. Full-history prompting, schema-only MCP forwarding with break-early on pi-known tools, control-char/size sanitization, env allow-list, process-registry registration, and inactivity timeout. + - **KTD10** — the ACP runtime plugin publishes its identity-pinned bundled bridge path on load so the kill-switch needs no manual path; it does not enable the transport. + - **OQ2** — opt-in connection reuse (`FUSION_CLAUDE_ACP_REUSE=1`, default OFF): a warm bridge connection + ACP session is kept across turns of one conversation (keyed by `sessionId`), so multi-turn lanes skip the cold bridge/`claude` spawn and `session/new` round-trip and send only the latest-turn delta (`buildResumePrompt`). A stable `router` indirection serves each turn's handlers; a warm-child death routes failure to the current owner turn (no 30-min inactivity hang), eviction is cache-identity-aware (a concurrent cold turn can't kill a newer entry's child), an empty resume cold-starts instead of issuing an empty prompt, and a per-turn token drops cross-turn stray updates. The idle reaper is `unref`'d. Default OFF → the cold path is functionally unchanged. + + The Claude-via-pi OAuth path is unchanged. Live verification confirmed the bridge gates tool execution behind `session/request_permission` (forwarded MCP tools and native tools do not execute when cancelled). Remaining for a follow-up: picker/auth/status surface (U12), workflow `model`-node verification (U13), and production rollout. + +- c1b581e: Add the **Command Center** dashboard — a combined analytics/observability and live Mission-Control view (`?view=command-center`). + + - **Telemetry** — a queryable `usage_events` SQLite table populated via a dedicated `emitUsageEvent` capture seam (tool calls, messages, session lifecycle), feeding date-range aggregators for tokens, tool usage + autonomy ratio, activity (sessions/messages/active-nodes/stickiness), productivity (files/commits/PRs/LOC), and ecosystem breadth — all in `packages/core` and reusable by CLI/engine. + - **Cost** — derived from token counts via a hand-maintained `model-pricing` map carrying `pricingAsOf` + a staleness flag; unknown models report unavailable rather than guessing. + - **View** — a new lazy-loaded, ARIA-tabbed Command Center with hand-rolled CSS-bar chart primitives, a date-range picker, per-area panels, a live Mission-Control panel (SSE push + idle-aware polling), and an SDLC funnel. + - **API** — `GET /api/command-center/{tokens,tools,activity,productivity,live}` (agent-usable), each under session auth and project scoping, with `?format=csv` export and an opt-in OpenTelemetry (OTLP) metrics exporter. + +- 898ac1e: Add the Command Center signals analytics endpoint backed by local incidents data and document honest empty-state sentinels for signal metrics. +- 863ebfa: Add a CLI session relaunch route and enable the dashboard's resume-exhausted "Relaunch fresh" action to re-enqueue the owning task for a fresh CLI-agent run. +- 21c4d3e: Dashboard agent chat sessions now load the same agent-declared and enabled plugin-contributed skills as task execution sessions, so plugin skills such as `ce-debug` are available in chat. +- a453716: Render assistant question tool calls as shared in-chat response cards in full Chat and Quick Chat. +- a998f63: Enable creating workflow node connections from the mobile workflow editor. +- e2a3a37: Add a project setting for configuring the auto-merge conflict retry cap before Fusion parks or bounces tasks for recovery. +- 05fe6e5: Compound Engineering now treats stage launch settings as an explicit `disabledStages` opt-out list so newly bundled stages, including `ce-debug`, remain launchable on existing installs with stale settings snapshots. +- b6ac5f2: Add bounded-by-default verification guardrails: project `verificationCommandTimeoutMs`, marathon command detection, and an explicit `allowFullSuite` escape hatch for full verification runs. +- 0453a65: Request agent and enabled plugin skills across planning, mission interview, workflow design, memory insight, and scheduled automation agent sessions. +- cdadac1: Load selected Fusion and enabled plugin skills in milestone/slice interview and agent-onboarding dashboard sessions. +- f41732d: Add a live-updating, animated Command Center token-usage-over-time view with hour/day/week granularity and bounded polling for token totals. +- 504305e: Add a Command Center GitHub issue analytics endpoint and dashboard area showing issues filed by Fusion, issues fixed by Fusion, net flow, daily trends, and by-repository breakdowns from the local project task store. +- 64092ca: Add Command Center agent-run sheets that show total, active, completed, and failed heartbeat runs in the Activity area and Overview, plus agent-run daily activity and CSV export rows. +- 36f1fee: Add the Command Center Team tab and `/api/command-center/team` endpoint for project-scoped per-agent token, cost, files-changed, task-completion, and live-status analytics. +- af31f7d: Move System Stats into the Command Center as a redesigned graph-rich System area with gauges, trend sparklines, task/agent bars, and relocated Vitest controls; remove the standalone System Stats modal plus its Header and mobile More affordances. +- 94a081f: Persist GitHub source issue closure timestamps and use them for exact Command Center "Fixed by Fusion" date bucketing, falling back to task `updatedAt` only when the real close time has not been observed. +- 9b396b6: Add an optional project-scoped GitHub source-issue closed-at backfill endpoint that fills historical imported tasks with real GitHub `closed_at` values for more accurate Fixed by Fusion analytics. +- 2059790: Add a Command Center GitHub affordance for operators to run the historical source-issue closed-at backfill and review accumulated scanned, filled, skipped, and error counts. +- d6e2f92: Add `recharts` and shared Command Center PieChart/LineChart wrappers for downstream graphical chart migrations. The wrappers are token-themed, responsive, reduced-motion aware, and safe for empty, zero, negative, NaN, and Infinity inputs; the current production build shows no observable Command Center chunk-size increase yet because no Command Center surface imports the new wrappers until the dependent migration tasks land (CommandCenter chunk remains 74.68 kB / 16.46 kB gzip in this task's build output). +- 99d799c: Add Command Center pie and line chart affordances to the Overview, Tokens, Tools, Activity, and Productivity analytics surfaces using existing analytics data. +- 5e1a4ff: Add Command Center pie and line charts to Team, Ecosystem, GitHub, Signals, and System surfaces using existing analytics data. +- 47e7b4a: Populate Command Center Productivity Lines changed from merge-time commit association diff stats when available. +- c1b581e: Add the **Monitor stage** (U13) — deployment and incident tracking that closes the SDLC loop. + + - **Schema** — new `deployments` and `incidents` SQLite tables (`packages/core/src/db.ts`, `SCHEMA_VERSION` 119 → 120, migration added in the same change; fingerprint auto-covers SCHEMA_SQL tables). + - **Metrics** — real MTTR (incident-open → resolved) plus deploy/incident counts in `activity-analytics`, replacing the prior unavailable seam. + - **Ingestion** — `POST /api/monitor/{deployments,incidents}` self-authenticate via a shared ingest secret (constant-time bearer check, fail-closed) with SSRF-untrusted payload links; `GET /api/monitor/metrics` exposes the aggregates. + - **Loop closure** — a `monitor` workflow trait can auto-open a single fix task on a regression signal, guarded by `groupingKey` grouping, a threshold/sustained gate, cooldown absorption, a per-window circuit breaker, and a self-loop guard. + +- 168dc2f: Export Command Center analytics over OpenTelemetry (OTLP) so teams can ship token / cost / activity metrics to Datadog / Grafana / etc. **Disabled by default** (U10, R4). + + - New pure mapping `mapAnalyticsToOtlp` in `@fusion/core` (`otel-metrics.ts`) turns the token/cost/activity aggregator outputs into the OTLP/HTTP JSON wire shape (`resourceMetrics`) — counters for token/cost, gauges for activity — with `model` / `provider` / `node.id` / `agent.id` attributes per data point. Fully testable without a live collector; no SDK dependency in core. + - Dashboard exporter (`otel-exporter.ts`) periodically maps current analytics and POSTs them to a configured collector, wired into `server.ts` startup/shutdown. + + **SDK choice:** ships a **minimal OTLP/HTTP JSON exporter rather than the official `@opentelemetry/*` SDK** — and therefore adds **no new runtime dependency**. The OTLP/HTTP JSON protocol is a single, stable `POST /v1/metrics` of a well-defined JSON envelope (built in core), so for a default-disabled feature we avoid pulling the multi-package SDK (sdk-metrics + exporter-metrics-otlp-http + resources + api). The wire shape is collector-compatible; swapping in the official SDK later is mechanical. (If maintainers prefer the real SDK, that is a follow-up changeset + dependency add.) + + **Enabled only via env** (none set ⇒ nothing starts): `FUSION_OTEL_METRICS_ENDPOINT` (full `/v1/metrics` URL, required to enable), `FUSION_OTEL_METRICS_HEADERS` (`k=v,k2=v2` auth headers), `FUSION_OTEL_METRICS_INTERVAL_MS`, `FUSION_OTEL_METRICS_TIMEOUT_MS`, `FUSION_OTEL_RESOURCE_ATTRIBUTES`. + + **Security:** endpoint validated on write — `http://` is rejected in production (exporter does not start) and warns loudly otherwise; auth header (Datadog/Grafana token) VALUES are never logged and are masked in diagnostics; a collector-unreachable failure logs (redacted) and backs off exponentially without crashing the server or blocking requests. + +- 951c6ef: Ingest external signals (Sentry / Datadog / PagerDuty / generic webhook) into triage tasks via a common `SignalSource` adapter seam (U11, KTD8). + + - New `POST /api/signals/:provider` endpoints, mirroring the GitHub ingestion path. Verified, normalized signals create a task in the `triage` column via the existing task store. + - Generic webhook is the must-work path; Sentry/Datadog/PagerDuty are thin adapters with provider-specific HMAC verification + payload normalization. Each normalized `Signal` carries a `groupingKey` (Sentry `issue.id`, PagerDuty `incident.id`, Datadog monitor key; the generic webhook requires a caller-supplied key or falls back to `source + normalized-title`) for the downstream storm guard. + - Security (mandatory): per-provider HMAC against an env-sourced secret (never source-controlled) with 401 on missing/invalid secret or signature — the generic webhook is never an unauthenticated task-creation endpoint; ±5 min replay window + delivery-id nonce dedup; persistent external-id dedup; ~1 MB body cap; per-source rate limit; field-length + meta-byte caps; SSRF-untrusted handling of payload URLs; `meta` stored as data, never rendered as raw HTML. + +- 0a87890: Add a persistent, incrementally-refreshed knowledge index (U14) downstream agents can query. + + - **Schema** — new `knowledge_pages` SQLite table (`packages/core/src/db.ts`) with `SCHEMA_VERSION` bumped 118 → 119 (added in the same change as the migration; the fingerprint auto-covers SCHEMA_SQL tables). Keyword search uses a denormalized lowercased `searchText` column with AND-of-terms `LIKE` matching, deliberately avoiding SQLite FTS5 (not available on every build) and any external embedding API. + - **Index module** (`packages/dashboard/src/knowledge-index.ts`) — upsert-by-source-key pages, a model-free keyword query API, and `refreshKnowledgeForTask` that re-indexes a single completed task (one upsert, never a full re-index, so unaffected pages keep their timestamps). This is the delta over the existing `insights`/`memoryView` surfaces, which are LLM-extracted learnings, not a deterministic searchable index of concrete task/PR history. + - **Refresh hook** — `KnowledgeIndexRefreshService` listens for `task:moved → done` (mirroring `GitHubSourceIssueCloseService`) and is wired alongside the other completion listeners; fail-soft so it can never disrupt task completion. + - **Query API** (`register-knowledge-routes.ts`) — `GET /api/knowledge/query` and `POST /api/knowledge/refresh`, registered as an `ApiRouteRegistrar` so they inherit the dashboard's standard session/auth middleware (401 when unauthenticated) and apply `getScopedStore(req)` (no cross-project reads), exactly like U9. + +#### Patch Changes + +- c8788d8: Align the workflow editor's client-side column trait validation details with the server validator so conflicting trait compositions identify the same source traits before save. +- 265d9ec: Fix task workflow selection so successful workflow changes and clears notify dashboard clients to refresh board workflow lanes. +- def4bd9: Add dashboard controls for renaming regular Chat and Quick Chat sessions. +- 62335f8: Fix two post-merge Full Suite test failures. Sync the roadmap store's schema-version assertion to core's `SCHEMA_VERSION` (116 → 117). Stop `useCeSessions` background refreshes (poll fallback and push events) from clearing an error a `cancel`/`remove` just surfaced — an in-flight session kept the poll running, which silently erased the action error before the user could see it. +- cd2da10: Wire dashboard CLI session banner actions so needs-attention sessions surface, supported actions call existing routes/settings flows, and unsupported actions render disabled instead of silently doing nothing. +- fee0178: Guard no-commits-expected tasks from being finalized as done by no-op merge/self-healing lanes when skipped or incomplete steps outweigh completed work. +- bc6dfd3: Surface paused workflow graph exits that occur outside `in-progress` as operator-actionable failures instead of leaving tasks stranded. +- 0093678: Block release and publish-class tasks during triage unless they were explicitly authorized by a user-authored source. +- 3158e9c: Fix the dashboard TUI Agents view so pressing `s` starts the selected agent without also switching back to Main. +- 0db8134: Bound `fn_task_list` text output across CLI, dashboard, and engine tool surfaces so oversized board listings remain plain text with an explicit truncation marker instead of overflowing host response budgets. +- a15b4ca: Keep the chat sidebar visible at a compact bounded width when a tablet software keyboard opens, then restore the previous width when the keyboard closes. +- 198fb17: Keep prior chat thread messages visible while reconnecting to an in-flight streamed assistant response. +- 98cb80d: Fix the tablet task detail modal sizing so the action footer remains on-screen and the modal uses more viewport width. +- 4a9fe99: Allow chat attachments to be sent without accompanying text in Quick Chat and Main Chat while still rejecting fully empty sends. +- d35f93e: Refresh dashboard mobile and PWA home-screen icons from the canonical Fusion logo and bump the service-worker cache for installed app updates. +- 550715d: Bringing up Quick Chat now focuses the composer input on desktop (matching existing mobile behavior). +- 89171e0: Polish the bundled Compound Engineering dashboard view so its spacing, radii, and controls align with Fusion dashboard design tokens and shared component classes. +- 914842f: Make Chat the first tab and default active view in the task detail modal while preserving explicit initial tab requests. +- 6ced5d7: Fix workflow graph merge-node failures so merge-seam aborts are not misclassified as pause/resume aborts. Non-paused merge failures now route to the bounded auto-merge retry path instead of being parked failed with no merge retry count. +- a84a8e1: Fix `fn_task_list` crashes when the runtime `@fusion/core` formatter export is unavailable by resolving defensively and returning bounded fallback text. +- 593ebac: Resolve task-list text formatting defensively when an installed core package is missing the `formatTaskListText` runtime export, preserving `fn_task_list` output with a bounded inline fallback. +- 403bd9d: Prevent custom workflows from reaching terminal success when declared task-document artifacts are missing, and keep malformed blocking gate verdicts from being treated as successful workflow-step passes. +- 01b80db: Add a Fusion-native `fn_ask_question` tool for dashboard chat agents so structured questions render in the existing chat response card and answers return through the next chat message. +- 5b9ff04: Keep previously persisted main-chat conversation messages visible while reconnecting to an in-flight assistant response. +- 1bd8f6d: Fix mobile terminal cell measurement by making xterm font stacks use real monospace text faces before the Nerd Font symbols fallback. +- 19aac38: Load dashboard chat skills requested with `/skill:{name}` and strip the command token from model prompts. +- a013bc0: Fix the perpetual step off-by-one: `fn_task_update` and `fn_review_step` now treat `step` as 0-based, matching the `### Step N:` numbering in PROMPT.md (Step 0 = Preflight) and `TaskStore.updateStep`. Previously the tools were 1-indexed while everything agent-facing was 0-based, so agents could not mark Step 0 done and reviews/progress landed one step early. +- 4c3186d: Prefer fresher TypeScript plugin source over stale gitignored dist output in dev/worktree plugin resolution when no `bundled.js` exists. Production bundled installs remain unaffected because `bundled.js` still always wins. +- 0767d1b: Generalize bundled plugin freshness checks across staged CLI plugin artifacts. +- 29b27a7: Improve Command Center tool analytics by categorizing Fusion tool families and re-bucketing historical `other` rows. +- 98ccf8a: Completed no-commit executions that finalize to in-review are no longer re-parked as failed "engine abort during pause/resume" operator-action graph failures; genuine pause and hard-cancel semantics are preserved. +- 4dd5337: Close cached CLI extension TaskStore instances on session shutdown so task-tool runs do not leave SQLite handles behind. +- 4929198: Lower the shared `fn_task_list` plain-text budget and cover filtered column listings with realistic regression cases so large todo, planning, and done outputs stay host-safe. +- 673a8a6: Fix `fn_task_list` column filters so empty target columns return explicit text instead of an empty content block. +- 58a34e9: Clamp Command Center SDLC completion analytics to cohort-based conversion rates and add the radial completion gauge plus animated live activity signals. +- 3d28b3b: Preserve already-streamed chat text, thinking, and tool-call state when the dashboard reattaches to an in-flight assistant response. +- dae0bde: Encourage dashboard chat agents to use structured `fn_ask_question` cards when offering choices or alternatives. +- ab8ecb2: Stop the engine from registering merge-trait hooks that collided with core's in-review field-effects adapter and could crash workflow-column moves. +- b1a2aee: Expose task document read/write tools to dashboard chat agents with explicit `task_id` targeting. +- 16b6e5d: Fix mobile iOS terminal cell measurement by making xterm font remeasure resilient to strict FontFaceSet shorthand rejection and pinning text-size adjustment on terminal viewports. +- 0ed46d9: Expose task document read/write tools to planning agents with explicit task IDs, matching chat session behavior. +- 3b32b53: Completed/no-commit executions that finalize to review no longer get re-parked failed when later teardown overwrites completion-finalize abort provenance with a hard-cancel marker. Genuine user/global pauses, merge-seam retry routing, and active-execution hard-cancel behavior are preserved. +- b6823af: Fix completed tasks being parked failed in in-review with a spurious "engine abort during pause/resume — operator action required" error (FN-6648; recurrence of FN-6478/FN-6568/FN-6625/FN-6644/FN-6647). The paused-after-completion graceful-exit path finalizes a fully completed task to in-review while leaving a non-user `paused` flag set; `handleGraphFailure`'s completion-finalized guards required `paused !== true`, so the trailing graph failure was misclassified as an operator-action pause abort once the volatile completion markers were lost. The classifier now recognizes finalized completions regardless of a lingering non-user pause flag, while genuine user/global pauses and in-progress tasks are unaffected. +- 2367918: Add attractive Command Center Overview charts for tokens by model, tool categories, and daily activity using existing analytics data. +- 662a09b: Add live animated Command Center Activity line charts for messages, active agents, active nodes, and combined throughput, backed by a reusable zero/NaN-safe LineChart primitive. +- 11c4120: Fix mobile terminal font measurement by keeping the symbols-only Nerd Font out of xterm's measured ASCII font stack while retaining a scoped DOM glyph fallback. +- 21d8076: Fix Command Center mobile chart rendering so chart primitives shrink inside the tabpanel without scroll-stealing overflow, zero-height collapse, or stretch artifacts, and normalize chart/card border and spacing rhythm across the combined analytics surfaces. +- ef54459: Fix Command Center token analytics so Tokens by model and the per-model table group tasks by the actually-used runtime model instead of collapsing resolved-via-settings usage into `(unknown)`. +- 317b08b: Command Center token-cost analytics now price resolved-via-settings task usage from the actually-used model snapshot, with legacy own-model fallback, instead of showing those costs as unavailable. +- fe207ca: Fix Command Center mobile chart rendering by bounding chart label/track layouts in real mobile engines and normalizing chart/card/table border spacing across the dashboard bundle. +- 0f021ae: Fix Command Center charts and shell styling to use the canonical `--accent` and `--text` dashboard tokens instead of undefined `--color-accent` and `--text-primary` aliases, so chart accents and primary text render with the intended colors. +- 282b069: Replace non-Command-Center dashboard CSS references to the undefined `--text-primary` alias with the canonical `--text` token so primary text uses the intended theme-aware color. +- 9d07e85: Fix served dashboard lazy-view preloads so persisted Command Center and other lazy views include their extracted CSS chunks. +- cfddde5: Fix Command Center activity chart rendering so plotted extrema stay visible and chart wrappers keep a measurable default height. +- cc02286: Inline direct and room chat attachments into agent prompts so agents can read text files and receive supported image attachments. +- 84cf3ff: Guard task detail activity-log rendering against legacy/operator log entries that use text/detail instead of action/outcome. +- 283f689: Repair mission autopilot reconciliation so stale triaged/in-progress features without live task cards are retriaged, while generated fix-loop debris is blocked instead of recreating duplicate tasks. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [c8788d8] +- Updated dependencies [265d9ec] +- Updated dependencies [6427802] +- Updated dependencies [def4bd9] +- Updated dependencies [c1b581e] +- Updated dependencies [898ac1e] +- Updated dependencies [62335f8] +- Updated dependencies [cd2da10] +- Updated dependencies [fee0178] +- Updated dependencies [863ebfa] +- Updated dependencies [bc6dfd3] +- Updated dependencies [0093678] +- Updated dependencies [3158e9c] +- Updated dependencies [0db8134] +- Updated dependencies [a15b4ca] +- Updated dependencies [21c4d3e] +- Updated dependencies [198fb17] +- Updated dependencies [98cb80d] +- Updated dependencies [a453716] +- Updated dependencies [4a9fe99] +- Updated dependencies [d35f93e] +- Updated dependencies [550715d] +- Updated dependencies [a998f63] +- Updated dependencies [89171e0] +- Updated dependencies [914842f] +- Updated dependencies [6ced5d7] +- Updated dependencies [e2a3a37] +- Updated dependencies [a84a8e1] +- Updated dependencies [593ebac] +- Updated dependencies [05fe6e5] +- Updated dependencies [403bd9d] +- Updated dependencies [01b80db] +- Updated dependencies [5b9ff04] +- Updated dependencies [1bd8f6d] +- Updated dependencies [19aac38] +- Updated dependencies [a013bc0] +- Updated dependencies [b6ac5f2] +- Updated dependencies [0453a65] +- Updated dependencies [4c3186d] +- Updated dependencies [0767d1b] +- Updated dependencies [29b27a7] +- Updated dependencies [cdadac1] +- Updated dependencies [98ccf8a] +- Updated dependencies [4dd5337] +- Updated dependencies [4929198] +- Updated dependencies [673a8a6] +- Updated dependencies [58a34e9] +- Updated dependencies [3d28b3b] +- Updated dependencies [dae0bde] +- Updated dependencies [ab8ecb2] +- Updated dependencies [b1a2aee] +- Updated dependencies [16b6e5d] +- Updated dependencies [0ed46d9] +- Updated dependencies [3b32b53] +- Updated dependencies [b6823af] +- Updated dependencies [2367918] +- Updated dependencies [f41732d] +- Updated dependencies [504305e] +- Updated dependencies [64092ca] +- Updated dependencies [36f1fee] +- Updated dependencies [662a09b] +- Updated dependencies [af31f7d] +- Updated dependencies [11c4120] +- Updated dependencies [21d8076] +- Updated dependencies [ef54459] +- Updated dependencies [94a081f] +- Updated dependencies [317b08b] +- Updated dependencies [9b396b6] +- Updated dependencies [2059790] +- Updated dependencies [fe207ca] +- Updated dependencies [d6e2f92] +- Updated dependencies [99d799c] +- Updated dependencies [5e1a4ff] +- Updated dependencies [0f021ae] +- Updated dependencies [282b069] +- Updated dependencies [9d07e85] +- Updated dependencies [cfddde5] +- Updated dependencies [47e7b4a] +- Updated dependencies [cc02286] +- Updated dependencies [84cf3ff] +- Updated dependencies [c1b581e] +- Updated dependencies [283f689] +- Updated dependencies [168dc2f] +- Updated dependencies [951c6ef] +- Updated dependencies [0a87890] + - @runfusion/fusion@0.44.0 + +## 0.43.1 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.43.1 +- @fusion/engine@0.43.1 +- @fusion/i18n@0.39.6 +- @fusion-plugin-examples/cli-printing-press@0.1.23 +- @fusion-plugin-examples/compound-engineering@0.1.6 +- @fusion-plugin-examples/dependency-graph@0.1.37 +- @fusion-plugin-examples/roadmap@0.1.25 +- @fusion-plugin-examples/cursor-runtime@0.1.25 +- @fusion-plugin-examples/droid-runtime@0.1.32 +- @fusion-plugin-examples/hermes-runtime@0.2.56 +- @fusion-plugin-examples/openclaw-runtime@0.2.56 +- @fusion-plugin-examples/paperclip-runtime@0.2.56 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.43.1 +- @fusion/dashboard@0.43.1 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.43.1 +- @fusion/pi-claude-cli@0.43.1 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.43.1 + +### @runfusion/fusion + +#### Patch Changes + +- 59f2596: Fix the standalone `fn plugin new` scaffold so generated plugins include the required `state: "installed"` field and build unedited with `pnpm build`. This also lets the documented `fn plugin dev . --once` path complete its pre-load build step instead of failing TypeScript validation for a missing `FusionPlugin.state`. + + Manual end-to-end spot-check for release validation: `npx @runfusion/fusion@ plugin new proof-point-plugin && cd proof-point-plugin && pnpm install && pnpm build && npx @runfusion/fusion@ plugin dev . --once`. + + Registry evidence captured for the original failing release: `npm view @runfusion/fusion@0.43.0 dist.integrity` returned `sha512-kvxicT+e8ulc7FDhBVP9NsgaioZv6NDW81N8cXNS/X8M32Eo3Y33xT6JFW2DrSiFXsJmAaib/GnpQE0nYQYApQ==`. + +- 1f540b2: Persist planning-session response history before agent continuation so retry/replay and SQLite session recovery retain answered turns when generation errors or transitions complete. +- 19eca3d: Park incomplete tasks that exhaust stuck-loop recovery instead of making them scheduler-runnable again. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [59f2596] +- Updated dependencies [1f540b2] +- Updated dependencies [19eca3d] + - @runfusion/fusion@0.43.1 + +## 0.43.0 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.43.0 +- @fusion/engine@0.43.0 +- @fusion/i18n@0.39.5 +- @fusion-plugin-examples/cli-printing-press@0.1.22 +- @fusion-plugin-examples/compound-engineering@0.1.5 +- @fusion-plugin-examples/dependency-graph@0.1.36 +- @fusion-plugin-examples/roadmap@0.1.24 +- @fusion-plugin-examples/cursor-runtime@0.1.24 +- @fusion-plugin-examples/droid-runtime@0.1.31 +- @fusion-plugin-examples/hermes-runtime@0.2.55 +- @fusion-plugin-examples/openclaw-runtime@0.2.55 +- @fusion-plugin-examples/paperclip-runtime@0.2.55 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.43.0 +- @fusion/dashboard@0.43.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.43.0 +- @fusion/pi-claude-cli@0.43.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.43.0 + +### @runfusion/fusion + +#### Minor Changes + +- 9149121: Enable Z.ai GLM-5.2 model selection. +- 64de883: Make the built-in compound-engineering workflow run the CE way end-to-end: + + - **Execute** stage invokes the `compound-engineering:ce-work` skill in coding mode instead of the generic executor prompt. + - **Merge** stage adds `ce-commit-push-pr` and `ce-resolve-pr-feedback` skill steps (CE owns commit/push/PR + feedback; Fusion's merge seam still owns the board-state merge). The plugin now bundles `ce-commit`, `ce-commit-push-pr`, and `ce-resolve-pr-feedback`. + - **Planning questions reach a human:** workflow-step sessions carry a `FUSION_WORKFLOW_STEP` signal; in that mode the CE skills emit an await-input sentinel instead of calling a blocking tool with no listener. The executor parks the task `awaiting-user-input` with the question, and a new task-card **"Answer questions"** button opens the workflow tab where the existing input banner captures the answer and resumes the step. + - **Subagents work in workflow steps:** `fn_spawn_agent` gains an optional `systemPromptOverride`; the plugin installs the 43 `ce-*` persona definitions plugin-locally and exposes their directory via `FUSION_CE_AGENTS_DIR`, so the CE skills read a persona def and spawn it as a real subagent (falling back to inline single-agent work when unavailable). + +- e8c2d51: Add a one-click dashboard Update now action for installing available Fusion updates. + +#### Patch Changes + +- 740c712: Inline the private `@fusion/core` types into the published `@runfusion/fusion/plugin-sdk` declaration entry so standalone external plugins created with `fn plugin new` can typecheck and `pnpm build` cleanly against released Fusion. Human spot-check: `npx @runfusion/fusion@0.42.0 plugin new proof-point-plugin && cd proof-point-plugin && pnpm install && pnpm build`. +- b1ba87e: Ensure `zai/glm-5.2` reliably appears in the model list after user Z.ai provider extensions load. +- 65a4c51: Recover stale Compound Engineering sessions on plugin load and session reads so persisted active rows without live agent handles no longer leave the dashboard stuck waiting for work that is not running. +- 20aad56: Fix "Couldn't start local Fusion" on the Linux AppImage (and any packaged build launched from a desktop launcher). The embedded local runtime now roots its data at the user's home directory (`~/.fusion`) instead of `process.cwd()`, which was `/` or the read-only AppImage mount point and caused database creation to fail with EACCES/EROFS. Set `FUSION_HOME` to override the location. +- 066c919: Preserve the original corrupt project database at `fusion.db` when startup recovery fails after moving it aside. +- 0d75725: Fixed unreliable horizontal scrolling when swiping across task cards on the mobile board. Native HTML5 drag is now disabled on touch-primary devices (where it never worked anyway), so the browser no longer hijacks swipe-to-scroll gestures that start on a card. +- 67ae2be: Fix two mobile chat send failures. The regular chat send button was dead to touch because the action only ran on `onClick`, which iOS suppresses after `preventDefault()` in the touch sequence — it now fires from pointerdown/touchstart with a dedupe latch. Quick chat messages could strand in the composer (shown locally but never sent to the agent or persisted) when a queued message's delivery trigger bailed — a dropped stream leaving the streaming flag stuck `true`, or a stream that looked healthy when queued but then stalled. A queued send now detects a stale flag at send time via the stream's connection state and the server's generation status, and a delivery watchdog re-confirms any message that stays pending and force-delivers it once no generation is actually in flight. +- fd6caaa: Fix sporadic quick chat send failures on mobile (notably the first message after a response). A real touch tap dispatches both `pointerdown` and `touchstart`, and the quick chat send button ran its action on each — firing `handleSendMessage` twice per tap. Because React had not yet flushed the composer clear between the two events, both reads saw the same text and sent, and the hook's second send closed the first's freshly-opened stream and re-POSTed, which could drop the response. The send and stop buttons now claim a single action per tap so only the first of the paired events fires. +- 9eeaaa7: Fix the quick chat stop button rendering too narrow. It borrowed ChatView's `.chat-input-stop` styling, which sizes itself with `--chat-input-control-size` — a variable scoped to ChatView's composer and undefined in the quick chat DOM — collapsing the button toward its icon width. It is now pinned to the send button's square dimensions. +- ee6d7ac: Workflow step execution now surfaces task attachment locations in the context-recovery prompt path and no longer tells autonomous agents to ask for context. +- 14ed177: Restored horizontal swiping on mobile kanban board columns while preserving page-level horizontal pan containment. +- df01ab7: Fix Create Pull Request conflict preflight to derive `conflictsWithBase` from `git merge-tree --write-tree` exit codes instead of non-empty output, and treat no-op PR conflict resolution merges as successful without attempting an empty commit. +- 96773dd: Fix standalone installs of the published CLI crashing with `ERR_MODULE_NOT_FOUND` for `@earendil-works/pi-coding-agent`. `@earendil-works/pi-coding-agent` and `@earendil-works/pi-ai` are now plain required dependencies instead of also being optional peers, so clean npm and pnpm installs resolve the pi runtime packages. +- 67d4d51: Move task-card timing badges from the top metadata cluster into the bottom-right footer chip cluster so timers align with retry and GitHub footer badges. +- 7b83906: Run the configured or inferred dependency install inside temporary standalone AI-merge clean-room worktrees before merge/review verification. +- be2773b: Fix scheduler concurrency diagnostics and semaphore slot accounting so queued tasks are not held behind contradictory or negative capacity readings. +- 3cc82bd: Fix mobile board horizontal overflow that caused iOS Safari to zoom-out/cut-off the board and let the whole page pan off-screen. Screen-reader-only `.visually-hidden` spans were `position: absolute` with no offsets, so inside the horizontally-scrolled kanban columns they rendered off-screen-right and ballooned the document's scroll width. Pinning the utility to its containing block's origin keeps the document locked to the viewport on mobile. +- aa71ace: Refresh expired Claude OAuth access tokens from Fusion auth storage instead of requiring repeated manual re-login. +- 417183d: Send task-detail Chat composer messages on plain Enter while preserving Shift+Enter newlines and Cmd/Ctrl+Enter sending. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [9149121] +- Updated dependencies [740c712] +- Updated dependencies [b1ba87e] +- Updated dependencies [65a4c51] +- Updated dependencies [64de883] +- Updated dependencies [20aad56] +- Updated dependencies [066c919] +- Updated dependencies [0d75725] +- Updated dependencies [67ae2be] +- Updated dependencies [fd6caaa] +- Updated dependencies [9eeaaa7] +- Updated dependencies [ee6d7ac] +- Updated dependencies [e8c2d51] +- Updated dependencies [14ed177] +- Updated dependencies [df01ab7] +- Updated dependencies [96773dd] +- Updated dependencies [67d4d51] +- Updated dependencies [7b83906] +- Updated dependencies [be2773b] +- Updated dependencies [3cc82bd] +- Updated dependencies [aa71ace] +- Updated dependencies [417183d] + - @runfusion/fusion@0.43.0 + +## 0.42.0 + +### @fusion/dashboard + +#### Patch Changes + +- Updated dependencies [630b2a8] + - @fusion/engine@0.42.0 + - @fusion/core@0.42.0 + - @fusion/i18n@0.39.4 + - @fusion-plugin-examples/cli-printing-press@0.1.21 + - @fusion-plugin-examples/compound-engineering@0.1.4 + - @fusion-plugin-examples/dependency-graph@0.1.35 + - @fusion-plugin-examples/roadmap@0.1.23 + - @fusion-plugin-examples/cursor-runtime@0.1.23 + - @fusion-plugin-examples/droid-runtime@0.1.30 + - @fusion-plugin-examples/hermes-runtime@0.2.54 + - @fusion-plugin-examples/openclaw-runtime@0.2.54 + - @fusion-plugin-examples/paperclip-runtime@0.2.54 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/dashboard@0.42.0 +- @fusion/core@0.42.0 + +### @fusion/engine + +#### Patch Changes + +- 630b2a8: Allow narrowly scoped plan-only operational tasks to complete without source commits when their prompt or metadata explicitly declares no-source/no-code intent and their recorded evidence satisfies the task. The commit guard still rejects missing commits for normal implementation tasks and still enforces worktree and branch invariants before applying the no-commit exemption. + - @fusion/core@0.42.0 + - @fusion/pi-claude-cli@0.42.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.42.0 + +### @runfusion/fusion + +#### Minor Changes + +- e22afec: Add workflow-native typed settings for triage/spec policy thresholds and routing defaults. The built-in defaults preserve current behavior: size bands remain S <2h, M 2-4h, L 4-8h; subtask signals use the canonical planning-prompt values of step threshold 7 and packages/modules threshold 3; file-scope/remediation thresholds remain 20 and 30. + + These triage policy settings are new workflow settings, not moved project settings, so they are excluded from the U4 `MOVED_SETTINGS_KEYS` tombstone while still resolving through workflow effective settings. + +- 039d3ce: Fast-mode triage is now expressed as workflow-declared policy: the lean prompt lives in the built-in `default-triage-fast` agent prompt and `planning-fast` seam, while `leanPlanning` and `autoApproveSpec` are workflow-native settings for prompt selection and spec-review auto-approval. + + The internal `FAST_TRIAGE_SYSTEM_PROMPT` engine constant was removed. Existing `executionMode: "fast"` tasks remain byte-equivalent through a single legacy execution-mode-to-resolved-policy bridge. + +- 167f9b0: Allow engineer-role agents to opt into no-task backlog auto-claim for implementation tasks while preserving executor-only default pickup behavior. +- 1c4ec5f: Add dashboard controls for the engineer backlog auto-claim opt-in at project scope and per-agent heartbeat settings. +- eb607c6: Make dashboard modals touch-resizable on tablet and widen the task-detail modal default tablet width. +- f7f2cae: Move Frontend UX criteria injection from AI self-instructions into deterministic engine-applied workflow policy, preserving the byte-equivalent checklist and idempotent insertion behavior. +- 4e6df03: Add a verified no-op/duplicate task completion path so executors can close already-satisfied tasks without fabricating commits by using an audited `fn_task_done` sentinel summary. +- 7ffea9f: Expose Google Generative AI as a selectable custom-provider API type in the dashboard settings UI and documentation. +- 508551c: Allow tasks to be archived from any live board column and restored to their pre-archive column. +- bd87ce7: Add workflow-declared optional steps and expose Browser Verification as the built-in coding workflow's opt-in optional step for task creation and editing. +- 72661fa: Title summarization now accepts descriptions of any length by truncating the model input to a bounded prompt instead of rejecting descriptions over 2000 characters. +- 07d5262: Sync workflow setting values across nodes in settings push, pull, receive, and status flows. + +#### Patch Changes + +- 8eb99ed: Quick Entry no longer auto-focuses when the board or dashboard becomes visible. +- 36f5ecd: Skip custom workflow pre-merge prompt, script, and gate nodes when a task runs in fast execution mode. +- 1a716f2: Resolve the standard triage planning prompt from the selected workflow IR planning node instead of the removed engine-side `TRIAGE_SYSTEM_PROMPT` duplicate. The built-in `default-triage` prompt is now the canonical policy source for `builtin:coding`; where the old copies disagreed, the surviving canonical subtask-split threshold is `MORE THAN 7 implementation steps` (with the matching `MORE THAN 3 different packages/modules` guidance). Fast-mode triage continues to use `FAST_TRIAGE_SYSTEM_PROMPT` unchanged. +- fb2c6e5: Resolve the built-in reviewer base prompt from the workflow IR `review` node instead of an engine-local `REVIEWER_SYSTEM_PROMPT` duplicate. The canonical reviewer policy now lives in the `default-reviewer` agent prompt / built-in workflow seam, with reconciled superset content that preserves the FN-5928/FN-6229 surface-enumeration and symptom-verification gates, undersplit-task guidance, test-quality rules, worktree-boundary review, and the embedded port-4040 safety rule. +- c0ff360: Fix mobile dashboard blanking after toggling the in-review auto-merge switch by keeping the board visible when real browsers horizontally pan the document to the offscreen column control. +- 12621aa: Record explicit `builtin:coding` project-default workflow selections even when the compiled built-in has zero materialized steps, while preserving interpreter-deferred `builtin:stepwise-coding` fallback behavior. +- 30e747b: Standalone plugin scaffolds now declare the dev toolchain they generate scripts and config for: `@types/node`, `vitest`, and `typescript`. This lets projects created with `fn plugin new` install, build, test, and load through `fn plugin dev . --once` via the documented external-author path without relying on transitive or hoisted dependencies. + + Manual spot-check for release validation: + + ```sh + npx @runfusion/fusion@latest plugin new proof-point-plugin + cd proof-point-plugin + pnpm install + pnpm build + pnpm test + fn plugin dev . --once + ``` + +- 8c16395: Stop self-healing from removing worktrees that are still in use. The idle-worktree and cap-enforcement sweeps now skip any worktree bound to a live executor/merger/step/workflow session, so a checkout is no longer reaped while its task transiently sits in `done` or loses its worktree linkage mid-run. +- d5b45c8: Fix "Couldn't start local Fusion" on the Linux AppImage (and any packaged build launched from a desktop launcher). The embedded local runtime now roots its data at the user's home directory (`~/.fusion`) instead of `process.cwd()`, which was `/` or the read-only AppImage mount point and caused database creation to fail with EACCES/EROFS. Set `FUSION_HOME` to override the location. +- f0d2415: Fix custom provider message sends failing with a `ByteString` error (`character ... value 8226`). The settings UI displays the saved API key masked with `•` characters; saving the provider without retyping the key persisted that mask as the real credential, which then broke HTTP header encoding. Masked values echoed back on update are now treated as "unchanged" and the stored key is preserved; masked values on create/probe are rejected. + + The edit form no longer seeds the API key field with the masked value at all — it starts blank (with a "Leave blank to keep current key" hint) so the mask can never be echoed back to save or "Detect Models". Existing keys are preserved when the field is left empty. + +- a83c2d8: Fix custom provider models not appearing in model dropdowns. The `/models` endpoint filtered results to providers configured in Fusion's auth stores, which excluded custom providers (stored in global settings). Their registry keys are now added to the allowlist so their models surface in pickers. +- cbc3157: Fix the mobile chat keyboard collapsing on iOS Safari. Several ancestor/scroll mutations were blurring the focused composer textarea: + + 1. `.chat-thread--keyboard-active` declared `transform: translateY(...)` + `will-change: transform` in CSS, keeping a non-`none` transform on `.chat-thread` (an ancestor of the composer) for the whole keyboard-active window. The drift compensation is now applied imperatively in JS only when iOS actually shifts the visual viewport (`offsetTop > 0`), so the ancestor stays `transform: none` on focus. + + 2. The mobile keyboard scroll-lock pinned `body { position: fixed }` a beat after the composer was focused — the textbook iOS keyboard-dismiss trigger. App-level and ChatView keyboard pins now use a new `useMobileKeyboardViewportLock` that locks `overflow: hidden` + `scrollTo(0, 0)` WITHOUT changing `position` (the same approach the Quick Chat panel uses), so iOS keeps the input focused. Modals are unchanged and keep the `position: fixed` lock. + + 3. The direct-chat composer's `handleInputFocus` ran `window.scrollTo(0, 0)` on every focus to undo iOS layout drift. That scroll fires while iOS is still raising the keyboard, which aborts the raise — the keyboard opened then immediately dismissed on re-focus (first tap fine, every tap after a dismiss broken). The drift reset now happens on **blur** instead — when the keyboard is already closing, so there is nothing to dismiss — immediately plus a short follow-up that is cancelled on the next focus, so a fast re-tap can't scroll mid-raise. Each focus therefore starts at `scrollY 0` and the keyboard lock's `scrollTo(0, 0)` is a harmless no-op. + + 4. The mobile bottom nav stayed on screen while the keyboard was up: `.mobile-nav-bar--keyboard-open` only pinned it to `bottom: 0` and relied on the keyboard to cover it, but on iOS the layout viewport doesn't shrink, so the bar overlapped the composer. It now slides fully off-screen (`translateY(100%)` + `pointer-events: none`) while typing. Safe for the keyboard because the nav is a sibling of the input, not an ancestor. + +- cbc3157: Fix the Quick Chat FAB not opening on iOS Safari. The drag hook calls `setPointerCapture()` in `pointerdown`, which makes WebKit swallow the synthetic `click`, so the FAB never toggled on iPhone. The open/close toggle now fires from the drag hook's `pointerup` (a real user gesture, so the stealth-input focus still raises the keyboard), with the trailing synthetic click de-duped so mouse and test click paths are unaffected. +- e5036b1: Fix the Quick Chat send button going dead after switching chats on mobile. The send and stop buttons run their action on `pointerdown`/`touchstart` (iOS needs that) and set a shared `handledMobileActionRef` latch so the trailing synthetic `onClick` doesn't double-fire — but the latch was only ever cleared inside `onClick`. On iOS, `preventDefault()` in `touchstart` routinely suppresses that click, leaving the latch stuck `true`, so the next real click (e.g. after opening a different chat) was swallowed and the button appeared unresponsive. The latch is now self-clearing: it auto-resets on a short timer after each gesture and is consumed-and-cancelled when a click does fire, so it can never persist across taps. Because the ref is shared by both buttons, this also stops a stuck stop-button latch from killing the next send tap. +- 535c40d: Fix task creation failing with "node 'merge-gate' branches into 2 edges — graphs with branches require the workflow interpreter (deferred)". The built-in coding workflow now models the merge lifecycle as a branching region of merge/retry/branch-group primitives (FN-6035), but the linear workflow compiler still tried to lower those nodes and rejected their fan-out. The compiler now treats the merge-region primitive kinds (merge-gate, merge-attempt, manual-merge-hold, retry-backoff, recovery-router, branch-group-member-integration, branch-group-promotion) as an engine-owned terminal boundary — exempt from the single-edge linearity rule and never lowered to a step — so linear-prefix workflows compile to their pre-merge step list again. +- e35f3dd: Classify harmless temporary merge worktree cleanup failures after `git worktree prune`/porcelain inspection while keeping still-registered worktree leaks visible in merger diagnostics. +- 3a729f5: Allow narrowly-scoped Review Level 1 coordination tasks with board-only file scope and explicit no-source intent to complete without commits while preserving the missing-commit guard for implementation tasks. +- c285f3f: Fix pi 0.79 extension discovery compatibility and retry stale title-summarizer model ids with automatic model resolution. +- 9a78814: Stop review entry from freezing the global auto-merge setting onto tasks. Tasks without an explicit per-task auto-merge override now continue to follow the live global setting, so toggling global auto-merge off stops newly-entered non-override in-review tasks from being auto-merge processed. +- 2085610: Move AI-merge clean-room worktrees into a repo-local cleanup-exempt root, guard cleanup sweeps by active merge ownership, and classify missing clean-room worktree failures as transient so merges can retry cleanly. +- d23c5d9: Fix task detail Pull Request and Review surfaces so they use the live project auto-merge setting instead of a stale modal-open snapshot. Create PR / manual merge affordances now appear immediately when auto-merge is toggled off, and the automatic auto-merge hint returns when it is toggled back on. +- 4fc00b6: Self-heal compound-engineering answer submission for restarted awaiting-input sessions by rehydrating the interactive session before sending the answer. +- 65251d2: Pausing or sleeping an agent no longer pauses its assigned tasks. Assigned tasks now keep their existing pause state so only explicit user actions pause ordinary task work. +- bffae81: Add `autoMergeProvenance` so Fusion can distinguish explicit per-task auto-merge overrides from legacy review-entry stamps. Startup now marks ambiguous legacy in-review `autoMerge: true` rows as `legacy-stamp` without changing behavior, and the operator-visible `reconcileLegacyAutoMergeStamps` action (dry-run by default) can clear those legacy stamps so global auto-merge OFF is respected while genuine user overrides are preserved. +- 0897b2a: Add a bounded persisted auto-retry for transient workflow-graph resume failures after engine restart or unpause, while preserving terminal failures for genuine graph errors. +- ec4b247: Re-fire durable-agent assignment wakes that were skipped because the agent was mid-heartbeat, so newly assigned tasks are worked when the active run completes instead of waiting for the next timer tick. +- 751d942: Fix workflow graph execution for the built-in coding workflow's merge-policy primitive region by collapsing any merge-region entry back to the legacy `merge` seam until the workflow interpreter owns merge policy execution. +- 93237c3: Fix mobile chat composer first taps so iOS and Android preserve native keyboard focus across direct chat, room chat, and Quick Chat. +- 480e55f: Fix non-English Active Agents next-heartbeat translations so localized strings interpolate the provided elapsed heartbeat value instead of showing a raw placeholder. +- 0a135c9: Fix the task details Chat tab so it opens and reactivates at the latest agent output while preserving scroll-away behavior for live updates. +- 66591ec: Add dashboard and CLI operator surfaces to inspect and apply legacy auto-merge stamp cleanup. +- a9b1139: Self-healing now automatically re-dispatches an assigned in-progress task when its durable agent loses both the heartbeat run and active execution session, preventing the task from stranding until the next engine restart. +- f2054d0: Reliably settle the task detail Chat transcript to the latest output on load and tab reactivation, including after collapsible thinking/tool groups reflow. +- 34ada00: Show user-sent task-detail Chat steering messages as You bubbles and keep them visible after steering requests persist. +- 35554e6: Keep the task-detail Chat composer pinned and visible while the transcript scrolls internally on mobile and desktop. +- e0ec3d1: Steering messages sent from task chat now reach active step-session and workflow runs, including parallel step sessions, and the misleading inactive-session "next session" composer copy was removed. +- f68775a: Ensure only explicit user actions unpause user-paused tasks. Engine self-healing, agent resume cascades, dashboard agent-state resume fallback, heartbeat recovery, and approval-decision resume no longer clear `userPaused` or auto-unpause tasks the user paused. +- 4ea9d66: Fix automatic agent runs to resolve executor, planning, heartbeat, merger, and validator models from fresh task/settings configuration before falling back to durable agent runtime defaults. +- 44b756d: Fix built-in branching workflow selection so interpreter-deferred coding workflows can be selected or used as project defaults without throwing during legacy step materialization. +- e6eef1a: Handle insight extraction agent responses deterministically by accepting prompt return text, falling back to session state, and surfacing a 503 error when no assistant text is produced. +- e305b1a: Respect per-task pause state during triage planning so paused tasks do not auto-advance after specification approval. +- 40cb0d3: Keep the dashboard usage dialog near the top of the viewport across desktop popover, modal, and mobile presentations. +- f16b038: Add workflow work-item storage primitives for workflow-owned merge migration. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [8eb99ed] +- Updated dependencies [36f5ecd] +- Updated dependencies [1a716f2] +- Updated dependencies [e22afec] +- Updated dependencies [fb2c6e5] +- Updated dependencies [039d3ce] +- Updated dependencies [c0ff360] +- Updated dependencies [167f9b0] +- Updated dependencies [1c4ec5f] +- Updated dependencies [12621aa] +- Updated dependencies [30e747b] +- Updated dependencies [eb607c6] +- Updated dependencies [8c16395] +- Updated dependencies [d5b45c8] +- Updated dependencies [f0d2415] +- Updated dependencies [a83c2d8] +- Updated dependencies [cbc3157] +- Updated dependencies [cbc3157] +- Updated dependencies [e5036b1] +- Updated dependencies [535c40d] +- Updated dependencies [e35f3dd] +- Updated dependencies [3a729f5] +- Updated dependencies [c285f3f] +- Updated dependencies [f7f2cae] +- Updated dependencies [9a78814] +- Updated dependencies [2085610] +- Updated dependencies [d23c5d9] +- Updated dependencies [4fc00b6] +- Updated dependencies [65251d2] +- Updated dependencies [4e6df03] +- Updated dependencies [bffae81] +- Updated dependencies [0897b2a] +- Updated dependencies [ec4b247] +- Updated dependencies [7ffea9f] +- Updated dependencies [751d942] +- Updated dependencies [508551c] +- Updated dependencies [93237c3] +- Updated dependencies [bd87ce7] +- Updated dependencies [72661fa] +- Updated dependencies [480e55f] +- Updated dependencies [0a135c9] +- Updated dependencies [66591ec] +- Updated dependencies [a9b1139] +- Updated dependencies [f2054d0] +- Updated dependencies [34ada00] +- Updated dependencies [35554e6] +- Updated dependencies [e0ec3d1] +- Updated dependencies [f68775a] +- Updated dependencies [4ea9d66] +- Updated dependencies [44b756d] +- Updated dependencies [e6eef1a] +- Updated dependencies [07d5262] +- Updated dependencies [e305b1a] +- Updated dependencies [40cb0d3] +- Updated dependencies [f16b038] + - @runfusion/fusion@0.42.0 + +## 0.41.0 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.41.0 +- @fusion/engine@0.41.0 +- @fusion/i18n@0.39.3 +- @fusion-plugin-examples/cli-printing-press@0.1.20 +- @fusion-plugin-examples/compound-engineering@0.1.3 +- @fusion-plugin-examples/dependency-graph@0.1.34 +- @fusion-plugin-examples/roadmap@0.1.22 +- @fusion-plugin-examples/cursor-runtime@0.1.22 +- @fusion-plugin-examples/droid-runtime@0.1.29 +- @fusion-plugin-examples/hermes-runtime@0.2.53 +- @fusion-plugin-examples/openclaw-runtime@0.2.53 +- @fusion-plugin-examples/paperclip-runtime@0.2.53 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.41.0 +- @fusion/dashboard@0.41.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.41.0 +- @fusion/pi-claude-cli@0.41.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.41.0 + +### @runfusion/fusion + +#### Minor Changes + +- 4151a19: Bump `@earendil-works/pi-coding-agent` and `@earendil-works/pi-ai` from `^0.78.0` to `^0.79.1`. This adds **Claude Fable 5** (`claude-fable-5`) model support on the Anthropic and Amazon Bedrock providers, with adaptive thinking and `xhigh` effort. Fable now appears automatically in the registry-driven model picker for users with Anthropic (or Claude CLI) auth configured. See the upstream pi coding agent changelog for [`0.79.1` (2026-06-09)](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/CHANGELOG.md). + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [4151a19] + - @runfusion/fusion@0.41.0 + +## 0.40.1 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.40.1 +- @fusion/engine@0.40.1 +- @fusion/i18n@0.39.2 +- @fusion-plugin-examples/cli-printing-press@0.1.19 +- @fusion-plugin-examples/compound-engineering@0.1.2 +- @fusion-plugin-examples/dependency-graph@0.1.33 +- @fusion-plugin-examples/roadmap@0.1.21 +- @fusion-plugin-examples/cursor-runtime@0.1.21 +- @fusion-plugin-examples/droid-runtime@0.1.28 +- @fusion-plugin-examples/hermes-runtime@0.2.52 +- @fusion-plugin-examples/openclaw-runtime@0.2.52 +- @fusion-plugin-examples/paperclip-runtime@0.2.52 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.40.1 +- @fusion/dashboard@0.40.1 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.40.1 +- @fusion/pi-claude-cli@0.40.1 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.40.1 + +### @runfusion/fusion + +#### Patch Changes + +- e62847b: fix: keep `./dist/*` subpaths resolvable in the packed manifest + + The prepack transform injects an `exports` field for the plugin-sdk subpath, + which flips Node into strict subpath mode and hid every other `./dist/*` file. + That broke the runfusion.ai alias (which imports + `@runfusion/fusion/dist/bin.js`) with `ERR_PACKAGE_PATH_NOT_EXPORTED`, failing + the pre-publish smoke test. Add a `./dist/*` passthrough so the alias bin and + the pi `./dist/extension.js` loader keep resolving after pack. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [e62847b] + - @runfusion/fusion@0.40.1 + +## 0.40.0 + +### @fusion/dashboard + +#### Patch Changes + +- 2d2024f: Unfreeze dashboard spinners and pulse/enter animations. Transition tokens + (`--transition-slow: 0.3s ease`) bundle a duration and an easing; 15 animation + declarations reused them as bare durations, which made the whole `animation` + declaration invalid at computed-value time and silently resolved it to + `animation: none`. Animation rules now use new duration-only tokens + (`--duration-instant/fast/normal/slow`), with the transition tokens derived + from them, and a repo-wide CSS regression test forbids the pattern. +- 784f308: Fix first tap of GitHub tracking icon in quick task entry on mobile (FN-6148). + + The delegated touch handler on `.quick-entry-actions` now uses `closest("button")` to resolve taps that land on child SVG elements, so the GitHub tracking toggle responds correctly on the first touch — identical root-cause fix as FN-6145. + + - @fusion/core@0.40.0 + - @fusion/engine@0.40.0 + - @fusion/i18n@0.39.1 + - @fusion-plugin-examples/cli-printing-press@0.1.18 + - @fusion-plugin-examples/compound-engineering@0.1.1 + - @fusion-plugin-examples/dependency-graph@0.1.32 + - @fusion-plugin-examples/roadmap@0.1.20 + - @fusion-plugin-examples/cursor-runtime@0.1.20 + - @fusion-plugin-examples/droid-runtime@0.1.27 + - @fusion-plugin-examples/hermes-runtime@0.2.51 + - @fusion-plugin-examples/openclaw-runtime@0.2.51 + - @fusion-plugin-examples/paperclip-runtime@0.2.51 + +### @fusion/desktop + +#### Patch Changes + +- Updated dependencies [2d2024f] +- Updated dependencies [784f308] + - @fusion/dashboard@0.40.0 + - @fusion/core@0.40.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.40.0 +- @fusion/pi-claude-cli@0.40.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.40.0 + +### @runfusion/fusion + +#### Minor Changes + +- 61d6874: Add a guarded interpreter-authoritative workflow cutover for coding-task lifecycle execution. The new capability stays default-off behind `experimentalFeatures.workflowInterpreterAuthoritative` and only activates when rollout-readiness checks pass, preserving legacy execution as the fallback path. +- 93e8bd9: Add mission↔goal linkage tooling across Fusion surfaces: REST mission goal endpoints, `fn mission goals|link-goal|unlink-goal` CLI commands, and `fn_mission_list_goals|fn_mission_link_goal|fn_mission_unlink_goal` pi-extension tools. +- 26bc80a: Add mission↔goal batch linking support across REST, CLI, and pi-extension surfaces. + + - `POST /api/missions` and `PATCH /api/missions/:missionId` now accept optional `goalIds: string[]` for mission goal linking on create and update. + - `fn mission create --goal ` supports repeatable goal flags to link goals during mission creation. + - Mission goal link surfaces now reject archived goals with `GOAL_ARCHIVED` while preserving `404` for missing goals. + - Unlink paths remain permissive so archived goals can still be removed from missions. + +- 489a287: Add an ACP (Agent Client Protocol) client runtime plugin (`runtimeId: "acp"`) + that drives any external ACP-compatible agent over JSON-RPC/stdio, built on the + official `@agentclientprotocol/sdk`. Installed on demand (experimental). + + The agent runs as an untrusted subprocess that calls back into Fusion, so the + integration ships a defense-in-depth security floor: per-category permission + gating against the live policy (never a preset shortcut; `allow_once` only; + unmappable kinds and missing policy default-deny), an unrestricted-risk + acknowledgement that escalates blanket allows to approval under the allow-all + default, an opt-in filesystem capability behind a real symlink-resolving cwd jail + (realpath + `O_NOFOLLOW`, secret/`.git` deny-list, writes gated through the + permission policy), untrusted-output sanitization and bounds, and an env + allow-list for the subprocess. + +- c1c99a9: Wire the CLI Agent Executor as a selectable executor kind for the task execute + path (U7). A workflow node with `config.executor === "cli-agent"` (plus + `cliAdapterId` and optional `cliAutonomy`/`cliNotify`) now drives an engine-owned + CLI coding agent (Claude Code / Codex / Droid / Pi / generic) through the execute + step inside the task worktree. + + The new `cli-agent/task-session.ts` orchestrates the task↔session lifecycle: + spawn in the worktree, mint the per-session hook token and write the hook scripts, + inject the task prompt after readiness, subscribe to the authoritative state + machine, and resolve on a positive completion signal (origin R20 gating — a + native `done` advances the pipeline; the generic tier never auto-advances on idle + and exposes a `confirmAdvance()` affordance instead). The resolved executor config + is snapshotted at launch, so a mid-run node-config edit applies to the next run + only. The PTY is reaped (recorded `completed`) at the execute→in-review handoff. + + Lifecycle semantics honor the existing contracts: a hard cancel + (`moveTask(in-progress→todo)` / column-exit abort) SIGKILLs the CLI session via + the same dispose/abort path API sessions use and marks it `killed` (never + resume-eligible); a re-plan/RETHINK re-entry kills any prior live session and + launches fresh; a follow-up to a done task resumes the recorded native session id + when the adapter supports resume, else launches fresh. A PTY-pool ceiling + (`CliConcurrencyLimitError`) surfaces as a clear queued/rejected task state rather + than a silent stall. + +- d8248b4: Add the CLI Agent Executor hook ingestion route and per-session hook scripts + (U17). The dashboard now serves a localhost-only `POST /api/cli-agent/hooks` + endpoint that authenticates per-session hook POSTs from a spawned CLI agent and + forwards the validated payload in-process to the engine telemetry hub (the engine + has no HTTP server — only the dashboard serves HTTP). + + The route is hardened because localhost is not a trust boundary: it validates the + high-entropy per-session token against the engine-held registry (a session id + alone is never sufficient, and a token for one session never validates for + another), rejects browser-context requests via Origin/Host CSRF checks, caps the + payload size, and treats an unknown/non-live session as a 200 no-op rather than a + crash. It is exempt from the daemon bearer-token middleware (hook scripts only + hold the per-session token) but authenticates with that token instead. + + The engine gains `hook-scripts.ts`: it generates the per-session hook script and + notify shim (Orca `agent-hooks` shape — `curl` POST of the stdin JSON with the + session token header, short timeouts, always exit 0), writes them into a + session-scoped config dir (owner-only, executable), and deletes that dir on + session end (the token is registry-invalidated at the same moment, bounding its + at-rest exposure to the session lifetime). + +- ace7106: CLI-agent hybrid chat (U12): a chat session can select a cli-agent executor and + be driven by a long-lived CLI agent process. Adapter transcript telemetry maps + to durable chat_messages rows at user/assistant/tool-summary granularity (raw + tool noise stays in the terminal), with the shared `redactSecrets` pass applied + before persistence so transcripts never become a secret store. Composer sends + route through the inject path with FIFO queueing; the flush decision re-fetches + authoritative session state rather than trusting a cached busy flag. The chat + surface gains a transcript ↔ raw-terminal toggle (terminal owns input, composer + hidden in terminal mode); generic-tier sessions render terminal-only with no + toggle. New per-session `cliExecutorAdapterId` linkage on chat_sessions. + + ChatView now mounts `CliChatSurface` for cli-backed sessions (the message-pane + + composer region is delegated to it; regular sessions keep the standard composer), + and the engine `TelemetryHub` gains a narrow optional `onEvent` tap (settable via + `setEventListener`) so the chat transcript runner can observe the same sanitized + events the hook route already feeds, without the hub becoming a subscriber bus. + +- 7a80d29: Mobile terminal interaction for cli-agent sessions (U13). `SessionTerminal` now + detects mobile viewports via the canonical breakpoint + (`(max-width: 768px), (max-height: 480px)`) and renders a bottom input model in + place of relying on xterm's hidden-textarea (unreliable on mobile): a visible + text input that forwards typed text + `\r` as input frames on submit, plus an + accessory key bar emitting exact control sequences — Esc (`0x1B`), Tab (`0x09`), + a dedicated Ctrl-C (`0x03`), ANSI CSI cursor arrows (`CSI A/B/C/D`), and a sticky + Ctrl modifier whose next key combines into a control byte (Ctrl-C `0x03`, + Ctrl-D `0x04`, Ctrl-Z `0x1A`) with a visible active state. + + Bar keys apply the iOS composer survival pattern (pointerdown/mousedown + preventDefault, action on click) so the input keeps focus, and the bar behaves as + a fixed footer that lifts above the virtual keyboard via `useMobileKeyboard` + (including its pinch-zoom `vv.scale > 1` guard, which is not treated as + keyboard-open). xterm `onData` input stays attached (the bar is primary, not + exclusive). Bar keys and the input are deliberate user keystrokes routed straight + to the session input path. All new strings are localized in the `app` i18n + catalog. + +- 8bac390: Add CLI-agent one-shot sessions for the validator, planning, and CE plugin + surfaces (U9). A one-shot session runs an adapter's non-interactive invocation + (`claude -p`, `codex exec --json`, `droid exec --output-format json`, + `pi --print`) to completion in a working directory, streams output to a + read-only terminal (input disabled server-side via the durable + `autonomyPosture.readOnly` flag the transport's `isReadOnlySession` honors), + parses the adapter's structured JSON result, and reaps the PTY on exit. + + The new `cli-agent/one-shot-session.ts` returns a typed result: a success with + the parsed payload, or a typed failure (`nonzero-exit` / `unparseable` / + `spawn-failed`) carrying a bounded output tail. The validator integration + (`cli-agent-validator.ts`) maps results into the existing + pass/fail/blocked/error verdict contract — a malformed or unparseable result + maps to `error`, NEVER a silent pass. A planning seam (`runCliAgentPlanning`) + maps one-shot output into the same `PlanningResponse` shape a model run + produces, and the CE plugin's orchestrator threads an `executor` option + (`model` | `cli-agent`) end-to-end to its resolver. + +- 10acf17: Add the CLI agent resume coordinator and self-healing integration (U8). On + engine start, sessions persisted as live (starting / ready / busy / + waitingOnInput) are classified `engineDeath` and queued for resume respecting + the session-manager concurrency ceiling. Resume verifies the recorded worktree + still exists (missing → needsAttention, never a CLI spawned into a vanished + directory), detects a dirty worktree (logged + flagged on the session record, + resume proceeds), relaunches via the adapter's `buildResume` with the recorded + native session id in the recorded worktree, re-attaches telemetry, and + re-injects no prompt. Only `crashed`/`engineDeath` are resume-eligible + (`killed`/`userExited`/`authFailed`/`completed` never); attempts are capped at 2 + with backoff; exhaustion, an unsupported adapter, a missing vendor session + store, or an immediate spawn error route to needsAttention (a permanent-failure + path, not a retry loop). + + Self-healing idle-worktree sweeps (`enforceWorktreeCap`, `cleanupOrphans`, + unregistered-orphan reap) now skip a worktree backing a resume-eligible + `cli_sessions` record via a narrow `isWorktreeResumeReserved` seam, and the + stuck-task detector suppresses stuck/inactivity flagging while a task's CLI + session is `waitingOnInput` via a narrow `isCliSessionWaitingOnInput` seam — the + U3 stall backstop remains the only escalation while genuinely waiting. + +- 5872331: Bootstrap the CLI Agent Executor runtime and wire it end-to-end. + + A new `createCliAgentRuntime` factory (engine) constructs the per-project bundle — a `CliSessionStore` over the project's existing core Database, a per-runtime adapter registry with all five bundled adapters, the `CliSessionManager` (PTY lifecycle), the `TelemetryHub` (per-session token registry rebuilt from live records), and the `CliResumeCoordinator` (relaunch re-mints a hook token + rewrites hook scripts) — returning the executor bundle, the `isWorktreeResumeReserved` / `isCliSessionWaitingOnInput` predicates, and a scoped `dispose`. + + The runtime is instantiated per project in `InProcessRuntime` behind the `experimentalFeatures.cliAgentExecutor` flag (opt-in, matching the `workflowGraphExecutor` precedent): the bundle threads into `TaskExecutorOptions.cliAgentRuntime`, the predicates feed the self-healing idle-worktree sweep and the stuck-task detector, and `resumeCoordinator.recoverOnStart()` runs non-blocking after engine start (errors logged, never thrown). The dashboard hook endpoint URL is derived from a server-threaded option, falling back to a localhost URL from `FUSION_DASHBOARD_PORT` (default 4040). + + The dashboard now resolves the project's `TelemetryHub` via `cliAgentHubResolver`, mounts the cli-sessions transport from the runtime's manager + store, and brokers cli-backed chat sends: a chat session with a `cliExecutorAdapterId` routes composer sends to a `CliChatSessionRunner` (instead of the model agent loop), and the hub's sanitized telemetry is routed per-session into the runner's transcript handler. + +- 17c9303: CLI agent session transport (U10): authenticated cli-sessions REST routes + (list, single-use session-scoped attach tickets, inject, confirm-advance), a + distinct `/api/cli-sessions/ws` WebSocket attach handler (daemon-token + Origin + allowlist + single-use ticket gate, scrollback replay then live byte frames, + ACK-credit flow control driving engine pause/resume, latest-active-client + resize, server-side read-only enforcement, input-source attribution), a + streaming-safe outbound output filter (`neutralizeTerminalOutput`) that strips + OSC 52 clipboard writes, non-http(s) OSC 8 hyperlink URIs, and device-status / + query sequences, and a throttled `cli:session:state` SSE event with + Last-Event-ID replay. +- 243113a: Add CLI-agent adapter launch settings, an autonomy approval gate, and workflow + node-editor configuration for the CLI Agent Executor (U15). + + A new `cliAgents` slice of global settings holds per-adapter operator launch + config — command override, extra args, autonomy mode, and env allowlist + additions — validated and sanitized at the write boundary (unknown adapter ids + and invalid fields are dropped). Shipped defaults are owned by the adapters. + + The autonomy gate closes the "adjacent settings" bypass: elevation requested + through ANY channel (the autonomy field, extra args such as + `--dangerously-skip-permissions`, an autonomy-toggling env var, or a non-default + command override) is detected over the FULLY RESOLVED argv + env via per-adapter + elevation markers plus a shared generic env-pattern set. `resolveEffectivePosture` + derives the posture chip from the resolved invocation — never the autonomy field + alone — and the effective posture is denormalized onto the session record at + spawn. An elevated launch without a stored per-project approval fails with a + typed `CliAutonomyNotApprovedError` instead of stalling. Approvals are per-project + + - per-adapter (mirroring the raw workflow-CLI-command approval precedent) and the + approving principal in v1 is the daemon-token holder. + + The dashboard adds daemon-token-authed routes + (`/api/cli-agents`, `/api/cli-agents/settings`, + `/api/cli-agents/:adapterId/approve-autonomy` + revoke), a Settings section for + per-adapter launch config with an explicit confirmation flow before elevated + autonomy is approved, and a workflow node-editor block that surfaces an adapter + picker (with native/hybrid/generic tier labels), an autonomy toggle, and the + waiting-on-input notification mode (banner / banner+notify) when a node's executor + is `cli-agent`. All new strings are localized in the `app` i18n catalog. + +- e10db81: CLI agent terminal UI (U11): a shared `SessionTerminal` component (lazy-loaded + xterm + fit/webgl/unicode11) that attaches to the U10 cli-sessions WebSocket + with ACK flow control, a posture chip (baseline vs elevated), a read-only + badge, session-idle/ended replay states, and a generic-tier confirm-advance + strip. Adds a `terminal` tab to the task detail view driven by the lifecycle + visibility matrix (live / read-only live / replay-idle / replay-ended / hidden) + with live `cli:session:state` SSE merging, waiting-on-input and needs-attention + task-card badges (distinct from staleness/stall badges), and extends + `SessionNotificationBanner` with a `cli-agent` session type plus the pinned + needs-attention variants (userExited / authFailed / resume-exhausted) and their + actions. All new strings flow through the i18n catalogs. +- 57631c7: Add full-screen TUI attach to cli-agent sessions (U14). The Ink dashboard TUI + can hand the terminal to a CLI agent session as a raw passthrough: it enters the + alternate screen, streams WebSocket terminal bytes to stdout and stdin keystrokes + back as input frames, propagates resizes, and ACKs consumed bytes for flow + control. The detach chord (Ctrl-]) restores the TUI cleanly, and a dropped + connection surfaces an error and restores the terminal. Untrusted terminal output + is neutralized through the same hardening filter the dashboard WS bridge uses + (OSC 52 clipboard writes, non-http(s) OSC 8 links, and device-status queries are + stripped before reaching the host TTY). +- 3cf13dd: Add the Compound Engineering bundled plugin: a dedicated dashboard surface for compound-engineering artifacts and interactive `ce-*` sessions, a work→board bridge, and bidirectional board↔pipeline sync. Sessions are fully multi-session: a Sessions panel lists every run with stage/status/last-activity, lets you open and switch between concurrent sessions (each keeps running server-side), resume interrupted ones, and discard settled ones (`DELETE /sessions/:id` disposes the live handle before deleting the row). + + Sessions show the agent's full working output live (streamed thinking/tool activity with an inactivity-based stall timeout instead of a fixed turn timeout), the user can steer mid-stage with free-text guidance (attached to an answer or sent on its own), and the transcript renders past questions/answers/working traces as a proper chat surface. + + This also adds two reusable host capabilities that any plugin benefits from: + + - **Interactive agent sessions for plugin routes** (`ctx.createInteractiveAiSession`), with skill-discovery forwarding (`requestedSkillNames` / `additionalSkillPaths`) and live mid-turn progress streaming (`onProgress`: thinking/text deltas + tool markers) so a plugin can load a bundled skill into a live session and surface its work in real time. + - **Real plugin event push over SSE**: a plugin's `ctx.emitEvent` calls are forwarded to connected `/api/events` clients as project-scoped `plugin:custom` events, and dashboard views can consume them via the new `subscribePluginEvents` view-context capability. + +- ee5f5e8: Add "New folder" button to DirectoryPicker for project setup + + The directory picker in the project setup flow now includes a "New folder" + button that lets users create folders directly when selecting a project path. + This includes: + + - New `POST /api/create-directory` endpoint for creating directories + - Create folder UI in DirectoryPicker with inline error handling + - Keyboard support (Enter to create, Escape to cancel) + - Client-side validation for folder names (no path separators or traversal) + + Also fixes a bug where navigating into an empty folder would revert to the + previous directory. + +- e854d33: Add `fn onboard` command: a sequential, prompt-based onboarding wizard covering central DB creation, AI provider setup (API key), first project init, core settings defaults, and a next-steps tour. Persists a `cliOnboardingCompletedAt` completion marker in global settings (distinct from the dashboard `setupComplete` first-run flag). +- 641b932: Add a safe onboarding auto-launch hook in the CLI bootstrap path. When the central DB is missing, interactive TTY commands now trigger `fn onboard` automatically before command dispatch, while non-interactive contexts (non-TTY, `serve`, `daemon`, explicit skip signals) remain unchanged and never block execution. +- 2053f3f: Add `fn onboard`: an explicit, user-invoked onboarding command that runs a sequential, prompt-based wizard for central DB creation, AI provider setup (API key), first project init (`fn init`), core settings defaults (global `testMode` and project `maxConcurrent`), and a next-steps tour. It persists a `cliOnboardingCompletedAt` completion marker in global settings so later runs are skipped unless `--force` is passed. +- e9de195: Add dashboard shared branch-group visibility and controls: branch-group list/show/assign/promote API routes, grouped task surfacing, and a completion-gated branch-group card that only reveals PR/merge actions once all members are landed. +- eb425d1: Add a dedicated dashboard Group Task Modal for shared branch groups. Grouped badges in task cards and subtask planning now open a modal showing shared branch status, member landed progress, tracked PR state, member-task quick links, and completion-gated promote actions. +- 9c29e2e: Add a new New Task branch strategy option, **Merge into a shared feature branch** (`shared-group`). + + When selected, task creation now joins an existing open branch group by shared branch name (or creates a `new-task` sourced group when missing), links `branchContext` with `assignmentMode: "shared"`, and derives a per-task working branch from the shared branch instead of running directly on the shared integration branch. + +- 3373c0b: Add shared branch-group completion-gate promotion machinery so grouped shared branches promote to the default branch exactly once after all members land. This includes idempotent promotion re-evaluation, finalized branch-group status/PR tracking persistence, and lifecycle wiring that keeps member integration and shared→default promotion as separate phases. +- 130f6f1: Custom OpenAI-compatible providers now register with explicit conservative role compatibility: Fusion defaults `compat.supportsDeveloperRole` to `false` so reasoning-capable models emit the legacy `system` role instead of relying on provider URL auto-detection. Advanced users can opt in per provider with `supportsDeveloperRole: true` when their endpoint explicitly supports the `developer` role. +- 0a418e6: Add the external plugin authoring loop for published Fusion installs: `@runfusion/fusion/plugin-sdk` is available as the public SDK subpath, `fn plugin new ` scaffolds standalone publishable plugin packages, and `fn plugin dev ` builds, installs, watches, and hot-reloads local plugins during development. +- 30a09e3: Persist mission↔goal many-to-many links with a new `mission_goals` join table, MissionStore link/unlink/list helpers, and a project schema version bump from 100 to 101. +- abbeaec: Surface mission-linked goals across mission read paths, including `fn_mission_show`, mission detail API payloads, and dashboard mission detail navigation into anchored goal cards. +- 577ce12: Document mission-to-goal linkage behavior, including the explicit no-backfill decision for existing missions, and surface an Unlinked badge for active missions without linked goals in Mission Manager. +- 3b9ff42: Add self-healing recovery for stale mission validator runs that are left in `running` after their owning execution disappears. + + Stale validator runs are now reaped to the existing terminal `error` status (rather than introducing a new `cancelled` status), the reap reason is stored in the run summary, active mission features are moved back to `needs_fix` so validation can re-trigger, and startup/maintenance sweeps emit `mission:validator-run-reaped` audit events for recovered rows. + +- cc18206: Mission validation now AI-validates all mission criteria by lazily ensuring a per-feature managed assertion at runtime and removing the zero-assertion auto-pass path. Milestone acceptance criteria are threaded into validator prompts, and the dashboard now presents mission criteria as AI-validated instead of informational-only. +- d72cb2a: Move agent logs out of the SQLite `agentLogEntries` table into per-task `.fusion/tasks/{ID}/agent-log.jsonl` files, add one-time migration + source-ref rewrite support, preserve soft-deleted log files for forensics while hiding them from live reads, and switch goal-citation source refs to `agentLog:{taskId}:{lineNo}`. +- 8aed4da: Add AI-assisted conflict resolution to the dashboard Create PR flow so users can resolve task-branch merge conflicts against the selected base branch, push the updated branch, and continue PR creation without leaving Fusion. +- 8891d4b: Add an in-app Create PR remediation that pushes the task branch to `origin`, refreshes preflight status, and unblocks PR creation without leaving Fusion. +- 13c6d96: Add workflow `notify` nodes so custom workflows can dispatch templated notifications through configured providers. +- 6271778: Add `workflow_id` support to agent task creation, delegation, and update tools so agents can select or clear task workflows directly. +- 0b7549a: Enable workflow columns, graph executor, dual-observe, and authoritative interpreter experimental flags by default. +- 1b7e52e: Expose workflow discovery and selection during triage planning, including workflow routing metadata for child task creation. +- b1454c1: Branch-group promotion now creates a single real GitHub PR for the group integration branch when promoting a completed PR-mode group. The PR number/url/state are persisted on the branch group and promotion is idempotent — re-running never opens a second PR (an existing persisted or open PR is reused). The GitHub client is injected into the engine via the same option-callback seam as `processPullRequestMerge`, wired at the `fn daemon`, `fn dashboard`, and `fn serve` construction sites. PR creation only happens for eligible (completion-gated, auto-merge-allowed) groups, and a GitHub failure leaves the group recoverable rather than persisting a false PR state. + + The single managed group PR is now kept in sync through its terminal lifecycle: as additional members land, the PR body is rewritten with the latest member checklist and x/N completion (idempotent body rewrite — sync failures are non-fatal and retry on the next landing). When the persisted PR is closed or merged out-of-band on GitHub, the stored `prState` is reconciled rather than re-opened. Abandoning a group best-effort closes its GitHub PR and marks `prState` `closed` (or preserves `merged`). New injected `syncGroupPr` callback and dashboard `updatePr`/`closePr` GitHub-client helpers back this flow. + + The branch-group surface is completion-gated end-to-end: the dashboard branch-group card and Group Task modal show member progress before completion, reveal the promote/Open-PR control only when the group is complete, render the persisted PR link once promoted, expose an Abandon action while the PR is open, and display a terminal merged/closed state. A new agent-native CLI command (`fn branch-group list | show | promote `) reaches the same promotion coordinator path the dashboard uses — promoting a complete group opens/links the same single managed PR, and an incomplete group is rejected with the same completion-gate message. + +- f9e5513: Harden the project database against the recurring "database disk image is malformed" corruption. + + - **Integrity-checked backups**: every backup copy is now verified with `PRAGMA quick_check` before it is kept, a verifiably-corrupt copy is quarantined as `*.corrupt` instead of masquerading as good, and `cleanupOldBackups` will never rotate out the last verified-good backup. + - **Startup auto-recovery**: on open, a malformed `fusion.db` is detected and rebuilt offline via `sqlite3 .recover` (corrupt original preserved as `fusion.db.corrupt-`, stale `-wal`/`-shm` dropped) before any connection is established. Opt out with `FUSION_DISABLE_DB_AUTORECOVER=1`. This also fixes a latent bug where the recovery path invoked the non-existent `.recover main` option and always failed. + - **Database shrink + retention**: scratch `lost_and_found*` tables left by prior recoveries are dropped on init, and a new `operationalLogRetentionDays` setting (default 30 days, configurable in Settings → Backups → Database Maintenance, 0 to disable) prunes unbounded append-only log tables (`activityLog`, `agentLogEntries`, `runAuditEvents`, `agentHeartbeats`) during periodic maintenance to curb the file growth that widens the corruption window. + +- 34c8ac9: Add the unified `fn pr` command namespace for CLI parity with the dashboard's + PR-entity review surface (U8, R13): `fn pr create | list | show | approve | +respond | retry | merge | close | automerge`. + + Each subcommand routes to the SAME store/engine/release path the dashboard PR + routes use, so the two surfaces can't diverge: `create` mints the GitHub PR; + `list`/`show` read PR entities; `approve`/`respond`/`retry`/`merge`/`close` fire + the workflow's user-controlled release edges via `releaseHeldTaskByEvent` + (`pr-approve`/`pr-respond`/`pr-retry`/`pr-merge`/`pr-close`); `automerge` toggles + the entity's `autoMerge` flag. + + BREAKING: the per-task `fn task pr-create` command is retired. Use `fn pr create +` instead (same flags: `--title`, `--base`, `--body`, `--draft`, + `--no-ai`, `--reviewer`). + +- 5c4c765: Add a dashboard browse-and-install flow for skills.sh catalog entries, including the new `POST /api/skills/install` API route and Skills view install actions that refresh discovered skills after a successful install. +- d071aec: Add executable custom workflows with a visual graph node editor. Author a workflow as a graph (start → prompt/script/gate steps → end) in a new React Flow–based editor, then select it per task or set a project default. Selected workflows compile to the existing WorkflowStep engine and run at the pre/post-merge boundaries — no changes to the scheduler/executor/merger. Non-linear graphs are rejected with a clear message and reserved for the (deferred) graph interpreter. + + Prompt nodes carry an execution profile: run on a chosen model, as a named agent, as a skill invocation, or as a named project script (CLI) with the prompt passed via FUSION_NODE_PROMPT — plus per-node retries and an auto-approve toggle. "User input" nodes pause the run with a needs-input badge on the task card and a banner in the task modal; replying in comments and unpausing resumes the workflow with the answer. + + CLI nodes can run arbitrary commands (not just named scripts); the first run of an exact command pauses the task for explicit user approval. The task modal's input/approval banner is interactive — reply-and-resume for user-input nodes, approve-and-run for CLI commands. + + Agents reach workflows too: the `fn_workflow_list`, `fn_workflow_get`, `fn_workflow_select`, `fn_workflow_create`, `fn_workflow_update`, and `fn_workflow_delete` tools (plus `fn_trait_list` for the column vocabulary) give agents the same author/list/select capability as the dashboard. These are exposed not only to the task executor but also to the chat and planning agents, so you can author and edit workflows directly in a chat or planning conversation; a guard test locks all six tool names to each lane to prevent silent exposure drift. Built-in workflows are now read-only in the editor (palette/inspector disabled, with a "Duplicate to edit" action), and a node's "Auto-approve requests" toggle now actually bypasses the CLI first-run approval pause. + + Also fixes a latent persistence bug where `pausedReason` was written to the in-memory task and read by queries but never stored by the task upsert or mapped back on read — so it was lost on every reload. This silently broke any pause/resume that depends on the reason (workflow CLI-approval and await-input nodes, token-budget pauses, worktrunk failures). The approve-CLI endpoint now derives the approved command solely from the task's pausedReason (ignoring any caller-supplied command), await-input nodes only resume when this node actually paused the task (not on a pre-existing steering comment), and write-capable custom nodes are refused until a task worktree exists so they never mutate the shared repo root. + + The editor itself got a major usability upgrade: card-style nodes with kind accents and live config summaries (model/agent/skill/command, gate mode, hold release, join mode); success/failure edge authoring on regular edges with distinct styling, parallel conditioned edges, and an author-time cycle guard; one-click auto-layout that respects column swimlanes; safe node/edge deletion with cascade semantics; proper dialogs (create/delete/discard) with inline rename, descriptions, and a dirty-state guard on every dismissal path; onboarding/empty states; and the Columns and Fields panels now live in the editor's left sidebar under the workflow list. + + The node editor is now the primary workflow surface: the header and mobile nav open it directly and the legacy Workflow Steps screen is retired. Existing flat steps migrate automatically (and idempotently) on first editor open — every step becomes an insertable template fragment in the new palette Templates section (alongside built-in and plugin step templates), and your default-on steps become a "Migrated steps" workflow that's set as the project default. Task creation now picks a workflow (applied atomically at create) instead of individual step checkboxes. + + Workflows and template fragments import/export as JSON files — with server-side validation, name-collision handling, and automatic stripping of approval-bypass flags from untrusted files. And you can ask AI to design a workflow: describe what you want in the create dialog (or redesign the active workflow from the toolbar) and a planning-lane model emits a validated graph, with interpreter-only branching flagged honestly. + +- 9072d71: Add a localization (i18n) foundation across the UI. Introduces react-i18next-backed translation for both the dashboard and the terminal UI, with English as the source language and Simplified Chinese, Traditional Chinese, French, and Spanish as target locales. + + - New `@fusion/i18n` package holding the authored catalogs and shared i18next configuration (namespace split, script-aware zh-CN/zh-TW fallback, plural setup). + - A `language` preference (`fusion settings`) and a Settings language switcher; the CLI resolves locale from `--lang`, settings, then environment. + - An `i18next-cli` workflow (`extract`/`sync`/`types`/`status`/`lint`) so adding a future language is a translate-only, near-zero-code operation. + +- c1a7231: Redesign the workflow editor mobile surface with a graph outline, mobile add flow, and first-class workflow settings destinations. +- fbc2c37: Convert the built-in PR lifecycle from a selectable task workflow into a reusable workflow-editor fragment template. +- bd5315f: Allow projects to enable or disable built-in workflows from settings, and show built-in workflow seam prompt text in workflow nodes. +- d8a015e: Allow built-in workflow review columns to surface the auto-merge toggle. +- 7076dd4: Make task steps workflow-modelable, behind the `experimentalFeatures.workflowGraphExecutor` flag (off by default). + + Step policy — how a task breaks into steps, how each step is reviewed, and what happens on revision/rethink — was previously fixed engine law. Workflows can now model it as graph structure: a `foreach` node instantiates a per-step template subgraph once per planned step; a `step-review` node surfaces APPROVE/REVISE/RETHINK/UNAVAILABLE verdicts as outcome edges; `rework` edges (the only legal graph cycles, bounded per instance) route revisions back to a `step-execute` seam, with RETHINK triggering a substrate reset-to-baseline (git reset + session rewind). Steps additionally gain parallel execution: with `mode: parallel` + per-instance worktrees, dependency-satisfied steps (declared via `### Step N (depends: 1,2):` annotations) run concurrently off a common base, with an ordered integration stage that lands branches in step order and routes rebase conflicts to a budget-counted rework outcome. + + Step parsing itself becomes a graph node: `parse-steps(artifact, parser)` reads a workflow-declared task artifact and runs a registry parser (built-in `step-headings`/`json-steps`, or plugin-contributed parsers under `plugin::`) to write the step list, with routable `no-steps`/`parse-error` outcomes. A `code` node runs sandboxed TypeScript (esbuild + child process, clamped timeout, no store handle) for arbitrary computed routing/field logic. Workflows also declare typed custom task fields (string/text/number/boolean/enum/multi-enum/date/url, with enum options and render hints); values are validated through a single store authority and the task UI renders the field schema dynamically (detail form widgets, card badges, and a workflow-editor Fields panel). `fn_task_update` accepts a `custom_fields` patch; `fn_workflow_create/update` accept the new IR constructs. + + The default coding workflow is untouched and byte-identical (the parity oracle); a new built-in stepwise coding workflow demonstrates the full modeling. With the flag off, step execution, review, and the board are exactly as before. + + **ROLLBACK:** This is flag-gated by `experimentalFeatures.workflowGraphExecutor` and additive on disk. Schema migration v108 only ADDS the `workflow_run_step_instances` table and the `tasks.customFields` column (default `'{}'`) — it rewrites no existing rows. The flag is read once and pinned per run, so a mid-flight toggle never switches a task between the legacy and graph step paths; flag-off rollback mid-task converges via the existing fell-back + git-reconcile recovery, because `Task.steps[]` remains the always-git-reconcilable projection sink. Instance rows are per-run prunable and are never the authority over git history. IR using the new node kinds (`foreach`/`step-review`/`parse-steps`/`code`) is v2-only, and `downgradeIrToV1IfPure` already refuses non-v1 node kinds, so the v2 rollback contract from the columns track is preserved automatically. To downgrade to a pre-v108 binary, turn the flag off and let in-flight stepwise tasks settle (or reconcile from git) first; custom-field values on the dropped column are lost on downgrade, so export any needed field values beforehand. + +- 4fa5407: Add per-column agent assignment for workflow columns, behind the combined `experimentalFeatures.workflowColumns` + `experimentalFeatures.workflowGraphExecutor` flags. + + A workflow column can now name a permanent agent from the registry plus a mode — `defer` (the column agent is the default for work in that column that carries no agent/model settings of its own) or `override` (the column agent supersedes node- and task-level agent/model settings). The binding applies to all session-running work attributable to the column's nodes: custom prompt/gate/script nodes, the execute seam's coding session, and step-execute sessions. Precedence is resolved by one shared `@fusion/core` resolver (`resolveColumnAgentBinding` + `resolveEffectiveAgent`) consumed by every reader, with defer/override expressed as explicit named rules and defer granularity all-or-nothing (an own agent identity OR a complete `modelProvider`+`modelId` pair suppresses the column agent). The binding keys off the node's declared IR column; foreach template nodes inherit the enclosing foreach node's column. A missing/deleted agent at resolution time logs and falls back to normal resolution — a live session is never aborted. The built-in default workflow carries no column agents and stays byte-identical (parity oracle); with either flag off, column agents are inert. + + The effective column agent is also the principal for the subsystems that previously assumed the running agent is always `task.assignedAgentId`: action gating (`buildActionGateContext` / `buildPermanentAgentGatingContext`) is computed for the agent actually running; heartbeat serialization honors it in both directions (the execute deferral gate, a second `resumeTaskForAgent` pass that re-dispatches tasks whose effective column agent matches, and a reverse-direction heartbeat-scheduler guard so an `allowParallelExecution=false` column agent never heartbeats concurrently with its own session); and a workflow-definition edit or agent runtimeConfig change that re-keys the column-effective agent/model hot-swaps the running graph session, while an agent deleted mid-session falls back without a restart. + + Authoring lands in the workflow editor: the column panel gains a registry-backed per-column agent picker plus a defer/override mode toggle, bound columns are badged on their headers, and a node inside an override column shows that its own executor settings are superseded (so override never reads as a bug). Picker interaction states are explicit — flags off disables the picker with a tooltip naming both required flags, an in-flight fetch disables it, a failed fetch shows an inline error, and a stored `agentId` missing from the registry renders an "Agent not found" warning that preserves the IR until the author clears or replaces it. Agent references are validated at save time: the `POST`/`PATCH` workflow routes reject an unknown `agentId` with a typed 4xx naming the offending column, and binding an agent whose permission policy is broader than the project default requires an explicit `confirmPolicyEscalation` flag so override cannot silently re-key action gates to a more-privileged agent. + +- 60605fa: Add workflow-defined custom columns with composable traits, behind the `experimentalFeatures.workflowColumns` flag (off by default). + + Workflows can now define their own columns, each carrying composable traits (declarative flags plus lifecycle hooks) instead of the fixed `triage → todo → in-progress → in-review → done → archived` pipeline. The dashboard board renders one lane per workflow in use, and graphs gain `hold`, `split`, and `join` nodes for passive dwell and parallel fan-out/join branches. The built-in default workflow reproduces today's pipeline verbatim, and migration rewrites zero task rows — a null workflow selection resolves to the default workflow at read time. With the flag off, the legacy board, transitions, and engine behavior are unchanged. + + **ROLLBACK:** Workflow IR now has a `v2` on-disk shape (custom columns + `hold`/`split`/`join` nodes). Pre-v2 binaries hard-reject any IR whose `version !== 'v1'`, so a naive downgrade would brick rows that had been re-serialized as v2. To keep rollback safe, the store downgrades a workflow back to the `v1` shape on save whenever (a) the `experimentalFeatures.workflowColumns` flag is OFF, and (b) the graph is "pure v1" — only `start`/`prompt`/`script`/`gate`/`end` nodes, no `hold`/`split`/`join`, and exactly the synthesized default columns at their default seam-derived placement. v2 is persisted only when the flag is ON or a genuine v2 feature (custom column, applied trait, custom placement, or a v2-only node) is in use. Reading a downgraded `v1` row on a v2 binary re-upgrades it to the identical v2 graph, so this is lossless. Rollback is therefore only unsafe for workflows that actually use v2 features with the flag ON; turn the flag OFF and re-save such workflows (or delete them) before downgrading to a pre-v2 binary. + +- 71822f2: Add workflow extension plugin contracts for move policies, work engines, node handlers, task verdict providers, auto-merge facts, and shared board action services. +- a504238: Add first-class workflow loop nodes with bounded template repetition, exit conditions, editor support, and plugin SDK type exports. +- 61ae1bf: Expose default-workflow Plan/Triage, Executor, and Reviewer model lanes from Project Models settings while keeping workflow setting values as the source of truth. +- e2707af: Add a first-class workflow settings mechanism and hard-move execution policy onto it. + + - **Workflow settings.** Workflows now declare typed settings in their IR (id, type, default, options) — the same authoring pattern as custom task fields. Setting _values_ persist per `(workflow, project)` behind a single validating store authority, and the engine resolves _effective settings_ per task (`stored value ?? declaration default`, dropping values that no longer validate). Built-in `builtin:coding` declares every moved key with its former default, so an untuned project behaves identically. + - **Hard-move migration.** A one-time, idempotent, per-project migration relocates the step-execution, review/approval, and per-phase model-lane keys out of project/global settings into workflow setting values, removing them from the settings schema entirely. A `MOVED_SETTINGS_KEYS` tombstone list shields cross-node sync, v1 imports, and stale writers from resurrecting a moved key; a consistency test enforces one home per key. + - **Settings UI redesign.** The Settings modal is rebuilt from shared schema-driven field primitives and per-section components; moved settings show a redirect stub linking to the workflow editor (one release). The new **Workflow editor → Settings** panel (Definitions/Values tabs) and the `fn_workflow_settings` agent tool edit values with typed validation. + - **Export v2.** Settings export bumps to version 2 with a `workflowSettings` value section; importing a v1 export upgrades any moved key it carries into the appropriate workflow's values. Workflow settings are not synced across nodes yet (surfaced in the sync UI). + +#### Patch Changes + +- f76716e: Fix custom-provider model resolution in the bundled engine for OpenAI Responses API providers. + + - Align custom-provider reads with global settings directory resolution (including legacy `~/.pi/fusion` and `~/.pi/kb` migration paths), so providers persist across restart and remain visible during agent session creation. + - Ensure custom provider registration diagnostics include enough detail for troubleshooting registration failures. + - Improve configured-model resolution errors to clearly identify the failing `provider/model` selection while retaining the existing `"was not found in the pi model registry"` matcher substring and pointing users to Settings → Custom Providers. + - Add regression tests covering legacy settings-path custom-provider loading and openai-responses provider model resolution. + +- fab8a62: Make `fn_goal_list` and `fn_goal_show` available in engine agent sessions, including executor, heartbeat, and triage runs. + + Also make `fn_goal_list` output concise by truncating descriptions to short single-line snippets while keeping full goal descriptions available through `fn_goal_show`. + +- 2d81a95: Fix mission→goal link write paths to return `400 { code: "GOAL_NOT_FOUND" }` instead of 404 for unknown goals, aligning the API, CLI, and pi tool contract. +- 40c0048: Fix built-in workflow editor graph edge visibility so read-only built-in workflows render connected, clickable React Flow edges for success, failure, and rework paths. +- 9c84ba2: Built-in coding workflow catalog (`builtin:coding`) now exposes the canonical `BUILTIN_CODING_WORKFLOW_IR` used by resolver/runtime fallback paths, removing drift between workflow surfaces. +- 934071c: Agent-created tasks without explicit titles now request AI title summarization regardless of the project auto-summarize setting. +- d75f861: Harden AI merge temporary worktree cleanup with same-task pre-merge pruning and task-aware stale tempdir sweeping for completed or deleted tasks. +- db971a9: Initialize missing Git repositories automatically when registering Fusion projects. +- 30ba1f0: Expose the dashboard file viewer to plugin views and use it for Compound Engineering artifact documents. +- 07dcb16: Add the Codex, Droid, and Pi CLI agent adapters (U5). + + Three new launch adapters join the engine's CLI agent executor, each declaring honest, verified capability flags so surfaces can render tier differences: + + - **Codex** (hybrid tier): native turn-complete via the session-scoped `notify` config program (`-c notify=[…]`), capturing `thread-id` as the native session id; waiting-on-input is inferred from ANSI-stripped PTY prompt-pattern heuristics (approval menus, idle composer markers, with a spinner/working override) because Codex has no native waiting signal; resume via `codex resume `; rollout JSONL transcript tailed by probing (not hardcoding) the sessions directory for the file matching the thread-id. + - **Droid** (native tier): Claude-style hooks (`SessionStart`, `Stop`, `Notification`, tool-activity) delivering `session_id`/`transcript_path`/`permission_mode`; a message classifier splits the conflated `Notification` event into permission-request vs idle sub-reasons (both treated as waiting-on-input); resume via interactive `droid --resume ` or headless `droid exec -s ` — never the bare `-r` that means `--reasoning-effort` in exec mode. + - **Pi** (native tier): telemetry and transcript from session-JSONL tailing under a session-scoped `--session-dir`; lifecycle events (turn/agent start→busy, end→done, input-request→waiting) plus message rows→transcript; resume via `pi --session `. + + A new `session-jsonl` transcript source is added to the adapter capability union for Pi. + +- f3b700a: Add the generic heuristic-tier CLI agent adapter (U6). + + Arbitrary user-configured CLI commands can now run as engine-owned PTY sessions. The generic adapter declares every native capability disabled (no native done/waiting signal, no transcript) and infers state purely from the terminal byte stream: busy while output progresses or a spinner animates, and a synthetic idle after a configurable quiet window when a prompt-like glyph is showing and no spinner overrides it. Per the completion-gating decision (origin R20) the generic tier NEVER reports done — idle surfaces a "looks idle — confirm to advance" affordance via a new busy-equivalent idle sub-state and never advances the pipeline. + +- b9afce3: Fix a batch of CLI Agent Executor review defects: + + - **Schema-version gate**: bump `SCHEMA_VERSION` to 110 so a DB already at 109 + runs migration 110 and gains the `chat_sessions.cliExecutorAdapterId` column + (it was previously short-circuited). Add the column to the compat-fingerprint + `MIGRATION_ONLY_TABLE_SCHEMAS.chat_sessions` entry so the fingerprint matches. + - **Generic adapter double-wrap**: `formatInjection` no longer re-wraps injected + text in bracketed-paste markers when `bracketedPasteActive`; the session + manager's security path is the sole wrapper, so the generic adapter (like every + native one) only appends a carriage return. + - **Output-filter cross-boundary bypass**: thread one carry buffer across the + scrollback→live seam in the CLI session WS bridge so a dangerous escape (e.g. + OSC 52) split across the seam is fully neutralized instead of the held + introducer being flushed verbatim into the scrollback frame. + - **Output-filter overflow leak**: when an over-length carry begins with a + recognized dangerous introducer (OSC `ESC ]` / DCS `ESC P`), drop the + introducer instead of flushing it as literal, so it cannot recombine with a + later terminator at the client. + - **Follow-up never resolves**: `followUp()` now drives the authoritative state + machine `done→busy` before injecting, so the re-armed result promise resolves + on the next positive `done` instead of hanging on an idempotent done. + +- 38b84a3: Recover failed Planning Mode session loads into the existing retryable error view instead of dropping back to the empty planner. Failed or malformed persisted planning sessions now keep their session id so Retry/Dismiss recovery remains available, while deleted sessions still quietly fall back to a new session. +- 68e52e3: Fix in-review tasks showing other tasks' files in the "files changed" list. `baseCommitSha` was captured as `merge-base(HEAD, origin/main)` at task start, but task branches fork from local main — when local main was ahead by merged-but-unpushed task commits, the recorded base rewound past them, and after the post-merge rebase-and-push rewrote their SHAs the diff range permanently swept the predecessors' files into the new task's diff. The capture now measures against local main first (origin/main as fallback), matching the contamination-base sites. +- 314411c: Fix mission triage silently stranding features when two missions share a base branch. + + `branch_groups.branchName` is globally unique, but `ensureBranchGroupForSource` only checked for an existing group by `(sourceType, sourceId)`. When a second mission's shared-branch triage resolved to a base branch (e.g. `main`) that another mission already owned a branch group for, `createBranchGroup` threw `UNIQUE constraint failed: branch_groups.branchName`. That error escaped `triageFeature` and was swallowed by both of its callers (the validation-failure auto-triage and the startup/maintenance reconcile sweep), leaving the mission's `defined` features — including auto-generated fix features — permanently un-triaged and the mission unable to progress. + + `ensureBranchGroupForSource` now reuses an existing open group for the same branch name (matching the established `getBranchGroupByBranchName(...) ?? ensureBranchGroupForSource(...)` idiom) instead of colliding on the unique constraint. + +- 7d417a1: Fix the bundled Compound Engineering dashboard plugin build so its CSS is included in `dist`. +- 978d07c: Fix opencode-go model sync: pass API key to CLI and strip provider prefix from model IDs + + Two bugs when using OpenCode Go as a provider: + + 1. **Model discovery only returned free models** — the saved Go API key was never passed as `OPENCODE_API_KEY` to the spawned `opencode models opencode --refresh` process. The CLI's internal plugin checks this env var and, when absent, disables all paid models (those with `cost.input > 0`). Only 20 free models appeared instead of all 67. + + 2. **API requests failed with 401** — `normalizeOpencodeGoModel` was registering models with prefixed IDs like `opencode-go/deepseek-v4-flash`. The Pi SDK sends `model.id` verbatim in API requests; the OpenCode API expects bare model names (e.g. `deepseek-v4-flash`). The prefix is now stripped during normalization. + + Also deduplicates models when the CLI emits both `opencode/foo` and `opencode-go/foo` for the same model, guards against empty model IDs, and refactors the duplicated `onApiKeySaved` handler into a shared `handleOpencodeGoApiKeySaved` helper. + + After this change, users must re-select their opencode-go model in Settings because model IDs have changed from prefixed to bare names. + +- c2604d5: Fix missions stalling when a feature is marked `done` but stranded mid-loop. + + A mission feature could be left `status: "done"` while its `loopState` never advanced past `"implementing"` and it had no linked board task (so it was never validated). The slice-completion gate (`MissionStore.computeSliceStatus`) correctly refuses to count an assertion-linked `done` feature until its validator passes, but nothing re-drove a task-less feature, so the slice — and the whole mission — could never auto-progress. + + Active-mission recovery now detects these stranded `done` features and re-runs assertion validation directly (no board task), so the gate can resolve: on pass the feature becomes legitimately complete, on fail the normal fix-feature flow takes over. The feature-validation path was extracted into a shared `runFeatureValidation` helper used by both task-completion and recovery. + +- a27921a: Fix project selector review regressions around optional selection handlers and bookmarked search matches, and tighten retry/backoff timeout and rate-limit handling. +- 77a1099: Fix a spurious Settings → Plugins error for the bundled Dependency Graph plugin where plugin startup could fail with `Invalid state transition from "started" to "started"`. + + Plugin state transitions now treat same-state updates as idempotent no-ops, while still allowing same-state calls with an explicit error payload to update the persisted error field without emitting a state-changed transition. + +- 944c03d: Fixes the UsageIndicator popup hidden-window recovery flow by preventing hide/show controls from acting as implicit form-submit buttons. + + - Sets the per-window hide control and provider-level **Show hidden (N)** control to `type="button"` so they do not trigger parent form submits. + - Adds a regression test that verifies clicking **Show hidden** reveals hidden windows, persists the unhidden state, and remains correct after rerender/state re-sync. + +- feceedb: Repair dropped spaces after sentence-ending punctuation when streamed agent text is split across separate assistant messages by tool-call round-trips (chat and agent logs), by tracking a per-session running tail at the shared engine streaming-delta chokepoints. Completes FN-5789, which only covered within-message boundaries. +- 40b4919: `fn onboard` now allows each onboarding step to be skipped individually without aborting the overall wizard. Skipping steps still marks onboarding as completed, while interactive cancellation behavior remains unchanged. +- e1a35a3: Harden CLI onboarding auto-launch backward compatibility by adding an explicit skip when both the central DB and local project DB already exist. This preserves established agent/headless behavior by ensuring non-TTY, `serve`, and `daemon` invocations continue without onboarding prompts or blocking. +- 38e0422: Refine onboarding auto-launch bypass behavior by treating `--skip-onboarding` and `FUSION_SKIP_ONBOARDING` as first-class skip paths. + + - Parse `FUSION_SKIP_ONBOARDING` with strict truthiness (`1`, `true`, `yes`, `on` only). + - Return distinct auto-launch skip reasons for flag (`skip-flag`) and env (`skip-env`). + - Strip `--skip-onboarding` as a global CLI flag so it never leaks into downstream command parsers while still informing onboarding gate decisions. + +- 245129e: Add orchestrator-level regression coverage and CLI docs that guarantee onboarding auto-launch never blocks existing projects, non-TTY/headless workflows, or agent-run `fn` commands. +- c676cbe: Update `fn onboard` CLI HELP text and CLI reference docs to match shipped onboarding behavior, including auto-launch conditions, skip paths, and onboarding escape hatches (`--skip-onboarding`, `FUSION_SKIP_ONBOARDING`). +- 1aef3c9: Fixes a mobile dashboard crash path where toggling the in-review auto-merge switch could blank the UI until refresh on some Android/legacy WebView environments. +- 327f0a9: Fix shared branch-group execution to always derive per-task working branches (`fusion/`) for checkout/worktree operations while keeping the branch-group branch as the merge target. +- e16893a: Classify provider 400 errors for unsupported `messages.[n].role` values as operator-actionable agent errors, and annotate prompt-boundary failures with a clear model/provider compatibility hint. This stops invisible retry loops and makes misconfigured imported agent model/provider combinations fail fast with actionable diagnostics. +- b4230c0: Reuse imported GitHub source issues as task tracking links when GitHub tracking is enabled, instead of creating a duplicate issue. Tasks imported from GitHub now link their existing `sourceIssue` (when valid) as `githubTracking.issue` with no GitHub auth or issue creation call required. +- 8376781: Fix mobile Task Detail Logs scrolling for branch-group tasks by making the branch-group card collapsible and re-pinning the agent log viewer when its container height changes. +- e561290: Fix shared-branch-group member finalization so routed members land on the group's shared branch instead of being auto-finalized against the project default branch. Also harden already-landed commit attribution so the recovery detector never claims a commit that merely mentions a task ID in prose (2026-05-23 lost-work regression): the `git log --grep` ancestry fallback is now ownership-anchored on a Fusion trailer or a task-scoped conventional-commit subject. +- d4db0b0: CLI auto-launch now honors the persisted `cliOnboardingCompletedAt` marker so onboarding fires only once, even when the Central DB step was skipped during `fn onboard`. +- 7d1708f: Fix `fn_goal_list` and `fn_goal_show` so tool calls made from Fusion worktree directories resolve the canonical project database and return goals created through the dashboard UI. +- 684baa0: Stop queued chat messages from disappearing after back-navigation while the assistant is still responding (GitHub #1279). + + Re-entering a chat restored the queued follow-up and immediately flushed it based on the client's local `isGenerating` flag — which is stale mid-generation (it is a route-level enrichment the `chat:session:updated` SSE payload lacks). The premature send aborted the live generation server-side and could lose the queued message entirely, since its persisted copy was deleted before the send. + + The restore path in both Chat and Quick Chat now confirms with the server before flushing: if a generation is still in flight it re-attaches to the stream and lets completion deliver the queued message; the message is sent immediately only when the server reports no active generation. On a failed check the queued bubble is kept for a later flush trigger. + +- e6ce500: Fix the dashboard skills interface so enabled and disabled skill toggles persist across refreshes for both top-level and package-scoped skills. The adapter now normalizes stored skill paths consistently when writing settings and when rediscovering installed skills. +- c60dae1: Fix the desktop quick chat panel so moving the FAB while the panel is closed no longer shrinks or overwrites the saved panel size before the next reopen. +- f3732af: Fix chat message sends with file attachments by parsing multipart form bodies on the chat messages SSE endpoint. + + Uploaded message attachments are now validated, persisted to the session attachment directory, converted into chat attachment metadata, and forwarded to the chat manager while JSON-only message sends continue to work unchanged. + +- de23db3: Bump `@earendil-works/pi-coding-agent` and `@earendil-works/pi-ai` from `^0.77.0` to `^0.78.0`. See the upstream pi coding agent changelog for [`0.78.0` (2026-05-29)](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/CHANGELOG.md#0780---2026-05-29). +- 7d20a99: Clear stale active-session registry entries when PR-mode merge cleanup removes a task worktree. +- 48e08c0: Recover mission interview drafts that were sent to the background from the final summary step. Plan-ready `complete` mission interview sessions now remain resumable across the dashboard, `fn mission list`, and `fn_mission_list` until they are approved into a mission or discarded. +- a66b128: Fix Planning Mode single-task session history so completed sessions remain restorable from the summary view after task creation. +- d9e1cdb: Fix agent-created ntfy task notifications so they include the task description when a title has not been assigned yet. +- dab1569: Fix Planning Mode session history so duplicate AI-session rows are collapsed by session id and deleting a history entry only succeeds when the server-side delete persists. +- ac92174: Fix a Planning Mode reliability bug where creating a single task could fail with a browser-level `Failed to fetch` error when post-create side effects threw or rejected before the dashboard finished responding. +- cf23c6f: Run the configured `worktreeInitCommand` on merge worktrees before AI merge verification across warm and cold integration modes, so merge verification uses the same project-specific bootstrap as executor worktrees. +- e33dadd: Fix fresh-install `pnpm install` bin-link warnings by pointing the published `fn`/`fusion` bins at a committed `bin.mjs` launcher that forwards to the built CLI output. +- 3d18872: Fix the dashboard OAuth login flow for ChatGPT Plus/Pro (Codex Subscription) so multi-option provider selection prompts no longer cancel the login before browser auth starts. +- a1b7556: persist the OAuth expiry alert/notification throttle so users are alerted at most once per provider every 12 hours, even across server restarts. +- 419f688: Fix the dashboard auto-merge toggle blanking on mobile by keeping board stabilization tied to viewport events instead of a one-shot resize listener. + + The in-review board now stays visible when auto-merge is toggled across Android mobile, iOS mobile, tablet, and desktop layouts, with regression coverage for populated and empty columns plus rollback and error-boundary paths. + +- de3273e: Clear the in-review stall deadlock auto-pause on user-initiated retry so dashboard, CLI, and extension retries can actually resume merge/execution work without overriding manual pauses. +- 6a00dd2: Stop missions from silently looping or stalling when agents can't run their tasks (GitHub #1261). + + Importing a catalog ("company") agent assigns it the role `custom`, which the scheduler never auto-assigns mission/queue work to. Combined with a model/provider that rejects the `developer` system role, this surfaced to users as an invisible, repeating failure loop. + + - **Auto-recover from incompatible roles:** an "unsupported message role" provider rejection (e.g. a reasoning model sending the `developer` role to a provider that only accepts `system`/`user`/`assistant`/`tool`) is now treated as a model-selection error, so a configured fallback model is tried once before the task is marked failed. The single-swap guard keeps an incompatible fallback from looping. + - **Stop the retry loop:** operator-actionable failures (unsupported role, auth, quota) now block the mission feature immediately with a clear event instead of burning the full retry budget re-running the same cryptic error. + - **Preflight mission start:** when ephemeral agents are disabled and no eligible executor agent exists, starting a mission now fails fast with an actionable message instead of queueing tasks forever. + - **Warn on import:** importing only `custom`-role agents now surfaces a warning that they won't be auto-assigned mission work unless one is given the `executor` role. + +- 08d25f0: Streamline the Task Changes tab header controls on mobile so diff navigation and actions use a more compact layout. +- fa23782: Fix the dashboard mobile auto-merge toggle blank-screen regression by restoring shared mobile breakpoint coverage and strengthening the regression suite across mobile, tablet, desktop, rollback, and task-review detail surfaces. +- e84410e: Fix duplicate GitHub tracking issues and harden GitHub issue import deduping. +- 60eb2ec: Allow failed agents to be stopped and deleted consistently across the dashboard and CLI guidance. + + Agents in the error state can now transition to paused, the dashboard exposes delete actions for failed agents in list/detail views, and regression coverage protects the updated behavior. + +- f77aa07: Fix auto-merge toggle not appearing on the built-in coding workflow's in-review column. The builtin:coding IR now carries the correct column traits (merge-blocker, human-review) so the dashboard resolves and passes the auto-merge toggle to the in-review column. +- 4ffd0a2: Restore terminal task notifications for workflow/PR-backed completions that move tasks to done before emitting the canonical merged lifecycle event. +- 8bc3d7b: Harden dependency security floors by forcing protobufjs resolutions to patched versions and upgrading Vitest tooling to the patched 4.1 line. +- a2f4bb1: Removed the `collapsible`, `collapseStorageKey`, and `collapsedLabel` props from `WorkflowSelector`. Callers should stop passing these props; workflow selectors now always render expanded. +- fc33a42: Open the workflow editor on the selected board workflow when using the workflow-mode edit action. +- be7645f: Right-align the task-card promote action at the end of the card action row. +- 07a5365: Fix workflow/AI merge ntfy notification delivery by preserving merge-backed task metadata, treating an empty ntfy event allowlist as the documented default events, and allowing failed/no-provider notification attempts to retry after settings refresh. +- 6ec0e2b: Fix task changed-file counts for stacked or cherry-equivalent task branches by filtering active review diffs to commits attributed to the current task. +- 7c4e44d: Prevent QuickEntry quick-action buttons from stealing or restoring textarea focus on mouse down, preserving existing click behavior while avoiding unwanted mobile keyboard refocus. +- 576ff77: Stop failing task worktree acquisition and branch authority checks when a task branch contains foreign task-attributed commits. +- b7a56cc: Stop classifying benign workflow-graph exits after a task already advanced or paused as failures. These exits now use info-level benign wording while genuine in-progress graph failures keep the existing failure handling. +- 99661c1: Add an expand/collapse control for the workflow prompt editor so long prompts can be edited in a fullscreen overlay. +- 477c8f1: Tokenize bare hex colors in ScriptsModal and SettingsSyncLog CSS to use semantic custom properties. +- 4435ca2: Detect Codex model-auth-tier incompatibility as a model-selection error, trigger configured fallback models, and surface an actionable diagnostic when no fallback is available. +- d7e1454: Make the Nodes screen open as a full-screen mobile overlay so it covers the header while staying above the mobile nav. +- 1c69ea7: Fix CLI task retry behavior and plugin SDK runtime shims, and harden CLI tests against stale constructor mocks. +- de7b110: Fix the Nodes view tablet overlay so node cards and topology content no longer bleed through node detail modals. +- bbf3de9: Fix merger AI commit finalization so deleted tasks no longer crash settings resolution while the merge is completing. +- d9d67fb: Hide the compound engineering built-in workflow unless the `fusion-plugin-compound-engineering` plugin is installed. +- c9d48fb: Revalidate dashboard service-worker assets before falling back to cache so rebuilt tabs cannot stay on stale bundles and render a blank page. +- fa68edf: Fix the integrated dashboard terminal so Ctrl/Cmd+C copies selected terminal text without swallowing plain SIGINT behavior, and Ctrl/Cmd+V pastes clipboard text into the active session. +- e883a8d: Fix retry handling for stranded in-review tasks whose status is unset by allowing retry when execution is incomplete or a merge retry has already been attempted. +- 7a9d2b0: Suppress in-review stall and merge-stalled signals for tasks already owned by the merge queue. +- 0b0186a: Suppress legacy stalled-review badges and re-enqueue churn for tasks already owned by the merge queue. +- 5f5852d: Fix coding-agent startup and tool boundary checks from AI merge temp worktrees on macOS by comparing Git worktree paths with filesystem-canonical paths. +- 85c3420: Fix Fusion task tools from AI merge temp worktrees so merger agents can fetch task details without trying to bootstrap a nested project. +- 6f37806: Fix missing model rows in the Minimax provider usage panel. The primary `general` model meters quota purely via `current_interval_remaining_percent` (its count fields are `0`), so the previous count-based visibility filter dropped it entirely. + + Minimax usage now prefers the authoritative `*_remaining_percent` field (with a count-based fallback) and renders a window only when a model exposes any quota signal. Each model's separate weekly quota window (`current_weekly_remaining_percent`, `weekly_*` timing) is now surfaced as its own indicator alongside the interval window. + +- ad46881: Respect per-task auto-merge overrides when the global auto-merge setting is off. Tasks with auto-merge explicitly enabled now get enqueued for merge and covered by the in-review self-healing sweeps (stall surfacing, merged-task finalization, retry recovery) even when the project-level setting is disabled; tasks without an explicit override keep the PR-based/manual review flow untouched. +- 1c49ae6: Fix mobile quick-entry action buttons so nested icons and labels do not trigger browser touch gestures instead of toggling their controls. +- be0140c: Fix the bundled dependency graph plugin so the graph view fills the available dashboard width. +- aa8bd3d: Fix stuck task recovery by preserving retryable requeues, supervising verification subprocesses, and narrowing executor verification guidance to impacted work. +- b6243d6: Suppress transient dashboard fetch errors after tab resume so cached data remains visible and executor status shows a reconnecting state instead of raw network errors. +- c27c321: Fix mobile Quick Entry action buttons so taps rely on native browser click synthesis instead of a manual touchend click. +- 614bec2: Fix the vitest memory-pressure auto-kill firing on a garbage metric and killing innocent processes. The guard probed `os.availableMemory` (which does not exist) and silently fell back to `os.freemem()`, which on macOS reads ~99% used on an idle machine — so with the toggle on, every vitest process was SIGKILLed every 30 seconds regardless of real memory pressure. It now reads `process.availableMemory()` (Node 22+) and refuses to auto-kill when only the unreliable freemem fallback is available. Kill targeting is also fixed: `pgrep -f vitest` matches full command lines (wrapper shells, monitors, editors that merely mention vitest); the TUI auto-kill/manual kill and the dashboard `POST /api/kill-vitest` + system-stats count now filter matches to actual node processes via a shared `findVitestProcessIds` helper. +- e138971: Fix workflow board/list workflow selection, custom workflow task creation controls, workflow editor defaults, built-in workflow node prompt display, and executor handling for built-in workflow runs. +- 4b4c32d: Fix workflow scheduling so in-progress column limits are enforced from fresh task state after hold-advancing sweep dispatches. +- ff0750c: Fix the workflow graph editor opening invisibly and bundle the Compound Engineering and Roadmaps plugins. + + - The "Graph editor" button now actually shows the editor: its overlay was rendered without the `open` class, leaving it `display: none`, so opening it looked like the workflow steps view was just dismissed. + - `fusion-plugin-compound-engineering` and `fusion-plugin-roadmap` are now listed in the dashboard's built-in plugins, so they appear under Settings → Built-in Plugins (they were implemented and registered but missing from the list). + - Installing Compound Engineering (and CLI Printing Press) from Settings → Built-in Plugins no longer fails with "Plugin manifest not found": both ids are now in the dashboard's bundled-plugin fallback set, and the Compound Engineering plugin is staged into `dist/plugins/` so packaged installs can resolve it. + - Plugins installed from Settings now load instead of erroring with "Plugin entry must be a file, got directory": the dashboard install routes register the plugin's loadable entry file (`bundled.js`/`dist/index.js`/`src/index.ts`) rather than the package directory, and enabling a plugin heals legacy directory-path registrations in place. + +- 8f42098: Route task execution through workflow-native runtime primitives and make the built-in coding workflow explicitly own planning before execute/review/merge. +- a533307: Restore file-overlap blocking for workflow-column task releases so cards stay queued with overlap badges until active file-scope leases clear. +- 83565a5: Fix workflow-native dispatch capacity accounting and publish workflow node task metadata to the existing task fields used by scheduler and dashboard surfaces. +- cd8126d: Honor the worktree execution limit when workflow-column hold releases dispatch tasks. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [61d6874] +- Updated dependencies [f76716e] +- Updated dependencies [93e8bd9] +- Updated dependencies [26bc80a] +- Updated dependencies [fab8a62] +- Updated dependencies [2d81a95] +- Updated dependencies [40c0048] +- Updated dependencies [9c84ba2] +- Updated dependencies [489a287] +- Updated dependencies [934071c] +- Updated dependencies [d75f861] +- Updated dependencies [db971a9] +- Updated dependencies [30ba1f0] +- Updated dependencies [07dcb16] +- Updated dependencies [c1c99a9] +- Updated dependencies [f3b700a] +- Updated dependencies [d8248b4] +- Updated dependencies [ace7106] +- Updated dependencies [7a80d29] +- Updated dependencies [8bac390] +- Updated dependencies [10acf17] +- Updated dependencies [b9afce3] +- Updated dependencies [5872331] +- Updated dependencies [17c9303] +- Updated dependencies [243113a] +- Updated dependencies [e10db81] +- Updated dependencies [57631c7] +- Updated dependencies [3cf13dd] +- Updated dependencies [ee5f5e8] +- Updated dependencies [38b84a3] +- Updated dependencies [68e52e3] +- Updated dependencies [314411c] +- Updated dependencies [7d417a1] +- Updated dependencies [978d07c] +- Updated dependencies [c2604d5] +- Updated dependencies [a27921a] +- Updated dependencies [77a1099] +- Updated dependencies [944c03d] +- Updated dependencies [feceedb] +- Updated dependencies [e854d33] +- Updated dependencies [40b4919] +- Updated dependencies [641b932] +- Updated dependencies [e1a35a3] +- Updated dependencies [38e0422] +- Updated dependencies [245129e] +- Updated dependencies [c676cbe] +- Updated dependencies [2053f3f] +- Updated dependencies [1aef3c9] +- Updated dependencies [327f0a9] +- Updated dependencies [e9de195] +- Updated dependencies [eb425d1] +- Updated dependencies [9c29e2e] +- Updated dependencies [3373c0b] +- Updated dependencies [e16893a] +- Updated dependencies [130f6f1] +- Updated dependencies [b4230c0] +- Updated dependencies [0a418e6] +- Updated dependencies [8376781] +- Updated dependencies [e561290] +- Updated dependencies [d4db0b0] +- Updated dependencies [7d1708f] +- Updated dependencies [684baa0] +- Updated dependencies [e6ce500] +- Updated dependencies [c60dae1] +- Updated dependencies [f3732af] +- Updated dependencies [de23db3] +- Updated dependencies [7d20a99] +- Updated dependencies [48e08c0] +- Updated dependencies [a66b128] +- Updated dependencies [d9e1cdb] +- Updated dependencies [dab1569] +- Updated dependencies [30a09e3] +- Updated dependencies [abbeaec] +- Updated dependencies [577ce12] +- Updated dependencies [3b9ff42] +- Updated dependencies [cc18206] +- Updated dependencies [ac92174] +- Updated dependencies [cf23c6f] +- Updated dependencies [d72cb2a] +- Updated dependencies [e33dadd] +- Updated dependencies [3d18872] +- Updated dependencies [a1b7556] +- Updated dependencies [419f688] +- Updated dependencies [de3273e] +- Updated dependencies [6a00dd2] +- Updated dependencies [8aed4da] +- Updated dependencies [8891d4b] +- Updated dependencies [08d25f0] +- Updated dependencies [fa23782] +- Updated dependencies [e84410e] +- Updated dependencies [60eb2ec] +- Updated dependencies [f77aa07] +- Updated dependencies [4ffd0a2] +- Updated dependencies [13c6d96] +- Updated dependencies [8bc3d7b] +- Updated dependencies [a2f4bb1] +- Updated dependencies [fc33a42] +- Updated dependencies [6271778] +- Updated dependencies [be7645f] +- Updated dependencies [07a5365] +- Updated dependencies [6ec0e2b] +- Updated dependencies [7c4e44d] +- Updated dependencies [0b7549a] +- Updated dependencies [576ff77] +- Updated dependencies [b7a56cc] +- Updated dependencies [99661c1] +- Updated dependencies [477c8f1] +- Updated dependencies [4435ca2] +- Updated dependencies [1b7e52e] +- Updated dependencies [d7e1454] +- Updated dependencies [1c69ea7] +- Updated dependencies [de7b110] +- Updated dependencies [bbf3de9] +- Updated dependencies [d9d67fb] +- Updated dependencies [c9d48fb] +- Updated dependencies [b1454c1] +- Updated dependencies [f9e5513] +- Updated dependencies [34c8ac9] +- Updated dependencies [5c4c765] +- Updated dependencies [fa68edf] +- Updated dependencies [e883a8d] +- Updated dependencies [d071aec] +- Updated dependencies [9072d71] +- Updated dependencies [7a9d2b0] +- Updated dependencies [0b0186a] +- Updated dependencies [5f5852d] +- Updated dependencies [85c3420] +- Updated dependencies [6f37806] +- Updated dependencies [c1a7231] +- Updated dependencies [ad46881] +- Updated dependencies [fbc2c37] +- Updated dependencies [1c49ae6] +- Updated dependencies [bd5315f] +- Updated dependencies [d8a015e] +- Updated dependencies [be0140c] +- Updated dependencies [7076dd4] +- Updated dependencies [aa8bd3d] +- Updated dependencies [b6243d6] +- Updated dependencies [c27c321] +- Updated dependencies [614bec2] +- Updated dependencies [e138971] +- Updated dependencies [4b4c32d] +- Updated dependencies [4fa5407] +- Updated dependencies [60605fa] +- Updated dependencies [71822f2] +- Updated dependencies [ff0750c] +- Updated dependencies [a504238] +- Updated dependencies [61ae1bf] +- Updated dependencies [8f42098] +- Updated dependencies [a533307] +- Updated dependencies [83565a5] +- Updated dependencies [e2707af] +- Updated dependencies [cd8126d] + - @runfusion/fusion@0.40.0 + +## 0.39.0 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion-plugin-examples/cli-printing-press@0.1.17 +- @fusion-plugin-examples/cursor-runtime@0.1.19 +- @fusion-plugin-examples/dependency-graph@0.1.31 +- @fusion-plugin-examples/droid-runtime@0.1.26 +- @fusion-plugin-examples/hermes-runtime@0.2.50 +- @fusion-plugin-examples/openclaw-runtime@0.2.50 +- @fusion-plugin-examples/paperclip-runtime@0.2.50 +- @fusion-plugin-examples/roadmap@0.1.19 +- @fusion/core@0.39.0 +- @fusion/engine@0.39.0 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/dashboard@0.39.0 +- @fusion/core@0.39.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.39.0 +- @fusion/pi-claude-cli@0.39.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- 3d22a98: Fix Windows binary-release build failure: add the DOM lib to `@fusion/plugin-sdk`'s tsconfig. Because `@fusion/core` exports its types as raw `src/*.ts`, plugin-sdk recompiles core's source under its own compiler options; without the DOM lib the global fetch `Response` type (`.ok`/`.status`/`.json`) resolved inconsistently across platforms and broke the Windows CLI and desktop release jobs (TS2339). + - @fusion/core@0.39.0 + +### @runfusion/fusion + +#### Minor Changes + +- 3b59487: Add a new `fn_mission_update` extension tool to patch mission `title`/`description` without recreating missions, and classify it as a mission mutation tool in readonly/permanent gating policy. +- 194dfa9: Add a run-audit cited-goal trail for goal anchoring flows. + + - Enrich `goal:injection-applied`, `goal:injection-skipped`, and `goal:retrieval-invoked` events with `metadata.goalIds` (IDs/counts only). + - Add core aggregation helper `collectCitedGoalIdsFromAudit(...)` to derive injected/retrieved/combined cited goal IDs from run-audit events. + - Add dashboard API endpoint `GET /api/agents/:id/runs/:runId/cited-goals` to query cited goal IDs for a run. + +- 3d22a98: Add the Workflow IR v1 contract surface via `@fusion/core`, including versioned graph types (`WorkflowIr`), runtime parsing/validation (`parseWorkflowIr`), serialization (`serializeWorkflowIr`), and a canonical built-in fixture (`BUILTIN_WORKFLOW_IR_FIXTURE`) for interpreter parity testing. +- 0ffe7f0: Add mission delete tooling for agents: `fn_feature_delete`, `fn_slice_delete`, and `fn_milestone_delete`. + + Mission feature/slice/milestone deletes now enforce a linked live-task guard by default and return clear conflict errors. Callers can pass `force: true` to clear mission linkage and proceed with hard deletion. + +- acad46c: Expose mission assertion backfill through operator-facing surfaces. + + - Added dashboard API route `POST /api/missions/:missionId/backfill-assertions` with dry-run default and `MissionAssertionBackfillReport` response. + - Added agent/CLI tool `fn_mission_backfill_assertions` for dry-run/apply remediation of FN-5696 legacy zero-assertion features. + - Updated mission operator docs and synced fusion skill/tool reference docs. + +- 1edbb54: Add a flagged-off Workflow Graph Executor scaffold and built-in coding lifecycle Workflow IR exports. + + - Adds `BUILTIN_CODING_WORKFLOW_IR` and `buildBuiltinCodingWorkflowIr` to `@fusion/core`. + - Adds `WorkflowGraphExecutor` and `WORKFLOW_GRAPH_EXECUTOR_FLAG` to `@fusion/engine`. + - Adds parity-harness skeleton tests and IR documentation updates. + + The new executor path is gated by `experimentalFeatures.workflowGraphExecutor` and remains strict no-op while disabled (default). + +- ba81d1f: Add workflow graph interpreter node handlers and traversal semantics behind the default-off `workflowGraphExecutor` experimental flag. The interpreter now supports prompt/script/gate dispatch through legacy seam DI, edge-condition routing (`success`/`failure`/`outcome:`), bounded retries, and parity-oriented tests for no-op flag behavior and lifecycle routing. +- 5b4eecb: Add workflow interpreter dual-observe parity instrumentation surfaces for phased rollout. + + - Export pure workflow parity comparison helpers from `@fusion/core` (`compareWorkflowRunObservations`, `compareWorkflowRunAudits`) with structured drift reports. + - Add `observeWorkflowParity` in the engine as a default-OFF, fail-soft observer gated by `experimentalFeatures.workflowInterpreterDualObserve`. + - Emit run-audit parity events (`workflow:parity-observed`, `workflow:parity-drift`) for shadow agreement/drift visibility without changing authoritative legacy execution. + +- 0c42578: Wire branch-group-aware merge routing into the merge path. Tasks marked with `branchContext.assignmentMode = "shared"` now merge onto their group's integration branch (`branch_groups.branchName`) in both direct merge and PR-mode base-branch resolution, while ungrouped and `per-task-derived` tasks keep existing default-branch behavior. + + This release also adds reliability backstop coverage for grouped vs ungrouped routing and branch-group merge audit telemetry (`merge:branch-group-routed`). + +- 06d8490: feat(FN-5783): enforce branch-group autoMerge precedence for grouped promotion gating and audit visibility +- e2101ea: Add single group-level pull request behavior for shared `branch_groups` in PR merge mode. + + When tasks share a `branchContext.groupId`, Fusion now opens and tracks one PR for the group's integration branch instead of creating one PR per task. The group PR metadata is written back to `branch_groups` and refreshed from merge-status polling. + +- 7b70e7f: Add a branch-group promotion eligibility hook to the engine merge lifecycle via `evaluateBranchGroupPromotion`, and emit `merge:branch-group-promotion-gated` audit telemetry whenever shared-group member landings are evaluated for downstream group→default promotion readiness. +- 5930c18: Add a new opt-in `task-created` notification event for ntfy/webhook providers. + + - `task-created` fires when a task is created by an agent (`sourceAgentId` present), including agent-issued `fn_task_create` calls. + - Event is off by default and must be explicitly enabled in Settings → Notifications (`ntfyEvents` / provider `events`). + - ntfy formatting includes agent attribution and task deep-linking to the created task. + +- b1c1a33: Add safe `fn task deps` commands for audited task dependency mutations. + +#### Patch Changes + +- 62bc1e4: Removed the `showGitHubStarButton` setting and its Project General toggle from Settings. + + The Settings header "Star on GitHub" button remains available (always shown) while the dedicated visibility setting is no longer configurable. + +- a7347ad: Skip self-owned branch reclaim for dependency-blocked todo tasks so repaired queued work is not repeatedly resumed before its blocker clears. +- 6ba3cbf: Respect dashboard task-list column filters so API callers receive only tasks in the requested persisted column. +- 3dee395: Block AI merge finalization when the checked-out integration worktree is dirty instead of stashing local changes into the merge landing path by default, with an explicit Merge settings UI escape hatch for the legacy dirty-checkout sync behavior. +- 716f396: Fix room chat send reliability by preventing concurrent in-flight room dispatches, classifying ambiguous delivered sends as delivered (so composer text is not restored), and hardening optimistic/SSE reconciliation to avoid duplicate user message rendering. +- 4148f43: Fix the Binary Release workflow so platform binaries publish to GitHub Releases again: + + - The release job now tolerates a single failing build leg instead of being skipped, which previously suppressed all assets. + - The node_modules cache key includes CPU arch (so arm64 runners no longer restore x64 native deps, fixing the `@rollup/rollup-linux-arm64-gnu` build crash) and the job id (so same-OS/arch jobs don't race on one key and fail the post-job cache save). + - The macOS and Windows CLI signing steps are skipped gracefully when their certificate secrets are absent, so unsigned binaries still publish. + - Desktop packaging now invokes `electron-builder` directly via `pnpm exec` instead of the `dist:*` scripts: pnpm leaked the `--` separator into script args, which made electron-builder ignore `--publish never` (auto-publishing to the wrong repo and 404ing) and drop the Linux `--x64 --arm64` flags. + - The desktop build spawns workspace `.cmd` bins with a shell on Windows, fixing the `spawn EINVAL` failure. + - The desktop package declares an `author` with email so the Linux `.deb` target (fpm) can build. + - The Linux AppImage verify step matches electron-builder's actual x64 output name (`-linux-x86_64.AppImage`). + - `@types/node` is pinned workspace-wide via a pnpm override so the desktop/plugin-sdk build is deterministic (a stale transitive `@types/node` lacking global `fetch`/`Response` types intermittently broke the Windows desktop build). + - The `build-exe-cross` tests that cross-compile platform binaries are now opt-in (`FUSION_TEST_BUILD_EXE=1`) instead of auto-running on every CI run; native per-platform binary builds remain covered by `test-release.yml`. + - A workflow_dispatch run now builds and uploads binaries as artifacts for validation without creating a release (release creation is gated to tag pushes). + - The dependency-graph plugin build uses a cross-platform copy step that no longer breaks the Windows desktop build. + - The macOS Intel (`bun-darwin-x64`) CLI binary is no longer built/shipped — `macos-13` runners are too scarce to build reliably and were blocking releases. The macOS CLI is now Apple-Silicon-only; the desktop macOS DMG/ZIP remains universal. + +- f8bda56: Fix scheduler overlap starvation for coordination-only tasks by allowing no-commit/coordination scopes to bypass active file-scope leases when overlaps are limited to safe read-only paths. Implementation tasks with real write-scope overlaps remain serialized behind active leases. +- 033f74c: Improve `fn_feature_link_task` error handling when linking to tasks that are not on the active board. Instead of surfacing a raw SQLite foreign key failure, the tool now returns a clear validation error explaining that only active (non-archived, non-deleted) tasks can be linked to mission features. +- 3255965: Fix mission assertion-validation trigger gaps so mission-linked tasks reaching done no longer bypass validator execution. + + Assertion-linked features now stay completion-gated until validator pass, and startup recovery replays implementing features whose linked tasks are already done/archived but still lack a passing validator status. + +- 1594470: Fix mission loop no-assertions auto-pass handling so completion deterministically advances feature `loopState` to `passed`, sets `lastValidatorStatus` to `passed`, and emits the structured `validation_auto_passed_no_assertions` audit event exactly once. +- 9c4e8ed: Realize the mission completion-gate contract for live Goals mission workflows. + + - Fix mission execution auto-pass behavior so zero-assertion features move to `loopState: "passed"` (not stuck in `implementing`) and emit `feature_auto_passed_no_assertions` telemetry while preserving `validation:passed` emission. + - Add milestone guard signaling for prose acceptance criteria with zero structured assertions via `hasProseButNoAssertions` rollup and warning event `milestone_missing_structured_assertions`. + - Add an idempotent `seedContractAssertionsForFeatures(...)` helper for operator-run assertion persistence and coverage tests. + - Reconcile MissionManager labels/copy to clearly separate enforced contract assertions from informational feature acceptance criteria, including warning badge and indicators. + +- 20c1c32: Persist merge-request handoff shadow contract and accepted marker for Phase 1 reliability scaffolding. +- bb0f693: Fixes a dashboard regression where toggling the in-review Auto-merge switch could leave the UI in a broken/blank state until refresh. Auto-merge toggle state updates now remain consistent during rapid toggles, and regression coverage was added for the settings hook path. +- 292bf07: Fix merger agent-log visibility by flushing buffered `AgentLogger` output before disposing AI sessions used for autostash conflict resolution, autostash hard-fail recovery, and rebase conflict resolution. This ensures trailing text/thinking deltas are persisted so merger activity reliably appears in the task agent log panel. +- 5396730: Harden mission validation end-to-end by locking the canonical zero-assertion auto-pass path, strengthening assertion pass/fail regression coverage, and wiring bounded periodic mission recovery into existing self-healing maintenance so stranded implementing features recover without engine restart. +- b154844: Fixes an executor worktree self-heal gap where `task.worktree` could be recorded as a nested subdirectory of a valid git worktree root. + + When a nested path is detected under a registered worktree inside the configured worktrees directory, Fusion now re-anchors `task.worktree` to the actual git top-level and continues execution. Genuine mismatches (repo root, outside configured worktrees dir, or unregistered top-level) still fail with existing `wrong_toplevel` and liveness guard behavior. + +- 93e8a5f: Persist AI merge agent text, thinking, and tool output to task agent logs in AI merger mode. +- 9f29935: Throttle `oauth-token-expired` notifications to at most once per provider every 12 hours, even when the credential `expires` timestamp changes across refreshes/replacements. +- 793da2c: Refinement tasks now inherit the source task’s GitHub tracking state, preventing auto-created tracking issues when the source task was not GitHub-linked. +- 2140ab2: Repair dropped spaces after sentence-ending punctuation in streamed agent responses (chat and agent logs) across all providers by applying the streaming-delta sentence-boundary fix at the shared engine delta chokepoints, not just the per-provider CLI bridges. +- ffadb0c: Fix GitHub tracking reconciliation for soft-deleted and archived tasks by adding a periodic 15-minute sweep, paginating archive/deleted candidate scans, and correcting done-task filtering to use the task column. +- fa428a4: Run the configured `worktreeInitCommand` when the merger has to create a fresh merge worktree during reuse-worktree reacquisition. This bootstraps newly created merge workspaces before merge verification/workflow steps run, while leaving pooled/reused existing worktrees unchanged. +- ab38ee0: Requeue incomplete stuck-loop exhausted tasks in todo with progress preserved instead of routing them through review/merge or requiring manual unpause. +- c6b3b77: Treat foreign-attributed commits reachable from origin/main as already integrated during branch contamination checks to avoid false-positive recovery loops when local main is stale. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [62bc1e4] +- Updated dependencies [a7347ad] +- Updated dependencies [6ba3cbf] +- Updated dependencies [3dee395] +- Updated dependencies [716f396] +- Updated dependencies [4148f43] +- Updated dependencies [f8bda56] +- Updated dependencies [3b59487] +- Updated dependencies [033f74c] +- Updated dependencies [3255965] +- Updated dependencies [1594470] +- Updated dependencies [9c4e8ed] +- Updated dependencies [20c1c32] +- Updated dependencies [bb0f693] +- Updated dependencies [292bf07] +- Updated dependencies [5396730] +- Updated dependencies [194dfa9] +- Updated dependencies [3d22a98] +- Updated dependencies [0ffe7f0] +- Updated dependencies [acad46c] +- Updated dependencies [1edbb54] +- Updated dependencies [ba81d1f] +- Updated dependencies [5b4eecb] +- Updated dependencies [b154844] +- Updated dependencies [93e8a5f] +- Updated dependencies [9f29935] +- Updated dependencies [793da2c] +- Updated dependencies [0c42578] +- Updated dependencies [06d8490] +- Updated dependencies [e2101ea] +- Updated dependencies [7b70e7f] +- Updated dependencies [2140ab2] +- Updated dependencies [ffadb0c] +- Updated dependencies [fa428a4] +- Updated dependencies [5930c18] +- Updated dependencies [ab38ee0] +- Updated dependencies [c6b3b77] +- Updated dependencies [b1c1a33] + - @runfusion/fusion@0.39.0 + +## 0.38.1 + +### @fusion/dashboard + +#### Patch Changes + +- bad8f52: Improve the mission manager mobile stacked layout so mission rows reflow cleanly: stacked mission list items switch to a column layout with stretched content, item actions become full-width and wrap instead of cramped inline controls, and run controls span the full width. + - @fusion-plugin-examples/cli-printing-press@0.1.16 + - @fusion-plugin-examples/dependency-graph@0.1.30 + - @fusion-plugin-examples/roadmap@0.1.18 + - @fusion/core@0.38.1 + - @fusion/engine@0.38.1 + - @fusion-plugin-examples/cursor-runtime@0.1.18 + - @fusion-plugin-examples/droid-runtime@0.1.25 + - @fusion-plugin-examples/hermes-runtime@0.2.49 + - @fusion-plugin-examples/openclaw-runtime@0.2.49 + - @fusion-plugin-examples/paperclip-runtime@0.2.49 + +### @fusion/desktop + +#### Patch Changes + +- Updated dependencies [bad8f52] + - @fusion/dashboard@0.38.1 + - @fusion/core@0.38.1 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.38.1 +- @fusion/pi-claude-cli@0.38.1 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.38.1 + +### @runfusion/fusion + +#### Patch Changes + +- bad8f52: Fix the Binary Release workflow so platform binaries publish to GitHub Releases again. The release job now tolerates a single failing build leg instead of being skipped (which previously suppressed all assets), the node_modules cache key includes CPU arch to stop arm64 runners restoring x64 native deps, the macOS CLI signing step is skipped gracefully when Apple certs are absent, and the dependency-graph plugin build uses a cross-platform copy step that no longer breaks the Windows desktop build. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [bad8f52] + - @runfusion/fusion@0.38.1 + +## 0.38.0 + +### @fusion/dashboard + +#### Patch Changes + +- Updated dependencies [9112b7d] + - @fusion/engine@0.38.0 + - @fusion-plugin-examples/cli-printing-press@0.1.15 + - @fusion-plugin-examples/dependency-graph@0.1.29 + - @fusion-plugin-examples/roadmap@0.1.17 + - @fusion/core@0.38.0 + - @fusion-plugin-examples/cursor-runtime@0.1.17 + - @fusion-plugin-examples/droid-runtime@0.1.24 + - @fusion-plugin-examples/hermes-runtime@0.2.48 + - @fusion-plugin-examples/openclaw-runtime@0.2.48 + - @fusion-plugin-examples/paperclip-runtime@0.2.48 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/dashboard@0.38.0 +- @fusion/core@0.38.0 + +### @fusion/engine + +#### Patch Changes + +- 9112b7d: Fix scheduler overlap deferral starvation by considering only runnable queued todo tasks as higher-priority overlap competitors. Dependency-blocked queued tasks now keep their unmet-dependency queue state without reserving overlapping files from ready work, while active in-progress and eligible in-review tasks continue to hold explicit file-scope leases. Dispatch logs now distinguish unmet dependencies, active file-scope lease blocking, and higher-priority runnable queued-task deferral. + - @fusion/core@0.38.0 + - @fusion/pi-claude-cli@0.38.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.38.0 + +### @runfusion/fusion + +#### Minor Changes + +- afc3b47: Adds goal-anchoring run-audit observability for Slice 2 hybrid anchoring with three `database` mutation types: `goal:injection-applied`, `goal:injection-skipped`, and `goal:retrieval-invoked`. + + Events carry count-only metadata contracts (`count`, plus `lane` for injection and `toolName` for retrieval, with optional `truncated`/`reason`/`notFound`) and avoid prompt bodies or goal title/description payloads. These events are available through the existing `GET /api/agents/:id/runs/:runId/audit` timeline route with standard date-range filtering via `startTime`/`endTime`. + +- 71e2aec: Add a goal-citation audit trail to support Slice 2 anchoring success-signal measurement. + + - Introduce a persisted `goal_citations` table (schema v93) with deduplication on `(goalId, surface, sourceRef)`. + - Record citations from `agent_log` and `task_document` write seams. + - Extract goal IDs using `GOAL_ID_PATTERN` (`/\bG-[0-9A-Z]+(?:-[0-9A-Z]+)*\b/g`) and store bounded snippets (max 200 chars). + - Add `fn goals citations` with filters: `--goal`, `--agent`, `--surface`, `--since`, `--until`, `--limit`, and `--json`. + +- 4fee2c1: Add a branch-strategy dropdown to the New Task dialog with project-default, auto-new, existing, and custom-new modes. + + New tasks now submit `branchSelection`, and `auto-new` derives a persisted branch name using `fusion/{task-id}-{short-name}`. + +- 0605d13: Add mission-level branch strategy defaults so missions can persist whether triaged tasks should use project default branching, a shared existing/custom branch, or per-task derived branches. + + Mission create/edit flows now save both `baseBranch` and `branchStrategy`, and mission triage handlers apply that stored strategy by default (including autopilot triage when no explicit branch options are supplied). + + Also fix planning breakdown task creation to forward the selected branch options so multi-task planning respects the same branch selection used by single-task planning. + +- 7221413: Add per-mission/planning branch-group data-model foundations in `@fusion/core`. + + - Introduce durable `branch_groups` storage with source linkage (`mission`/`planning`), branch metadata, PR state, status, and auto-merge override. + - Add `TaskStore` branch-group APIs: create/get/getBySource/list/update/setTaskBranchGroup. + - Persist `Task.autoMerge` and `Mission.autoMerge` as optional overrides. + - Reuse `Task.branchContext.groupId` for task↔group linkage (no separate `branchGroupId` column). + - Bump project schema version to `94` with migration coverage and schema assertions. + +#### Patch Changes + +- 53d97e2: Clarify no-task heartbeat prompts when eligible Todo tasks exist but role policy filters them out of auto-claim candidates. +- dbb0804: Fix per-task diff view incorrectly including a task's base commit when a done task lands as a no-op or its resolved merge SHA equals `baseCommitSha`. +- 668e3a5: Mission creation now always returns a stopped mission. `POST /api/missions` and the mission store ignore create-time `autopilotEnabled` input, forcing new missions to `status: "planning"` with autopilot disabled and inactive. + + Autopilot remains a post-creation action via explicit mission start/update flows. + +- a014c6d: Auto-merge now treats transient provider/network failures during merge (for example "This operation was aborted", "socket hang up", and provider `server_error` payloads) as bounded retryable errors instead of immediate terminal failures. The engine re-enqueues affected in-review merges with exponential backoff for both direct and pull-request merge strategies, then parks the task as failed with explicit transient-retry exhaustion logs once the retry cap is reached. +- d5b3336: Dashboard: OAuth re-login banner now clears a provider immediately after successful OAuth re-authentication, instead of waiting for the next auth-status polling interval. +- 0044c23: Fix dashboard OAuth login for `github-copilot` when upstream auth storage invokes device-code callbacks. The `/api/auth/login` route now provides the expected callback wiring and preserves `deviceCode: { userCode, verificationUri }` in responses so Copilot login no longer crashes with `options.onDeviceCode is not a function`. +- 4a60c2a: Backfill done-task "N files changed" chips when mergeDetails enrichment arrives after the initial done websocket snapshot. Task cards now pass a done-mode merge enrichment signature into diff-stats invalidation so `/api/tasks/:id/diff` is re-fetched and authoritative lineage stats render without requiring a manual refresh. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [53d97e2] +- Updated dependencies [afc3b47] +- Updated dependencies [71e2aec] +- Updated dependencies [dbb0804] +- Updated dependencies [4fee2c1] +- Updated dependencies [0605d13] +- Updated dependencies [668e3a5] +- Updated dependencies [a014c6d] +- Updated dependencies [d5b3336] +- Updated dependencies [0044c23] +- Updated dependencies [4a60c2a] +- Updated dependencies [7221413] + - @runfusion/fusion@0.38.0 + +## 0.37.0 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.37.0 +- @fusion/engine@0.37.0 +- @fusion-plugin-examples/cli-printing-press@0.1.14 +- @fusion-plugin-examples/dependency-graph@0.1.28 +- @fusion-plugin-examples/roadmap@0.1.16 +- @fusion-plugin-examples/cursor-runtime@0.1.16 +- @fusion-plugin-examples/droid-runtime@0.1.23 +- @fusion-plugin-examples/hermes-runtime@0.2.47 +- @fusion-plugin-examples/openclaw-runtime@0.2.47 +- @fusion-plugin-examples/paperclip-runtime@0.2.47 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.37.0 +- @fusion/dashboard@0.37.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.37.0 +- @fusion/pi-claude-cli@0.37.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.37.0 + +### @runfusion/fusion + +#### Minor Changes + +- b335f3d: Add a new `fn_goal_show` tool for goal retrieval by ID, including structured JSON output via `details.goal` and a stable not-found contract (`GOAL_NOT_FOUND`). + + Also register `fn_goal_list` and `fn_goal_show` in the engine readonly tool allowlist so agent runtime sessions can use goal retrieval on the readonly path. + +#### Patch Changes + +- 230efa1: Update `useAiMergeCommitSummary` docs/JSDoc to match the intended default of `true`, including that merge commit summaries include a subject plus body summary (narrative + bullets + diff-stat). + + Also fixes AI merge-mode prompt guidance so AI-authored squash commits include a summarized body instead of subject-only commit messages. + +- b5f2f91: Do not mark executor sessions as failed when they are parked for pending code review. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [230efa1] +- Updated dependencies [b335f3d] +- Updated dependencies [b5f2f91] + - @runfusion/fusion@0.37.0 + +## 0.36.0 + +### @fusion/dashboard + +#### Patch Changes + +- @fusion/core@0.36.0 +- @fusion/engine@0.36.0 +- @fusion-plugin-examples/cli-printing-press@0.1.13 +- @fusion-plugin-examples/dependency-graph@0.1.27 +- @fusion-plugin-examples/roadmap@0.1.15 +- @fusion-plugin-examples/cursor-runtime@0.1.15 +- @fusion-plugin-examples/droid-runtime@0.1.22 +- @fusion-plugin-examples/hermes-runtime@0.2.46 +- @fusion-plugin-examples/openclaw-runtime@0.2.46 +- @fusion-plugin-examples/paperclip-runtime@0.2.46 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/core@0.36.0 +- @fusion/dashboard@0.36.0 + +### @fusion/engine + +#### Patch Changes + +- @fusion/core@0.36.0 +- @fusion/pi-claude-cli@0.36.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.36.0 + +### @runfusion/fusion + +#### Minor Changes + +- 2a35358: Add Goals REST API (`/api/goals`) with list/create/update/archive/unarchive endpoints. + Creating a 6th active goal or unarchiving when already at 5 active now returns HTTP 409 with `ACTIVE_GOAL_LIMIT_EXCEEDED` details. +- 009d569: Add `fn goals` CLI subcommand (`list` / `create` / `archive`) and pi extension tools (`fn_goal_list`, `fn_goal_create`, `fn_goal_archive`) for Slice 1 of the Goals primitive. Author-facing only — no agent anchoring yet. + +#### Patch Changes + +- f258a75: Fix ntfy JSON publish notifications to encode `priority` as the integer scale expected by ntfy so unicode mailbox/room notifications deliver successfully. +- 2c4683a: Widen task detail modal on tablet viewports to use more of the 769px–1024px viewport. +- e84673c: Close source-imported GitHub issues when their linked Fusion task is deleted, with parity to tracking-issue delete handling. Dashboard delete confirmation now prompts for `close`, `delete`, or `leave` on source-imported issues and forwards `githubIssueAction` through task deletion flows. For API callers that omit `githubIssueAction` (or send `auto`) on source-imported issue deletes, Fusion now defaults to `close`. +- 200dda9: Suppress a misleading transient failure state when a worktree-local `.fusion/tasks//task.json` read briefly returns ENOENT during executor session startup. Fusion now treats this as recoverable, routes through existing auto-recovery, and avoids persisting `status: "failed"`/`error` so the red task-card error banner and failed notification are not shown for self-healed runs. +- 6b27ab5: fix(FN-5627): default auto-prerebase to fire when branch is >=1 commit behind integration + + `decideAutoPrerebase()` previously defaulted `prerebaseDivergenceThreshold` to `0`, which meant the threshold path **never fired** unless the user explicitly set a positive value. Only hot-file matches could trigger prerebase. + + The result: tasks whose branch was started against an older main tip (because other tasks landed concurrently) would skip prerebase, build their squash commit against the stale base, and then fail at the `git update-ref` step because the squash commit didn't descend from current main. The merger correctly detected this as a non-fast-forward advance and threw `IntegrationBranchConcurrentAdvanceError` — with both "expected" and "observed" SHAs set to the current main tip (because `observedCurrentSha` was captured from the pre-update rev-parse). This produced the misleading "expected X, observed X" same-SHA error signature that stranded FN-5632 stuck at `mergeRetries=3`. + + New default: `prerebaseDivergenceThreshold = 1`. Any branch behind by at least 1 commit auto-rebases before squash. Users who want the legacy never-fire behavior can explicitly set `prerebaseDivergenceThreshold = 0`. Threshold comparison also changed from `>` to `>=` so an explicit threshold of N rebases at N+ commits behind instead of N+1+. + + The self-healing classifier comment for `spurious-concurrent-advance-same-sha` is updated to reflect that the signature can come from either the pre-FN-5627 misclassification OR the legitimate post-FN-5627 non-fast-forward path; the auto-recovery sweep is unchanged because both cases self-heal cleanly once prerebase fires on the retry. + + Tests: + + - Default threshold (undefined) fires at 1 commit behind + - Explicit threshold = 0 stays as opt-out (never fire on commit-count) + - Default threshold doesn't fire when branch is up-to-date (commitsBehind=0) + +- b2d547e: fix(FN-5627): close TOCTOU window between merger optimistic `mergeConfirmed: true` write and integration ref advance, add reachability gate on auto-merge fast-path + + The merger previously persisted `mergeConfirmed: true` + `commitSha` to the task row as soon as the local squash commit was built, **before** running `git update-ref refs/heads/` to actually advance the integration branch. If the ref-advance then failed for any reason (lock contention, hook rejection, packed-refs race, or a misclassified non-CAS error via the `merger-ref-update-advance.ts` string heuristic), the task row was poisoned: the auto-merge scheduler's `mergeConfirmed` fast-path would silently promote the never-landed work to `done` on the next tick, including emitting `task:merged` and closing the GitHub tracking issue. + + This affected at least 9 tasks across 2026-05-27/28 (FN-5596, FN-5597, FN-5599, FN-5612, FN-5613, FN-5614, FN-5616, FN-5623, FN-5625) — the merger silently dropped real work and marked the tasks complete. + + The fix has three layers: + + 1. **merger.ts** — In `reuseTaskWorktreeMerge` mode, persist `mergeConfirmed: false` initially. Promote to `true` only after `advanceIntegrationBranchRef` returns `advanced: true`. Other merge paths (legacy in-place merge, verified no-op fast-paths, owned-commit recovery) are unchanged because they advance the ref before this point. + + 2. **project-engine.ts** — Defense-in-depth reachability gate on the auto-merge "merge already confirmed" fast-path. Before `moveTask(taskId, "done")`, verify `git merge-base --is-ancestor ` succeeds. On failure, clear `mergeConfirmed`, mark task `status: "failed"`, leave in `in-review`, and emit `merger:fast-path-blocked-foreign-commit` run-audit event. Legitimate no-op merges (no `commitSha`) bypass the gate. + + 3. **merger-ref-update-advance.ts** — Replace the fragile string heuristic that classified update-ref failures as `concurrent-advance` (matching `"is at"` / `"expected"` / `"cannot lock ref"` in error text) with structured detection. After update-ref fails, re-read the ref: if observed equals expected, classify as `ref-update-refused` (no actual race occurred). Eliminates the misleading "expected X observed X" same-SHA log signature seen on FN-5625. + +- 694970b: fix(FN-5627): always rebase behind branches before squash regardless of user-configured prerebase threshold + + After the FN-5627 default-threshold fix landed (threshold=1 default), tasks were still getting stuck at `mergeRetries=3` with `Integration branch main advanced concurrently (expected X, observed X)` errors because user projects with explicit `prerebaseDivergenceThreshold` values higher than the branch's commits-behind count still skipped prerebase entirely. + + Example: a project with `prerebaseDivergenceThreshold: 50` for low-noise PR experience would skip prerebase on a task branched 4 commits behind main. The squash commit then doesn't descend from current main, and `git update-ref` correctly refuses the non-fast-forward advance — producing the misleading same-SHA error signature that stranded FN-5626, FN-5628, FN-5633. + + Root distinction missed in the earlier fix: the user-configurable `prerebaseDivergenceThreshold` controls the _user-visible severity reporting_ ("this branch is N commits behind"), while engine correctness requires a _safety invariant_ ("any branch behind main MUST be rebased before squash, or update-ref will fail"). These are independent concerns. + + New behavior: + + - After the hot-file and threshold checks, `decideAutoPrerebase()` now returns `fire: true` with `reason: "safety-fallback-any-divergence"` whenever `commitsBehind > 0`. + - The threshold-based path still wins when tripped (so user-visible audit `reason` reflects the configured policy when applicable). + - Full opt-out remains `prerebaseAutoEnabled: false` — that case skips the safety fallback too, and the user accepts that behind-branch merges will fail. + - `prerebaseDivergenceThreshold: 0` is no longer a complete opt-out from the commit-count gate — it only suppresses the threshold-based reason label. Safety fallback still fires. + + Tests: + + - New `safety-fallback-any-divergence` reason added to `AutoPrerebaseDecision.reason` union. + - 4 commits behind with threshold=50 → fires via safety fallback (was: skipped). + - `prerebaseAutoEnabled=false` → no fire (full opt-out preserved). + - Configured threshold tripping still wins the `reason` label. + - Branch fully up-to-date (commitsBehind=0) → no-divergence (unchanged). + +- 5768d5e: feat(FN-5627): self-heal transient merge failures stuck at mergeRetries=3 + + After the FN-5627 merger fix landed, two in-review tasks (FN-5628, FN-5632) remained stuck at `mergeRetries=3` with `status='failed'` due to transient merge errors that the merger correctly identified but had no auto-recovery for: + + - `lease-handoff-failed: target-not-queued` — FN-5353 class race where the merge queue lease acquisition saw the task drop out of the queue between enqueue and handoff (typically due to a self-healing sweep cleaning stale `mergeQueue` rows mid-flight). + - Legacy same-SHA spurious concurrent-advance errors persisted before FN-5627's `merger-ref-update-advance.ts` classifier fix landed. + + These tasks had no path forward except manual intervention. The `AUTO_MERGE_COOLDOWN_MS` cooldown reset takes hours and gives up too easily. + + This change adds `SelfHealingManager.recoverTransientMergeFailures()`, wired into both startup recovery and the periodic Batch 2 maintenance loop. For each in-review task with `mergeRetries >= MAX_AUTO_MERGE_RETRIES`, `status='failed'`, and an `error` matching `classifyTransientMergeError()`: + + 1. Reset `mergeRetries=0`, clear `status`/`error`. + 2. Increment `mergeDetails.transientRecoveryCount` (new field on `MergeDetails`). + 3. Re-enqueue via `requeueForAutoMerge`. + 4. Emit `merger:transient-failure-auto-recovered` run-audit event. + + Bounded by `MAX_TRANSIENT_MERGE_RECOVERIES = 2` to avoid infinite loops on genuinely stuck tasks. Once exhausted, the task stays parked as failed and emits `merger:transient-failure-budget-exhausted` once with a `[transient-recovery-budget-exhausted]` marker on `error` for repeat-suppression. + + Non-transient failure classes (verification, build, real conflicts, etc.) are not eligible — only the pattern-matched transient classes auto-recover. No-op when `autoMerge=false`, no `requeueForAutoMerge` callback wired, or pause is active. + + Tests: + + - Lease-handoff transient recovery path + - Same-SHA spurious-advance recovery (legacy pre-FN-5627) + - Genuine concurrent-advance (different SHAs) NOT recovered + - Non-transient failures (verification errors) NOT recovered + - Budget exhaustion behavior + - autoMerge=false no-op + +- e75c4da: fix(FN-5627): suppress ntfy notifications for transient merge failures the engine auto-recovers + + Even with the FN-5627 merger TOCTOU fix + transient-failure self-healing sweep + safety-fallback auto-prerebase landed, the merger can still hit transient failure classes (lease handoff races, brief same-SHA non-FF advances) for tasks whose branches are particularly out-of-sync. The self-healing sweep auto-recovers them within bounded budget — but each individual failure cycle was firing a ntfy alarm before the recovery cleared the failed state, producing user-facing alarm spam for tasks that were never actually stuck. + + Two layers of fix: + + 1. `NotificationService.handleTaskUpdated` now classifies `task.error` via the new shared `classifyTransientMergeError` helper before scheduling the deferred failure notification. Transient classes (`lease-handoff-target-not-queued`, `spurious-concurrent-advance-same-sha`) get logged as suppressed and never schedule a ntfy timer. + + 2. Defense-in-depth: `fireDeferredFailureNotification` re-classifies the error at dispatch time, so a failure scheduled before the suppression landed on a newer cycle still suppresses if the error matches a transient class. + + The classifier itself moved from `self-healing.ts` to a new logger-free `transient-merge-error-classifier.ts` module so consumers in `NotificationService` don't pull `createLogger` through the import chain and break test mocks of `../logger.js`. `self-healing.ts` re-exports the symbol for backward compatibility. + + Log prefix for the recovery actions also changed from `[FN-5627] Auto-recovering...` to `Auto-recovered:` so that `NotificationService.maybeSuppressTransientFailedNotification`'s existing `/^Auto-recovered:/` log-prefix check cancels any already-scheduled failure notification when the sweep runs mid-grace-window. + + Tests: + + - 3 new notification-service tests covering transient suppression for both error classes plus a control case ensuring genuine non-transient failures still notify. + - Existing transient-recovery tests in self-healing.test.ts continue to pass against the relocated classifier. + +- b2dce7d: FN-5631 re-lands FN-5616 to add an opt-in `githubCloseSourceIssueOnDone` setting that closes source-imported GitHub issues when linked tasks are completed, including startup reconciliation for previously missed closes. +- 1153b09: feat(FN-5637): update `fn init` to add `fusion.db`, `fusion.db-wal`, and `fusion.db-shm` to project `.gitignore` alongside `.fusion` and `.pi` so stray runtime SQLite files are not committed. +- 5b5da2c: Fix bundled runtime plugin auto-install in globally installed CLI builds. Save/Save & Test for Paperclip, Hermes, OpenClaw, Cursor, and Droid runtime providers no longer fails with `unavailable in this build` when bundled plugins are present under `dist/plugins/`. +- b96b0bc: Fix `fn update` npm EEXIST bin-link collisions by retrying once with `--force` and showing manual recovery guidance when the retry fails. +- 2a35358: Add a new project-level `goals` table to the core schema and fresh database DDL. + Bump `SCHEMA_VERSION` from 91 to 92 with an idempotent migration that creates `goals` and `idxGoalsStatus`. +- 29ac58f: feat(FN-5633): standalone AI merge path (clean-room merge + AI reviewer) + + Adds a self-contained AI merge path (`merger.mode: "ai"`, the new default) that the engine dispatches to instead of the legacy `aiMergeTask` pipeline. It does not share the legacy scaffolding (prerebase / conflict-strategy ladder / post-merge audit / transient self-heal), which was buggy and error-prone. + + How it works: + + - **Clean room**: a throwaway detached worktree is created at the target branch's current tip, so the user's real checkout is never the merge surface — dirty files cannot be clobbered and the landing is a fast-forward by construction. + - **AI merge**: an AI agent merges the task branch into the clean room and produces one squash commit, resolving conflicts in favor of the task's intent. + - **AI reviewer with retries**: a fresh read-only reviewer audits the squash (completeness / collateral / conflict-soundness) and classifies any veto blocking vs advisory. It drives up to `merger.maxReviewPasses` corrective re-merges. After the budget, advisory concerns land with a logged warning; an unfixable BLOCKING (correctness) concern hard-fails (`AiMergeBlockedError`) rather than ship wrong code. Verdict parsing fails safe to blocking. + - **Per-task target branch**: each task merges into its own target branch (or the default integration branch). The local checkout is only synced when it is on that target. + - **Local checkout sync**: when the checkout is on the target branch, the ref + working tree advance together via `git merge --ff-only` (dirty state read accurately before the move); dirty edits are stashed, fast-forwarded, and restored — and if the restore conflicts the AI merger reconciles them (the original edits are also kept in a stash as a backup). A checkout on a different branch is advanced via `update-ref` and left untouched. Un-stashable dirty state advances the ref and leaves the working tree with a warning. Concurrent advances trigger a bounded rebuild on the new tip. + - **Status + logs**: progress (merging / reviewing / corrective passes / landing / blocked / landed) is written to the task status pill and the task log stream. + + Settings: `merger.mode` (`ai` default / `deterministic` legacy), `merger.reviewerModel`, `merger.maxReviewPasses` (default 3), surfaced in Settings → Merge. When AI merge is on, the legacy merge-mechanics settings (integration worktree, conflict strategy, overlap guard, post-merge audit, direct-commit routing) are hidden since they do not apply. + + Commit message: the AI agent writes the squash commit subject as a concise summary of the actual changes (not just the task title), and every landed squash carries the board-association trailers — `Fusion-Task-Id: ` plus the canonical lineage trailer when the task has a `lineageId` — guaranteed via an idempotent amend even if the agent omits them, so the board associates the commit with the task. + + Verification: the merge agent is instructed to run the project's tests, type-check, and lint after resolving the merge and to fix any NEW failure the merge introduced (without being on the hook for pre-existing breakage) before committing. + + Editable prompt: the AI merge agent's base persona is the editable "merger" role prompt (Settings → Prompts); the non-negotiable clean-room / verification / commit-trailer rules are always appended so a custom prompt can't drop them. + + Reviewer model: the reviewer agent uses the project's reviewer/validator model lane (`resolveValidatorSettingsModel`: project validator → global validator → project default), not a merge-specific setting. + + No-branch guard: a missing task branch is a benign no-op only when the task was never executed or was already merged (branch cleaned up on re-process); if the task was executed (`baseCommitSha` recorded) and was never merged, the merge fails loudly rather than silently marking the task done. + + The legacy `aiMergeTask` pipeline is retained unchanged and used when `merger.mode: "deterministic"`. + + Tests: `merger-ai.test.ts` covers the verdict parser, clean merge, blocking hard-fail (no advance), advisory land, empty no-op, per-task target branch isolation, missing-target-branch error, and `landSquash` (clean ff, other-branch update-ref, dirty stash-restore, AI-resolved restore conflict). Engine merge-orchestration tests that assert the legacy path are pinned to `merger.mode: "deterministic"`. + +- cec191e: Migrate Fusion's pi dependencies from `@mariozechner/pi-coding-agent` / `@mariozechner/pi-ai` to the new `@earendil-works/*` scope and bump to `^0.77.0`. + + This follows the upstream project move to `https://github.com/earendil-works/pi` and updates transitive dependency resolution to the maintained package namespace. + +- aa7eccb: When `useAiMergeCommitSummary` is enabled, AI-authored merge commits now include a richer body: the short narrative headline plus an AI-generated bullet summary of changed modules/files, followed by a `Files changed` diff stat block. + + `mergeDetails.mergeCommitMessage` remains the short headline summary so dashboard UI consumers keep their existing concise display behavior. + +- d78fbcc: Fix GitHub PR modal/review fetches that call `gh api` through `runGhJsonAsync`. + + `runGhJson` and `runGhJsonAsync` now skip auto-appending `--json` for the `gh api` subcommand (which already returns JSON and rejects that flag), preventing runtime `unknown flag: --json` errors when loading PR comments/reviews. + +- 2df891f: ci: re-enable auto-trigger of binary release workflow on `v*` tags so GitHub Releases include CLI and desktop binaries + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [f258a75] +- Updated dependencies [2c4683a] +- Updated dependencies [e84673c] +- Updated dependencies [2a35358] +- Updated dependencies [009d569] +- Updated dependencies [200dda9] +- Updated dependencies [6b27ab5] +- Updated dependencies [b2d547e] +- Updated dependencies [694970b] +- Updated dependencies [5768d5e] +- Updated dependencies [e75c4da] +- Updated dependencies [b2dce7d] +- Updated dependencies [1153b09] +- Updated dependencies [5b5da2c] +- Updated dependencies [b96b0bc] +- Updated dependencies [2a35358] +- Updated dependencies [29ac58f] +- Updated dependencies [cec191e] +- Updated dependencies [aa7eccb] +- Updated dependencies [d78fbcc] +- Updated dependencies [2df891f] + - @runfusion/fusion@0.36.0 + +## 0.35.0 + +### @fusion/dashboard + +#### Patch Changes + +- Updated dependencies [1992049] + - @fusion/engine@0.35.0 + - @fusion-plugin-examples/cli-printing-press@0.1.12 + - @fusion-plugin-examples/dependency-graph@0.1.26 + - @fusion-plugin-examples/roadmap@0.1.14 + - @fusion/core@0.35.0 + - @fusion-plugin-examples/cursor-runtime@0.1.14 + - @fusion-plugin-examples/droid-runtime@0.1.21 + - @fusion-plugin-examples/hermes-runtime@0.2.45 + - @fusion-plugin-examples/openclaw-runtime@0.2.45 + - @fusion-plugin-examples/paperclip-runtime@0.2.45 + +### @fusion/desktop + +#### Patch Changes + +- @fusion/dashboard@0.35.0 +- @fusion/core@0.35.0 + +### @fusion/engine + +#### Minor Changes + +- 1992049: Add opt-in RTK command rewriting for Pi bash tools via `FUSION_RTK_REWRITE`. + +#### Patch Changes + +- @fusion/core@0.35.0 +- @fusion/pi-claude-cli@0.35.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- @fusion/core@0.35.0 + +### @runfusion/fusion + +#### Minor Changes + +- d767e2e: Add `openai-responses` as a supported custom provider `apiType` across CLI, engine, dashboard API validation, and dashboard forms. + + Custom providers configured with this apiType now route through pi-ai's built-in `openai-responses` transport while probe-model discovery continues to use the OpenAI-compatible `/v1/models` path. + +#### Patch Changes + +- da34bd0: Dashboard now shows a top-level "Re-login required" banner when a stored OAuth provider credential (Codex, Claude, etc.) has expired, and the engine logs the expired set on startup and once every 24 hours. +- d76b6f9: TUI System panel now reliably shows the full auth token at all terminal widths so it can be selected and copied manually when the `[c]` shortcut is unavailable. +- d767e2e: Fixed custom provider registration so provider keys are derived from the configured provider name (with deterministic collision suffixing) instead of internal UUID ids, ensuring model selector and logs show stable human-readable keys. Also fixed the OpenAI-compatible custom-provider registration path by validating end-to-end openai-completions round-trip behavior with a regression test. +- 8a0fbf0: Fix the Bun-compiled `fn` executable so `--help` no longer crashes with a missing `react-devtools-core` module. The build now defines `process.env.DEV` as `false` during compile, allowing Ink's DEV-only devtools import path to be removed from the bundled binary. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [da34bd0] +- Updated dependencies [d76b6f9] +- Updated dependencies [d767e2e] +- Updated dependencies [d767e2e] +- Updated dependencies [8a0fbf0] + - @runfusion/fusion@0.35.0 + +## 0.34.0 + +### @fusion/core + +#### Patch Changes + +- 6a6c6fd: Dashboard startup and request-storm fixes: + + - **Faster startup**: parallelized independent store inits, started CentralCore init early in background, and ran plugin loading concurrently with extension resolution. The duplicate-runtime root cause is also fixed — `shouldUseHybridExecutor` no longer auto-enables for local-only multi-project setups, where `ProjectEngineManager` already handles project lifecycle (set `FUSION_HYBRID_EXECUTOR=1` to force-enable). Eliminates ~7s of redundant self-healing pipeline work per cold start. + - **Per-page request reduction**: added in-flight request dedupe (`packages/dashboard/app/api/dedupe.ts`) wrapped around the top API offenders. A single page load went from ~177 requests to ~101, with `/api/plugins/ui-slots` dropping from 17× to 1×. + - **Stale-data-after-mutation hazard**: `forceFresh` option on the deduped fetchers now redirects ALL in-flight waiters to receive the fresh post-mutation response, not just the forcing caller. Generation counters in `useAgents` and `AgentListModal` provide a second layer of protection against slow polls overwriting fresh state. + - **SSE refresh storm**: agent SSE event handler now debounces (250ms) with a trailing-edge guard, so multi-agent activity bursts coalesce to at most 2 refetches per burst instead of one per event. + - **Live isolation-mode transition**: PATCH `/api/projects/:id` with an `isolationMode` change now returns a 503 with actionable guidance when HybridExecutor is unavailable (local-only single-node), instead of silently persisting a config that the live runtime won't honor. + - **Error handling regression**: restored try/catch around `HybridExecutor.initialize` and `engineManager.ensureEngine` in the parallel engine setup so a paused or broken cwd project no longer aborts dashboard startup. + - **TaskStore migration race**: sequenced the SQLite store inits (TaskStore → AutomationStore → PluginStore → AgentStore) since they all open the same `.fusion/fusion.db` and run `addColumnIfMissing` migrations with a TOCTOU `hasColumn` → `ALTER` pattern. + - **`gh` CLI invocation storm**: `isGhAvailable()` and `isGhAuthenticated()` now memoize their results with a 60s TTL. `GitHubTrackingReconciler` was scanning up to 200 done tasks at startup and calling `hasGhAuth()` per task — each call shelled out to `gh --version` and `gh auth status` (which makes a network roundtrip), pinning the event loop for ~60s of synchronous `spawnSync` work. CPU-profile-confirmed: dropped from 71s (69% of cold-start CPU) to 2s. The cache benefits all 28+ call sites in `dashboard/src/github.ts`, the engine PR monitor, the research provider, and the API routes automatically. `resetGhAvailabilityCache()` is exported for login/logout flows that need to invalidate immediately. + - **SQLite integrity check delay**: `PRAGMA integrity_check(100)` walks every page of the database file and was scheduled 3 seconds after init — landing right in the responsiveness-critical window for ~7s per database. Pushed the deferred-check timer to 60 seconds so the user is already interacting with the dashboard by the time it runs. The check itself is unchanged; corruption detection still works. + - **Engine init event-loop yields**: `InProcessRuntime.start()` now awaits a `setImmediate`-based yield between major init phases (TaskStore → Plugins → WorktreePool → AgentStore → Scheduler → Executor → HeartbeatMonitor → SelfHealing) so HTTP requests can be processed between them instead of waiting on the entire stack. Same yield is now interleaved between each step of `SelfHealingManager.runStartupRecovery()` (34 steps per project) and its periodic maintenance batches. + - **Deferred startup recovery**: `InProcessRuntime.start()` no longer awaits `resumeStartupRecoverySequence()` or `workerManager.reconcileOrphaned()` — both are correctness-preserving background operations and their git/SQLite work was blocking server-listen for several seconds. + - **Deferred orphan-task AI agent resumption**: orphaned in-progress tasks resumed at engine restart now wait 30 seconds before spawning their AI agent session (worktree setup + pi-coding-agent session creation is heavy and saturates the event loop). Override via `FUSION_RESUME_ORPHAN_DELAY_MS=`; auto-zeroes under Vitest. + - **Event-loop lag tracer**: opt-in debug aid for diagnosing cold-start regressions. Set `FUSION_TRACE_EL_LAG=/path/to/file.txt` to capture every block >150ms with a timestamp relative to process start. + +### @fusion/dashboard + +#### Patch Changes + +- 6a6c6fd: Dashboard startup and request-storm fixes: + + - **Faster startup**: parallelized independent store inits, started CentralCore init early in background, and ran plugin loading concurrently with extension resolution. The duplicate-runtime root cause is also fixed — `shouldUseHybridExecutor` no longer auto-enables for local-only multi-project setups, where `ProjectEngineManager` already handles project lifecycle (set `FUSION_HYBRID_EXECUTOR=1` to force-enable). Eliminates ~7s of redundant self-healing pipeline work per cold start. + - **Per-page request reduction**: added in-flight request dedupe (`packages/dashboard/app/api/dedupe.ts`) wrapped around the top API offenders. A single page load went from ~177 requests to ~101, with `/api/plugins/ui-slots` dropping from 17× to 1×. + - **Stale-data-after-mutation hazard**: `forceFresh` option on the deduped fetchers now redirects ALL in-flight waiters to receive the fresh post-mutation response, not just the forcing caller. Generation counters in `useAgents` and `AgentListModal` provide a second layer of protection against slow polls overwriting fresh state. + - **SSE refresh storm**: agent SSE event handler now debounces (250ms) with a trailing-edge guard, so multi-agent activity bursts coalesce to at most 2 refetches per burst instead of one per event. + - **Live isolation-mode transition**: PATCH `/api/projects/:id` with an `isolationMode` change now returns a 503 with actionable guidance when HybridExecutor is unavailable (local-only single-node), instead of silently persisting a config that the live runtime won't honor. + - **Error handling regression**: restored try/catch around `HybridExecutor.initialize` and `engineManager.ensureEngine` in the parallel engine setup so a paused or broken cwd project no longer aborts dashboard startup. + - **TaskStore migration race**: sequenced the SQLite store inits (TaskStore → AutomationStore → PluginStore → AgentStore) since they all open the same `.fusion/fusion.db` and run `addColumnIfMissing` migrations with a TOCTOU `hasColumn` → `ALTER` pattern. + - **`gh` CLI invocation storm**: `isGhAvailable()` and `isGhAuthenticated()` now memoize their results with a 60s TTL. `GitHubTrackingReconciler` was scanning up to 200 done tasks at startup and calling `hasGhAuth()` per task — each call shelled out to `gh --version` and `gh auth status` (which makes a network roundtrip), pinning the event loop for ~60s of synchronous `spawnSync` work. CPU-profile-confirmed: dropped from 71s (69% of cold-start CPU) to 2s. The cache benefits all 28+ call sites in `dashboard/src/github.ts`, the engine PR monitor, the research provider, and the API routes automatically. `resetGhAvailabilityCache()` is exported for login/logout flows that need to invalidate immediately. + - **SQLite integrity check delay**: `PRAGMA integrity_check(100)` walks every page of the database file and was scheduled 3 seconds after init — landing right in the responsiveness-critical window for ~7s per database. Pushed the deferred-check timer to 60 seconds so the user is already interacting with the dashboard by the time it runs. The check itself is unchanged; corruption detection still works. + - **Engine init event-loop yields**: `InProcessRuntime.start()` now awaits a `setImmediate`-based yield between major init phases (TaskStore → Plugins → WorktreePool → AgentStore → Scheduler → Executor → HeartbeatMonitor → SelfHealing) so HTTP requests can be processed between them instead of waiting on the entire stack. Same yield is now interleaved between each step of `SelfHealingManager.runStartupRecovery()` (34 steps per project) and its periodic maintenance batches. + - **Deferred startup recovery**: `InProcessRuntime.start()` no longer awaits `resumeStartupRecoverySequence()` or `workerManager.reconcileOrphaned()` — both are correctness-preserving background operations and their git/SQLite work was blocking server-listen for several seconds. + - **Deferred orphan-task AI agent resumption**: orphaned in-progress tasks resumed at engine restart now wait 30 seconds before spawning their AI agent session (worktree setup + pi-coding-agent session creation is heavy and saturates the event loop). Override via `FUSION_RESUME_ORPHAN_DELAY_MS=`; auto-zeroes under Vitest. + - **Event-loop lag tracer**: opt-in debug aid for diagnosing cold-start regressions. Set `FUSION_TRACE_EL_LAG=/path/to/file.txt` to capture every block >150ms with a timestamp relative to process start. + +- Updated dependencies [6a6c6fd] +- Updated dependencies [97f1143] +- Updated dependencies [4e4830f] + - @fusion/engine@0.34.0 + - @fusion/core@0.34.0 + - @fusion-plugin-examples/cli-printing-press@0.1.11 + - @fusion-plugin-examples/dependency-graph@0.1.25 + - @fusion-plugin-examples/roadmap@0.1.13 + - @fusion-plugin-examples/cursor-runtime@0.1.13 + - @fusion-plugin-examples/droid-runtime@0.1.20 + - @fusion-plugin-examples/hermes-runtime@0.2.44 + - @fusion-plugin-examples/openclaw-runtime@0.2.44 + - @fusion-plugin-examples/paperclip-runtime@0.2.44 + +### @fusion/desktop + +#### Patch Changes + +- Updated dependencies [6a6c6fd] + - @fusion/dashboard@0.34.0 + - @fusion/core@0.34.0 + +### @fusion/engine + +#### Minor Changes + +- 97f1143: Add optional dependencies parameter to fn_task_update tool. Executors can now programmatically modify task dependency arrays during execution with `fn_task_update({ id: "FN-XXX", dependencies: ["FN-001", "FN-002"] })`. The parameter is optional and backward-compatible; omitting it preserves existing dependencies. Includes validation for self-dependency and non-existent task IDs. Eliminates the need for direct task.json editing workarounds. + +#### Patch Changes + +- 6a6c6fd: Dashboard startup and request-storm fixes: + + - **Faster startup**: parallelized independent store inits, started CentralCore init early in background, and ran plugin loading concurrently with extension resolution. The duplicate-runtime root cause is also fixed — `shouldUseHybridExecutor` no longer auto-enables for local-only multi-project setups, where `ProjectEngineManager` already handles project lifecycle (set `FUSION_HYBRID_EXECUTOR=1` to force-enable). Eliminates ~7s of redundant self-healing pipeline work per cold start. + - **Per-page request reduction**: added in-flight request dedupe (`packages/dashboard/app/api/dedupe.ts`) wrapped around the top API offenders. A single page load went from ~177 requests to ~101, with `/api/plugins/ui-slots` dropping from 17× to 1×. + - **Stale-data-after-mutation hazard**: `forceFresh` option on the deduped fetchers now redirects ALL in-flight waiters to receive the fresh post-mutation response, not just the forcing caller. Generation counters in `useAgents` and `AgentListModal` provide a second layer of protection against slow polls overwriting fresh state. + - **SSE refresh storm**: agent SSE event handler now debounces (250ms) with a trailing-edge guard, so multi-agent activity bursts coalesce to at most 2 refetches per burst instead of one per event. + - **Live isolation-mode transition**: PATCH `/api/projects/:id` with an `isolationMode` change now returns a 503 with actionable guidance when HybridExecutor is unavailable (local-only single-node), instead of silently persisting a config that the live runtime won't honor. + - **Error handling regression**: restored try/catch around `HybridExecutor.initialize` and `engineManager.ensureEngine` in the parallel engine setup so a paused or broken cwd project no longer aborts dashboard startup. + - **TaskStore migration race**: sequenced the SQLite store inits (TaskStore → AutomationStore → PluginStore → AgentStore) since they all open the same `.fusion/fusion.db` and run `addColumnIfMissing` migrations with a TOCTOU `hasColumn` → `ALTER` pattern. + - **`gh` CLI invocation storm**: `isGhAvailable()` and `isGhAuthenticated()` now memoize their results with a 60s TTL. `GitHubTrackingReconciler` was scanning up to 200 done tasks at startup and calling `hasGhAuth()` per task — each call shelled out to `gh --version` and `gh auth status` (which makes a network roundtrip), pinning the event loop for ~60s of synchronous `spawnSync` work. CPU-profile-confirmed: dropped from 71s (69% of cold-start CPU) to 2s. The cache benefits all 28+ call sites in `dashboard/src/github.ts`, the engine PR monitor, the research provider, and the API routes automatically. `resetGhAvailabilityCache()` is exported for login/logout flows that need to invalidate immediately. + - **SQLite integrity check delay**: `PRAGMA integrity_check(100)` walks every page of the database file and was scheduled 3 seconds after init — landing right in the responsiveness-critical window for ~7s per database. Pushed the deferred-check timer to 60 seconds so the user is already interacting with the dashboard by the time it runs. The check itself is unchanged; corruption detection still works. + - **Engine init event-loop yields**: `InProcessRuntime.start()` now awaits a `setImmediate`-based yield between major init phases (TaskStore → Plugins → WorktreePool → AgentStore → Scheduler → Executor → HeartbeatMonitor → SelfHealing) so HTTP requests can be processed between them instead of waiting on the entire stack. Same yield is now interleaved between each step of `SelfHealingManager.runStartupRecovery()` (34 steps per project) and its periodic maintenance batches. + - **Deferred startup recovery**: `InProcessRuntime.start()` no longer awaits `resumeStartupRecoverySequence()` or `workerManager.reconcileOrphaned()` — both are correctness-preserving background operations and their git/SQLite work was blocking server-listen for several seconds. + - **Deferred orphan-task AI agent resumption**: orphaned in-progress tasks resumed at engine restart now wait 30 seconds before spawning their AI agent session (worktree setup + pi-coding-agent session creation is heavy and saturates the event loop). Override via `FUSION_RESUME_ORPHAN_DELAY_MS=`; auto-zeroes under Vitest. + - **Event-loop lag tracer**: opt-in debug aid for diagnosing cold-start regressions. Set `FUSION_TRACE_EL_LAG=/path/to/file.txt` to capture every block >150ms with a timestamp relative to process start. + +- 4e4830f: Fix two bugs that compounded to produce bare `feat(FN-XXXX): merge fusion/fn-XXXX` merge commits in the dashboard: + + - **`Provided value cannot be bound to SQLite parameter 4` (TypeError) mid-merge**: the verification-fix finalize path called `upsertTaskCommitAssociation` with `commitSha` derived from a `git rev-parse HEAD` whose surrounding exec could reject under the parallel-attempt race, leaving `commitSha` undefined when bound to positional parameter 4. Extracted both duplicated callsites into a `recordCommitAssociationFromHead` helper that catches exec failures and validates each git output is non-empty before binding. The merge no longer fails over a denormalized lookup write when the commit itself landed cleanly. + - **Bare-fallback subjects persisted into `mergeDetails.mergeCommitMessage`**: when `buildDeterministicMergeMessage`'s tier-3 fallback (`merge ${branch}`) made it onto a landed commit, the four `classification.commit.subject` / `landedCommit.subject` recovery sites in `self-healing.ts` and `aiMergeTask` copied that bare subject verbatim into `mergeDetails`. Added `regenerateBareMergeSubject` (in a new `merger-bare-subject.ts` module to keep self-healing's import graph narrow) which detects the bare pattern via `BARE_MERGE_SUBJECT_RE` and regenerates a descriptive subject from the landed commit's diff stat via the existing AI commit-subject summarizer. Cosmetic only — the git commit is never amended; the regenerated subject only populates the persisted `mergeDetails` and the in-process `MergeResult`. Gated by `settings.useAiMergeCommitSummary`. + +- Updated dependencies [6a6c6fd] + - @fusion/core@0.34.0 + - @fusion/pi-claude-cli@0.34.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- Updated dependencies [6a6c6fd] + - @fusion/core@0.34.0 + +### @runfusion/fusion + +#### Minor Changes + +- 5eacd79: Add optional `baseBranch` support to mission creation and task planning flows. + + - `fn_mission_create` now accepts `baseBranch` to persist a mission-level default integration branch. + - Mission feature/slice triage inherits mission `baseBranch` when no explicit triage base branch is supplied. + - `fn_task_plan`/CLI planning paths now accept and forward `baseBranch` to created tasks. + +- 1fb905a: Planning Mode now lets you pick a branch strategy (project default, auto-named, existing, or custom new) and an optional base/merge-target branch when creating a task from a completed planning session. + +#### Patch Changes + +- 0a6da9f: Fix ntfy notification deep links: project-only links now switch projects, and task links to non-current projects resolve against the correct project before opening the modal. +- 06a107d: Fix triage/executor not swapping to the configured planning fallback model when the primary provider's API key is missing (or returns 401/403/rate-limit). The top-level `promptWithFallback` now delegates to the rich session-attached path (which runs `isRetryableModelSelectionError` and `swapPromptSession`), with a WeakSet re-entry guard preserving the FN-4900 recursion fix. +- 88c465c: Fix two engine reliability bugs surfaced by CI sharding repair: + + - Self-healing in-review branch rebind now dedups case-variant candidate refs by resolved SHA rather than lowercase name, so two distinct branches sharing a case-insensitive name on case-sensitive filesystems (Linux) are correctly flagged as ambiguous instead of one being silently picked. + - CI test sharding: removed the `--` separator between `pnpm test` and `--shard`, which vitest's CLI parser was treating as end-of-flags and turning the shard selector into a positional file filter — silently disabling sharding so every shard ran the full suite. Test shards now run their actual slice. + - CI test-shards jobs now check out with `fetch-depth: 0` so engine tests that depend on real git history (merge-base, ref resolution) behave the same on CI as locally. + - PR Checks workflow now also runs on push to `main`, so post-merge regressions surface immediately instead of waiting for the next PR. + +- 6a6c6fd: Dashboard startup and request-storm fixes: + + - **Faster startup**: parallelized independent store inits, started CentralCore init early in background, and ran plugin loading concurrently with extension resolution. The duplicate-runtime root cause is also fixed — `shouldUseHybridExecutor` no longer auto-enables for local-only multi-project setups, where `ProjectEngineManager` already handles project lifecycle (set `FUSION_HYBRID_EXECUTOR=1` to force-enable). Eliminates ~7s of redundant self-healing pipeline work per cold start. + - **Per-page request reduction**: added in-flight request dedupe (`packages/dashboard/app/api/dedupe.ts`) wrapped around the top API offenders. A single page load went from ~177 requests to ~101, with `/api/plugins/ui-slots` dropping from 17× to 1×. + - **Stale-data-after-mutation hazard**: `forceFresh` option on the deduped fetchers now redirects ALL in-flight waiters to receive the fresh post-mutation response, not just the forcing caller. Generation counters in `useAgents` and `AgentListModal` provide a second layer of protection against slow polls overwriting fresh state. + - **SSE refresh storm**: agent SSE event handler now debounces (250ms) with a trailing-edge guard, so multi-agent activity bursts coalesce to at most 2 refetches per burst instead of one per event. + - **Live isolation-mode transition**: PATCH `/api/projects/:id` with an `isolationMode` change now returns a 503 with actionable guidance when HybridExecutor is unavailable (local-only single-node), instead of silently persisting a config that the live runtime won't honor. + - **Error handling regression**: restored try/catch around `HybridExecutor.initialize` and `engineManager.ensureEngine` in the parallel engine setup so a paused or broken cwd project no longer aborts dashboard startup. + - **TaskStore migration race**: sequenced the SQLite store inits (TaskStore → AutomationStore → PluginStore → AgentStore) since they all open the same `.fusion/fusion.db` and run `addColumnIfMissing` migrations with a TOCTOU `hasColumn` → `ALTER` pattern. + - **`gh` CLI invocation storm**: `isGhAvailable()` and `isGhAuthenticated()` now memoize their results with a 60s TTL. `GitHubTrackingReconciler` was scanning up to 200 done tasks at startup and calling `hasGhAuth()` per task — each call shelled out to `gh --version` and `gh auth status` (which makes a network roundtrip), pinning the event loop for ~60s of synchronous `spawnSync` work. CPU-profile-confirmed: dropped from 71s (69% of cold-start CPU) to 2s. The cache benefits all 28+ call sites in `dashboard/src/github.ts`, the engine PR monitor, the research provider, and the API routes automatically. `resetGhAvailabilityCache()` is exported for login/logout flows that need to invalidate immediately. + - **SQLite integrity check delay**: `PRAGMA integrity_check(100)` walks every page of the database file and was scheduled 3 seconds after init — landing right in the responsiveness-critical window for ~7s per database. Pushed the deferred-check timer to 60 seconds so the user is already interacting with the dashboard by the time it runs. The check itself is unchanged; corruption detection still works. + - **Engine init event-loop yields**: `InProcessRuntime.start()` now awaits a `setImmediate`-based yield between major init phases (TaskStore → Plugins → WorktreePool → AgentStore → Scheduler → Executor → HeartbeatMonitor → SelfHealing) so HTTP requests can be processed between them instead of waiting on the entire stack. Same yield is now interleaved between each step of `SelfHealingManager.runStartupRecovery()` (34 steps per project) and its periodic maintenance batches. + - **Deferred startup recovery**: `InProcessRuntime.start()` no longer awaits `resumeStartupRecoverySequence()` or `workerManager.reconcileOrphaned()` — both are correctness-preserving background operations and their git/SQLite work was blocking server-listen for several seconds. + - **Deferred orphan-task AI agent resumption**: orphaned in-progress tasks resumed at engine restart now wait 30 seconds before spawning their AI agent session (worktree setup + pi-coding-agent session creation is heavy and saturates the event loop). Override via `FUSION_RESUME_ORPHAN_DELAY_MS=`; auto-zeroes under Vitest. + - **Event-loop lag tracer**: opt-in debug aid for diagnosing cold-start regressions. Set `FUSION_TRACE_EL_LAG=/path/to/file.txt` to capture every block >150ms with a timestamp relative to process start. + +- bad6759: Enable editing the agent name during the review step of the New Agent dialog. +- 7f01b53: Fix chat session API endpoints ignoring `projectId` in multi-project mode. + + `GET /chat/sessions`, `GET /chat/sessions/:id`, `GET /chat/sessions/:id/messages` + and related mutation endpoints all used `options.chatStore` (the home-directory + project's store) regardless of the `projectId` query parameter. In a multi-project + daemon (e.g. running from `~/`) sessions belonging to secondary projects were + invisible — list returned empty, fetching by ID returned 404. + + Root cause: `registerChatRoutes` accessed `options.chatStore` directly instead of + routing through the per-project `resolveProjectChatContext` helper (already used + correctly by `registerChatRoomRoutes` for the rooms API). + + Fix: introduce a `resolveScopedChatStore(projectId)` helper inside + `registerChatRoutes` that delegates to `resolveProjectChatContext`, and replace + all ten `options.chatStore` usages with calls to this helper. When `engineManager` + is present and has an engine for the given `projectId`, the engine's own + `ChatStore` is used; otherwise falls back to the default store (backward compatible). + +- 64056b3: Fix `useChat` truncating sessions longer than 50 messages on initial open. + + `loadMessages()` fetched `{ limit: 50 }` for the initial load. The + `loadMoreMessages` callback was never called from `ChatView` (no scroll + sentinel exists), so sessions beyond 50 messages were permanently cut off. + + Fix: introduce `fetchAllMessagesInChat()` that paginates through the API's + 200-message cap and replace the initial load path. A stale-session guard + (via `activeSessionRef`) prevents overwriting a switched session's messages. + The forward-pagination path (`isPaginationRequest = true`) is preserved + unchanged for backward compatibility. + +- 629aa29: Fix Windows compatibility in cloudflared install fallback by replacing `execFileAsync("mkdir", ["-p", ...])` with `fs.mkdir({ recursive: true })`. The shell-level `-p` flag is Unix-only and breaks installation on Windows cmd.exe with "A subdirectory or file -p already exists". The worktree-hooks fix from the original report was already landed independently. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [0a6da9f] +- Updated dependencies [06a107d] +- Updated dependencies [88c465c] +- Updated dependencies [6a6c6fd] +- Updated dependencies [bad6759] +- Updated dependencies [7f01b53] +- Updated dependencies [64056b3] +- Updated dependencies [5eacd79] +- Updated dependencies [1fb905a] +- Updated dependencies [629aa29] + - @runfusion/fusion@0.34.0 + +## 0.33.0 + +### @fusion/core + +#### Minor Changes + +- a201f56: feat(core): add `mergeAdvanceAutoSync` project setting (`"off" | "ff-only" | "stash-and-ff"`) + + Adds the schema for a new project setting that controls what happens in **other** worktrees still checked out on the integration branch when the merger advances the branch ref. Previously the merger only updated `refs/heads/` and left every other checkout's index and working tree pinned at the old tip, so `git status` in the user's project-root checkout reported the new commits as inverted "staged changes to be committed." + + Modes (default `"stash-and-ff"`): + + - `"off"` — preserve the legacy behavior; user must `git pull` or click the Merge Advance Notice banner Pull button. + - `"ff-only"` — auto-fast-forward only clean worktrees; dirty worktrees stay untouched and the banner still surfaces. + - `"stash-and-ff"` — run the Smart Pull pipeline (stash → fast-forward → pop). Pop conflicts emit `merge:auto-sync` audit events with `outcome: "stash-pop-conflict"` and surface through the existing dashboard stash-conflict modal. + + Schema-only in this changeset; the merger hook that consumes the setting lands in the follow-up engine change. + +- 51fc826: fix(engine,core): dedup heartbeat-spawned follow-ups by parent task + + Heartbeat agents create follow-up tasks via `fn_task_create`. Until + now, the intake similarity guard scoped candidates by `sourceAgentId` + only, so the same parent task could spawn many sibling tasks across + heartbeats whenever triage rewrote their titles enough to dodge the + title-fingerprint guard. + + The task-scoped heartbeat now stamps `sourceParentTaskId` (and + `sourceRunId`) on every `fn_task_create`, and the intake duplicate + matcher treats a candidate as a sibling when it shares either the + caller's agent ID or the caller's parent task ID. Same-parent + siblings with similar descriptions are auto-archived as before. + + Tool description and heartbeat prompts also now instruct agents to + scan existing open tasks before creating, as a belt-and-suspenders + layer above the deterministic dedup. + +#### Patch Changes + +- 408e20b: fix(merger): two root-cause fixes for tasks landing in Done with no commit on main + + **Bug 1: sibling fusion/fn-\* branch as merge target** — `resolveTaskMergeTarget` + previously returned `task.baseBranch` unconditionally before falling back to the + project default. When a task was dispatched as a sibling/dependent off another + in-flight task's worktree, `baseBranch` ended up as the upstream's + `fusion/fn-` branch. The merger then detached onto that sibling, squashed + on top of it, and advanced `refs/heads/fusion/fn-` — never main. FN-5233's + squash (`84563e549`) stranded on `fusion/fn-5339`; FN-5530's + (`4140a3e0a`) stranded on `fusion/fn-5543`. The resolver now refuses any + `fusion/fn-\*` candidate as a merge destination and falls through to the + project default. The merger emits a new `merge:merge-target-rejected-fusion-sibling` + audit event so the upstream `baseBranch`-propagation bug stays observable. + + **Bug 2: deadlock-recovery mis-attributed tasks to unrelated commits** — + `findLandedTaskCommit` step (4) used `git log --grep=FN-XXXX` which matches the + entire commit message (not just the subject) and blindly accepted the first + hit. FN-5441 and FN-5446 were both marked done against `e3dbfaae` — an + FN-5483 commit whose body merely _mentioned_ them by name in a paragraph about + a refusal. The grep fallback now fetches each candidate's body and re-verifies + ownership via a tightened `commitOwnedByTask`: trailers must be line-anchored + (`(?:^|\n)Fusion-Task-Id: (?:\n|$)`), and the subject fallback must match + a conventional-commit form (`():` or `:`), not a substring. + Prose mentions can no longer claim a task. + + The historical recovery for FN-5233 has been cherry-picked to main as + `2d2e5b809`. The other 11 affected tasks (FN-5441, FN-5446, FN-5472, FN-5484, + FN-5487, FN-5490, FN-5515, FN-5517, FN-5526, FN-5539, FN-5540, FN-5542) + remain in Done but need separate triage — 3 look like legitimate + verification-only no-ops, the remaining 9 likely lost real work. + +- ec6643e: fix(test-utils): cancel subprocess tracking timer for every proc in afterEach + + The vitest subprocess guard registered a 60 s "command timed out" timer for + each tracked child process and relied on `afterEach` to cancel it. Under + concurrent load (`pnpm` recursive test runs) the timer could outlive the + originating test and fire during a later test's `afterEach`, surfacing as + spurious "Test subprocess guard detected unsafe child-process usage: + Timed out after 60000ms" failures attributed to a different test name. + + The cleanup loop now scopes "Left running" failure reporting + SIGKILL to + processes spawned by the current test, but unconditionally clears each + tracked subprocess's timer so the 60 s timeout cannot fire after the + afterEach completes. The grace period before declaring a process leaked + is also raised from 200 ms to 1 s to absorb event-loop contention from + slow git shells under recursive test load. + +- 4c31e88: feat(engine): merger auto-syncs project-root checkout after advancing integration-branch ref + + Wires `mergeAdvanceAutoSync` into the merger's post-ref-advance code path. After `advanceIntegrationBranchRef` ff-updates `refs/heads/`, the merger now enumerates other worktrees still on that branch (typically the user's project-root checkout) and reconciles each one's index + working tree to the new tip via `syncWorktreeToHead`. + + The reconciliation primitive is **not** a `git pull` — origin may still be at the previous tip (no `pushAfterMerge`), in which case `git pull --ff-only` is a no-op and a naive `stash → pull → pop` ends with the worktree restored to the old state. Instead `syncWorktreeToHead`: + + 1. Diffs the worktree against the _previous_ tip to isolate real user edits from the stale-index "phantom diff" that looks like inverted commits. + 2. When the worktree is clean against the previous tip, runs `git reset --hard HEAD` to snap index + files forward. + 3. In `stash-and-ff` mode with real edits, captures them as a binary patch against the previous tip, snaps to HEAD, then `git apply --3way` to restore. Untracked files are copied to a temp dir and restored after the snap. Patch conflicts surface as `synced-with-pop-conflict` with the patch left on disk for manual recovery. + + Each per-worktree attempt emits a `merge:auto-sync` audit event (new `GitMutationType`) with the outcome; the per-step `pull:fast-forward`, `stash:push`, `stash:pop`, and `stash:pop-conflict` events that pass through the auditor are tagged `metadata.autoSync = true` so downstream consumers can attribute them. + + The user-facing effect: with the default `mergeAdvanceAutoSync: "stash-and-ff"`, after a Fusion task merges the user's `git status` in the project-root checkout becomes clean and the working tree shows the new commits' content — no manual `git reset` or Pull-button click required. Set `mergeAdvanceAutoSync: "off"` to restore the legacy behavior (the Merge Advance Notice banner still surfaces and the user pulls by hand). + + Backstopped by `merger-auto-sync.slow.test.ts` covering: clean-sync snaps both index and files forward, ff-only with real edits is a no-op, stash-and-ff preserves untracked local files across the snap, task worktrees on `fusion/fn-*` branches are correctly skipped, and an empty branch map emits nothing. + +### @fusion/dashboard + +#### Minor Changes + +- 6e7f1e5: feat(dashboard): explain "Recent integration-branch advances" and add a one-click "Sync working tree" fix + + Two additions to Git Manager → Status: + + **Info disclosure** — an `[i]` button next to the "Recent integration-branch advances (N need action)" header toggles an inline explainer. Covers what an "advance" is, what each `autoSyncOutcome` value means (`clean-sync`, `synced-with-edits-restored`, `off / not run`, `stash-failed`, `would-conflict`, …), and where to enable `mergeAdvanceAutoSync` for the permanent fix. + + **Sync working tree button** — when ≥1 advance shows `needsAction`, a button surfaces in the same header that calls the existing `POST /api/git/pull` (FN-5358 Smart Pull machinery: auto-stash dirty edits, fast-forward pull, restore stash, surface conflicts). On success the extended git status auto-refetches and the "need action" count drops; on conflict, the existing error toast fires. + + No new state machine — `handlePull`/`remoteLoading === "pull"` is the same plumbing the existing Pull button uses. + +- 85786e7: feat(dashboard): show extended integration-branch + working-tree state in Git Manager + + Repository Status panel now answers "what is the actual state of my project root vs the integration branch?" so operators can be sure of the picture even when the Merge Advance Notice banner has been dismissed. + + `GET /api/git/status` accepts a new `?extended=1` query and returns additional optional fields: + + - **integrationBranch** + **integrationBranchSource** — the canonical branch (resolved via `settings.integrationBranch` → legacy `baseBranch` → `origin/HEAD` → `main`) and where the value came from. + - **integrationTipSha / originIntegrationTipSha** — SHAs at both ends, so operators can spot when local main has been advanced by the merger but origin/main hasn't caught up. + - **aheadOfIntegration / behindIntegration** — HEAD vs local integration tip (useful when on a non-integration branch). + - **aheadOfOriginIntegration / behindOriginIntegration** — local integration tip vs `origin/`. + - **dirtyDetails** — staged/modified/untracked/conflicted counts + a 12-line porcelain sample. + - **indexStaleVsHead** — true when the index reflects a previous tip and the worktree is clean against the index but not against HEAD. Surfaces the exact "phantom staged changes" scenario that `mergeAdvanceAutoSync` exists to fix. + - **stashCount** — for at-a-glance recovery awareness. + - **recentMergeAdvances** — up to 5 recent `merge:integration-ref-advance` audit events for the project root, joined with their `merge:auto-sync` outcomes; entries whose auto-sync didn't successfully bring this worktree forward are flagged `needsAction: true`. + + `GitManagerModal` now renders all of this: + + - The existing Branch / Commit / Working Tree / Remote Sync cards gain sub-text — Working Tree shows staged/modified/untracked/conflicted breakdown; Branch shows whether you're on the integration branch. + - A second row of cards adds Integration branch (with resolution source + tip SHA), HEAD-vs-integration ahead/behind, local-integration-vs-origin ahead/behind, and stash count. + - A yellow warning panel appears when `indexStaleVsHead` is true, telling the operator to enable `mergeAdvanceAutoSync` or run `git reset --hard HEAD`. + - A "Recent integration-branch advances" list shows the last few merger advances with their per-advance auto-sync outcome, color-coded by whether they still need action. + + All `fetchGitStatus(projectId)` calls inside `GitManagerModal` now pass `{ extended: true }`. Other callers in the app are unaffected — the extra fields are optional and the un-extended response shape is unchanged. + +#### Patch Changes + +- 60a0012: fix(dashboard): stop main-chat and quick-chat composers from instantly dismissing the Android soft keyboard + + Two layered Android-specific fixes for the chat composers: + + 1. The body scroll-lock applied while the keyboard is open in main chat was an iOS-specific workaround for visualViewport drift. On Android Chrome it does the opposite of what we want — mutating `body { position: fixed; ... }` while the keyboard is opening causes Chrome to treat it as a focus-target relayout and immediately dismisses the keyboard. `useMobileScrollLock` is now gated to iOS UAs. + + 2. ChatView and QuickChatFAB both had an iOS-specific `onTouchStart` on the textarea that called `event.preventDefault()` and then programmatically refocused the input (to suppress iOS's visualViewport auto-scroll on re-focus). On Android, `preventDefault` on a textarea touchstart prevents the soft keyboard from opening — programmatic `focus()` alone does not raise the Android keyboard. Result: tapping the composer focused the input but the keyboard never appeared, looking like an instant dismiss. The touchstart workaround is now gated to iOS UAs via `isIOS()`. + +- a10fc56: fix(dashboard): keep Android keyboard open in main chat; disable kanban pinch-zoom + + Two Android-specific fixes: + + 1. **Keyboard dismissing in main chat.** `mobileKeyboardOpen` in `App.tsx` (derived from `useMobileKeyboard`) gates `project-content--with-mobile-nav` / `--with-footer` className assignment and MobileNavBar rendering. When the soft keyboard opened, those classes were removed and the nav unmounted, shrinking padding-bottom by ~80px in a single render. Android Chrome treats the resulting jump of the focused chat input as the focus target moving and instantly dismisses the keyboard. With `interactive-widget=resizes-content` set on Android, the layout viewport itself shrinks with the keyboard, so the hide-nav-on-keyboard behavior was redundant on Android (and harmful). The whole pattern is now gated to iOS via `isIOS()`. iOS path is unchanged. + + 2. **Pinch-zoom on kanban.** Android Chrome ignores `user-scalable=no` for accessibility, and the kanban board's `overflow-x: auto` columns combined with the inflated ICB produce a broken visual when the user zooms out. Adds `touch-action: pan-x pan-y` to `html, body` inside the mobile media query, which keeps scroll panning but disables pinch-zoom (Chat and MissionManager were unaffected because they don't expose a wide horizontal scrollable region). + +- de67c51: fix(dashboard): pull syncs the worktree to local integration tip, not just to origin + + The integration-mode `POST /api/git/pull` (used by the merge-advance-notice banner) only ran `git merge --ff-only origin/` after fetching. When the merger had advanced local `refs/heads/` via `update-ref` but the user hadn't pushed yet, the worktree's HEAD already resolved to the new sha (symbolic ref follow) but the working tree and index were still at the old state. The fast-forward step short-circuited (`already up to date with origin`) and the user saw "Pull completed" with `fromSha === toSha` while their files visibly stayed behind. + + Pull now explicitly resets the worktree to `refs/heads/` after the origin fast-forward step. The autostash above protects user edits, so the reset is safe regardless of whether the origin FF ran. + +- 5d35b64: fix(dashboard): remove duplicate integration-advances UI; Sync working tree is now pure-local (no origin fetch) + + **Removed duplicate UI** — Git Manager → Status had two overlapping sections rendering the same data: a `Sync local tip` button + a `Recent integration advances` list, sitting above the highlighted `Recent integration-branch advances` block (the one with the lost-work warnings). Deleted the duplicate (`gm-integration-actions` + `gm-recent-advances`) along with the dead `mergeAdvanceEvents` state, fetcher, and SSE subscription that only fed it. + + **Sync working tree is now pure-local** — for the "N need action" case the merger has already advanced `refs/heads/` locally and the worktree just needs to follow. Previously the button called the integration-mode pull which ran `tryFastForwardFromOrigin` first, silently pulling in unrelated remote commits. New `skipOriginFetch` option on `PullGitBranchOptions.integration` (and the matching `POST /api/git/pull` body field) skips the origin step entirely. The Sync button passes `skipOriginFetch: true`, so the sequence is: auto-stash → `git reset --hard refs/heads/` → restore stash. Origin is not touched. + + Help disclosure updated to match the new behavior. + +- 4f38ed1: fix(dashboard): clear `needs action` on recent integration-branch advances after manual sync + + The Git Manager's "Recent integration-branch advances" list derived `needsAction` purely from the original `merge:auto-sync` audit-event outcome. When the operator clicked "Sync working tree" — or fixed up the worktree by hand — the worktree caught up to the integration tip, but the list kept showing "(N need action)" because the historical audit events still recorded the original failure/disabled state. + + `collectRecentMergeAdvances` now also checks whether each advance's `toSha` is reachable from the current HEAD. If it is, the worktree already contains that advance and `needsAction` is false regardless of what the audit trail recorded. + +- ef12df4: fix(dashboard): close 8 review findings on extended Git Manager status + Integration branch setting + + **Settings persistence (data-loss)** — the project-settings patch builder now applies null-as-delete to all non-model keys, matching the global-settings branch. Previously, clearing the Integration branch field (picking `(auto-detect)` or clicking `Use dropdown`) set `integrationBranch: undefined`, which `JSON.stringify` silently dropped — the server retained the stale explicit value and the operator could not un-pin the branch from the UI. + + **`isIndexStale` was wrong both directions** — the heuristic (`diff --cached --name-only` non-empty AND `diff --name-only` empty) fired false-positive on benign `git add` and false-negative whenever the worktree had any unrelated edit. Replaced with a reflog-anchored check: stale iff `refs/heads/@{1}` exists, HEAD is a descendant of it, and `git diff-index --cached ` is empty (i.e. the index exactly matches the pre-advance state). + + **Auto-sync attribution** — two fixes to `collectRecentMergeAdvances` in `register-git-github.ts`: + + - Auto-sync events are now matched by `(taskId, newSha)` instead of `taskId`-only. A task that produced multiple advances over time no longer has all its older entries mislabeled with the most-recent outcome. + - `worktreePath` comparison now runs both sides through `fs.realpathSync` first. On macOS the merger emits canonicalized paths (via `canonicalizePath` in `worktree-pool.ts`) while the route was called with the store's raw `rootDir`; symlinked project paths caused every advance to be marked `needsAction: true` indefinitely. + + **Extended path no longer 500s on git failure** — the `?extended=1` branch wraps `computeExtendedGitStatus` in its own try/catch and falls back to the basic status shape on any unhandled failure. Previously an unguarded `git branch --show-current` throw escaped to the route's outer catch and returned HTTP 500, while the basic path returned 200 with the swallowed-failure shape — surface parity matters because the dashboard always passes `extended=1` and would otherwise render an error toast where it should render the degraded panel. Also wrapped the same call inside `computeExtendedGitStatus` so detached-HEAD / non-git states return an empty `currentBranch` instead of throwing. + + **Integration branch falls back to `refs/remotes/origin/`** — when the configured branch exists only as a remote-tracking ref (e.g. operator set `integrationBranch: "release/v2"` without ever `git switch`-ing it locally), `integrationTipSha` now resolves to the origin tip instead of being null. A new `integrationTipSource: "local" | "remote-only" | "missing"` field tells the UI which side won; the Git Manager surfaces this with a `(remote-only — run git switch to track locally)` sub-text and a `no ref found` error state when both refs are missing. + + **Copy commit hash shows two buttons** — the Copy button now copies `status.commit` (the short SHA actually displayed in the `` element). A second Copy-full button surfaces `status.headSha` for git operations that need the 40-char SHA. Previously the single button silently copied the full SHA when extended was on, so what the user saw on screen was no longer what they pasted. + + **Detached HEAD no longer shows misleading "(not on main)"** — `git branch --show-current` returns empty on detached HEAD; the route now leaves `isOnIntegrationBranch` as `undefined` (not `false`) in that case, and the UI's "(not on )" sub-text only renders when we know we're on a different branch — not when we're on no branch at all. + +- d5cfa92: fix(dashboard): close 7 review findings on the extended-status hardening pass + + Follow-up to the prior fix commit; closes 7 more issues that an independent code review surfaced. + + **Settings inheritance regression (high)** — `SettingsModal.handleSave`'s non-model project branch lost the "only write if changed" gate when the prior commit added null-as-delete support. Result: every effective/inherited project key was being persisted as an explicit project override on every save, silently breaking inheritance across ~30+ keys. Restored the `value !== initialProjectValue` gate, matched against the model-lane branch's existing pattern. + + **Git Manager `Local vs origin` card showed misleading "Synced" in remote-only mode** — when `integrationTipSource === "remote-only"`, both `aheadOfOriginIntegration` / `behindOriginIntegration` are deliberately undefined (there's no local branch to compare), but the card's render fell through to `(ahead ?? 0) === 0 && (behind ?? 0) === 0 → "Synced"`. Now renders an explicit "no local tracking" sub-text in that case, with a separate `HEAD vs origin/` card surfacing a meaningful distance. + + **`isIndexStale` extended to multi-hop and gated to integration-branch worktrees** — + + - Walks up to 16 `refs/heads/` reflog entries so an A→B→C burst whose middle sync also missed is detected (the prior check only consulted `@{1}`). + - Only fires when `isOnIntegrationBranch === true`. Previously, a feature-branch worktree whose HEAD happened to descend from `@{1}` (e.g. `git switch -c hotfix main@{N}`) would trip the stale-index warning despite being perfectly healthy. + + **`enumeration-failed` auto-sync events no longer dropped** — the new `(taskId, newSha)` join filter required both `worktreePath` and `newSha` on every auto-sync event, which discarded the merger's early-failure events that emit neither. Now: events with both fields use the per-advance pair-key (with macOS realpath canonicalization on both sides); events with neither use a task-id fallback so the diagnostic outcome still surfaces on the matching advance. + + **`aheadOfIntegration` no longer silently shifts semantics** — split into three distinct distance fields so consumers don't have to read `integrationTipSource` to know which comparison they got: + + - `aheadOfIntegration` / `behindIntegration` — HEAD vs **local** integration tip; undefined when only the remote tip exists. + - `aheadOfIntegrationRemote` / `behindIntegrationRemote` — HEAD vs `origin/`; defined whenever the remote tracking ref exists. + - `aheadOfOriginIntegration` / `behindOriginIntegration` — local integration tip vs `origin/`; defined only when both refs exist. + + **`currentBranch` failure no longer masks wrong-branch state** — `git branch --show-current` returns empty on detached HEAD (success) and throws on transient git errors (lock contention, timeout). The prior catch collapsed both into `currentBranch = ""` so the UI couldn't distinguish them. New `currentBranchDetectionFailed?: boolean` field on `GitStatus` lets the UI surface "branch detection unavailable" on a real failure rather than silently hiding the wrong-branch warning. + +- 916047c: feat(dashboard): Integration branch setting is now a dropdown of local branches with Custom… fallback + + Replaces the plain text input with a ` dropdown when tabs don't fit, distinct from the viewport-based isMobileTerminal/isTabletTerminal flags. +- 4fb3606: summary: Show task Artifacts-tab documents expanded with Markdown by default. + category: feature + dev: TaskDocumentsTab now uses multi-expand document state and persists the Markdown/Plain preference. +- 06bf0b8: summary: Artifacts view — Task Documents sidebar now shows clearer task grouping and more space between tasks. + category: fix + dev: DocumentsView Task Documents sidebar restyles .documents-task-sidebar-group-header vs .documents-task-document-item hierarchy and increases inter-group separation, scoped under .documents-task-documents-sidebar so Project Files and Artifacts tabs are unaffected. +- 391ff0d: summary: Agents now auto-clear error state and retry on their next heartbeat instead of getting stuck. + category: fix + dev: Heartbeat scheduler keeps transient, non-operator-actionable error-state durable agents timer-eligible; executeHeartbeat clears error (error→active, clears lastError) at run entry, bounded by MAX_HEARTBEAT_ERROR_RECOVERY_ATTEMPTS (settings-overridable). Operator-actionable errors stay parked; exhaustion pauses the agent with pauseReason "error-retry-exhausted"; a successful run resets the counter. Emits agent:auto-recover-error-state / agent:error-retry-exhausted run-audit events. +- b3ed63d: summary: Fix the Artifacts Task Documents list rendering as blank rows when documents are loaded. + category: fix + dev: Root cause was flex-shrinking task cards in DocumentsView.css; cards now opt out of shrink and DocumentsView.test.tsx covers loaded 50+ group rendering. +- 3da3f37: summary: Done task cards group Archive and Revert into one dropdown. + category: feature + dev: Reuses the in-progress "Send back" .card-send-back\* dropdown pattern in TaskCard; new i18n key tasks.doneActions. +- 14b7244: summary: Stop recording advisory "merger awaiting-confirmation" planner interventions that never block auto-merge. + category: fix + dev: decidePlannerRecovery now returns action "none" for merger/pull-request stages when autoMergeWillProceed === true; the genuine human-approval (false) and neutral (undefined) confirmation paths are unchanged (FN-7840). +- 0b5c551: summary: Fix the mobile Todo view so the list panel fills full height on selection. + category: fix + dev: TodoView.css — the single-panel narrow-container stack no longer inherits the @media (max-width:768px) sidebar max-height cap. +- c7c6c5a: summary: Priority selection in quick add and task cards is now color-coded by urgency (blue low, amber high, red urgent). + category: feature + dev: priorityIndicator gains a getPriorityColorVar single source consumed by QuickEntryBox, TaskForm inline row, and TaskCard's .card-priority-badge; semantic tokens only, no test-id/payload changes. +- c9d0211: summary: Coordinate durable-agent error recovery across heartbeat and self-healing. + category: fix + dev: Reconciles heartbeatErrorRecovery with recoverOrphanedAgents so timer and self-healing paths share one retry budget, use consistent transient/operator-actionable eligibility, and emit a source-discriminated audit surface (FN-7844). +- 4397caf: summary: Fix push to remote after merge never running; pick the push remote and target branch from dropdowns in settings. + category: fix + dev: The `pushAfterMerge` setting only existed in the soft-deprecated legacy `aiMergeTask` pipeline; `runAiMerge` (the sole merge path since master-plan U0) now runs a post-finalize push step — ref-to-ref fast path, clean-room detached rebase with AI conflict resolution on remote divergence (non-FF local ref CAS advance + merge-advance auto-sync), `push:origin` run-audit events, non-fatal failures. New `GET /api/git/remotes/:name/branches` endpoint backs the settings dropdowns; the `pushRemote` setting string ("origin" / "origin main") is unchanged. +- d116018: summary: Make stranded AI merge recovery bind to the reviewed clean-room commit. + category: fix + dev: Avoids ambiguous same-task clean-room recovery and honors cancellation before pre-prune landing. +- d80cdd2: summary: Honor assigned agent models in execution and warn on default-model fallbacks. + category: fix + dev: Executor assigned-agent lookup now falls back to the root AgentStore; session audit adds noModelResolved/runtimeBuiltInFallbackModel when resolution is empty. +- 41998a6: summary: Fix cramped padding on the Notifications "Failure notification mode" settings card. + category: fix + dev: Wrap the failure-notification card fields in `.notification-provider-body` in NotificationsSection so it matches sibling provider-card padding on desktop and mobile. +- a9d5c0f: summary: Fix Grok CLI chat returning errors or empty replies in the dashboard. + category: fix + dev: Two independent defects. (1) The default (no-project) ChatManager received a bare PluginLoader as its runner; Grok CLI routing (deriveGrokRuntimeHintForNoVisibleKey → resolveRuntime) calls getRuntimeById/createRuntimeContext, which only exist on PluginRunner, so a grok-cli/\* chat with no Fusion-visible GROK_API_KEY threw "getRuntimeById is not a function" and surfaced the misleading "requires the bundled Grok CLI runtime" error. New resolveChatManagerPluginRunner(options) prefers the engine's PluginRunner (the runner the project-scoped chat path already uses), falling back to the loader only in UI-only mode. (2) In a source checkout the running dashboard resolved the staged CLI tsup bundle (packages/cli/dist/plugins/fusion-plugin-grok-runtime/bundled.js), which resolvePluginEntryPath prefers verbatim with no freshness check; that bundle was stale vs the FN-7796 single-JSON adapter source (the FN-7779 dev prebuild rebuilds each plugin's own dist but never the staged bundle), so project-scoped grok chat produced empty replies. Fixed durably: getCandidatePluginDirs now probes the live workspace source dir (/plugins/) before the staged bundle, so dev loads the freshness-checked live plugin (self-healing even when the prebuild is skipped). Published installs are unaffected (no workspace dir). A one-time `pnpm build` refreshes any already-stale staged bundle. +- 5dc3837: summary: Fix header connection pill showing "Desktop Desktop" and mixed font sizes. + category: fix + dev: ShellConnectionStatus now folds the host kind into one summary string; removed the separate \_\_kind span and its CSS. +- 1d2d73b: summary: Fix Memory insights parsing and modernize the Memory, Insights, Todos, and agent Memory views. + category: fix + dev: parseInsightsContent filtered bullets after stripping their prefix, collapsing every category into one blob; useMemoryData drops the dead GET /memory and /memory/stats mount fetches and no longer refetches the file list on selection; Engines tab is a 2-column card grid; Todo items are single-row with a quiet inline action cluster; the agent Memory tab uses the shared FileEditor with per-section save actions and fixes the agents.memoryFileMeta {{date}} interpolation. +- c73094e: summary: Polish the Memory view: centered layout, labeled editor toolbar, aligned toggle rows. + category: fix + dev: MemoryView tabs get a 960px centered column; FileEditor instances pass forceToolbarActionsVisible; new i18n key memory.dreamsEnabledTooltip. +- c68b053: summary: Reconcile completed and stale generated-fix mission invariants. + category: fix + dev: Completed missions now normalize autopilot/auto-advance to inactive during autopilot completion, polling, and restart recovery. Mission reconciliation also supersedes generated fix features whose own validator state is already passed, and the scheduler startup sweep runs stale generated-fix reconciliation before trying to relink or retriage active slice features. This prevents complete missions from remaining watched and prevents stale generated fix rows from keeping otherwise-drained missions administratively active. +- b613a87: summary: Settings on mobile now keeps showing the GitHub star count. + category: fix + dev: Removed the ≤768px `display:none` on `.settings-github-star-btn__count` in SettingsModal.css (FN-7848). +- be1950b: summary: Keep task detail per-model cost tables horizontally scrollable on mobile. + category: fix + dev: Removes the Task Detail stacked-card mobile override and guards the shared token table scroll contract. +- dbb29d4: summary: Document the planner-overseer eye badge on task cards. + category: internal + dev: Clarifies that the eye icon reflects non-idle plannerOverseerState, not a human view marker. +- e4a59f7: summary: Tasks are no longer stuck "awaiting release authorization" — the over-firing release gate was removed. + category: fix + dev: Removed the triage release-authorization gate (packages/engine/src/triage-release-authorization.ts + finalizeApprovedTask block) and its dashboard approve/reject-plan guards. It false-flagged specs that merely mentioned release tooling and stranded tasks in awaiting-approval with no in-band exit. Legacy `awaitingApprovalReason: "release-authorization"` rows now render as ordinary manual plan-approval holds. Releases are kept out of Fusion by agent instruction (AGENTS.md → Releasing) instead. +- e4d404e: summary: Fix Settings GitLab row overflowing its panel and the footer Save button clipping. + category: fix + dev: settings-gitlab-disclosure now carries the form-group gutter; .settings-modal .modal-actions wraps on desktop instead of clipping (mobile nowrap rail preserved). +- 2cfeb74: summary: Polish first-run setup: connected providers first, state-driven GitHub step, fixed radios, deduped node picker. + category: fix + dev: New setupWizardNodes.ts (getSelectableRuntimeNodes/shouldShowRuntimeNodeSelector) shared by SetupWizardModal and SetupProjectForm; GitHub status revalidates on window focus and OAUTH_RELOGIN_SUCCESS_EVENT; 4 new i18n keys. +- e90a9c4: summary: Auto-heal wedged SQLite connections in place instead of failing every request until restart. + category: fix + dev: The sqlite adapter now classifies connection-corruption errors (SQLITE_NOTADB "file is not a database" / "database disk image is malformed"), reopens the connection on the same path, replays assignment-style PRAGMAs, verifies with PRAGMA quick_check, and retries the failed operation once when outside an explicit transaction. Statements are generation-tracked so ones prepared before the reopen re-prepare transparently; mid-transaction unwind (ROLLBACK/RELEASE) after a reopen is absorbed as no-ops. Covers fusion.db, fusion-central.db, and archive.db. On-disk corruption (quick_check failure) still defers to the open-time recovery machinery. +- 23e36b8: summary: Task API operations no longer fail with 500 when a task's PROMPT.md can't be read; server also logs 500 causes. + category: fix + dev: getTask (the shared load for GET/DELETE/PATCH/retry/reset/archive) and the mutation helpers updateTaskUnlocked, updateStep, readPromptForArchive, and resetPromptCheckboxes (packages/core/src/store.ts) read PROMPT.md unguarded, so an unreadable file (root-owned from a prior `sudo` run → EACCES, PROMPT.md being a directory → EISDIR, transient FS error) 500'd every per-task op while the PROMPT.md-free board list/create kept working. These reads are now best-effort (degrade + log). Diagnosability: rethrowAsApiError preserves the original error as Error `cause` and the /api boundary logs stack + cause for 5xx (packages/dashboard/src/api-error.ts, server.ts); client body stays generic in production. +- 23e36b8: summary: "Update now" now explains permission (EACCES) failures and how to fix them instead of showing raw npm errors. + category: fix + dev: `performUpdateInstall` (packages/dashboard/src/update-check.ts) detects EACCES/EPERM install failures (by error code or stderr text) and returns actionable remediation — run `sudo fn update`, reinstall without sudo, or `brew upgrade fusion` for Homebrew installs — rather than the raw `npm error EACCES … rename '/usr/lib/node_modules/@runfusion/fusion'`. Occurs when Fusion was installed via `sudo npm i -g` (root-owned global dir); `--force` is not retried for this class since it cannot grant write permission. + +### runfusion.ai + +#### Patch Changes + +- Updated dependencies [6317fcd] +- Updated dependencies [79264d4] +- Updated dependencies [17d7bd1] +- Updated dependencies [49faf0a] +- Updated dependencies [66e91f9] +- Updated dependencies [9ac4da0] +- Updated dependencies [f10c39f] +- Updated dependencies [409de31] +- Updated dependencies [9024f3a] +- Updated dependencies [f628095] +- Updated dependencies [05d30ff] +- Updated dependencies [93b0801] +- Updated dependencies [ec1a2ea] +- Updated dependencies [fbea66d] +- Updated dependencies [19055c6] +- Updated dependencies [f66bfae] +- Updated dependencies [23e36b8] +- Updated dependencies [84fb513] +- Updated dependencies [53427cd] +- Updated dependencies [c565ceb] +- Updated dependencies [d585edb] +- Updated dependencies [7fe18df] +- Updated dependencies [bccb552] +- Updated dependencies [639a706] +- Updated dependencies [3e7e4a8] +- Updated dependencies [22e7d75] +- Updated dependencies [55dae49] +- Updated dependencies [081dae0] +- Updated dependencies [4fb2bf5] +- Updated dependencies [dcfbee9] +- Updated dependencies [6606902] +- Updated dependencies [6cff782] +- Updated dependencies [7dc2710] +- Updated dependencies [2580524] +- Updated dependencies [21d1201] +- Updated dependencies [b2613b7] +- Updated dependencies [71e9f48] +- Updated dependencies [c8fcbec] +- Updated dependencies [cda9532] +- Updated dependencies [a4931a4] +- Updated dependencies [626e002] +- Updated dependencies [a24b0fa] +- Updated dependencies [171aaa2] +- Updated dependencies [e657d3b] +- Updated dependencies [1fc615d] +- Updated dependencies [e5c3ffb] +- Updated dependencies [927741a] +- Updated dependencies [d44dbaa] +- Updated dependencies [5a9f354] +- Updated dependencies [7420abe] +- Updated dependencies [6a13ad1] +- Updated dependencies [1e79a23] +- Updated dependencies [bab42b4] +- Updated dependencies [0e90578] +- Updated dependencies [86bd434] +- Updated dependencies [5304af8] +- Updated dependencies [4726af6] +- Updated dependencies [9d7b087] +- Updated dependencies [2ff8e2e] +- Updated dependencies [f930790] +- Updated dependencies [1fa4a69] +- Updated dependencies [786a274] +- Updated dependencies [eb377ba] +- Updated dependencies [547740b] +- Updated dependencies [9ce0b49] +- Updated dependencies [f7c6f56] +- Updated dependencies [d2c2a4c] +- Updated dependencies [28c8233] +- Updated dependencies [b4b183f] +- Updated dependencies [2be6040] +- Updated dependencies [fed5d3d] +- Updated dependencies [150227f] +- Updated dependencies [18841d7] +- Updated dependencies [f6fd6ac] +- Updated dependencies [059016e] +- Updated dependencies [167067c] +- Updated dependencies [3cda9d8] +- Updated dependencies [5f14a58] +- Updated dependencies [235ff4c] +- Updated dependencies [df8ad46] +- Updated dependencies [1ba588d] +- Updated dependencies [f9641ec] +- Updated dependencies [035caca] +- Updated dependencies [57c3d7c] +- Updated dependencies [2758dde] +- Updated dependencies [a32307f] +- Updated dependencies [70330bc] +- Updated dependencies [ee796ee] +- Updated dependencies [f5fd8b8] +- Updated dependencies [5729fe2] +- Updated dependencies [2e97395] +- Updated dependencies [03073af] +- Updated dependencies [59a798b] +- Updated dependencies [4d4e9ad] +- Updated dependencies [cc8b1b6] +- Updated dependencies [30bd779] +- Updated dependencies [dd82a60] +- Updated dependencies [db9b9d2] +- Updated dependencies [de67b57] +- Updated dependencies [fc4acd4] +- Updated dependencies [3d5cc0a] +- Updated dependencies [c258fc1] +- Updated dependencies [7846c96] +- Updated dependencies [725ce45] +- Updated dependencies [915c1e0] +- Updated dependencies [21fb8f6] +- Updated dependencies [367f591] +- Updated dependencies [60b8b4e] +- Updated dependencies [c1b14c2] +- Updated dependencies [281d1a3] +- Updated dependencies [595d323] +- Updated dependencies [56b20a7] +- Updated dependencies [bd0e99b] +- Updated dependencies [d40f24d] +- Updated dependencies [a2c9b0f] +- Updated dependencies [3da9da2] +- Updated dependencies [9376504] +- Updated dependencies [0a90dc4] +- Updated dependencies [ee5c2a8] +- Updated dependencies [26f0c5a] +- Updated dependencies [6b506f2] +- Updated dependencies [4fb3606] +- Updated dependencies [06bf0b8] +- Updated dependencies [391ff0d] +- Updated dependencies [b3ed63d] +- Updated dependencies [cc743ee] +- Updated dependencies [3da3f37] +- Updated dependencies [14b7244] +- Updated dependencies [0b5c551] +- Updated dependencies [c7c6c5a] +- Updated dependencies [c9d0211] +- Updated dependencies [dd95634] +- Updated dependencies [d99c04c] +- Updated dependencies [4397caf] +- Updated dependencies [d116018] +- Updated dependencies [d80cdd2] +- Updated dependencies [41998a6] +- Updated dependencies [6267a76] +- Updated dependencies [a9d5c0f] +- Updated dependencies [5dc3837] +- Updated dependencies [1d2d73b] +- Updated dependencies [c73094e] +- Updated dependencies [c68b053] +- Updated dependencies [b613a87] +- Updated dependencies [be1950b] +- Updated dependencies [dbb29d4] +- Updated dependencies [e4a59f7] +- Updated dependencies [e4d404e] +- Updated dependencies [2cfeb74] +- Updated dependencies [bcbd97c] +- Updated dependencies [e90a9c4] +- Updated dependencies [23e36b8] +- Updated dependencies [fc07bdf] +- Updated dependencies [23e36b8] +- Updated dependencies [4edd8cc] + - @runfusion/fusion@0.58.0 ## 0.57.0 @@ -3036,10881 +3542,4 @@ User-facing release notes aggregated across all packages. This file is auto-sync - Updated dependencies [661b6b8] - @runfusion/fusion@0.50.0 -## 0.49.0 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.49.0 -- @fusion/engine@0.49.0 -- @fusion/i18n@0.39.12 -- @fusion-plugin-examples/cli-printing-press@0.1.29 -- @fusion-plugin-examples/compound-engineering@0.1.12 -- @fusion-plugin-examples/dependency-graph@0.1.43 -- @fusion-plugin-examples/roadmap@0.1.31 -- @fusion-plugin-examples/cursor-runtime@0.1.31 -- @fusion-plugin-examples/droid-runtime@0.1.38 -- @fusion-plugin-examples/hermes-runtime@0.2.62 -- @fusion-plugin-examples/openclaw-runtime@0.2.62 -- @fusion-plugin-examples/paperclip-runtime@0.2.62 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.49.0 -- @fusion/dashboard@0.49.0 -- @fusion/engine@0.49.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.49.0 -- @fusion/pi-claude-cli@0.49.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.49.0 - -### @runfusion/fusion - -#### Minor Changes - -- 7772ab3: summary: Add a default-on, toggleable pre-merge Code Review step to the built-in coding workflows. - category: feature - dev: New `code-review` optional-group node (defaultOn:true, toolMode readonly, gateMode advisory, phase pre-merge) on the pre-merge success path (execute → browser-verification → code-review → review) of both the built-in coding and stepwise coding workflows. Runs for every coding task by default (seeded into enabledWorkflowSteps via resolveDefaultOnOptionalGroupIds) but is toggleable off per task; advisory so it does not change merge outcomes (operators can promote it to a blocking gate). Also fixes default-workflow task creation to seed default-on optional groups for interpreter-deferred built-ins (previously dropped). Reuses the shared prompt-gate verdict machinery (no engine verification code). The `code-review` WORKFLOW_STEP_TEMPLATE is also available in the editor palette. -- 744aa2c: summary: Verification now runs only the tests affected by a task's changed files, so merge/step checks finish in seconds. - category: feature - dev: New deriveFileScopedPnpmTestCommand maps changed test files (and co-located tests of changed source) to a per-package `pnpm --filter exec vitest run ` command; inferDefaultTestCommand uses it (overriding even an explicit testCommand) when the new project setting scopeVerificationToChangedFiles (default true) is on and git context is available, falling back to the configured command when no tests resolve. The thin merge-gate suite remains the cross-cutting safety net. -- 98a5052: summary: Record signed signal connectors in Command Center incident metrics. - category: feature - dev: Adds connector incident ingestion and /api/command-center/signals/connectors configuration status. -- e46ea00: summary: Add an engine-disconnected dashboard banner with one-click Start engine. - category: feature - dev: Adds project-scoped engine status/start API routes and dashboard-only guidance for UI-only launches. -- 9a2709d: summary: Show provider icons next to Command Center model names. - category: feature - dev: Infers provider icons from model ids for Command Center model tables and bar charts; pie charts remain text-only. -- 4cc9c2f: summary: Preview images, videos, audio, and PDFs directly in the Files modal. - category: feature - dev: Adds browser-native previews backed by workspace-safe file download URLs. -- 541f1f6: summary: Add optional workflow-step quick dropdowns to task creation surfaces. - category: feature - dev: Surfaces active workflow optional steps in QuickEntryBox and NewTaskModal create payloads. -- 79c602d: summary: Add core MCP server settings model with project/global precedence and secret references. - category: feature - dev: New @fusion/core MCP config types, validators, resolveEffectiveMcpServers, secret-resolver seam, and Claude Desktop import/export. Secret material stored only as Fusion-managed secret references. -- 6c94ee0: summary: Forward configured MCP servers to all AI lanes and add reachability validation. - category: feature - dev: Adds runtime MCP support gating, materialized MCP forwarding, and POST /api/mcp/validate. -- 429143e: summary: Add `fn mcp` CLI to manage MCP servers, import Claude Desktop config, and export Fusion MCP JSON. - category: feature - dev: New `packages/cli/src/commands/mcp.ts`; reuses @fusion/core resolveEffectiveMcpServers, validation, and import/export; sensitive fields stored as secret references via SecretsStore, never plaintext. -- 301f25d: summary: Add MCP server management UI in Settings with global/project scopes, validation, and import/export. - category: feature - dev: New SettingsModal sections global-mcp/mcp + McpServersCard; consumes @fusion/core MCP foundation and POST /api/mcp/validate; sensitive fields bind to secret references only. -- 2ce208e: summary: Automations popup is now movable and resizable like other Fusion pop-outs. - category: feature - dev: ScheduledTasksModal modal presentation now renders inside the shared FloatingWindow (windowKey "automation", persistGeometryKey "floating-window:automation"); embedded presentation unchanged. Mobile stays full-screen by CSS. -- 8131d54: summary: Automation AI steps now run with all tools by default, with a per-step tool selector and live run output. - category: feature - dev: Adds AutomationStep.allowedTools + AUTOMATION_SELECTABLE_TOOLS (core); toolsAllowlist on createFnAgent (engine); SSE GET /automations/:id/run/stream and /routines/:id/run/stream (dashboard). -- dd1b960: summary: Enabled optional workflow steps now run and show in task progress reliably. - category: feature - dev: Fixes FN-7039. `Store.optionalGroupIdSet` falls back to `builtin:coding` (matching the executor's unselected-task resolution) so a toggled built-in group id (e.g. `browser-verification`) is no longer materialized into a legacy `WS-xxx` step row the graph never matches. Create-time optional-step controls (QuickEntryBox, TaskForm) resolve `builtin:coding` when no project default workflow is set, so the toggles appear. First unit of the broader graph-native workflow-step refactor. -- 2442032: summary: Make Remote Access settings visible without enabling an experimental flag. - category: feature - dev: Graduates the Settings UI section while leaving remoteAccess provider/token gating unchanged. -- f685518: summary: Auto-discover MCP servers from Claude/Cursor/Windsurf/VS Code and opt-in to enable them in Settings. - category: feature - dev: New @fusion/core mcp-discovery source resolution + parser, @fusion/engine discoverMcpServers fs reader, GET /api/mcp/discovered route, and a discovered region in McpServersCard. Read-only/opt-in; discovered secrets become Fusion secret references, never plaintext. -- 1d860ec: summary: Adjust the global concurrency cap from the footer and dashboard; settings grouped by global vs project scope. - category: feature - dev: Added a Global Max Concurrent slider (wired to fetch/updateGlobalConcurrency) to EngineControlMenu (footer) and the dashboard CommandCenterControls Concurrency card, with debounced saves matching the existing project sliders. SchedulingSection now groups fields under labeled "Global — all projects" and "This project" subheadings with scope badges so the global cap is not mistaken for a per-project setting (clearer on mobile). - -#### Patch Changes - -- c7cbae1: summary: Keep task-detail Chat and Workflow tabs aligned on displayed model names. - category: fix - dev: Extracts dashboard effective model display resolution for shared Chat, Agent Log, and Workflow tab use. -- 50a9471: summary: Fix random fusion crashes when multiple dashboards/CLIs run on one host. - category: fix - dev: Central DB (~/.fusion/fusion-central.db) now uses journal_mode=DELETE instead of WAL. WAL coordinates concurrent processes via a memory-mapped `-shm` wal-index that SIGBUSes a reader (walIndexReadHdr / `cluster_pagein past EOF`) on macOS/APFS when another process resizes it mid-checkpoint, killing the node process with no JS stack. DELETE mode removes the `-shm` mmap surface and coordinates via POSIX locks (busy_timeout absorbs the added writer serialization). Per-project DBs (db.ts) are unchanged. See central-db.ts open() and central-db.test.ts regression. -- b293525: summary: Fix unreadable info-toast contrast and dashboard CSS token regressions. - category: fix - dev: Tokenized raw rgba/undefined CSS vars across ~15 dashboard component stylesheets, defined missing --border-strong / right-dock width tokens, enrolled the shadcn-custom light theme in the dark-text toast correction (WCAG AA). Also repairs ~19 stale dashboard tests that trailed intentional product changes (workflowColumns graduation, onboarding flow, theme relabels, header divider removal). -- c20c4b7: summary: Fix global settings (including the global concurrency cap) intermittently resetting to defaults. - category: fix - dev: Several production call sites built `new CentralCore(store.getFusionDir())`, pointing the central/global DB at the project's `.fusion/` instead of `~/.fusion/` and spawning stray per-project central DBs seeded with default global settings that shadowed real global state. Added `TaskStore.getGlobalSettingsDir()`, routed the secrets store plus the secrets/proxy/node/secrets-sync/settings-sync dashboard routes through it, and added a `resolveGlobalDir()` guard that throws on a project-local `.fusion/` dir (parent is a git repo) so the regression can't silently recur. Existing stray DBs were operator-quarantined. -- d08e8db: summary: Restore dashboard Settings helper copy and TaskChat tool-call labels. - category: fix - dev: Repairs changed-only dashboard assertions for navigation, pause routes, TaskChat, and theme selector parity. -- 6df4043: summary: Preserve the selected workflow when Missions creates tasks. - category: fix - dev: Missions now shares the header workflow selector with Planning and passes workflowId through mission triage APIs. -- f5e1b96: summary: Add a Worktrees setting for copying repository files into new task worktrees. - category: feature - dev: Adds project setting `worktreeCopyFiles`; release with the standard changeset workflow, not manual versioning. -- 0744ab3: summary: Restore animated loading spinners across the Fusion dashboard. - category: fix - dev: Dashboard spinner utilities now use a collision-proof keyframe and tests guard component CSS chunks. -- 9fabc9d: summary: Ignore hidden dot paths in overlap scheduling by default with a Settings toggle. - category: fix - dev: Adds project setting `ignoreHiddenOverlapPaths` and keeps `overlapIgnorePaths` as an additional explicit filter. -- 0049fb9: summary: Make browser and Android Back close dashboard task detail before leaving the current view. - category: fix - dev: Updates dashboard task-detail history entries for full-panel and modal detail flows. -- 4880a0f: summary: Fix Command Center token usage updating live without manual refresh. - category: fix - dev: Analytics polling now revalidates in the background when prior data exists so token cards, charts, and model rows stay mounted during live refresh. -- 419d58f: summary: Prevent Planning Mode summary buttons from overlapping on tablet screens. - category: fix - dev: Adds a tablet responsive CSS contract for Planning Mode summary action wrapping. -- a0954c7: summary: Make Plan Mission with AI desktop modal movable and recover cleanly from stream failures. - category: fix - dev: Dashboard mission interview now uses floating desktop geometry and normalizes terminal SSE errors into one retry state. -- 575e211: summary: Prevent Planning Mode from crashing on malformed AI summary arrays. - category: fix - dev: Normalizes planning summaries, question options, subtasks, and dependency arrays at UI/API boundaries. -- f1b3bd8: summary: Allow Planning Mode generations to continue while meaningful AI output is progressing. - category: fix - dev: Replaces the fixed Planning Mode generation cap with inactivity and repeated-output detection. -- 7e7b0c6: summary: Recover mission AI planning from transient stream interruptions. - category: fix - dev: MissionInterviewModal refetches active session state before showing permanent stream errors. -- 0c53f46: summary: Stop showing branch reattachment warnings in Task Detail. - category: fix - dev: Removes stale TaskDetailModal rebind-banner CSS/mocks and covers missing-branch workspace shapes. -- d984fce: summary: Fix discarding mission interview drafts from the Missions view. - category: fix - dev: Preserves project and owning-tab scope for mission interview draft discard requests. -- ef6e459: summary: Fix excessive spacing in the embedded Automations pane. - category: fix - dev: Top-pack embedded Automations grid rows and add regression coverage for the list/detail layout. -- 2d2dd50: summary: Fix mobile Missions back navigation from mission detail tabs. - category: fix - dev: Tracks mission detail visibility for mobile history entries instead of selected mission IDs. -- 3513d5f: summary: Keep New Task mobile dialog controls tappable while the keyboard is open. - category: fix - dev: Restores hit testing for the NewTaskModal sheet and bounds mobile picker dropdowns. -- 4dab2b6: summary: Exclude engine-down time from task duration badge and stats. - category: fix - dev: Adds engineLastActiveAt heartbeat and startup reconcile-engine-downtime-active-timing recovery. -- 977000c: summary: Restore horizontal scrolling for mobile task detail tabs. - category: fix - dev: Keeps the task-detail tab strip scrollable across Board modal and List embedded surfaces. -- 3f66e55: summary: Fix workflow editor so the Browser Verification block shows connected edges. - category: fix - dev: optional-group/foreach/loop container nodes now render connectable handles without adjacent layer overlap in WorkflowNodeEditor. -- f5b588c: summary: Retry transient ntfy publish failures so one-shot task notifications are less likely to be lost. - category: fix - dev: Adds bounded ntfy fetch retries for network, timeout, 5xx, and 429 failures with a per-attempt timeout. -- 45727f1: summary: Command Center date-range presets now correctly filter charts. - category: fix - dev: Honors open-ended Command Center analytics bounds and serializes All time explicitly. -- 775a1f8: summary: Make the AI session needs-input banner compact and hide it on Missions or Planning. - category: fix - dev: Shrinks SessionNotificationBanner CSS and tests the DashboardBanners visibility guard. -- ea3cfee: summary: Prevent long Skills list rows from overflowing the left pane. - category: fix - dev: Constrains SkillsView discovered-skill name, path, and source rows with ellipsis truncation. -- 0ae4499: summary: Open dependency Graph tasks in the shared movable task pop-out. - category: fix - dev: Routes graph plugin task-open callbacks through MainContent popOutTaskDetail while preserving non-graph plugin modal behavior. -- f3f20ac: summary: Preview image, video, audio, and PDF files natively in the right-dock Files viewer. - category: fix - dev: Reuses the shared file-preview classification and download route in DockFilesView. -- 6415eed: summary: Match the optional steps dropdown trigger to shared task creation buttons. - category: fix - dev: Reuses the dashboard `.btn .btn-sm` trigger styling for WorkflowOptionalStepsDropdown. -- b6b5583: summary: Workflow and automation steps now use the configured project Execution model instead of the default. - category: fix - dev: Workflow/AI-prompt step model resolution now consults the execution lane (resolveExecutorSessionModel / resolveExecutionSettingsModel) instead of resolveProjectDefaultModel, fixing executeWorkflowStep (executor.ts), cron-runner.ts, and dashboard routes.ts. FN-7039. -- 2c46cdc: summary: Fix task Workflow tab showing "Step definition not found." for Code Review and other optional steps. - category: fix - dev: WorkflowResultsTab configuredSteps now shows the not-found message only when a step id is absent from the step lookup, not when a found optional-group step has an empty description. -- ea5e12e: summary: Quick task input no longer refocuses itself after you add a task. - category: fix - dev: Removed QuickEntryBox post-submit focus restoration (FNXC:QuickEntryFocus); supersedes FN-6217/FN-6219. -- 07209a4: summary: Capitalize the built-in Code Review step name consistently. - category: fix - dev: Updates the compound-engineering built-in workflow node display name and regression coverage. -- da69e03: summary: Remove the quick-entry keyboard hint from the task creation surface. - category: internal - dev: Removes the retired quickEntryHint locale key and QuickEntryBox hint shell/CSS. -- 93da87d: summary: Restore mobile swipe scrolling when touching task-detail tab buttons. - category: fix - dev: Adds detail-tab touch-action pan-x coverage to override the global mobile pan-y lock. -- c0d5353: summary: Restore horizontal swiping on Agent Detail tabs on mobile touch devices. - category: fix - dev: Adds `.agent-detail-tab` touch-action pan-x coverage because the global mobile pan-y lock is non-inherited. -- 59fc94b: summary: Fix slash/namespaced skill commands not loading in chat and agent sessions. - category: fix - dev: skill-resolver requested-name matching now reduces a/b, a/b/SKILL.md, and source::a/b forms to the bare token like the dashboard bareSkillName, scoped to requested-name matching (allow/exclude path matching unchanged). -- afa33b7: summary: Fix task-detail Workflow tabs so inherited workflow graphs and step details populate. - category: fix - dev: Resets stale task workflow selection/results on task switches and aliases optional step template IDs. -- d03d6c2: summary: Keep Graph tasks visible when cached workflow assignments reference deleted workflows. - category: fix - dev: Treat stale Graph `taskWorkflowIds` entries as default-workflow assignments during workflow filtering. -- 42f46a1: summary: Fix npm install failure caused by bundled plugins referencing private @fusion packages. - category: fix - dev: Sanitizes copied plugin and vendored extension manifests in tsup.config.ts before publishing. -- 7a3a9a9: summary: Rename the Remote Access settings section (drops the stale "& Node Sync" suffix). - category: fix - dev: The standalone Node Sync settings section is unchanged. -- e48c75c: summary: Mobile: hide the executor footer and remove the empty gap above the keyboard while typing. - category: fix - dev: computeMobileBarKeyboardFlags no longer iOS-gates footerHidden, so Android keyboard-open now hides ExecutorStatusBar and drops the reserved footer+nav padding-bottom (composer sits flush above the keyboard). footerKeyboardOpen stays iOS-only. Supersedes FN-5707's Android gate. -- c202053: summary: Fix Planning Mode not scrolling on mobile so action buttons stay reachable. - category: fix - dev: The global mobile `.modal-lg`/`.modal:not(.confirm-dialog)` 100dvh rule was matching the embedded Planning shell (`.planning-modal--embedded`) and stretching it past its bounded `.planning-view` pane, clipping the footer under `overflow:hidden`. Mobile rule now qualifies as `.planning-view.open .planning-modal--embedded` (specificity 0,3,0) and re-pins `max-height:100%` so the inner flex scroll chain works. -- efa5d9b: summary: Verification (merge/step gate) timeout now scales with command scope instead of a flat 10 minutes. - category: fix - dev: verification-utils runVerificationCommand derives its default from the command — package-scoped (pnpm --filter/-F) gets 300s, workspace-scoped gets 900s — matching fn_run_verification (DEFAULT_TIMEOUT_PACKAGE_SEC/WORKSPACE_SEC). Project verificationCommandTimeoutMs still overrides; the 1800s hard cap still applies. Fixes workspace-scoped suites being killed as a 10-min infra timeout during merge/step verification. -- 7cd660f: summary: Fix stale overlap-blocker repair edge cases and dashboard display synchronization. - category: fix - dev: Adds effective write-scope repair handling for scheduler/file-scope lease consistency. -- 9a2e8a7: summary: Post-merge workflow steps now run once via the workflow graph instead of the merger. - category: internal - dev: Flips `experimentalFeatures.graphNativePostMerge` DEFAULT-ON so the graph is the sole post-merge owner; the legacy merger post-merge path (`runPostMergeWorkflowSteps`/`hasEnabledPostMergeWorkflowSteps`) is inert under the flag (kept until U7c). DB migration 130 rewrites legacy compiled `workflow_steps` enable ids (templateId ∈ built-in optional-group ids: browser-verification, code-review) to the graph node ids in tasks' `enabledWorkflowSteps` (idempotent, de-duped). `workflow_steps` table is retained. -- 347842f: summary: Retire the legacy workflow-steps store; workflow steps now run entirely graph-native. - category: internal - dev: U7c removes the last readers/writers of the legacy `workflow_steps` table and drops it via migration 131 (SCHEMA_VERSION 130→131, idempotent DROP). Removed: store CRUD (`create`/`update`/`delete`/`getWorkflowStep`), the workflow-compilation materializer (`materializeWorkflowSteps`), `migrateLegacyWorkflowSteps` + its `POST /api/workflows/migrate-legacy-steps` route and the editor's on-open migration notice, and the merger legacy post-merge execution path (worktree + prompt/script step run). Pre/post-merge steps record into `task.workflowStepResults`; `selectTaskWorkflow` now seeds `enabledWorkflowSteps` with default-on optional-group node ids only (the graph runs the workflow IR directly). `listWorkflowSteps()` returns only the in-memory plugin palette. Executor revive sources gate-ness from the recorded result status, not the table. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [c7cbae1] -- Updated dependencies [50a9471] -- Updated dependencies [7772ab3] -- Updated dependencies [744aa2c] -- Updated dependencies [b293525] -- Updated dependencies [c20c4b7] -- Updated dependencies [98a5052] -- Updated dependencies [e46ea00] -- Updated dependencies [d08e8db] -- Updated dependencies [6df4043] -- Updated dependencies [f5e1b96] -- Updated dependencies [0744ab3] -- Updated dependencies [9fabc9d] -- Updated dependencies [0049fb9] -- Updated dependencies [9a2709d] -- Updated dependencies [4880a0f] -- Updated dependencies [4cc9c2f] -- Updated dependencies [419d58f] -- Updated dependencies [a0954c7] -- Updated dependencies [575e211] -- Updated dependencies [f1b3bd8] -- Updated dependencies [7e7b0c6] -- Updated dependencies [0c53f46] -- Updated dependencies [d984fce] -- Updated dependencies [ef6e459] -- Updated dependencies [2d2dd50] -- Updated dependencies [3513d5f] -- Updated dependencies [4dab2b6] -- Updated dependencies [977000c] -- Updated dependencies [3f66e55] -- Updated dependencies [541f1f6] -- Updated dependencies [f5b588c] -- Updated dependencies [45727f1] -- Updated dependencies [775a1f8] -- Updated dependencies [79c602d] -- Updated dependencies [6c94ee0] -- Updated dependencies [429143e] -- Updated dependencies [301f25d] -- Updated dependencies [ea3cfee] -- Updated dependencies [0ae4499] -- Updated dependencies [f3f20ac] -- Updated dependencies [6415eed] -- Updated dependencies [2ce208e] -- Updated dependencies [8131d54] -- Updated dependencies [b6b5583] -- Updated dependencies [dd1b960] -- Updated dependencies [2c46cdc] -- Updated dependencies [ea5e12e] -- Updated dependencies [07209a4] -- Updated dependencies [da69e03] -- Updated dependencies [93da87d] -- Updated dependencies [c0d5353] -- Updated dependencies [59fc94b] -- Updated dependencies [afa33b7] -- Updated dependencies [d03d6c2] -- Updated dependencies [42f46a1] -- Updated dependencies [2442032] -- Updated dependencies [7a3a9a9] -- Updated dependencies [f685518] -- Updated dependencies [1d860ec] -- Updated dependencies [e48c75c] -- Updated dependencies [c202053] -- Updated dependencies [efa5d9b] -- Updated dependencies [7cd660f] -- Updated dependencies [9a2e8a7] -- Updated dependencies [347842f] - - @runfusion/fusion@0.49.0 - -## 0.48.0 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.48.0 -- @fusion/engine@0.48.0 -- @fusion/i18n@0.39.11 -- @fusion-plugin-examples/cli-printing-press@0.1.28 -- @fusion-plugin-examples/compound-engineering@0.1.11 -- @fusion-plugin-examples/dependency-graph@0.1.42 -- @fusion-plugin-examples/roadmap@0.1.30 -- @fusion-plugin-examples/cursor-runtime@0.1.30 -- @fusion-plugin-examples/droid-runtime@0.1.37 -- @fusion-plugin-examples/hermes-runtime@0.2.61 -- @fusion-plugin-examples/openclaw-runtime@0.2.61 -- @fusion-plugin-examples/paperclip-runtime@0.2.61 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.48.0 -- @fusion/dashboard@0.48.0 -- @fusion/engine@0.48.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.48.0 -- @fusion/pi-claude-cli@0.48.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.48.0 - -### @runfusion/fusion - -#### Minor Changes - -- d7f3c70: summary: Add a workflow dropdown to filter tasks in the dependency Graph view. - category: feature - dev: Scopes plugin-hosted graph tasks through the dashboard workflow assignment payload. - -#### Patch Changes - -- a20235b: summary: Fix release pipeline so binaries and desktop installers publish again. - category: fix - dev: github-release job sparse-checks-out CHANGELOG.md (was missing a checkout, so the release-notes step threw ENOENT and published 0 assets on v0.47.0); desktop esbuild build externalizes @fusion/engine so it no longer tries to bundle node-pty's native .node binaries. -- 214a60c: summary: Let quick-entry text use the full entry box width instead of wrapping early. - category: fix - dev: Adds a QuickEntryBox-specific textarea padding override and CSS cascade regression coverage. -- 5a192ec: summary: Add a New Task dialog picker that seeds prompts from current-remote GitHub issues and PRs. - category: feature - dev: Reuses existing GitHub remote, issue, and pull list endpoints; PR prompts direct agents to address review comments. -- a554ceb: summary: Match Quick Chat and Terminal typography in the dashboard footer. - category: fix - dev: Footer launcher CSS now shares inherited font and color contracts between Quick Chat and Terminal. -- d359306: summary: Prevent Create PR metadata generation from hanging and provide editable fallback content. - category: fix - dev: Bounds PR metadata generation and validates non-empty PR bodies before GitHub PR creation. -- 29530b5: summary: Widen tablet Chat View agent response bubbles for easier reading. - category: fix - dev: Uses ChatView container queries to target assistant, streaming, and failure bubbles without widening user or Quick Chat bubbles. -- eb3833a: summary: Retire dual-observe as a workflow-authoritative cutover prerequisite. - category: fix - dev: Cutover readiness now uses the authoritative flag plus clean populated parity summaries; stale dual-observe settings remain inert. -- 3ae053e: summary: Keep Planning Mode malformed AI responses retryable instead of stranding sessions. - category: fix - dev: Hardens planning JSON candidate selection and persists bounded parse failures as retryable AI-session errors. -- f918896: summary: Keep Git Manager tabs reachable in mobile and docked layouts. - category: fix - dev: Makes the shared Git Manager tablist a non-wrapping horizontal touch scroller in mobile and embedded narrow containers. -- bd5a779: summary: Remove helper guidance above the task chat composer. - category: fix - dev: Task chat placeholders now carry active/idle/done composer guidance without an extra status shell. -- 7a00811: summary: Open Mission Manager mission-delete confirmations in the standard modal dialog. - category: fix - dev: Routes mission list and detail delete affordances through ConfirmDialogProvider with regression coverage. -- e473ba6: summary: Make the task Changes tab inline diff panel wider on narrow screens. - category: fix - dev: Reclaims task-detail body padding for compact inline diff lists with mobile CSS contract coverage. -- e702185: summary: Equalize mobile bottom navigation side spacing. - category: fix - dev: Adds tokenized MobileNavBar horizontal padding while preserving ICB and safe-area behavior. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [a20235b] -- Updated dependencies [d7f3c70] -- Updated dependencies [214a60c] -- Updated dependencies [5a192ec] -- Updated dependencies [a554ceb] -- Updated dependencies [d359306] -- Updated dependencies [29530b5] -- Updated dependencies [eb3833a] -- Updated dependencies [3ae053e] -- Updated dependencies [f918896] -- Updated dependencies [bd5a779] -- Updated dependencies [7a00811] -- Updated dependencies [e473ba6] -- Updated dependencies [e702185] - - @runfusion/fusion@0.48.0 - -## 0.47.0 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.47.0 -- @fusion/engine@0.47.0 -- @fusion/i18n@0.39.10 -- @fusion-plugin-examples/cli-printing-press@0.1.27 -- @fusion-plugin-examples/compound-engineering@0.1.10 -- @fusion-plugin-examples/dependency-graph@0.1.41 -- @fusion-plugin-examples/roadmap@0.1.29 -- @fusion-plugin-examples/cursor-runtime@0.1.29 -- @fusion-plugin-examples/droid-runtime@0.1.36 -- @fusion-plugin-examples/hermes-runtime@0.2.60 -- @fusion-plugin-examples/openclaw-runtime@0.2.60 -- @fusion-plugin-examples/paperclip-runtime@0.2.60 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.47.0 -- @fusion/dashboard@0.47.0 -- @fusion/engine@0.47.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.47.0 -- @fusion/pi-claude-cli@0.47.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.47.0 - -### @runfusion/fusion - -#### Minor Changes - -- a6252e5: Merger unification (master-plan U0): `runAiMerge` (the FN-5633 clean-room AI merge path) is now the **sole** merge path. The engine dispatch, the `fn task merge` CLI command, and the UI-only (`--no-engine`) dashboard merge all route through `runAiMerge`; the legacy `aiMergeTask` pipeline is soft-deprecated (body retained, `@deprecated`). The `merger.mode` setting is now **inert and deprecated** — the type and field are retained as published surface, but the `"deterministic"` value no longer selects a different pipeline; observing it logs a one-time deprecation warning and proceeds via the unified AI merge path. A new shared `assertNotWorkspaceTaskMerge` guard rejects workspace-mode tasks (populated `workspaceWorktrees`) at every merge entry point with a clear error until per-repo merge support (master-plan U6) lands. -- e5382f0: **Breaking:** the `WorkflowOptionalStep` type, previously exported from `@runfusion/fusion`, is removed — any consumer importing it must migrate to `optional-group` nodes / `ResolvedWorkflowOptionalStep`. - - Retire the legacy optional-step DECLARATION model now that optional steps are graph-native `optional-group` nodes. Remove the `WorkflowOptionalStep` type and the `WorkflowIrV2.optionalSteps` IR field, drop the workflow node editor's optional-step declaration authoring panel (sidebar section, mobile tab, and collapse state), and stop threading an `optionalSteps` array through `flowToIr`/`serializeGraph`. A legacy persisted `optionalSteps` key on an old v2 workflow row is now tolerated (ignored, not validated) at parse so old rows still load as v2, and the rollback-downgrade heuristic still treats such a row as v2. The per-task optional-step toggle surfaces are unchanged — they continue to list and toggle optional steps sourced from `optional-group` nodes via `resolveWorkflowOptionalSteps` (`ResolvedWorkflowOptionalStep`). - -- e17e9bc: Add `X-Session-Id` and `X-Session-Affinity` request headers to all LLM chat completion requests. These let LLM gateways sticky-route consecutive requests from the same conversation to the same backend, and let observability tools (Langfuse, Arize, etc.) group the otherwise-stateless API calls of a session into a single multi-turn trace. Both headers carry the same stable identifier — the task id when available (stable across pause/resume), otherwise the pi session id. (#1675) -- 2019e5a: summary: Structured changeset format with AI-distilled release notes for cleaner, user-facing changelogs. - category: feature - dev: Changeset bodies now use labeled fields (summary, category, dev). A linter enforces the format in the PR gate. Release notes are distilled into grouped, end-user-facing sections. See .changeset/README.md for the format guide. -- 9c6b4dd: Workflow editor: add a Help section to the node detail pane. Every node now documents what it does, how to configure it, and its inputs/outputs/edges — including the engine-managed merge-lifecycle nodes (auto-merge gate, branch-group member integration, branch-group promotion, PR and recovery nodes), which are surfaced read-only with an "Engine-managed" badge. -- 0c031b8: Workflow editor: optional steps are now graph-native. A new `optional-group` container node (foreach/loop-style) holds a subgraph the executor runs once when the group is enabled for a task (per-task `enabledWorkflowSteps` + workflow `defaultOn`) and bypasses when disabled. All seven built-in add-ons (documentation-review, qa-check, security-audit, performance-review, accessibility-check, browser-verification, frontend-ux-design) are insertable from the node-editor palette as a node or wrapped in an optional-group. The built-in coding and stepwise-coding workflows now express `browser-verification` as an optional-group. Optional-group enable resolution correctly handles id collisions with add-on template ids, so a group's enable state is not silently bypassed during task creation/update. (The legacy declaration-based optional-steps model is retired in a sibling changeset; only the `workflow-step` seam infrastructure removal remains a follow-up.) -- 023e4b0: Workspace tasks no longer render blank in the dashboard. Task cards and the task - detail view now surface a workspace task's acquired per-sub-repo worktrees as a - read-only "N repos acquired" placeholder and flat repo → worktree/branch list, - instead of an empty branch area (no `task.worktree`/`task.branch`). -- 8f4098e: Add workspace mode: open a folder of git repositories as a single Fusion - project. The agent acquires per-repo worktrees on demand via - `fn_acquire_repo_worktree` as it discovers it needs to work in each sub-repo. -- 12d33c5: Workspace mode (Phase A / U2): harden per-repo worktree acquisition. Each sub-repo worktree now gets the task identity guard installed (single-repo parity), a per-repo base commit SHA captured local-first against that sub-repo's resolved integration branch (shared `integrationBranch` override stripped so each repo falls through to its own `origin/HEAD`), and same-sub-repo acquisition exclusivity registered in the path-keyed active-session registry. Re-acquiring an already-acquired `(taskId, repo)` is idempotent, and acquisition failures surface an error plus an audit event instead of silently stalling. -- 64e87f9: Workspace mode (Phase C U3): serialize concurrent same-sub-repo lands with a per-repo file-scope lease. When two workspace tasks try to land onto the SAME sub-repo's local integration ref at the same time, the merge phase now registers the sub-repo's absolute path in the path-keyed active-session registry under a distinct `workspace-repo-land` kind before each land and releases it in a `finally` (on land success or failure — no stuck lock). A second task contending for the same sub-repo fast-fails with a retryable `WorkspaceRepoLandBusyError`, which the existing partial-land auto-retry-then-park dispatch handles (consume a `mergeRetry`, re-enqueue with backoff, then operator-park). Disjoint sub-repos lease different paths and never serialize against each other. The lease prevents clean-room ai-merge worktree collisions; ref correctness is already guaranteed by `advanceIntegrationBranchRef`'s CAS (concurrent-advance → rebuild). -- 09bd01b: Workspace mode Phase A (U1): executor session scoping. In workspace mode the executor now skips the root worktree acquisition and every rootDir git preflight (base-commit capture, contamination, worktree-liveness), runs the agent session rooted at the browse-only workspace root, and tracks acquired sub-repo worktrees as a per-task set. Single-repo tasks are unchanged (one-element set, byte-for-byte preflight parity). -- fc9423e: Workspace mode (Phase B, U1): per-repo post-session change capture, contamination detection, and worktree-invariant verification. In workspace mode the executor now loops `task.workspaceWorktrees`, reusing `captureModifiedFiles` per sub-repo (diffing each against its own `baseCommitSha`, with a merge-base fallback when undefined) to aggregate repo-prefixed `task.modifiedFiles` and surface per-repo contamination, and un-stubs `verifyWorktreeInvariants` to assert each acquired worktree's git toplevel and `fusion/` branch. Single-repo behavior is unchanged. -- 81edbee: Workspace mode (Phase B, U2): per-repo review at both review entry points plus per-repo `fn_task_done` completion + scope-leak verification. In workspace mode both review call sites (the in-session `fn_review_step` tool and the step-inversion review seam) now loop the single-cwd `reviewStep` once per acquired sub-repo (cwd = each repo's worktree) and aggregate the repo-tagged verdicts as a conjunction — the task is reviewed only when every sub-repo approves, and the first failing sub-repo's verdict (with repo-tagged findings) drives the existing verdict→edge mapping. `fn_task_done` now verifies worktree invariants per acquired repo and iterates the scope-leak guard per sub-repo (cwd = repo worktree, repo `baseCommitSha`), blocking completion on any sub-repo carrying off-scope changes and naming the repo. Adds a minimal shared repo-prefix-derivation helper (`workspace-paths.ts`). Single-repo behavior is unchanged. - - Phase-B hardening: the per-repo scope-leak guard now fails CLOSED — a thrown capture/diff error in any sub-repo refuses `fn_task_done` (naming the repo) instead of failing open, and a scoped task that acquired zero sub-repo worktrees is blocked rather than silently passing. A legitimate per-repo `.changeset/` file is no longer falsely flagged off-scope (the always-allowed carve-out now runs against the repo-local path). Per-repo review stops at the first non-APPROVE sub-repo so a later repo's reviewer error can't mask an already-determined REVISE/RETHINK. Per-repo capture failures are isolated (one repo's error no longer drops the whole modified-files write), and the reported offending/failing repo is now deterministic (sorted repo iteration). Single-repo behavior remains unchanged. - -- 744ed09: Workspace mode Phase C (U1): per-repo merge loop. Extract `landOneRepo` from the - `runAiMerge` clean-room land closure (single-repo behavior unchanged) and add - `landWorkspaceTask`, which lands each acquired sub-repo's `fusion/` branch onto - that repo's OWN local integration ref (re-resolved per repo with overrides stripped), - land-as-you-go with no remote push. The engine merge dispatch and the user-facing - CLI/dashboard merge doors now route workspace tasks through this loop instead of - throwing; `store.mergeTask`, `aiMergeTask`, and the `runAiMerge` chokepoint keep - throwing `WorkspaceTaskMergeError` as defense-in-depth. -- 7544346: Workspace mode Phase C (U2): per-repo landed predicate, finalize-once, and idempotent - auto-retry-then-park. `landWorkspaceTask` now records each sub-repo's `landedSha` after - its branch advances that repo's local integration ref, and on a re-run SKIPS any repo - whose recorded `landedSha` is an ancestor of (or equals) its current integration tip — so - an interrupted multi-repo land retries only the un-landed repos and never re-advances an - already-landed ref. When every acquired repo's landed predicate holds, the task moves to - `done` EXACTLY ONCE via the task-global finalize path with an aggregate `mergeDetails` - (representative `commitSha` + a `workspaceLandedShas` map). A partial land (some repos - unlanded) does not move the task done; the engine merge dispatch surfaces it as a - retryable failure that consumes a `mergeRetry` and auto-retries the merge (skipping landed - repos) up to the configured max, then operator-parks the task as failed. -- 7cd204e: Workspace mode Phase D (U1): workspace-aware self-healing. The existing merging-status reconcilers no longer mis-finalize a partial-landed workspace task (recoverInterruptedMergingTasks now clears the transient `merging` status and re-enqueues the idempotent per-repo land instead of running the single-commit finalize over the non-git workspace root), and recoverMergeableReviewTasks now admits workspace tasks (task.worktree is null). Adds three reconcilers: partial-land recovery (re-enqueue via enqueueMerge, FORK-A unrecoverable → park failed; guarded by autoMerge:false + user-pause + workspace-aware liveness), phantom `workspace-repo-land` lease reclaim (new `entriesByKind` registry seam), and per-repo worktree cleanup from stored paths (no temp walk). New run-audit events: `task:reconcile-workspace-partial-land`(`-no-action`), `task:reclaim-phantom-workspace-land-lease`, `task:reconcile-orphaned-workspace-worktree`. - - Phase D P1 TOCTOU fix (merge-queue dispatch blind spot): the workspace partial-land and phantom-land-lease reconcilers now consult a new `ProjectEngine.isMergePending(taskId)` seam (true if the task is in the engine's in-memory `mergeQueue` or `mergeActive`). This closes the dequeue→rawMerge window where a workspace task is being merged but no other liveness signal fires yet (the id is shifted out of `mergeQueue` while `activeMergeTaskId` / `merging` status / the `workspace-repo-land` lease are not yet set inside `landWorkspaceTask`). The partial-land reconciler skips a merge-pending candidate (emitting `task:reconcile-workspace-partial-land-no-action` with reason `merge-pending`) instead of launching a second concurrent `landWorkspaceTask` (double-squash risk, since a same-task land lease is not contention), and lease reclaim leaves a merge-pending owner's not-yet-registered lease alone. Wired via `InProcessRuntime.setMergePendingProvider`; undefined (unwired) is treated as not-pending so existing guards still apply. - - Phase D review hardening: every single-commit-finalize self-healing site is now workspace-gated so a partial-landed workspace task can never be marked fully merged on one repo's commit — `recoverStuckMergeDeadlocks` (the twin of recoverInterruptedMergingTasks), `recoverOrphanOnlyScopeViolations`, `recoverAlreadyMergedReviewTasks`, `recoverBranchMisboundInReviewTasks`, and `recoverDoneTaskMergeMetadata` all skip workspace tasks and defer recovery to the workspace partial-land reconciler. The partial-land reconciler now bounds its `enqueueMerge` re-enqueue (parks `failed` after repeated queue rejections instead of looping forever) and treats a branch-gone-and-not-landed sub-repo as unrecoverable even when a stale unreachable `landedSha` is present. Phantom land-lease reclaim now only reclaims a demonstrably TERMINAL owner (never an `in-progress` executing task that registered its lease early). Orphan per-repo worktree removal failures are now engine-logged and retry-bounded. The canonical `isRepoLanded` predicate moved to a new dependency-free `workspace-land-predicate` module, dissolving the self-healing ↔ merger-ai import cycle (public export preserved). - -#### Patch Changes - -- 038ac30: Saved agent tool-output details now default off to reduce persisted log payloads, while timeline rows remain logged and detailed tool arguments/results stay available via the global `persistAgentToolOutput: true` opt-in. -- 627bdcf: Harden the workspace per-repo land loop against partial-failure races. A lost `landedSha` DB write after a sub-repo's integration ref already advanced no longer silently continues — it escalates to a retryable partial-land error, and the landed predicate now recognizes an already-landed repo via its `Fusion-Task-Id` trailer on retry, so a re-run never produces a second squash commit. The land lease is now taskId-aware across registry kinds: a merging task can no longer clobber an executing task's acquire lease on a shared sub-repo (any foreign-task holder is treated as contention), and the active-session registry rejects foreign-task overwrites instead of silently clobbering. The transient `merging` status is always reset before any throw escapes the land loop (no stuck-`merging` leak), and finalize re-reads the latest task and no longer swallows the merge-details persist failure (no finalizing on a stale row). - - Harden the workspace merge dispatch and user-facing merge doors. The partial-land retry catch now fails closed when the task row can't be read (DB outage no longer triggers an indefinite retry storm). The merge-confirmed reachability fast-path skips workspace tasks (whose recorded commitSha lives in a sub-repo, not the workspace root) so a fully-landed workspace task is no longer demoted/parked. The dashboard and CLI merge doors now report `merged: true` (and `mergeConfirmed`/`commitSha`) when a workspace fully lands, mirroring the engine result. Transient sub-repo land-lease contention (`WorkspaceRepoLandBusyError`) is re-enqueued with capped backoff on a separate bounded counter instead of burning the merge-retry quota, so pure contention can't park a never-failed task. Retry backoff is capped at 60s. - -- 3a71237: Address Phase C workspace merge-loop review feedback. A sub-repo recognized as already-landed via the `Fusion-Task-Id` trailer fallback (when its `landedSha` persist was lost) now resolves and re-records a concrete `landedSha`, so finalize no longer drops it and mis-reports a fully-landed workspace task as a no-op (`mergeConfirmed:false`). A manual merge that hits sub-repo land-lease contention now surfaces the busy error to the user without consuming the persisted `mergeRetries` quota (matching the auto path's separate busy counter). The partial-land retry persists the incremented retry count before arming the backoff timer — a failed write now fails closed instead of looping without consuming budget — and clears the stale busy-contention counter when a real partial land supersedes transient busy failures. The CLI and dashboard merge doors use the shared `isWorkspaceTask` predicate instead of re-inlining the workspace check, and integration-branch shell interpolation in base-commit capture uses POSIX single-quote escaping. -- e9a6955: Fix narrow right-sidebar Dev Server preview overlap by replacing the inline preview with an accessible modal launcher when the dock is very narrow, while keeping inline preview for full-page, mobile viewport, and expanded pop-out hosts. -- 7b60539: Fix ntfy test notifications to honor unsaved Settings form config so users can enable ntfy, enter a valid topic/server/token, and send a test notification before saving. -- cf2f3ba: Close task detail dialogs and embedded task-detail hosts immediately after delete confirmations complete, while delete requests continue reporting success or error toasts asynchronously. -- b9821ee: Stack task-detail Chat agent headers above output blocks in the List View split-pane detail pane while preserving full-width desktop chat layout. -- f062819: Fix multiworkspace tasks failing to complete. `task.workspaceWorktrees` is now durably persisted (it previously had no SQLite column, so `fn_acquire_repo_worktree`'s write was dropped on every persist and `fn_task_done` always reported "acquired no sub-repo worktrees"). Concurrent workspace tasks no longer collide on the shared browse-root active-session path — each task gets a task-scoped session key, so a second workspace task no longer fails with "active-session path … is held by …". - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [038ac30] -- Updated dependencies [627bdcf] -- Updated dependencies [3a71237] -- Updated dependencies [e9a6955] -- Updated dependencies [7b60539] -- Updated dependencies [cf2f3ba] -- Updated dependencies [b9821ee] -- Updated dependencies [a6252e5] -- Updated dependencies [f062819] -- Updated dependencies [e5382f0] -- Updated dependencies [e17e9bc] -- Updated dependencies [2019e5a] -- Updated dependencies [9c6b4dd] -- Updated dependencies [0c031b8] -- Updated dependencies [023e4b0] -- Updated dependencies [8f4098e] -- Updated dependencies [12d33c5] -- Updated dependencies [64e87f9] -- Updated dependencies [09bd01b] -- Updated dependencies [fc9423e] -- Updated dependencies [81edbee] -- Updated dependencies [744ed09] -- Updated dependencies [7544346] -- Updated dependencies [7cd204e] - - @runfusion/fusion@0.47.0 - -## 0.46.0 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.46.0 -- @fusion/engine@0.46.0 -- @fusion/i18n@0.39.9 -- @fusion-plugin-examples/cli-printing-press@0.1.26 -- @fusion-plugin-examples/compound-engineering@0.1.9 -- @fusion-plugin-examples/dependency-graph@0.1.40 -- @fusion-plugin-examples/roadmap@0.1.28 -- @fusion-plugin-examples/cursor-runtime@0.1.28 -- @fusion-plugin-examples/droid-runtime@0.1.35 -- @fusion-plugin-examples/hermes-runtime@0.2.59 -- @fusion-plugin-examples/openclaw-runtime@0.2.59 -- @fusion-plugin-examples/paperclip-runtime@0.2.59 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.46.0 -- @fusion/dashboard@0.46.0 -- @fusion/engine@0.46.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.46.0 -- @fusion/pi-claude-cli@0.46.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.46.0 - -### @runfusion/fusion - -#### Minor Changes - -- 41f3b04: Add a Command Center Productivity control for previewing and applying historical LOC backfills from the dashboard. -- efb94c8: Add editable global model pricing overrides, a one-click LiteLLM pricing refresh, and override-aware Command Center cost estimates. - -#### Patch Changes - -- f6e9deb: Stop Planning Mode from automatically focusing the initial text entry when it opens, preventing mobile keyboards from appearing until the user explicitly focuses the textarea. -- 466cf9c: Dispose completed spawned child agent sessions so execution memory is released promptly after `fn_spawn_agent` children finish, keep artifact registry listing metadata-only so large inline artifacts are not loaded during agent execution, bound structured tool-result log previews before serialization, reduce dashboard SSE keepalive churn, and keep the dashboard TUI performance timeline drained during long-running execution. -- d06e316: Fix Command Center Recharts line and pie graphs rendering blank when their cards initially report unusable responsive dimensions. -- a670f5c: Restore core task lifecycle compatibility for workflow-column transitions, deferred title summarization fixtures, workflow IR rollback persistence, and capacity-aware task movement. -- fe536b2: Fix stale durable agent task assignments for tasks parked behind file-scope lease queues, including Reports Health Check rendering and self-healing reconciliation. -- 736ec6d: Fix mobile mailbox message selection so stale deep links no longer override the user's selected message. -- 945f0f1: Pass project fallback model settings into triage spec reviewer sessions so global default overrides are honored during review. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [f6e9deb] -- Updated dependencies [466cf9c] -- Updated dependencies [d06e316] -- Updated dependencies [a670f5c] -- Updated dependencies [fe536b2] -- Updated dependencies [736ec6d] -- Updated dependencies [945f0f1] -- Updated dependencies [41f3b04] -- Updated dependencies [efb94c8] - - @runfusion/fusion@0.46.0 - -## 0.45.0 - -### @fusion/core - -#### Patch Changes - -- 26ebb92: Fix `reconcileOrphanedTaskDirs` silently resurrecting long-deleted tasks onto the live board after a restart ("all task IDs reset / starting over"). - - The sweep re-imports `.fusion/tasks//` directories that have no DB row, to recover heartbeat-created dirs that race store init or rows lost to a recent DB corruption. But it didn't distinguish a genuinely-recent orphan from an ancient deleted-task dir that merely lingered on disk. Modern deletes leave a soft-delete tombstone (caught by `taskIdExistsAnywhere`), but legacy hard-deletes left no tombstone — so a months-old `task.json` with no DB row was re-imported as a live task, surfacing old low-numbered IDs (FN-001, FN-002, …) at the top of the board. - - Reconcile now gates recovery on a recency window (`task.json` modified within the last 7 days). Older orphan dirs are skipped with reason `stale-orphan-dir-beyond-recency-window` and left for explicit recovery (unarchive/restore) or directory cleanup, while heartbeat-race and recent-corruption recovery still work. - -- 7e7eb62: Harden the orphan-worktree and stale-task-dir cleanup fixes (code-review follow-up). - - - **executor.ts (P0):** the stale-conflict recovery's `rm(worktreePath, { recursive, force })` had no bounds check. `worktreePath` can originate from a git worktree admin entry that resolves outside `.worktrees/`, so an out-of-bounds or symlinked path could be force-removed. The recovery now refuses unless the path is inside the configured worktrees dir, is not a symlink (checked via `realpathSync`), is not a registered git worktree, and is not actively owned — and it re-verifies liveness inside the catch rather than trusting the error string. It also excludes `spawn` failures (e.g. `spawn git ENOENT` when git is missing) so a missing-binary error is no longer misread as a successful stale-path cleanup. - - **worktree-pool.ts:** `resolveGitdirPointer` is replaced by `dotGitPointerIsDangling`, which reaps **only** when a `.git` link's gitdir target is confirmed missing. A real `.git` directory, an unparseable pointer, or any read/stat failure now returns "not dangling" (conservative) so a transient read error on a live worktree's `.git` can't cause a force-remove. Removes the `string | "directory" | null` sentinel union. - - **core store.ts:** the `reconcileOrphanedTaskDirs` recency window is now bypassed when the live task table is empty (the corruption/restore case — surviving `task.json` files keep old mtimes), and when a corrupt `fusion.db` was auto-recovered on startup, so `.recover` row loss is not stranded by the gate. Adds an `ignoreRecencyWindow` option for explicit callers. - - Tests for all of the above: executor recovery + out-of-bounds refusal, unparseable `.git` skip, recency boundary, empty-DB/forced bypass. - -### @fusion/dashboard - -#### Patch Changes - -- Updated dependencies [26ebb92] -- Updated dependencies [7e7eb62] - - @fusion/core@0.45.0 - - @fusion/engine@0.45.0 - - @fusion/i18n@0.39.8 - - @fusion-plugin-examples/cli-printing-press@0.1.25 - - @fusion-plugin-examples/compound-engineering@0.1.8 - - @fusion-plugin-examples/dependency-graph@0.1.39 - - @fusion-plugin-examples/roadmap@0.1.27 - - @fusion-plugin-examples/cursor-runtime@0.1.27 - - @fusion-plugin-examples/droid-runtime@0.1.34 - - @fusion-plugin-examples/hermes-runtime@0.2.58 - - @fusion-plugin-examples/openclaw-runtime@0.2.58 - - @fusion-plugin-examples/paperclip-runtime@0.2.58 - -### @fusion/desktop - -#### Patch Changes - -- Updated dependencies [26ebb92] -- Updated dependencies [7e7eb62] - - @fusion/core@0.45.0 - - @fusion/dashboard@0.45.0 - - @fusion/engine@0.45.0 - -### @fusion/engine - -#### Patch Changes - -- Updated dependencies [26ebb92] -- Updated dependencies [7e7eb62] - - @fusion/core@0.45.0 - - @fusion/pi-claude-cli@0.45.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- Updated dependencies [26ebb92] -- Updated dependencies [7e7eb62] - - @fusion/core@0.45.0 - -### @runfusion/fusion - -#### Minor Changes - -- 26e5514: Add the `factory-mono` dashboard color theme, a monochrome Factory variant with red accents and neutralized glow effects. -- 130fea2: Ask first-run users whether to create an optional first persistent agent after project registration, with CEO as the default template, skip support, and no duplicate GitHub star prompt. -- 70cce18: Add the `fn_agent_set_instructions` extension tool so managing agents can update direct or indirect reports' inline or file-backed instructions with org-hierarchy authorization. -- 8dd9697: Add an operator-triggered Command Center Productivity LOC backfill API and client for historical commit-association diff stats. -- f13aaa1: Add a Command Center GitHub resolved-issues detail list and expose the resolved issue rows in the GitHub analytics endpoint payload and CSV export. -- c158dda: Add the `xhigh` reasoning effort level to model settings and task/agent selectors. Claude CLI adapters pass the value through to runtime mapping, where non-Opus models use `high` effort and Opus models use `max` effort. -- 52924ba: Add a built-in lead-generation workflow with custom lead columns, fields, and stage prompts. -- 7f3e942: Add a built-in Design workflow that gates UI-heavy work with a design/UX review before standard review and merge. -- 281ce35: Add a built-in Marketing workflow with content-specific columns and prompts for brief, drafting, editorial review, and publishing. -- fbce59b: Add a core artifact registry data model and store APIs for persisted artifact metadata with on-disk binary storage. -- af06170: Add `fn_artifact_register`, `fn_artifact_list`, and `fn_artifact_view` agent tools for publishing and discovering multi-type artifacts, with best-effort dashboard user inbox notifications on registration. -- ef48895: Add dashboard artifact registry read APIs, client helpers, and a Documents-view Artifacts media gallery for images, videos, audio, documents, and generic artifacts. -- 58f7588: Add a Shadcn Custom dashboard theme with persisted, sanitized design-token color picker overrides across Settings and Command Center theme selectors. -- f80a785: Add pricing entries for OpenAI Codex models used through the `openai-codex` provider, so Command Center token analytics can estimate costs for Codex runs instead of showing them as unavailable. - - This is marked minor because it expands the set of priced models surfaced by the published CLI/dashboard without changing existing pricing behavior. - -- 09acfbb: Allow users to manually pause and unpause agent-assigned tasks from the dashboard task detail view and API. -- 4fec139: Move Stash Recovery into the Git Manager Recovery tab and remove the standalone top-level Stash Recovery view from dashboard navigation. -- 5b33da9: Move desktop toolbar tools into the right sidebar tools rail. The right dock now hosts Activity, Activity Log, Import from GitHub, Git Manager, Files, and Automation, and no longer duplicates left-sidebar content views. -- 7034b55: Move the dashboard terminal launcher to the footer executor status bar and add docked plus floating resizable terminal modes on desktop/tablet while preserving mobile fullscreen terminal behavior. -- a913881: Make the dashboard right dock persistent by default with an in-dock collapse toggle, and remove duplicate Header right-dock toggle behavior. -- 7fd14eb: Rename the task detail Documents tab to Artifacts and add a task-scoped media artifact gallery alongside existing task documents. -- 496167c: Polish dashboard navigation, floating modal, file browser, chat footer, agent role, insights, and list-view action surfaces for a more consistent responsive UI. -- eb3477a: Add a Command Center System node selector so local and registered remote node telemetry can be inspected from the dashboard. -- 59d3eee: Add estimated human hours saved to Command Center Productivity analytics, UI stats, and CSV exports. -- 2dc36d9: Import Tasks PR preview now shows the full comment thread and per-check status (with success/failure/pending indicators) for the selected pull request, fetched on selection and cached per PR. The body still renders immediately while checks and comments stream in. -- 7ef3817: Start the AI engine by default in `pnpm local`, keep dashboard `--dev` engine-on unless `--no-engine` is passed, start desktop local runtimes with engines, and show dashboard instructions when Fusion is launched without an engine. -- 7ddf58d: Sync workflow setting values across nodes in settings push, pull, receive, and status flows. -- 8640a74: The shared markdown renderer (GitHub PR/issue bodies + comments, mailbox, chat) now renders embedded raw HTML and mermaid diagrams. Raw HTML (`
`/``, ``, ``, tables) renders as real elements via `rehype-raw`, with `rehype-sanitize` stripping XSS (script/style/iframe, event handlers, `javascript:` URLs) since these bodies come from GitHub; HTML comments (``) are dropped. Fenced ```mermaid blocks render as actual diagrams via a lazy-loaded `mermaid` import (kept out of the main bundle, loaded only when a diagram is present), falling back to the raw code block on parse error and following the dashboard theme. -- 4fd8d44: Polish dashboard navigation and app chrome, add responsive chat/file/modal behavior, refine roadmaps, missions, task details, workflow defaults, theme defaults, and sidebar/header styling. -- 91180fb: Close the validator reaper→slice deadlock and harden every validation re-drive site for the new behavioral-verification posture. A reaped, task-less "done" feature (left in `loopState="validating"`/`needs_fix`+`error`) is now re-driven by recovery to a terminal pass/fail/inconclusive verdict instead of livelocking the slice, milestone, and mission. Adds an adversarial reliability suite enumerating every re-drive entry point (normal `processTaskOutcome`, each `recoverActiveMissions` branch, and the stale-run reaper) and asserting source-tree git-cleanliness, zero duplicate Fix Features, a terminal verdict, and no `error`-state deadlock. Documents the non-mutating verification run, the first-class `inconclusive` verdict, and the adversarial default-to-fail posture across `docs/missions.md`, `docs/missions-completion-contract.md`, and `CONCEPTS.md`. -- da5fea6: Add Shadcn color-variant dashboard themes for blue, green, red, purple, pink, orange, yellow, mono, and black variants. -- e19f7c2: Add a Shadcn dashboard color theme with zinc neutral tokens, sans-serif typography, 1px borders, subtle flat shadows, and solid primary buttons. -- b20a25c: Add the `shadcn-gray-blue` dashboard color theme with slate blue-gray surfaces and a muted slate-blue accent. -- 4672203: Add a Shadcn Gray dashboard color theme with a fully neutral zinc-gray accent. -- 12aae94: Add Shadcn Mono Red/Blue/Green/Purple/Pink/Orange/Yellow dashboard color themes and migrate legacy `shadcn-mono` selections to `shadcn-mono-red`. -- dc0064b: Dashboard navigation and panel redesign (desktop/tablet; mobile unchanged): - - - **Right sidebar**: a single show/hide toggle now lives in the top header (replacing the tablet overflow menu); the dock is hidden when closed and no longer keeps a persistent icon rail or in-dock collapse button. Its tools (Files — now the default/first tab, Activity, Activity Log, Git Manager) render inline inside the dock instead of opening popup modals. Files opens inline with a pop-out to the resizable file modal. The embedded Git Manager adapts to its width (compact horizontal tab strip in the dock, full two-pane in the wide pop-out). The dependency graph no longer appears in the dock. - - **Left sidebar**: New Task button matches the item-highlight box; footer spacing between Collapse and Settings; divider before the secondary section removed with uniform row spacing. New main-content destinations — Workflows, Import Tasks (GitHub import, with the GitHub mark), and Automations (two-pane, Command Center styling) — render in the main panel instead of as modals. - - **Embedded views**: Planning Mode embeds without modal chrome (no header/close/shadow), fills the full content area, and renders correctly on mobile; the board WorkflowSwitcher is available in Planning. Dev Server header matches Command Center. Insights header wraps so actions don't overlap. List view's left pane can be dragged much narrower with two-line title wrapping. - - **Other**: the docked terminal no longer blurs or blocks the page behind it; the footer Terminal button renders as plain text like the running-state trigger; the workflow selector matches the project selector's styling, height, and font size; the Automations screen uses theme color tokens. - -- 5697d2c: Skills view detail pane: render SKILL.md as Markdown (GFM + sanitized HTML + mermaid), compact the referenced-files area while showing all files, and make each file clickable to view its content with a "Back to SKILL.md" affordance. Adds a `GET /api/skills/:id/file` endpoint for per-file content. -- 5117944: Add Command Center Productivity task-duration analytics, dashboard stat cards, and CSV export rows for completed-task active execution time. -- d4e91d4: Add workflow optional steps: workflows can declare optional step templates that tasks toggle on/off per task, with a workflow-level default. The built-in coding and stepwise-coding workflows expose agent browser verification as an optional step (the stepwise workflow gains a pre-merge workflow-step seam so enabled steps actually run). Optional steps are authorable in the node editor, preserved across node-editor saves, and selectable from a steps dropdown in both the quick-add card and the full New Task modal. - -#### Patch Changes - -- c8a82e7: Auto-continue the agent session after an engine-internal pause/resume abort instead of re-queueing the task to todo. When the engine tears down in-flight work (hard-cancel) and the workflow graph run ends with the task back in `todo`, the executor now retries the agent session in place — bounded by the existing graph-resume retry budget with backoff, falling back to a benign re-queue only after retries are exhausted. Before re-dispatching, it re-checks the task at fire time and aborts the auto-continue if the task was paused, moved, or deleted during the backoff window, so genuine user/global/task pauses are never resumed against the operator's intent. The transient reclassification clears any stale `failed` status and emits an `Auto-recovered:` log so no spurious failure notification fires. -- ee9c8ab: Align dashboard view chrome and inner-pane spacing across Chat, Mailbox, Workflows, Artifacts-adjacent controls, Goals, and Compound Engineering. -- ce6c0fb: Polish dashboard view chrome: align Dashboard, Import Tasks, Automations, Chat, and docked Files editor controls with the shared view header and toolbar styling. -- 7635ba8: Fix a false "engine not running" banner when another fusion process on the same machine already owns the engine. The dashboard's health check only counted engines this process started, so a second launch (e.g. `pnpm dev dashboard` alongside an already-running `fusion`) that was correctly refused the per-machine engine singleton lock reported the engine as unavailable — even though one was running. The `ProjectEngineManager` now tracks engines owned by another process (detected via `EngineAlreadyRunningError` from the singleton lock) and exposes `hasRunningEngine()`, which the dashboard health endpoint uses so the banner reflects machine-level truth. Reconciliation still retries so this process takes over if the other exits, and the "refusing to start" log is emitted once per project instead of on every reconciliation tick. -- ce90cc9: Keep Fusion verification progress moving by making targeted script tests honor file arguments, reaping verification subprocess groups after clean exits, and preventing the line-count audit from blocking `pnpm test`. The changed-test runner now caps reverse-dependent fan-out so a foundational-package edit no longer expands into a whole-workspace run, and the executor/verification guidance now directs agents to scope verification to changed files rather than running the full workspace test suite. -- 5a422b0: Fix anthropic-compatible custom providers failing with "No API provider registered for api: anthropic". - - `resolveCustomProviderApiType` mapped the `anthropic-compatible` provider type to the api key `"anthropic"`, but pi-ai registers the Anthropic Messages API under `"anthropic-messages"`. Any custom provider configured as `anthropic-compatible` (self-hosted Claude proxy, gateway, etc.) therefore selected a model whose `api` did not match a registered provider and threw at stream time. Mapped it to `"anthropic-messages"` and added a regression assertion alongside the existing openai-compatible / openai-responses coverage. - -- 2d32760: Clear the stale `failed` status when a pause/resume abort is reclassified as a benign todo re-queue, so the task no longer surfaces as failed on the board and the deferred failure notification is suppressed. Previously a pause-abort parked `status:"failed"` on an earlier non-todo observation stayed dispatchable (the scheduler filters on column+paused, not status), re-entered the benign-todo branch, and was logged benign while the row stayed failed — firing a contradictory failure alert during global pause when self-healing recovery was suppressed. The clear path also emits an `Auto-recovered:`-prefixed log so the notification service proactively cancels the pending failure timer instead of relying only on the fire-time re-check. -- b564ee0: Make the compound-engineering built-in workflow actually load skills and run the full CE flow. Previously the workflow named CE skills at each node but the graph-node execution path (`runGraphCustomNode`) never loaded them: the named skill was only injected as prompt text, the plugin-injected `FUSION_CE_*` runtime env never reached the step session, and `fn_spawn_agent` was never registered for workflow steps, so persona fan-out and skill loading silently no-op'd. Now skill-executor graph steps thread the injected env, load the named skill (discovery + selection via `additionalSkillPaths`), register the spawn tool in coding mode, and receive an engine-injected Fusion workflow-step conventions preamble (await-input for questions, `FUSION_HEADLESS` degrade path, persona fan-out via `systemPromptOverride`). Adds an explicit `unattended` opt-in for `FUSION_HEADLESS`, reconciles the preamble with the gate verdict-JSON contract, and carries `skillName` through the `WorkflowStep` round-trip. -- 8b5b9a7: Fix the persistent non-blocking Full Suite failure caused by the Compound Engineering plugin's `dist-freshness.test.ts`. The test reads the plugin's compiled `dist/settings.js` and `dist/session/orchestrator.js`, but the plugin had no `pretest` build and was absent from `ensure-test-artifacts.mjs`, so on a fresh checkout `dist/` did not exist and the freshness guard threw "dist/ is missing — run pnpm build first". Register the plugin's required artifacts in `ensure-test-artifacts.mjs` and add a `pretest` hook that builds them, matching the other bundled plugins. -- 68c4053: Fix the Droid runtime model discovery spawning a runaway storm of leaked `droid` processes. - - `discoverDroidModels` invoked `droid models --json` / `droid model list --json`, but the droid CLI has no such commands — an unknown subcommand is parsed as a _prompt_, so each call launched a full agent session (a persistent `droid exec --stream-jsonrpc` backend) that never exited. The promise never settled and the process leaked; because the dashboard re-loads the droid extension on every chat-send, these piled up into dozens of orphaned `droid` processes. - - Discovery now reads the catalog from `droid exec --help` (which lists `Available Models:` + `Custom Models:` and exits cleanly), parsed via the new `parseDroidModelsFromHelp` helper. A SIGKILL-on-timeout guard (`DROID_MODEL_DISCOVERY_TIMEOUT_MS`) ensures any wedged spawn is killed and the promise always settles, so a single discovery call can never leak a process again. Verified end-to-end against the real binary (46 models incl. custom, 0 leaked processes). - -- 9101705: Show plugin-contributed skills (e.g. compound-engineering `ce-*`) in the workflow editor. The dashboard's discovered-skills catalog was built only from the disk-scanning package manager, so plugin skills — which the engine materializes for executor sessions separately — never appeared, and built-in workflow nodes that reference them (like `builtin:compound-engineering`) showed "— select skill —" / unresolved. The skills adapter now merges plugin skill contributions into the discovered list (deduped by bare name), and the editor's node summary + skill dropdown match namespaced skillNames (`compound-engineering:ce-work`) against the catalog's two-segment names (`ce-work/SKILL.md`) via a shared bare-name normalizer. -- 3b61ac3: Fix loading spinners that didn't spin across the dashboard. Many loading states (Settings, task tabs, agents, documents, plugins, model pickers, command center, and more) rendered bare "Loading…" text with no spinner — and a couple rendered an unstyled `loading-spinner` div that never showed anything. Added a shared `` component (self-contained animated SVG, no `lucide-react` dependency so it survives partial test mocks) and adopted it across ~45 loading placeholders so every loading state now shows a consistent animated spinner. -- d99246c: Fix macOS system memory usage reporting by deriving host memory used from OS-available memory instead of raw `os.freemem()` pages. -- 438cd75: Fix worktree-creation failures (and the `Workflow graph terminated with failure at node 'execute'` they surface as) caused by leaked orphan worktree directories. - - A directory under `.worktrees/` that survives with a _dangling_ `.git` pointer — present on disk, but the `.git/worktrees/` admin entry it references is gone — is invisible to `git worktree list` and untouched by `git worktree prune`, yet collides with a freshly generated worktree name. When the executor then tries to clean up the "conflict", `git worktree remove --force` fails with `is not a working tree` and the whole `execute` node fails after 3 attempts. - - - **On-demand recovery (`executor.ts`):** the FN-4813 stale-conflict recovery now also treats `is not a working tree` and `ENOENT` (not just `validation failed, cannot remove working tree`) as "no live worktree at this path" — it prunes any admin entry, force-removes the leftover directory, and proceeds with fresh worktree creation instead of failing. - - **Leak prevention (`worktree-pool.ts`):** `reapOrphanWorktrees` previously skipped any dir on the mere _presence_ of a `.git` file ("may be partially registered"), contradicting its own documented invariant. It now resolves the `.git` pointer and only skips when the gitdir target actually exists; a dangling pointer is reaped like any other half-initialized orphan, so these directories no longer accumulate across runs. - -- 9643563: Fix the global pause/resume failure mode that stalled the board: a pause-abort that left a task back in `todo` was parked `status:"failed"` ("operator action required") and leaked its in-memory worktree slot, producing an instant re-fail retry storm and concurrency-starving the whole queue. - - - Root cause: `handleGraphFailure` now treats a pause-abort that has re-queued a task to `todo` as benign (FN-6782) — it no longer parks it failed, clears the `pausedAborted` marker so the next dispatch starts clean, and releases the leaked worktree slot. - - Auto-recovery: a new `recoverPausedAbortFailures` self-healing sweep clears any pause-abort park (`status:"failed"` with "operator action required") still on the board and requeues it for normal scheduling, so the board self-heals without operator intervention. - - Defense-in-depth: a new `reapLeakedConcurrencySlots` self-healing sweep reclaims any in-memory worktree slot whose holder is no longer in-progress (the "in todo yet still a `maxWorktrees` holder" leak), gated by the executor's live-session refusal so it can never pull a worktree out from under a running agent. This recovers a leaked slot from any future/unknown path without an engine restart. - -- 24ff124: Stop edits to `scripts/lib/test-quarantine.json` from forcing `pnpm test` into gate mode. The quarantine list is runtime data, not executable test infra; tripping the shared-infra catch-all dropped affected-package coverage, so a dev's real changes went untested whenever they also touched the quarantine list. Quarantine edits now stay in changed mode and run the affected packages. -- a2342ca: Fix the task detail chat always showing "No agent is working on this task" for in-progress tasks. The active-session check required a persistent `assignedAgentId`/`checkedOutBy`, but in the default ephemeral-agents mode the scheduler never sets those fields, so an actively-executing task always read as idle. An assignment is now sufficient-but-not-necessary: a non-blocked, non-`queued` in-progress task counts as a live agent session on its own (`queued` stays assignment-gated, in-review is unchanged). -- 7e7eb62: Harden the orphan-worktree and stale-task-dir cleanup fixes (code-review follow-up). - - - **executor.ts (P0):** the stale-conflict recovery's `rm(worktreePath, { recursive, force })` had no bounds check. `worktreePath` can originate from a git worktree admin entry that resolves outside `.worktrees/`, so an out-of-bounds or symlinked path could be force-removed. The recovery now refuses unless the path is inside the configured worktrees dir, is not a symlink (checked via `realpathSync`), is not a registered git worktree, and is not actively owned — and it re-verifies liveness inside the catch rather than trusting the error string. It also excludes `spawn` failures (e.g. `spawn git ENOENT` when git is missing) so a missing-binary error is no longer misread as a successful stale-path cleanup. - - **worktree-pool.ts:** `resolveGitdirPointer` is replaced by `dotGitPointerIsDangling`, which reaps **only** when a `.git` link's gitdir target is confirmed missing. A real `.git` directory, an unparseable pointer, or any read/stat failure now returns "not dangling" (conservative) so a transient read error on a live worktree's `.git` can't cause a force-remove. Removes the `string | "directory" | null` sentinel union. - - **core store.ts:** the `reconcileOrphanedTaskDirs` recency window is now bypassed when the live task table is empty (the corruption/restore case — surviving `task.json` files keep old mtimes), and when a corrupt `fusion.db` was auto-recovered on startup, so `.recover` row loss is not stranded by the gate. Adds an `ignoreRecencyWindow` option for explicit callers. - - Tests for all of the above: executor recovery + out-of-bounds refusal, unparseable `.git` skip, recency boundary, empty-DB/forced bypass. - -- 87f18f8: Track real plugin activation events and surface project-scoped Command Center plugin activation analytics instead of placeholder ecosystem counts. -- ee72c94: Move the Command Center Overview SDLC throughput funnel to the bottom of the tab and broaden hand-rolled chart primitive colors to cycle through existing semantic theme tokens. -- 8f052c6: Fix Command Center Activity trend charts so mixed-unit agent/activity series stay visually legible instead of being flattened by high-volume message counts. -- df139ec: Recover in-progress tasks wedged behind stale in-memory executor bindings by clearing the phantom binding and requeueing with progress and worktree preserved. -- e6f6111: Fix terminal shortcut focus preservation so on-screen Ctrl combinations emit control bytes reliably on touch and pointer devices while keeping physical Ctrl behavior intact. -- d4d7623: Rebaseline the dashboard i18n lint guardrail by excluding non-shipping tests and stories, suppressing technical token categories, localizing plugin missing-view copy, and tracking remaining source-copy deferrals with narrow follow-up tasks. -- 98720f3: Fix mobile bottom tab navigation icon spacing so every tab uses an equal-width column across optional tabs, badges, and status dots. -- c4f34ce: Make the Agents view sidebar wider by default on tablet and resizable with per-project persistence on non-mobile layouts. -- b760fa0: Localize remaining plugin, agent, mission, node, research, document, activity, and miscellaneous dashboard strings and remove their i18n lint deferrals. -- bdf95f8: Localized the dashboard workflow/task/setup/PR component cluster and removed the obsolete i18n lint deferrals for those files so the hardcoded-string guardrail scans them again. -- eca96fb: Keep settings section dashboard copy covered by i18n lint by removing the settings/sections deferral and regenerating i18n resource types. -- c808177: Eliminate the legacy board flash before workflow lanes load by caching per-project board workflow metadata and showing a neutral skeleton while metadata resolves. -- 0c0fda1: Keep Command Center inline next to Agents across desktop and tablet header widths instead of moving it into the More views overflow menu. -- c32c925: Repair task-store startup and self-healing consistency by non-destructively re-importing orphaned live `.fusion/tasks/{ID}/task.json` records into the SQLite task index while preserving soft-deleted, archived, and tombstoned IDs. -- d2fc70a: Fix dependency gating so workflow-graph and workflow-authoritative executor dispatches re-check unmet task dependencies before running, requeueing blocked work with `blockedBy` instead of allowing it to advance to review. - - Add self-healing reconciliation for already-advanced `in-review` tasks with unmet dependencies, including the `task:reconcile-in-review-unmet-dependencies` run-audit event and guarded no-action companion. - -- 08d1f09: Recover benign in-review pause/resume abort parks without requiring operator intervention while preserving hard-cancel, pause, and terminal merge safeguards. -- 61ff17a: Harden in-review dependency drift reconciliation so guard-held or failed rebounds emit no-action audit evidence instead of silently wedging dependent tasks. -- 26bd85d: Fix mobile bottom navigation icon alignment so unread indicators use a centered token-sized icon slot without visually skewing tab spacing. -- 37c4cfa: Prevent bundled Droid and Claude CLI auth/presence probes from surfacing unhandled promise rejections when `spawn` throws synchronously, such as when test guards block real AI CLI auth commands. These probes now resolve as unavailable/unauthenticated instead of rejecting from fire-and-forget validation paths. -- 185ff70: Fix the experimental left sidebar Settings button so it remains clear of the fixed executor status footer, and keep project-selector fallback labels readable when translations are incomplete. -- c7b56a5: Stop triage and planning prompts from auto-selecting alternate workflows based on task type; agents now preserve the project default workflow unless the user explicitly requests a specific workflow. -- c18e827: Await CLI extension cached TaskStore shutdown so deferred filesystem writes and SQLite handles drain before fixture or process cleanup. -- 8c478ad: Fix stale board entries after dependency-driven task re-specification moves by syncing the watched task cache after `updateTaskDependencies` writes and defensively deduplicating `listTasks` rows so active task rows win over archived snapshots. -- 47ba99a: Bump the internal @earendil-works pi SDK family from ^0.79.1 to ^0.79.9 for the CLI, dashboard, and engine packages. -- 24c1c02: Fix dashboard toast text colors so Shadcn dark-mode success, info, and error notifications remain readable against their themed backgrounds. -- 1f23a2e: Ensure bundled Droid CLI provider startup registers without waiting for local `droid` probes and harden binary probes so missing, guarded, or hanging spawns resolve to unavailable sentinels instead of delaying engine boot. -- 15d427b: Move Planning Mode into the dashboard sidebar as a first-class embedded view while removing the desktop toolbar affordance. -- 91971b6: Update the built-in compound-engineering workflow so its Review stage runs the `compound-engineering:ce-code-review` skill directly. The redundant generic reviewer seam node was removed, leaving the CE code-review gate as the sole review stage. -- c4c8961: Tasks created from a selected non-default workflow lane now appear on that lane immediately instead of vanishing until the board-workflows metadata refetch catches up. -- 4342172: Built-in compound-engineering workflow prompts now explicitly call out the `/ce-` skill slash command at each stage. -- bb663a4: Improve bundled non-coding workflow prompts so marketing, lead-generation, and design runs produce structured deliverables, with content and design preview artifacts persisted for review. -- f4d2fa2: Hide the dashboard AI subtask-breakdown quick-add button behind the default-off `subtaskBreakdown` experimental feature flag. -- 5191e1f: Prevent the bundled Droid CLI extension from starting local `droid` probes during server boot; validation now runs only when a Droid stream is actually used while existing probe paths remain non-interactive and timeout-bounded. -- 4879996: Restyle the workflow switcher trigger and dropdown to visually match the project selector. -- ec1d29e: Prevent task worktree acquisition from returning the project repository root by enforcing a non-root postcondition across resume, pooled, and fresh checkout paths. -- c229a15: Tighten agent workflow-routing prompt policy so triage and executor agents must not move a task's workflow unless the user explicitly requested it or the agent created that task. Executor prompts now include an explicit `fn_workflow_select` guardrail while preserving workflow selection for tasks agents create. -- 849b40d: Keep workflow IR and effective-settings resolution usable when project identity lookup fails, falling back to declaration defaults instead of propagating the identity error. -- 9218613: Fix auto-merge lifecycle finalization so successful squash commits reliably leave tasks done, clear transient auto-merge state, and preserve actionable failure state when lifecycle updates fail. -- 6e563b9: Revalidate dashboard service-worker assets before falling back to cache so rebuilt tabs cannot stay on stale bundles and render a blank page. -- a1cac3a: Replace the compact Quick Chat implementation with the full Chat modal launcher and configurable footer/FAB/off setting, move the file browser into the shared floating-window shell with a compact New menu and consistent narrow editor toolbar, fit the dependency graph after layout settles, and align chat/mailbox/task-detail expansion plus header/theme polish. -- 67281fe: Fix Import from GitHub remote detection in multi-project dashboards by passing the active `projectId` to the `/api/git/remotes` lookup. The dialog now lists configured GitHub remotes instead of showing "No GitHub remotes detected" when the backend requires project scope. -- a147a98: Prevent global settings updates from overwriting an existing unreadable settings file with defaults, and use provider/CPU icons in task chat agent headers. -- e788537: Raise the minimum agent heartbeat staleness floor from 5 to 10 minutes. Agents go silent during long-running but legitimate work (notably a verification step running a multi-minute test command, where the agent is blocked awaiting the command and cannot tick/heartbeat). The 5-minute floor could misread such a busy agent as dead and reclaim its in-progress task mid-run; 10 minutes gives long operations room before the liveness gate acts. -- 4ed84be: Polish mobile workflow header alignment, task chat provider icons, modal overlay chrome, and shadcn font consistency. -- a6685b7: Check for duplicate tasks from the New Task dialog and show duplicate descriptions in the warning modal. -- f0fbc59: Update first-run onboarding to include an optional first-agent step and clearer temporary-agent task guidance. -- 36b8950: Carry the selected workflow lane through Planning Mode and Subtask Breakdown task creation so saved tasks appear on the active workflow instead of falling back to the main board. -- 93017a3: Preserve task progress when a single-session run is hard-cancelled mid-execution. When the engine aborted in-flight work and bounced the task back to `todo`, the single-session teardown cleared the task `branch` and re-queued without `preserveResumeState` — resetting every step to `pending` and dropping the pointer to commits already on the task branch, so the next dispatch re-planned from Step 0 and the committed work was stranded (observed as a task that "lost all progress" and got stuck). The teardown now keeps the branch and moves with `preserveResumeState` whenever the task has resumable step progress, matching the step-session and pause-park paths, so execution resumes onto the existing branch from the first incomplete step. The worktree is still removed to free its concurrency slot — only the durable pointers (branch + step state) are kept. -- 192a2f2: Preserve unrelated global settings when saving Settings sections, and graduate Chat Rooms, Goals, Memory, Insights, Skills, and Todo to default-on dashboard surfaces. -- 2e3b965: Smooth the mobile Quick Chat fullscreen sheet during Android soft-keyboard viewport resizing while preserving synchronous iOS visualViewport alignment. -- b9b9447: Reset a task's stuck-kill streak on genuine forward progress. `stuckKillCount` was a lifetime counter — incremented by self-healing on each stuck-kill and cleared only by a manual retry — so a long, genuinely-progressing task could be terminalized by accumulation toward the stuck-kill budget. It now resets when a step reaches a terminal forward status (done/skipped), so only consecutive no-progress stalls count toward the budget. -- 192a2f2: Open task-card files changed actions in the inline task detail Changes tab instead of the task modal. -- 5e55d9c: Show provider icons in task detail chat for default-backed executor, reviewer, planner, and merger models. -- 19be91c: Floating modals (the reusable FloatingWindow, the right-dock pop-out, the floating terminal, and the floating New Task dialog) now share a single z-index stack, so tapping any of them brings it to the front above all the others regardless of type. -- 65c4dc5: Graduate workflow columns and the workflow graph executor to the default runtime path. - - Upgrade notes: stale persisted `experimentalFeatures.workflowColumns` and `experimentalFeatures.workflowGraphExecutor` values are ignored by the engine, so prior installs keep dispatching tasks through the workflow runtime after upgrade. `workflowInterpreterDualObserve` remains an internal diagnostic and defaults off. - - If an upgraded project appears stalled, treat `todo` tasks with unmet dependencies, `paused`/`userPaused`, active checkout leases, unavailable assigned nodes, or file-scope overlap as intentionally parked. Eligible `todo` tasks without those blockers should be picked up by the workflow scheduler; eligible `in-progress` rows without a live executor are recovered through the normal orphan-resume/self-healing path. The old Experimental toggles are no longer a rollback switch; use a source rollback/downgrade to the previous release if the workflow runtime itself must be reverted. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [c8a82e7] -- Updated dependencies [ee9c8ab] -- Updated dependencies [ce6c0fb] -- Updated dependencies [7635ba8] -- Updated dependencies [26e5514] -- Updated dependencies [ce90cc9] -- Updated dependencies [130fea2] -- Updated dependencies [5a422b0] -- Updated dependencies [2d32760] -- Updated dependencies [b564ee0] -- Updated dependencies [8b5b9a7] -- Updated dependencies [68c4053] -- Updated dependencies [9101705] -- Updated dependencies [3b61ac3] -- Updated dependencies [d99246c] -- Updated dependencies [438cd75] -- Updated dependencies [9643563] -- Updated dependencies [24ff124] -- Updated dependencies [a2342ca] -- Updated dependencies [7e7eb62] -- Updated dependencies [87f18f8] -- Updated dependencies [70cce18] -- Updated dependencies [8dd9697] -- Updated dependencies [ee72c94] -- Updated dependencies [f13aaa1] -- Updated dependencies [8f052c6] -- Updated dependencies [df139ec] -- Updated dependencies [e6f6111] -- Updated dependencies [c158dda] -- Updated dependencies [d4d7623] -- Updated dependencies [52924ba] -- Updated dependencies [7f3e942] -- Updated dependencies [281ce35] -- Updated dependencies [98720f3] -- Updated dependencies [c4f34ce] -- Updated dependencies [b760fa0] -- Updated dependencies [bdf95f8] -- Updated dependencies [eca96fb] -- Updated dependencies [c808177] -- Updated dependencies [fbce59b] -- Updated dependencies [af06170] -- Updated dependencies [ef48895] -- Updated dependencies [0c0fda1] -- Updated dependencies [c32c925] -- Updated dependencies [d2fc70a] -- Updated dependencies [08d1f09] -- Updated dependencies [61ff17a] -- Updated dependencies [26bd85d] -- Updated dependencies [37c4cfa] -- Updated dependencies [58f7588] -- Updated dependencies [185ff70] -- Updated dependencies [c7b56a5] -- Updated dependencies [c18e827] -- Updated dependencies [8c478ad] -- Updated dependencies [47ba99a] -- Updated dependencies [24c1c02] -- Updated dependencies [f80a785] -- Updated dependencies [09acfbb] -- Updated dependencies [1f23a2e] -- Updated dependencies [4fec139] -- Updated dependencies [5b33da9] -- Updated dependencies [15d427b] -- Updated dependencies [7034b55] -- Updated dependencies [91971b6] -- Updated dependencies [a913881] -- Updated dependencies [c4c8961] -- Updated dependencies [4342172] -- Updated dependencies [bb663a4] -- Updated dependencies [7fd14eb] -- Updated dependencies [f4d2fa2] -- Updated dependencies [5191e1f] -- Updated dependencies [4879996] -- Updated dependencies [ec1d29e] -- Updated dependencies [c229a15] -- Updated dependencies [849b40d] -- Updated dependencies [9218613] -- Updated dependencies [6e563b9] -- Updated dependencies [496167c] -- Updated dependencies [a1cac3a] -- Updated dependencies [eb3477a] -- Updated dependencies [59d3eee] -- Updated dependencies [2dc36d9] -- Updated dependencies [67281fe] -- Updated dependencies [a147a98] -- Updated dependencies [e788537] -- Updated dependencies [7ef3817] -- Updated dependencies [7ddf58d] -- Updated dependencies [8640a74] -- Updated dependencies [4ed84be] -- Updated dependencies [a6685b7] -- Updated dependencies [f0fbc59] -- Updated dependencies [36b8950] -- Updated dependencies [4fd8d44] -- Updated dependencies [93017a3] -- Updated dependencies [91180fb] -- Updated dependencies [192a2f2] -- Updated dependencies [da5fea6] -- Updated dependencies [e19f7c2] -- Updated dependencies [b20a25c] -- Updated dependencies [4672203] -- Updated dependencies [12aae94] -- Updated dependencies [dc0064b] -- Updated dependencies [5697d2c] -- Updated dependencies [2e3b965] -- Updated dependencies [5117944] -- Updated dependencies [b9b9447] -- Updated dependencies [192a2f2] -- Updated dependencies [5e55d9c] -- Updated dependencies [19be91c] -- Updated dependencies [d4e91d4] -- Updated dependencies [65c4dc5] - - @runfusion/fusion@0.45.0 - -## 0.44.0 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.44.0 -- @fusion/engine@0.44.0 -- @fusion/i18n@0.39.7 -- @fusion-plugin-examples/cli-printing-press@0.1.24 -- @fusion-plugin-examples/compound-engineering@0.1.7 -- @fusion-plugin-examples/dependency-graph@0.1.38 -- @fusion-plugin-examples/roadmap@0.1.26 -- @fusion-plugin-examples/cursor-runtime@0.1.26 -- @fusion-plugin-examples/droid-runtime@0.1.33 -- @fusion-plugin-examples/hermes-runtime@0.2.57 -- @fusion-plugin-examples/openclaw-runtime@0.2.57 -- @fusion-plugin-examples/paperclip-runtime@0.2.57 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.44.0 -- @fusion/dashboard@0.44.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.44.0 -- @fusion/pi-claude-cli@0.44.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.44.0 - -### @runfusion/fusion - -#### Minor Changes - -- 6427802: Route Fusion's Claude CLI path through the ACP bridge (`claude-code-cli-acp`) instead of `claude -p` (Route A, dormant behind an OFF-by-default kill-switch). - - - **U10** — forward `mcpServers` on ACP `session/new` through the runtime contract (`AgentRuntimeOptions.mcpServers` + the plugin's `newAcpSession`); defaults to `[]` so existing read-only ACP "ask" turns are unchanged. - - **U11** — `streamViaAcp`: the `pi-claude-cli` provider can drive Claude through the bundled ACP bridge, returning the same `AssistantMessageEventStream` as the `-p` path. Dispatched only when `FUSION_CLAUDE_ACP=1` and a bridge path are present, so the live `-p` path is byte-for-byte untouched by default. Full-history prompting, schema-only MCP forwarding with break-early on pi-known tools, control-char/size sanitization, env allow-list, process-registry registration, and inactivity timeout. - - **KTD10** — the ACP runtime plugin publishes its identity-pinned bundled bridge path on load so the kill-switch needs no manual path; it does not enable the transport. - - **OQ2** — opt-in connection reuse (`FUSION_CLAUDE_ACP_REUSE=1`, default OFF): a warm bridge connection + ACP session is kept across turns of one conversation (keyed by `sessionId`), so multi-turn lanes skip the cold bridge/`claude` spawn and `session/new` round-trip and send only the latest-turn delta (`buildResumePrompt`). A stable `router` indirection serves each turn's handlers; a warm-child death routes failure to the current owner turn (no 30-min inactivity hang), eviction is cache-identity-aware (a concurrent cold turn can't kill a newer entry's child), an empty resume cold-starts instead of issuing an empty prompt, and a per-turn token drops cross-turn stray updates. The idle reaper is `unref`'d. Default OFF → the cold path is functionally unchanged. - - The Claude-via-pi OAuth path is unchanged. Live verification confirmed the bridge gates tool execution behind `session/request_permission` (forwarded MCP tools and native tools do not execute when cancelled). Remaining for a follow-up: picker/auth/status surface (U12), workflow `model`-node verification (U13), and production rollout. - -- c1b581e: Add the **Command Center** dashboard — a combined analytics/observability and live Mission-Control view (`?view=command-center`). - - - **Telemetry** — a queryable `usage_events` SQLite table populated via a dedicated `emitUsageEvent` capture seam (tool calls, messages, session lifecycle), feeding date-range aggregators for tokens, tool usage + autonomy ratio, activity (sessions/messages/active-nodes/stickiness), productivity (files/commits/PRs/LOC), and ecosystem breadth — all in `packages/core` and reusable by CLI/engine. - - **Cost** — derived from token counts via a hand-maintained `model-pricing` map carrying `pricingAsOf` + a staleness flag; unknown models report unavailable rather than guessing. - - **View** — a new lazy-loaded, ARIA-tabbed Command Center with hand-rolled CSS-bar chart primitives, a date-range picker, per-area panels, a live Mission-Control panel (SSE push + idle-aware polling), and an SDLC funnel. - - **API** — `GET /api/command-center/{tokens,tools,activity,productivity,live}` (agent-usable), each under session auth and project scoping, with `?format=csv` export and an opt-in OpenTelemetry (OTLP) metrics exporter. - -- 898ac1e: Add the Command Center signals analytics endpoint backed by local incidents data and document honest empty-state sentinels for signal metrics. -- 863ebfa: Add a CLI session relaunch route and enable the dashboard's resume-exhausted "Relaunch fresh" action to re-enqueue the owning task for a fresh CLI-agent run. -- 21c4d3e: Dashboard agent chat sessions now load the same agent-declared and enabled plugin-contributed skills as task execution sessions, so plugin skills such as `ce-debug` are available in chat. -- a453716: Render assistant question tool calls as shared in-chat response cards in full Chat and Quick Chat. -- a998f63: Enable creating workflow node connections from the mobile workflow editor. -- e2a3a37: Add a project setting for configuring the auto-merge conflict retry cap before Fusion parks or bounces tasks for recovery. -- 05fe6e5: Compound Engineering now treats stage launch settings as an explicit `disabledStages` opt-out list so newly bundled stages, including `ce-debug`, remain launchable on existing installs with stale settings snapshots. -- b6ac5f2: Add bounded-by-default verification guardrails: project `verificationCommandTimeoutMs`, marathon command detection, and an explicit `allowFullSuite` escape hatch for full verification runs. -- 0453a65: Request agent and enabled plugin skills across planning, mission interview, workflow design, memory insight, and scheduled automation agent sessions. -- cdadac1: Load selected Fusion and enabled plugin skills in milestone/slice interview and agent-onboarding dashboard sessions. -- f41732d: Add a live-updating, animated Command Center token-usage-over-time view with hour/day/week granularity and bounded polling for token totals. -- 504305e: Add a Command Center GitHub issue analytics endpoint and dashboard area showing issues filed by Fusion, issues fixed by Fusion, net flow, daily trends, and by-repository breakdowns from the local project task store. -- 64092ca: Add Command Center agent-run sheets that show total, active, completed, and failed heartbeat runs in the Activity area and Overview, plus agent-run daily activity and CSV export rows. -- 36f1fee: Add the Command Center Team tab and `/api/command-center/team` endpoint for project-scoped per-agent token, cost, files-changed, task-completion, and live-status analytics. -- af31f7d: Move System Stats into the Command Center as a redesigned graph-rich System area with gauges, trend sparklines, task/agent bars, and relocated Vitest controls; remove the standalone System Stats modal plus its Header and mobile More affordances. -- 94a081f: Persist GitHub source issue closure timestamps and use them for exact Command Center "Fixed by Fusion" date bucketing, falling back to task `updatedAt` only when the real close time has not been observed. -- 9b396b6: Add an optional project-scoped GitHub source-issue closed-at backfill endpoint that fills historical imported tasks with real GitHub `closed_at` values for more accurate Fixed by Fusion analytics. -- 2059790: Add a Command Center GitHub affordance for operators to run the historical source-issue closed-at backfill and review accumulated scanned, filled, skipped, and error counts. -- d6e2f92: Add `recharts` and shared Command Center PieChart/LineChart wrappers for downstream graphical chart migrations. The wrappers are token-themed, responsive, reduced-motion aware, and safe for empty, zero, negative, NaN, and Infinity inputs; the current production build shows no observable Command Center chunk-size increase yet because no Command Center surface imports the new wrappers until the dependent migration tasks land (CommandCenter chunk remains 74.68 kB / 16.46 kB gzip in this task's build output). -- 99d799c: Add Command Center pie and line chart affordances to the Overview, Tokens, Tools, Activity, and Productivity analytics surfaces using existing analytics data. -- 5e1a4ff: Add Command Center pie and line charts to Team, Ecosystem, GitHub, Signals, and System surfaces using existing analytics data. -- 47e7b4a: Populate Command Center Productivity Lines changed from merge-time commit association diff stats when available. -- c1b581e: Add the **Monitor stage** (U13) — deployment and incident tracking that closes the SDLC loop. - - - **Schema** — new `deployments` and `incidents` SQLite tables (`packages/core/src/db.ts`, `SCHEMA_VERSION` 119 → 120, migration added in the same change; fingerprint auto-covers SCHEMA_SQL tables). - - **Metrics** — real MTTR (incident-open → resolved) plus deploy/incident counts in `activity-analytics`, replacing the prior unavailable seam. - - **Ingestion** — `POST /api/monitor/{deployments,incidents}` self-authenticate via a shared ingest secret (constant-time bearer check, fail-closed) with SSRF-untrusted payload links; `GET /api/monitor/metrics` exposes the aggregates. - - **Loop closure** — a `monitor` workflow trait can auto-open a single fix task on a regression signal, guarded by `groupingKey` grouping, a threshold/sustained gate, cooldown absorption, a per-window circuit breaker, and a self-loop guard. - -- 168dc2f: Export Command Center analytics over OpenTelemetry (OTLP) so teams can ship token / cost / activity metrics to Datadog / Grafana / etc. **Disabled by default** (U10, R4). - - - New pure mapping `mapAnalyticsToOtlp` in `@fusion/core` (`otel-metrics.ts`) turns the token/cost/activity aggregator outputs into the OTLP/HTTP JSON wire shape (`resourceMetrics`) — counters for token/cost, gauges for activity — with `model` / `provider` / `node.id` / `agent.id` attributes per data point. Fully testable without a live collector; no SDK dependency in core. - - Dashboard exporter (`otel-exporter.ts`) periodically maps current analytics and POSTs them to a configured collector, wired into `server.ts` startup/shutdown. - - **SDK choice:** ships a **minimal OTLP/HTTP JSON exporter rather than the official `@opentelemetry/*` SDK** — and therefore adds **no new runtime dependency**. The OTLP/HTTP JSON protocol is a single, stable `POST /v1/metrics` of a well-defined JSON envelope (built in core), so for a default-disabled feature we avoid pulling the multi-package SDK (sdk-metrics + exporter-metrics-otlp-http + resources + api). The wire shape is collector-compatible; swapping in the official SDK later is mechanical. (If maintainers prefer the real SDK, that is a follow-up changeset + dependency add.) - - **Enabled only via env** (none set ⇒ nothing starts): `FUSION_OTEL_METRICS_ENDPOINT` (full `/v1/metrics` URL, required to enable), `FUSION_OTEL_METRICS_HEADERS` (`k=v,k2=v2` auth headers), `FUSION_OTEL_METRICS_INTERVAL_MS`, `FUSION_OTEL_METRICS_TIMEOUT_MS`, `FUSION_OTEL_RESOURCE_ATTRIBUTES`. - - **Security:** endpoint validated on write — `http://` is rejected in production (exporter does not start) and warns loudly otherwise; auth header (Datadog/Grafana token) VALUES are never logged and are masked in diagnostics; a collector-unreachable failure logs (redacted) and backs off exponentially without crashing the server or blocking requests. - -- 951c6ef: Ingest external signals (Sentry / Datadog / PagerDuty / generic webhook) into triage tasks via a common `SignalSource` adapter seam (U11, KTD8). - - - New `POST /api/signals/:provider` endpoints, mirroring the GitHub ingestion path. Verified, normalized signals create a task in the `triage` column via the existing task store. - - Generic webhook is the must-work path; Sentry/Datadog/PagerDuty are thin adapters with provider-specific HMAC verification + payload normalization. Each normalized `Signal` carries a `groupingKey` (Sentry `issue.id`, PagerDuty `incident.id`, Datadog monitor key; the generic webhook requires a caller-supplied key or falls back to `source + normalized-title`) for the downstream storm guard. - - Security (mandatory): per-provider HMAC against an env-sourced secret (never source-controlled) with 401 on missing/invalid secret or signature — the generic webhook is never an unauthenticated task-creation endpoint; ±5 min replay window + delivery-id nonce dedup; persistent external-id dedup; ~1 MB body cap; per-source rate limit; field-length + meta-byte caps; SSRF-untrusted handling of payload URLs; `meta` stored as data, never rendered as raw HTML. - -- 0a87890: Add a persistent, incrementally-refreshed knowledge index (U14) downstream agents can query. - - - **Schema** — new `knowledge_pages` SQLite table (`packages/core/src/db.ts`) with `SCHEMA_VERSION` bumped 118 → 119 (added in the same change as the migration; the fingerprint auto-covers SCHEMA_SQL tables). Keyword search uses a denormalized lowercased `searchText` column with AND-of-terms `LIKE` matching, deliberately avoiding SQLite FTS5 (not available on every build) and any external embedding API. - - **Index module** (`packages/dashboard/src/knowledge-index.ts`) — upsert-by-source-key pages, a model-free keyword query API, and `refreshKnowledgeForTask` that re-indexes a single completed task (one upsert, never a full re-index, so unaffected pages keep their timestamps). This is the delta over the existing `insights`/`memoryView` surfaces, which are LLM-extracted learnings, not a deterministic searchable index of concrete task/PR history. - - **Refresh hook** — `KnowledgeIndexRefreshService` listens for `task:moved → done` (mirroring `GitHubSourceIssueCloseService`) and is wired alongside the other completion listeners; fail-soft so it can never disrupt task completion. - - **Query API** (`register-knowledge-routes.ts`) — `GET /api/knowledge/query` and `POST /api/knowledge/refresh`, registered as an `ApiRouteRegistrar` so they inherit the dashboard's standard session/auth middleware (401 when unauthenticated) and apply `getScopedStore(req)` (no cross-project reads), exactly like U9. - -#### Patch Changes - -- c8788d8: Align the workflow editor's client-side column trait validation details with the server validator so conflicting trait compositions identify the same source traits before save. -- 265d9ec: Fix task workflow selection so successful workflow changes and clears notify dashboard clients to refresh board workflow lanes. -- def4bd9: Add dashboard controls for renaming regular Chat and Quick Chat sessions. -- 62335f8: Fix two post-merge Full Suite test failures. Sync the roadmap store's schema-version assertion to core's `SCHEMA_VERSION` (116 → 117). Stop `useCeSessions` background refreshes (poll fallback and push events) from clearing an error a `cancel`/`remove` just surfaced — an in-flight session kept the poll running, which silently erased the action error before the user could see it. -- cd2da10: Wire dashboard CLI session banner actions so needs-attention sessions surface, supported actions call existing routes/settings flows, and unsupported actions render disabled instead of silently doing nothing. -- fee0178: Guard no-commits-expected tasks from being finalized as done by no-op merge/self-healing lanes when skipped or incomplete steps outweigh completed work. -- bc6dfd3: Surface paused workflow graph exits that occur outside `in-progress` as operator-actionable failures instead of leaving tasks stranded. -- 0093678: Block release and publish-class tasks during triage unless they were explicitly authorized by a user-authored source. -- 3158e9c: Fix the dashboard TUI Agents view so pressing `s` starts the selected agent without also switching back to Main. -- 0db8134: Bound `fn_task_list` text output across CLI, dashboard, and engine tool surfaces so oversized board listings remain plain text with an explicit truncation marker instead of overflowing host response budgets. -- a15b4ca: Keep the chat sidebar visible at a compact bounded width when a tablet software keyboard opens, then restore the previous width when the keyboard closes. -- 198fb17: Keep prior chat thread messages visible while reconnecting to an in-flight streamed assistant response. -- 98cb80d: Fix the tablet task detail modal sizing so the action footer remains on-screen and the modal uses more viewport width. -- 4a9fe99: Allow chat attachments to be sent without accompanying text in Quick Chat and Main Chat while still rejecting fully empty sends. -- d35f93e: Refresh dashboard mobile and PWA home-screen icons from the canonical Fusion logo and bump the service-worker cache for installed app updates. -- 550715d: Bringing up Quick Chat now focuses the composer input on desktop (matching existing mobile behavior). -- 89171e0: Polish the bundled Compound Engineering dashboard view so its spacing, radii, and controls align with Fusion dashboard design tokens and shared component classes. -- 914842f: Make Chat the first tab and default active view in the task detail modal while preserving explicit initial tab requests. -- 6ced5d7: Fix workflow graph merge-node failures so merge-seam aborts are not misclassified as pause/resume aborts. Non-paused merge failures now route to the bounded auto-merge retry path instead of being parked failed with no merge retry count. -- a84a8e1: Fix `fn_task_list` crashes when the runtime `@fusion/core` formatter export is unavailable by resolving defensively and returning bounded fallback text. -- 593ebac: Resolve task-list text formatting defensively when an installed core package is missing the `formatTaskListText` runtime export, preserving `fn_task_list` output with a bounded inline fallback. -- 403bd9d: Prevent custom workflows from reaching terminal success when declared task-document artifacts are missing, and keep malformed blocking gate verdicts from being treated as successful workflow-step passes. -- 01b80db: Add a Fusion-native `fn_ask_question` tool for dashboard chat agents so structured questions render in the existing chat response card and answers return through the next chat message. -- 5b9ff04: Keep previously persisted main-chat conversation messages visible while reconnecting to an in-flight assistant response. -- 1bd8f6d: Fix mobile terminal cell measurement by making xterm font stacks use real monospace text faces before the Nerd Font symbols fallback. -- 19aac38: Load dashboard chat skills requested with `/skill:{name}` and strip the command token from model prompts. -- a013bc0: Fix the perpetual step off-by-one: `fn_task_update` and `fn_review_step` now treat `step` as 0-based, matching the `### Step N:` numbering in PROMPT.md (Step 0 = Preflight) and `TaskStore.updateStep`. Previously the tools were 1-indexed while everything agent-facing was 0-based, so agents could not mark Step 0 done and reviews/progress landed one step early. -- 4c3186d: Prefer fresher TypeScript plugin source over stale gitignored dist output in dev/worktree plugin resolution when no `bundled.js` exists. Production bundled installs remain unaffected because `bundled.js` still always wins. -- 0767d1b: Generalize bundled plugin freshness checks across staged CLI plugin artifacts. -- 29b27a7: Improve Command Center tool analytics by categorizing Fusion tool families and re-bucketing historical `other` rows. -- 98ccf8a: Completed no-commit executions that finalize to in-review are no longer re-parked as failed "engine abort during pause/resume" operator-action graph failures; genuine pause and hard-cancel semantics are preserved. -- 4dd5337: Close cached CLI extension TaskStore instances on session shutdown so task-tool runs do not leave SQLite handles behind. -- 4929198: Lower the shared `fn_task_list` plain-text budget and cover filtered column listings with realistic regression cases so large todo, planning, and done outputs stay host-safe. -- 673a8a6: Fix `fn_task_list` column filters so empty target columns return explicit text instead of an empty content block. -- 58a34e9: Clamp Command Center SDLC completion analytics to cohort-based conversion rates and add the radial completion gauge plus animated live activity signals. -- 3d28b3b: Preserve already-streamed chat text, thinking, and tool-call state when the dashboard reattaches to an in-flight assistant response. -- dae0bde: Encourage dashboard chat agents to use structured `fn_ask_question` cards when offering choices or alternatives. -- ab8ecb2: Stop the engine from registering merge-trait hooks that collided with core's in-review field-effects adapter and could crash workflow-column moves. -- b1a2aee: Expose task document read/write tools to dashboard chat agents with explicit `task_id` targeting. -- 16b6e5d: Fix mobile iOS terminal cell measurement by making xterm font remeasure resilient to strict FontFaceSet shorthand rejection and pinning text-size adjustment on terminal viewports. -- 0ed46d9: Expose task document read/write tools to planning agents with explicit task IDs, matching chat session behavior. -- 3b32b53: Completed/no-commit executions that finalize to review no longer get re-parked failed when later teardown overwrites completion-finalize abort provenance with a hard-cancel marker. Genuine user/global pauses, merge-seam retry routing, and active-execution hard-cancel behavior are preserved. -- b6823af: Fix completed tasks being parked failed in in-review with a spurious "engine abort during pause/resume — operator action required" error (FN-6648; recurrence of FN-6478/FN-6568/FN-6625/FN-6644/FN-6647). The paused-after-completion graceful-exit path finalizes a fully completed task to in-review while leaving a non-user `paused` flag set; `handleGraphFailure`'s completion-finalized guards required `paused !== true`, so the trailing graph failure was misclassified as an operator-action pause abort once the volatile completion markers were lost. The classifier now recognizes finalized completions regardless of a lingering non-user pause flag, while genuine user/global pauses and in-progress tasks are unaffected. -- 2367918: Add attractive Command Center Overview charts for tokens by model, tool categories, and daily activity using existing analytics data. -- 662a09b: Add live animated Command Center Activity line charts for messages, active agents, active nodes, and combined throughput, backed by a reusable zero/NaN-safe LineChart primitive. -- 11c4120: Fix mobile terminal font measurement by keeping the symbols-only Nerd Font out of xterm's measured ASCII font stack while retaining a scoped DOM glyph fallback. -- 21d8076: Fix Command Center mobile chart rendering so chart primitives shrink inside the tabpanel without scroll-stealing overflow, zero-height collapse, or stretch artifacts, and normalize chart/card border and spacing rhythm across the combined analytics surfaces. -- ef54459: Fix Command Center token analytics so Tokens by model and the per-model table group tasks by the actually-used runtime model instead of collapsing resolved-via-settings usage into `(unknown)`. -- 317b08b: Command Center token-cost analytics now price resolved-via-settings task usage from the actually-used model snapshot, with legacy own-model fallback, instead of showing those costs as unavailable. -- fe207ca: Fix Command Center mobile chart rendering by bounding chart label/track layouts in real mobile engines and normalizing chart/card/table border spacing across the dashboard bundle. -- 0f021ae: Fix Command Center charts and shell styling to use the canonical `--accent` and `--text` dashboard tokens instead of undefined `--color-accent` and `--text-primary` aliases, so chart accents and primary text render with the intended colors. -- 282b069: Replace non-Command-Center dashboard CSS references to the undefined `--text-primary` alias with the canonical `--text` token so primary text uses the intended theme-aware color. -- 9d07e85: Fix served dashboard lazy-view preloads so persisted Command Center and other lazy views include their extracted CSS chunks. -- cfddde5: Fix Command Center activity chart rendering so plotted extrema stay visible and chart wrappers keep a measurable default height. -- cc02286: Inline direct and room chat attachments into agent prompts so agents can read text files and receive supported image attachments. -- 84cf3ff: Guard task detail activity-log rendering against legacy/operator log entries that use text/detail instead of action/outcome. -- 283f689: Repair mission autopilot reconciliation so stale triaged/in-progress features without live task cards are retriaged, while generated fix-loop debris is blocked instead of recreating duplicate tasks. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [c8788d8] -- Updated dependencies [265d9ec] -- Updated dependencies [6427802] -- Updated dependencies [def4bd9] -- Updated dependencies [c1b581e] -- Updated dependencies [898ac1e] -- Updated dependencies [62335f8] -- Updated dependencies [cd2da10] -- Updated dependencies [fee0178] -- Updated dependencies [863ebfa] -- Updated dependencies [bc6dfd3] -- Updated dependencies [0093678] -- Updated dependencies [3158e9c] -- Updated dependencies [0db8134] -- Updated dependencies [a15b4ca] -- Updated dependencies [21c4d3e] -- Updated dependencies [198fb17] -- Updated dependencies [98cb80d] -- Updated dependencies [a453716] -- Updated dependencies [4a9fe99] -- Updated dependencies [d35f93e] -- Updated dependencies [550715d] -- Updated dependencies [a998f63] -- Updated dependencies [89171e0] -- Updated dependencies [914842f] -- Updated dependencies [6ced5d7] -- Updated dependencies [e2a3a37] -- Updated dependencies [a84a8e1] -- Updated dependencies [593ebac] -- Updated dependencies [05fe6e5] -- Updated dependencies [403bd9d] -- Updated dependencies [01b80db] -- Updated dependencies [5b9ff04] -- Updated dependencies [1bd8f6d] -- Updated dependencies [19aac38] -- Updated dependencies [a013bc0] -- Updated dependencies [b6ac5f2] -- Updated dependencies [0453a65] -- Updated dependencies [4c3186d] -- Updated dependencies [0767d1b] -- Updated dependencies [29b27a7] -- Updated dependencies [cdadac1] -- Updated dependencies [98ccf8a] -- Updated dependencies [4dd5337] -- Updated dependencies [4929198] -- Updated dependencies [673a8a6] -- Updated dependencies [58a34e9] -- Updated dependencies [3d28b3b] -- Updated dependencies [dae0bde] -- Updated dependencies [ab8ecb2] -- Updated dependencies [b1a2aee] -- Updated dependencies [16b6e5d] -- Updated dependencies [0ed46d9] -- Updated dependencies [3b32b53] -- Updated dependencies [b6823af] -- Updated dependencies [2367918] -- Updated dependencies [f41732d] -- Updated dependencies [504305e] -- Updated dependencies [64092ca] -- Updated dependencies [36f1fee] -- Updated dependencies [662a09b] -- Updated dependencies [af31f7d] -- Updated dependencies [11c4120] -- Updated dependencies [21d8076] -- Updated dependencies [ef54459] -- Updated dependencies [94a081f] -- Updated dependencies [317b08b] -- Updated dependencies [9b396b6] -- Updated dependencies [2059790] -- Updated dependencies [fe207ca] -- Updated dependencies [d6e2f92] -- Updated dependencies [99d799c] -- Updated dependencies [5e1a4ff] -- Updated dependencies [0f021ae] -- Updated dependencies [282b069] -- Updated dependencies [9d07e85] -- Updated dependencies [cfddde5] -- Updated dependencies [47e7b4a] -- Updated dependencies [cc02286] -- Updated dependencies [84cf3ff] -- Updated dependencies [c1b581e] -- Updated dependencies [283f689] -- Updated dependencies [168dc2f] -- Updated dependencies [951c6ef] -- Updated dependencies [0a87890] - - @runfusion/fusion@0.44.0 - -## 0.43.1 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.43.1 -- @fusion/engine@0.43.1 -- @fusion/i18n@0.39.6 -- @fusion-plugin-examples/cli-printing-press@0.1.23 -- @fusion-plugin-examples/compound-engineering@0.1.6 -- @fusion-plugin-examples/dependency-graph@0.1.37 -- @fusion-plugin-examples/roadmap@0.1.25 -- @fusion-plugin-examples/cursor-runtime@0.1.25 -- @fusion-plugin-examples/droid-runtime@0.1.32 -- @fusion-plugin-examples/hermes-runtime@0.2.56 -- @fusion-plugin-examples/openclaw-runtime@0.2.56 -- @fusion-plugin-examples/paperclip-runtime@0.2.56 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.43.1 -- @fusion/dashboard@0.43.1 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.43.1 -- @fusion/pi-claude-cli@0.43.1 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.43.1 - -### @runfusion/fusion - -#### Patch Changes - -- 59f2596: Fix the standalone `fn plugin new` scaffold so generated plugins include the required `state: "installed"` field and build unedited with `pnpm build`. This also lets the documented `fn plugin dev . --once` path complete its pre-load build step instead of failing TypeScript validation for a missing `FusionPlugin.state`. - - Manual end-to-end spot-check for release validation: `npx @runfusion/fusion@ plugin new proof-point-plugin && cd proof-point-plugin && pnpm install && pnpm build && npx @runfusion/fusion@ plugin dev . --once`. - - Registry evidence captured for the original failing release: `npm view @runfusion/fusion@0.43.0 dist.integrity` returned `sha512-kvxicT+e8ulc7FDhBVP9NsgaioZv6NDW81N8cXNS/X8M32Eo3Y33xT6JFW2DrSiFXsJmAaib/GnpQE0nYQYApQ==`. - -- 1f540b2: Persist planning-session response history before agent continuation so retry/replay and SQLite session recovery retain answered turns when generation errors or transitions complete. -- 19eca3d: Park incomplete tasks that exhaust stuck-loop recovery instead of making them scheduler-runnable again. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [59f2596] -- Updated dependencies [1f540b2] -- Updated dependencies [19eca3d] - - @runfusion/fusion@0.43.1 - -## 0.43.0 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.43.0 -- @fusion/engine@0.43.0 -- @fusion/i18n@0.39.5 -- @fusion-plugin-examples/cli-printing-press@0.1.22 -- @fusion-plugin-examples/compound-engineering@0.1.5 -- @fusion-plugin-examples/dependency-graph@0.1.36 -- @fusion-plugin-examples/roadmap@0.1.24 -- @fusion-plugin-examples/cursor-runtime@0.1.24 -- @fusion-plugin-examples/droid-runtime@0.1.31 -- @fusion-plugin-examples/hermes-runtime@0.2.55 -- @fusion-plugin-examples/openclaw-runtime@0.2.55 -- @fusion-plugin-examples/paperclip-runtime@0.2.55 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.43.0 -- @fusion/dashboard@0.43.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.43.0 -- @fusion/pi-claude-cli@0.43.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.43.0 - -### @runfusion/fusion - -#### Minor Changes - -- 9149121: Enable Z.ai GLM-5.2 model selection. -- 64de883: Make the built-in compound-engineering workflow run the CE way end-to-end: - - - **Execute** stage invokes the `compound-engineering:ce-work` skill in coding mode instead of the generic executor prompt. - - **Merge** stage adds `ce-commit-push-pr` and `ce-resolve-pr-feedback` skill steps (CE owns commit/push/PR + feedback; Fusion's merge seam still owns the board-state merge). The plugin now bundles `ce-commit`, `ce-commit-push-pr`, and `ce-resolve-pr-feedback`. - - **Planning questions reach a human:** workflow-step sessions carry a `FUSION_WORKFLOW_STEP` signal; in that mode the CE skills emit an await-input sentinel instead of calling a blocking tool with no listener. The executor parks the task `awaiting-user-input` with the question, and a new task-card **"Answer questions"** button opens the workflow tab where the existing input banner captures the answer and resumes the step. - - **Subagents work in workflow steps:** `fn_spawn_agent` gains an optional `systemPromptOverride`; the plugin installs the 43 `ce-*` persona definitions plugin-locally and exposes their directory via `FUSION_CE_AGENTS_DIR`, so the CE skills read a persona def and spawn it as a real subagent (falling back to inline single-agent work when unavailable). - -- e8c2d51: Add a one-click dashboard Update now action for installing available Fusion updates. - -#### Patch Changes - -- 740c712: Inline the private `@fusion/core` types into the published `@runfusion/fusion/plugin-sdk` declaration entry so standalone external plugins created with `fn plugin new` can typecheck and `pnpm build` cleanly against released Fusion. Human spot-check: `npx @runfusion/fusion@0.42.0 plugin new proof-point-plugin && cd proof-point-plugin && pnpm install && pnpm build`. -- b1ba87e: Ensure `zai/glm-5.2` reliably appears in the model list after user Z.ai provider extensions load. -- 65a4c51: Recover stale Compound Engineering sessions on plugin load and session reads so persisted active rows without live agent handles no longer leave the dashboard stuck waiting for work that is not running. -- 20aad56: Fix "Couldn't start local Fusion" on the Linux AppImage (and any packaged build launched from a desktop launcher). The embedded local runtime now roots its data at the user's home directory (`~/.fusion`) instead of `process.cwd()`, which was `/` or the read-only AppImage mount point and caused database creation to fail with EACCES/EROFS. Set `FUSION_HOME` to override the location. -- 066c919: Preserve the original corrupt project database at `fusion.db` when startup recovery fails after moving it aside. -- 0d75725: Fixed unreliable horizontal scrolling when swiping across task cards on the mobile board. Native HTML5 drag is now disabled on touch-primary devices (where it never worked anyway), so the browser no longer hijacks swipe-to-scroll gestures that start on a card. -- 67ae2be: Fix two mobile chat send failures. The regular chat send button was dead to touch because the action only ran on `onClick`, which iOS suppresses after `preventDefault()` in the touch sequence — it now fires from pointerdown/touchstart with a dedupe latch. Quick chat messages could strand in the composer (shown locally but never sent to the agent or persisted) when a queued message's delivery trigger bailed — a dropped stream leaving the streaming flag stuck `true`, or a stream that looked healthy when queued but then stalled. A queued send now detects a stale flag at send time via the stream's connection state and the server's generation status, and a delivery watchdog re-confirms any message that stays pending and force-delivers it once no generation is actually in flight. -- fd6caaa: Fix sporadic quick chat send failures on mobile (notably the first message after a response). A real touch tap dispatches both `pointerdown` and `touchstart`, and the quick chat send button ran its action on each — firing `handleSendMessage` twice per tap. Because React had not yet flushed the composer clear between the two events, both reads saw the same text and sent, and the hook's second send closed the first's freshly-opened stream and re-POSTed, which could drop the response. The send and stop buttons now claim a single action per tap so only the first of the paired events fires. -- 9eeaaa7: Fix the quick chat stop button rendering too narrow. It borrowed ChatView's `.chat-input-stop` styling, which sizes itself with `--chat-input-control-size` — a variable scoped to ChatView's composer and undefined in the quick chat DOM — collapsing the button toward its icon width. It is now pinned to the send button's square dimensions. -- ee6d7ac: Workflow step execution now surfaces task attachment locations in the context-recovery prompt path and no longer tells autonomous agents to ask for context. -- 14ed177: Restored horizontal swiping on mobile kanban board columns while preserving page-level horizontal pan containment. -- df01ab7: Fix Create Pull Request conflict preflight to derive `conflictsWithBase` from `git merge-tree --write-tree` exit codes instead of non-empty output, and treat no-op PR conflict resolution merges as successful without attempting an empty commit. -- 96773dd: Fix standalone installs of the published CLI crashing with `ERR_MODULE_NOT_FOUND` for `@earendil-works/pi-coding-agent`. `@earendil-works/pi-coding-agent` and `@earendil-works/pi-ai` are now plain required dependencies instead of also being optional peers, so clean npm and pnpm installs resolve the pi runtime packages. -- 67d4d51: Move task-card timing badges from the top metadata cluster into the bottom-right footer chip cluster so timers align with retry and GitHub footer badges. -- 7b83906: Run the configured or inferred dependency install inside temporary standalone AI-merge clean-room worktrees before merge/review verification. -- be2773b: Fix scheduler concurrency diagnostics and semaphore slot accounting so queued tasks are not held behind contradictory or negative capacity readings. -- 3cc82bd: Fix mobile board horizontal overflow that caused iOS Safari to zoom-out/cut-off the board and let the whole page pan off-screen. Screen-reader-only `.visually-hidden` spans were `position: absolute` with no offsets, so inside the horizontally-scrolled kanban columns they rendered off-screen-right and ballooned the document's scroll width. Pinning the utility to its containing block's origin keeps the document locked to the viewport on mobile. -- aa71ace: Refresh expired Claude OAuth access tokens from Fusion auth storage instead of requiring repeated manual re-login. -- 417183d: Send task-detail Chat composer messages on plain Enter while preserving Shift+Enter newlines and Cmd/Ctrl+Enter sending. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [9149121] -- Updated dependencies [740c712] -- Updated dependencies [b1ba87e] -- Updated dependencies [65a4c51] -- Updated dependencies [64de883] -- Updated dependencies [20aad56] -- Updated dependencies [066c919] -- Updated dependencies [0d75725] -- Updated dependencies [67ae2be] -- Updated dependencies [fd6caaa] -- Updated dependencies [9eeaaa7] -- Updated dependencies [ee6d7ac] -- Updated dependencies [e8c2d51] -- Updated dependencies [14ed177] -- Updated dependencies [df01ab7] -- Updated dependencies [96773dd] -- Updated dependencies [67d4d51] -- Updated dependencies [7b83906] -- Updated dependencies [be2773b] -- Updated dependencies [3cc82bd] -- Updated dependencies [aa71ace] -- Updated dependencies [417183d] - - @runfusion/fusion@0.43.0 - -## 0.42.0 - -### @fusion/dashboard - -#### Patch Changes - -- Updated dependencies [630b2a8] - - @fusion/engine@0.42.0 - - @fusion/core@0.42.0 - - @fusion/i18n@0.39.4 - - @fusion-plugin-examples/cli-printing-press@0.1.21 - - @fusion-plugin-examples/compound-engineering@0.1.4 - - @fusion-plugin-examples/dependency-graph@0.1.35 - - @fusion-plugin-examples/roadmap@0.1.23 - - @fusion-plugin-examples/cursor-runtime@0.1.23 - - @fusion-plugin-examples/droid-runtime@0.1.30 - - @fusion-plugin-examples/hermes-runtime@0.2.54 - - @fusion-plugin-examples/openclaw-runtime@0.2.54 - - @fusion-plugin-examples/paperclip-runtime@0.2.54 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/dashboard@0.42.0 -- @fusion/core@0.42.0 - -### @fusion/engine - -#### Patch Changes - -- 630b2a8: Allow narrowly scoped plan-only operational tasks to complete without source commits when their prompt or metadata explicitly declares no-source/no-code intent and their recorded evidence satisfies the task. The commit guard still rejects missing commits for normal implementation tasks and still enforces worktree and branch invariants before applying the no-commit exemption. - - @fusion/core@0.42.0 - - @fusion/pi-claude-cli@0.42.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.42.0 - -### @runfusion/fusion - -#### Minor Changes - -- e22afec: Add workflow-native typed settings for triage/spec policy thresholds and routing defaults. The built-in defaults preserve current behavior: size bands remain S <2h, M 2-4h, L 4-8h; subtask signals use the canonical planning-prompt values of step threshold 7 and packages/modules threshold 3; file-scope/remediation thresholds remain 20 and 30. - - These triage policy settings are new workflow settings, not moved project settings, so they are excluded from the U4 `MOVED_SETTINGS_KEYS` tombstone while still resolving through workflow effective settings. - -- 039d3ce: Fast-mode triage is now expressed as workflow-declared policy: the lean prompt lives in the built-in `default-triage-fast` agent prompt and `planning-fast` seam, while `leanPlanning` and `autoApproveSpec` are workflow-native settings for prompt selection and spec-review auto-approval. - - The internal `FAST_TRIAGE_SYSTEM_PROMPT` engine constant was removed. Existing `executionMode: "fast"` tasks remain byte-equivalent through a single legacy execution-mode-to-resolved-policy bridge. - -- 167f9b0: Allow engineer-role agents to opt into no-task backlog auto-claim for implementation tasks while preserving executor-only default pickup behavior. -- 1c4ec5f: Add dashboard controls for the engineer backlog auto-claim opt-in at project scope and per-agent heartbeat settings. -- eb607c6: Make dashboard modals touch-resizable on tablet and widen the task-detail modal default tablet width. -- f7f2cae: Move Frontend UX criteria injection from AI self-instructions into deterministic engine-applied workflow policy, preserving the byte-equivalent checklist and idempotent insertion behavior. -- 4e6df03: Add a verified no-op/duplicate task completion path so executors can close already-satisfied tasks without fabricating commits by using an audited `fn_task_done` sentinel summary. -- 7ffea9f: Expose Google Generative AI as a selectable custom-provider API type in the dashboard settings UI and documentation. -- 508551c: Allow tasks to be archived from any live board column and restored to their pre-archive column. -- bd87ce7: Add workflow-declared optional steps and expose Browser Verification as the built-in coding workflow's opt-in optional step for task creation and editing. -- 72661fa: Title summarization now accepts descriptions of any length by truncating the model input to a bounded prompt instead of rejecting descriptions over 2000 characters. -- 07d5262: Sync workflow setting values across nodes in settings push, pull, receive, and status flows. - -#### Patch Changes - -- 8eb99ed: Quick Entry no longer auto-focuses when the board or dashboard becomes visible. -- 36f5ecd: Skip custom workflow pre-merge prompt, script, and gate nodes when a task runs in fast execution mode. -- 1a716f2: Resolve the standard triage planning prompt from the selected workflow IR planning node instead of the removed engine-side `TRIAGE_SYSTEM_PROMPT` duplicate. The built-in `default-triage` prompt is now the canonical policy source for `builtin:coding`; where the old copies disagreed, the surviving canonical subtask-split threshold is `MORE THAN 7 implementation steps` (with the matching `MORE THAN 3 different packages/modules` guidance). Fast-mode triage continues to use `FAST_TRIAGE_SYSTEM_PROMPT` unchanged. -- fb2c6e5: Resolve the built-in reviewer base prompt from the workflow IR `review` node instead of an engine-local `REVIEWER_SYSTEM_PROMPT` duplicate. The canonical reviewer policy now lives in the `default-reviewer` agent prompt / built-in workflow seam, with reconciled superset content that preserves the FN-5928/FN-6229 surface-enumeration and symptom-verification gates, undersplit-task guidance, test-quality rules, worktree-boundary review, and the embedded port-4040 safety rule. -- c0ff360: Fix mobile dashboard blanking after toggling the in-review auto-merge switch by keeping the board visible when real browsers horizontally pan the document to the offscreen column control. -- 12621aa: Record explicit `builtin:coding` project-default workflow selections even when the compiled built-in has zero materialized steps, while preserving interpreter-deferred `builtin:stepwise-coding` fallback behavior. -- 30e747b: Standalone plugin scaffolds now declare the dev toolchain they generate scripts and config for: `@types/node`, `vitest`, and `typescript`. This lets projects created with `fn plugin new` install, build, test, and load through `fn plugin dev . --once` via the documented external-author path without relying on transitive or hoisted dependencies. - - Manual spot-check for release validation: - - ```sh - npx @runfusion/fusion@latest plugin new proof-point-plugin - cd proof-point-plugin - pnpm install - pnpm build - pnpm test - fn plugin dev . --once - ``` - -- 8c16395: Stop self-healing from removing worktrees that are still in use. The idle-worktree and cap-enforcement sweeps now skip any worktree bound to a live executor/merger/step/workflow session, so a checkout is no longer reaped while its task transiently sits in `done` or loses its worktree linkage mid-run. -- d5b45c8: Fix "Couldn't start local Fusion" on the Linux AppImage (and any packaged build launched from a desktop launcher). The embedded local runtime now roots its data at the user's home directory (`~/.fusion`) instead of `process.cwd()`, which was `/` or the read-only AppImage mount point and caused database creation to fail with EACCES/EROFS. Set `FUSION_HOME` to override the location. -- f0d2415: Fix custom provider message sends failing with a `ByteString` error (`character ... value 8226`). The settings UI displays the saved API key masked with `•` characters; saving the provider without retyping the key persisted that mask as the real credential, which then broke HTTP header encoding. Masked values echoed back on update are now treated as "unchanged" and the stored key is preserved; masked values on create/probe are rejected. - - The edit form no longer seeds the API key field with the masked value at all — it starts blank (with a "Leave blank to keep current key" hint) so the mask can never be echoed back to save or "Detect Models". Existing keys are preserved when the field is left empty. - -- a83c2d8: Fix custom provider models not appearing in model dropdowns. The `/models` endpoint filtered results to providers configured in Fusion's auth stores, which excluded custom providers (stored in global settings). Their registry keys are now added to the allowlist so their models surface in pickers. -- cbc3157: Fix the mobile chat keyboard collapsing on iOS Safari. Several ancestor/scroll mutations were blurring the focused composer textarea: - - 1. `.chat-thread--keyboard-active` declared `transform: translateY(...)` + `will-change: transform` in CSS, keeping a non-`none` transform on `.chat-thread` (an ancestor of the composer) for the whole keyboard-active window. The drift compensation is now applied imperatively in JS only when iOS actually shifts the visual viewport (`offsetTop > 0`), so the ancestor stays `transform: none` on focus. - - 2. The mobile keyboard scroll-lock pinned `body { position: fixed }` a beat after the composer was focused — the textbook iOS keyboard-dismiss trigger. App-level and ChatView keyboard pins now use a new `useMobileKeyboardViewportLock` that locks `overflow: hidden` + `scrollTo(0, 0)` WITHOUT changing `position` (the same approach the Quick Chat panel uses), so iOS keeps the input focused. Modals are unchanged and keep the `position: fixed` lock. - - 3. The direct-chat composer's `handleInputFocus` ran `window.scrollTo(0, 0)` on every focus to undo iOS layout drift. That scroll fires while iOS is still raising the keyboard, which aborts the raise — the keyboard opened then immediately dismissed on re-focus (first tap fine, every tap after a dismiss broken). The drift reset now happens on **blur** instead — when the keyboard is already closing, so there is nothing to dismiss — immediately plus a short follow-up that is cancelled on the next focus, so a fast re-tap can't scroll mid-raise. Each focus therefore starts at `scrollY 0` and the keyboard lock's `scrollTo(0, 0)` is a harmless no-op. - - 4. The mobile bottom nav stayed on screen while the keyboard was up: `.mobile-nav-bar--keyboard-open` only pinned it to `bottom: 0` and relied on the keyboard to cover it, but on iOS the layout viewport doesn't shrink, so the bar overlapped the composer. It now slides fully off-screen (`translateY(100%)` + `pointer-events: none`) while typing. Safe for the keyboard because the nav is a sibling of the input, not an ancestor. - -- cbc3157: Fix the Quick Chat FAB not opening on iOS Safari. The drag hook calls `setPointerCapture()` in `pointerdown`, which makes WebKit swallow the synthetic `click`, so the FAB never toggled on iPhone. The open/close toggle now fires from the drag hook's `pointerup` (a real user gesture, so the stealth-input focus still raises the keyboard), with the trailing synthetic click de-duped so mouse and test click paths are unaffected. -- e5036b1: Fix the Quick Chat send button going dead after switching chats on mobile. The send and stop buttons run their action on `pointerdown`/`touchstart` (iOS needs that) and set a shared `handledMobileActionRef` latch so the trailing synthetic `onClick` doesn't double-fire — but the latch was only ever cleared inside `onClick`. On iOS, `preventDefault()` in `touchstart` routinely suppresses that click, leaving the latch stuck `true`, so the next real click (e.g. after opening a different chat) was swallowed and the button appeared unresponsive. The latch is now self-clearing: it auto-resets on a short timer after each gesture and is consumed-and-cancelled when a click does fire, so it can never persist across taps. Because the ref is shared by both buttons, this also stops a stuck stop-button latch from killing the next send tap. -- 535c40d: Fix task creation failing with "node 'merge-gate' branches into 2 edges — graphs with branches require the workflow interpreter (deferred)". The built-in coding workflow now models the merge lifecycle as a branching region of merge/retry/branch-group primitives (FN-6035), but the linear workflow compiler still tried to lower those nodes and rejected their fan-out. The compiler now treats the merge-region primitive kinds (merge-gate, merge-attempt, manual-merge-hold, retry-backoff, recovery-router, branch-group-member-integration, branch-group-promotion) as an engine-owned terminal boundary — exempt from the single-edge linearity rule and never lowered to a step — so linear-prefix workflows compile to their pre-merge step list again. -- e35f3dd: Classify harmless temporary merge worktree cleanup failures after `git worktree prune`/porcelain inspection while keeping still-registered worktree leaks visible in merger diagnostics. -- 3a729f5: Allow narrowly-scoped Review Level 1 coordination tasks with board-only file scope and explicit no-source intent to complete without commits while preserving the missing-commit guard for implementation tasks. -- c285f3f: Fix pi 0.79 extension discovery compatibility and retry stale title-summarizer model ids with automatic model resolution. -- 9a78814: Stop review entry from freezing the global auto-merge setting onto tasks. Tasks without an explicit per-task auto-merge override now continue to follow the live global setting, so toggling global auto-merge off stops newly-entered non-override in-review tasks from being auto-merge processed. -- 2085610: Move AI-merge clean-room worktrees into a repo-local cleanup-exempt root, guard cleanup sweeps by active merge ownership, and classify missing clean-room worktree failures as transient so merges can retry cleanly. -- d23c5d9: Fix task detail Pull Request and Review surfaces so they use the live project auto-merge setting instead of a stale modal-open snapshot. Create PR / manual merge affordances now appear immediately when auto-merge is toggled off, and the automatic auto-merge hint returns when it is toggled back on. -- 4fc00b6: Self-heal compound-engineering answer submission for restarted awaiting-input sessions by rehydrating the interactive session before sending the answer. -- 65251d2: Pausing or sleeping an agent no longer pauses its assigned tasks. Assigned tasks now keep their existing pause state so only explicit user actions pause ordinary task work. -- bffae81: Add `autoMergeProvenance` so Fusion can distinguish explicit per-task auto-merge overrides from legacy review-entry stamps. Startup now marks ambiguous legacy in-review `autoMerge: true` rows as `legacy-stamp` without changing behavior, and the operator-visible `reconcileLegacyAutoMergeStamps` action (dry-run by default) can clear those legacy stamps so global auto-merge OFF is respected while genuine user overrides are preserved. -- 0897b2a: Add a bounded persisted auto-retry for transient workflow-graph resume failures after engine restart or unpause, while preserving terminal failures for genuine graph errors. -- ec4b247: Re-fire durable-agent assignment wakes that were skipped because the agent was mid-heartbeat, so newly assigned tasks are worked when the active run completes instead of waiting for the next timer tick. -- 751d942: Fix workflow graph execution for the built-in coding workflow's merge-policy primitive region by collapsing any merge-region entry back to the legacy `merge` seam until the workflow interpreter owns merge policy execution. -- 93237c3: Fix mobile chat composer first taps so iOS and Android preserve native keyboard focus across direct chat, room chat, and Quick Chat. -- 480e55f: Fix non-English Active Agents next-heartbeat translations so localized strings interpolate the provided elapsed heartbeat value instead of showing a raw placeholder. -- 0a135c9: Fix the task details Chat tab so it opens and reactivates at the latest agent output while preserving scroll-away behavior for live updates. -- 66591ec: Add dashboard and CLI operator surfaces to inspect and apply legacy auto-merge stamp cleanup. -- a9b1139: Self-healing now automatically re-dispatches an assigned in-progress task when its durable agent loses both the heartbeat run and active execution session, preventing the task from stranding until the next engine restart. -- f2054d0: Reliably settle the task detail Chat transcript to the latest output on load and tab reactivation, including after collapsible thinking/tool groups reflow. -- 34ada00: Show user-sent task-detail Chat steering messages as You bubbles and keep them visible after steering requests persist. -- 35554e6: Keep the task-detail Chat composer pinned and visible while the transcript scrolls internally on mobile and desktop. -- e0ec3d1: Steering messages sent from task chat now reach active step-session and workflow runs, including parallel step sessions, and the misleading inactive-session "next session" composer copy was removed. -- f68775a: Ensure only explicit user actions unpause user-paused tasks. Engine self-healing, agent resume cascades, dashboard agent-state resume fallback, heartbeat recovery, and approval-decision resume no longer clear `userPaused` or auto-unpause tasks the user paused. -- 4ea9d66: Fix automatic agent runs to resolve executor, planning, heartbeat, merger, and validator models from fresh task/settings configuration before falling back to durable agent runtime defaults. -- 44b756d: Fix built-in branching workflow selection so interpreter-deferred coding workflows can be selected or used as project defaults without throwing during legacy step materialization. -- e6eef1a: Handle insight extraction agent responses deterministically by accepting prompt return text, falling back to session state, and surfacing a 503 error when no assistant text is produced. -- e305b1a: Respect per-task pause state during triage planning so paused tasks do not auto-advance after specification approval. -- 40cb0d3: Keep the dashboard usage dialog near the top of the viewport across desktop popover, modal, and mobile presentations. -- f16b038: Add workflow work-item storage primitives for workflow-owned merge migration. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [8eb99ed] -- Updated dependencies [36f5ecd] -- Updated dependencies [1a716f2] -- Updated dependencies [e22afec] -- Updated dependencies [fb2c6e5] -- Updated dependencies [039d3ce] -- Updated dependencies [c0ff360] -- Updated dependencies [167f9b0] -- Updated dependencies [1c4ec5f] -- Updated dependencies [12621aa] -- Updated dependencies [30e747b] -- Updated dependencies [eb607c6] -- Updated dependencies [8c16395] -- Updated dependencies [d5b45c8] -- Updated dependencies [f0d2415] -- Updated dependencies [a83c2d8] -- Updated dependencies [cbc3157] -- Updated dependencies [cbc3157] -- Updated dependencies [e5036b1] -- Updated dependencies [535c40d] -- Updated dependencies [e35f3dd] -- Updated dependencies [3a729f5] -- Updated dependencies [c285f3f] -- Updated dependencies [f7f2cae] -- Updated dependencies [9a78814] -- Updated dependencies [2085610] -- Updated dependencies [d23c5d9] -- Updated dependencies [4fc00b6] -- Updated dependencies [65251d2] -- Updated dependencies [4e6df03] -- Updated dependencies [bffae81] -- Updated dependencies [0897b2a] -- Updated dependencies [ec4b247] -- Updated dependencies [7ffea9f] -- Updated dependencies [751d942] -- Updated dependencies [508551c] -- Updated dependencies [93237c3] -- Updated dependencies [bd87ce7] -- Updated dependencies [72661fa] -- Updated dependencies [480e55f] -- Updated dependencies [0a135c9] -- Updated dependencies [66591ec] -- Updated dependencies [a9b1139] -- Updated dependencies [f2054d0] -- Updated dependencies [34ada00] -- Updated dependencies [35554e6] -- Updated dependencies [e0ec3d1] -- Updated dependencies [f68775a] -- Updated dependencies [4ea9d66] -- Updated dependencies [44b756d] -- Updated dependencies [e6eef1a] -- Updated dependencies [07d5262] -- Updated dependencies [e305b1a] -- Updated dependencies [40cb0d3] -- Updated dependencies [f16b038] - - @runfusion/fusion@0.42.0 - -## 0.41.0 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.41.0 -- @fusion/engine@0.41.0 -- @fusion/i18n@0.39.3 -- @fusion-plugin-examples/cli-printing-press@0.1.20 -- @fusion-plugin-examples/compound-engineering@0.1.3 -- @fusion-plugin-examples/dependency-graph@0.1.34 -- @fusion-plugin-examples/roadmap@0.1.22 -- @fusion-plugin-examples/cursor-runtime@0.1.22 -- @fusion-plugin-examples/droid-runtime@0.1.29 -- @fusion-plugin-examples/hermes-runtime@0.2.53 -- @fusion-plugin-examples/openclaw-runtime@0.2.53 -- @fusion-plugin-examples/paperclip-runtime@0.2.53 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.41.0 -- @fusion/dashboard@0.41.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.41.0 -- @fusion/pi-claude-cli@0.41.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.41.0 - -### @runfusion/fusion - -#### Minor Changes - -- 4151a19: Bump `@earendil-works/pi-coding-agent` and `@earendil-works/pi-ai` from `^0.78.0` to `^0.79.1`. This adds **Claude Fable 5** (`claude-fable-5`) model support on the Anthropic and Amazon Bedrock providers, with adaptive thinking and `xhigh` effort. Fable now appears automatically in the registry-driven model picker for users with Anthropic (or Claude CLI) auth configured. See the upstream pi coding agent changelog for [`0.79.1` (2026-06-09)](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/CHANGELOG.md). - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [4151a19] - - @runfusion/fusion@0.41.0 - -## 0.40.1 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.40.1 -- @fusion/engine@0.40.1 -- @fusion/i18n@0.39.2 -- @fusion-plugin-examples/cli-printing-press@0.1.19 -- @fusion-plugin-examples/compound-engineering@0.1.2 -- @fusion-plugin-examples/dependency-graph@0.1.33 -- @fusion-plugin-examples/roadmap@0.1.21 -- @fusion-plugin-examples/cursor-runtime@0.1.21 -- @fusion-plugin-examples/droid-runtime@0.1.28 -- @fusion-plugin-examples/hermes-runtime@0.2.52 -- @fusion-plugin-examples/openclaw-runtime@0.2.52 -- @fusion-plugin-examples/paperclip-runtime@0.2.52 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.40.1 -- @fusion/dashboard@0.40.1 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.40.1 -- @fusion/pi-claude-cli@0.40.1 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.40.1 - -### @runfusion/fusion - -#### Patch Changes - -- e62847b: fix: keep `./dist/*` subpaths resolvable in the packed manifest - - The prepack transform injects an `exports` field for the plugin-sdk subpath, - which flips Node into strict subpath mode and hid every other `./dist/*` file. - That broke the runfusion.ai alias (which imports - `@runfusion/fusion/dist/bin.js`) with `ERR_PACKAGE_PATH_NOT_EXPORTED`, failing - the pre-publish smoke test. Add a `./dist/*` passthrough so the alias bin and - the pi `./dist/extension.js` loader keep resolving after pack. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [e62847b] - - @runfusion/fusion@0.40.1 - -## 0.40.0 - -### @fusion/dashboard - -#### Patch Changes - -- 2d2024f: Unfreeze dashboard spinners and pulse/enter animations. Transition tokens - (`--transition-slow: 0.3s ease`) bundle a duration and an easing; 15 animation - declarations reused them as bare durations, which made the whole `animation` - declaration invalid at computed-value time and silently resolved it to - `animation: none`. Animation rules now use new duration-only tokens - (`--duration-instant/fast/normal/slow`), with the transition tokens derived - from them, and a repo-wide CSS regression test forbids the pattern. -- 784f308: Fix first tap of GitHub tracking icon in quick task entry on mobile (FN-6148). - - The delegated touch handler on `.quick-entry-actions` now uses `closest("button")` to resolve taps that land on child SVG elements, so the GitHub tracking toggle responds correctly on the first touch — identical root-cause fix as FN-6145. - - - @fusion/core@0.40.0 - - @fusion/engine@0.40.0 - - @fusion/i18n@0.39.1 - - @fusion-plugin-examples/cli-printing-press@0.1.18 - - @fusion-plugin-examples/compound-engineering@0.1.1 - - @fusion-plugin-examples/dependency-graph@0.1.32 - - @fusion-plugin-examples/roadmap@0.1.20 - - @fusion-plugin-examples/cursor-runtime@0.1.20 - - @fusion-plugin-examples/droid-runtime@0.1.27 - - @fusion-plugin-examples/hermes-runtime@0.2.51 - - @fusion-plugin-examples/openclaw-runtime@0.2.51 - - @fusion-plugin-examples/paperclip-runtime@0.2.51 - -### @fusion/desktop - -#### Patch Changes - -- Updated dependencies [2d2024f] -- Updated dependencies [784f308] - - @fusion/dashboard@0.40.0 - - @fusion/core@0.40.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.40.0 -- @fusion/pi-claude-cli@0.40.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.40.0 - -### @runfusion/fusion - -#### Minor Changes - -- 61d6874: Add a guarded interpreter-authoritative workflow cutover for coding-task lifecycle execution. The new capability stays default-off behind `experimentalFeatures.workflowInterpreterAuthoritative` and only activates when rollout-readiness checks pass, preserving legacy execution as the fallback path. -- 93e8bd9: Add mission↔goal linkage tooling across Fusion surfaces: REST mission goal endpoints, `fn mission goals|link-goal|unlink-goal` CLI commands, and `fn_mission_list_goals|fn_mission_link_goal|fn_mission_unlink_goal` pi-extension tools. -- 26bc80a: Add mission↔goal batch linking support across REST, CLI, and pi-extension surfaces. - - - `POST /api/missions` and `PATCH /api/missions/:missionId` now accept optional `goalIds: string[]` for mission goal linking on create and update. - - `fn mission create --goal ` supports repeatable goal flags to link goals during mission creation. - - Mission goal link surfaces now reject archived goals with `GOAL_ARCHIVED` while preserving `404` for missing goals. - - Unlink paths remain permissive so archived goals can still be removed from missions. - -- 489a287: Add an ACP (Agent Client Protocol) client runtime plugin (`runtimeId: "acp"`) - that drives any external ACP-compatible agent over JSON-RPC/stdio, built on the - official `@agentclientprotocol/sdk`. Installed on demand (experimental). - - The agent runs as an untrusted subprocess that calls back into Fusion, so the - integration ships a defense-in-depth security floor: per-category permission - gating against the live policy (never a preset shortcut; `allow_once` only; - unmappable kinds and missing policy default-deny), an unrestricted-risk - acknowledgement that escalates blanket allows to approval under the allow-all - default, an opt-in filesystem capability behind a real symlink-resolving cwd jail - (realpath + `O_NOFOLLOW`, secret/`.git` deny-list, writes gated through the - permission policy), untrusted-output sanitization and bounds, and an env - allow-list for the subprocess. - -- c1c99a9: Wire the CLI Agent Executor as a selectable executor kind for the task execute - path (U7). A workflow node with `config.executor === "cli-agent"` (plus - `cliAdapterId` and optional `cliAutonomy`/`cliNotify`) now drives an engine-owned - CLI coding agent (Claude Code / Codex / Droid / Pi / generic) through the execute - step inside the task worktree. - - The new `cli-agent/task-session.ts` orchestrates the task↔session lifecycle: - spawn in the worktree, mint the per-session hook token and write the hook scripts, - inject the task prompt after readiness, subscribe to the authoritative state - machine, and resolve on a positive completion signal (origin R20 gating — a - native `done` advances the pipeline; the generic tier never auto-advances on idle - and exposes a `confirmAdvance()` affordance instead). The resolved executor config - is snapshotted at launch, so a mid-run node-config edit applies to the next run - only. The PTY is reaped (recorded `completed`) at the execute→in-review handoff. - - Lifecycle semantics honor the existing contracts: a hard cancel - (`moveTask(in-progress→todo)` / column-exit abort) SIGKILLs the CLI session via - the same dispose/abort path API sessions use and marks it `killed` (never - resume-eligible); a re-plan/RETHINK re-entry kills any prior live session and - launches fresh; a follow-up to a done task resumes the recorded native session id - when the adapter supports resume, else launches fresh. A PTY-pool ceiling - (`CliConcurrencyLimitError`) surfaces as a clear queued/rejected task state rather - than a silent stall. - -- d8248b4: Add the CLI Agent Executor hook ingestion route and per-session hook scripts - (U17). The dashboard now serves a localhost-only `POST /api/cli-agent/hooks` - endpoint that authenticates per-session hook POSTs from a spawned CLI agent and - forwards the validated payload in-process to the engine telemetry hub (the engine - has no HTTP server — only the dashboard serves HTTP). - - The route is hardened because localhost is not a trust boundary: it validates the - high-entropy per-session token against the engine-held registry (a session id - alone is never sufficient, and a token for one session never validates for - another), rejects browser-context requests via Origin/Host CSRF checks, caps the - payload size, and treats an unknown/non-live session as a 200 no-op rather than a - crash. It is exempt from the daemon bearer-token middleware (hook scripts only - hold the per-session token) but authenticates with that token instead. - - The engine gains `hook-scripts.ts`: it generates the per-session hook script and - notify shim (Orca `agent-hooks` shape — `curl` POST of the stdin JSON with the - session token header, short timeouts, always exit 0), writes them into a - session-scoped config dir (owner-only, executable), and deletes that dir on - session end (the token is registry-invalidated at the same moment, bounding its - at-rest exposure to the session lifetime). - -- ace7106: CLI-agent hybrid chat (U12): a chat session can select a cli-agent executor and - be driven by a long-lived CLI agent process. Adapter transcript telemetry maps - to durable chat_messages rows at user/assistant/tool-summary granularity (raw - tool noise stays in the terminal), with the shared `redactSecrets` pass applied - before persistence so transcripts never become a secret store. Composer sends - route through the inject path with FIFO queueing; the flush decision re-fetches - authoritative session state rather than trusting a cached busy flag. The chat - surface gains a transcript ↔ raw-terminal toggle (terminal owns input, composer - hidden in terminal mode); generic-tier sessions render terminal-only with no - toggle. New per-session `cliExecutorAdapterId` linkage on chat_sessions. - - ChatView now mounts `CliChatSurface` for cli-backed sessions (the message-pane + - composer region is delegated to it; regular sessions keep the standard composer), - and the engine `TelemetryHub` gains a narrow optional `onEvent` tap (settable via - `setEventListener`) so the chat transcript runner can observe the same sanitized - events the hook route already feeds, without the hub becoming a subscriber bus. - -- 7a80d29: Mobile terminal interaction for cli-agent sessions (U13). `SessionTerminal` now - detects mobile viewports via the canonical breakpoint - (`(max-width: 768px), (max-height: 480px)`) and renders a bottom input model in - place of relying on xterm's hidden-textarea (unreliable on mobile): a visible - text input that forwards typed text + `\r` as input frames on submit, plus an - accessory key bar emitting exact control sequences — Esc (`0x1B`), Tab (`0x09`), - a dedicated Ctrl-C (`0x03`), ANSI CSI cursor arrows (`CSI A/B/C/D`), and a sticky - Ctrl modifier whose next key combines into a control byte (Ctrl-C `0x03`, - Ctrl-D `0x04`, Ctrl-Z `0x1A`) with a visible active state. - - Bar keys apply the iOS composer survival pattern (pointerdown/mousedown - preventDefault, action on click) so the input keeps focus, and the bar behaves as - a fixed footer that lifts above the virtual keyboard via `useMobileKeyboard` - (including its pinch-zoom `vv.scale > 1` guard, which is not treated as - keyboard-open). xterm `onData` input stays attached (the bar is primary, not - exclusive). Bar keys and the input are deliberate user keystrokes routed straight - to the session input path. All new strings are localized in the `app` i18n - catalog. - -- 8bac390: Add CLI-agent one-shot sessions for the validator, planning, and CE plugin - surfaces (U9). A one-shot session runs an adapter's non-interactive invocation - (`claude -p`, `codex exec --json`, `droid exec --output-format json`, - `pi --print`) to completion in a working directory, streams output to a - read-only terminal (input disabled server-side via the durable - `autonomyPosture.readOnly` flag the transport's `isReadOnlySession` honors), - parses the adapter's structured JSON result, and reaps the PTY on exit. - - The new `cli-agent/one-shot-session.ts` returns a typed result: a success with - the parsed payload, or a typed failure (`nonzero-exit` / `unparseable` / - `spawn-failed`) carrying a bounded output tail. The validator integration - (`cli-agent-validator.ts`) maps results into the existing - pass/fail/blocked/error verdict contract — a malformed or unparseable result - maps to `error`, NEVER a silent pass. A planning seam (`runCliAgentPlanning`) - maps one-shot output into the same `PlanningResponse` shape a model run - produces, and the CE plugin's orchestrator threads an `executor` option - (`model` | `cli-agent`) end-to-end to its resolver. - -- 10acf17: Add the CLI agent resume coordinator and self-healing integration (U8). On - engine start, sessions persisted as live (starting / ready / busy / - waitingOnInput) are classified `engineDeath` and queued for resume respecting - the session-manager concurrency ceiling. Resume verifies the recorded worktree - still exists (missing → needsAttention, never a CLI spawned into a vanished - directory), detects a dirty worktree (logged + flagged on the session record, - resume proceeds), relaunches via the adapter's `buildResume` with the recorded - native session id in the recorded worktree, re-attaches telemetry, and - re-injects no prompt. Only `crashed`/`engineDeath` are resume-eligible - (`killed`/`userExited`/`authFailed`/`completed` never); attempts are capped at 2 - with backoff; exhaustion, an unsupported adapter, a missing vendor session - store, or an immediate spawn error route to needsAttention (a permanent-failure - path, not a retry loop). - - Self-healing idle-worktree sweeps (`enforceWorktreeCap`, `cleanupOrphans`, - unregistered-orphan reap) now skip a worktree backing a resume-eligible - `cli_sessions` record via a narrow `isWorktreeResumeReserved` seam, and the - stuck-task detector suppresses stuck/inactivity flagging while a task's CLI - session is `waitingOnInput` via a narrow `isCliSessionWaitingOnInput` seam — the - U3 stall backstop remains the only escalation while genuinely waiting. - -- 5872331: Bootstrap the CLI Agent Executor runtime and wire it end-to-end. - - A new `createCliAgentRuntime` factory (engine) constructs the per-project bundle — a `CliSessionStore` over the project's existing core Database, a per-runtime adapter registry with all five bundled adapters, the `CliSessionManager` (PTY lifecycle), the `TelemetryHub` (per-session token registry rebuilt from live records), and the `CliResumeCoordinator` (relaunch re-mints a hook token + rewrites hook scripts) — returning the executor bundle, the `isWorktreeResumeReserved` / `isCliSessionWaitingOnInput` predicates, and a scoped `dispose`. - - The runtime is instantiated per project in `InProcessRuntime` behind the `experimentalFeatures.cliAgentExecutor` flag (opt-in, matching the `workflowGraphExecutor` precedent): the bundle threads into `TaskExecutorOptions.cliAgentRuntime`, the predicates feed the self-healing idle-worktree sweep and the stuck-task detector, and `resumeCoordinator.recoverOnStart()` runs non-blocking after engine start (errors logged, never thrown). The dashboard hook endpoint URL is derived from a server-threaded option, falling back to a localhost URL from `FUSION_DASHBOARD_PORT` (default 4040). - - The dashboard now resolves the project's `TelemetryHub` via `cliAgentHubResolver`, mounts the cli-sessions transport from the runtime's manager + store, and brokers cli-backed chat sends: a chat session with a `cliExecutorAdapterId` routes composer sends to a `CliChatSessionRunner` (instead of the model agent loop), and the hub's sanitized telemetry is routed per-session into the runner's transcript handler. - -- 17c9303: CLI agent session transport (U10): authenticated cli-sessions REST routes - (list, single-use session-scoped attach tickets, inject, confirm-advance), a - distinct `/api/cli-sessions/ws` WebSocket attach handler (daemon-token + Origin - allowlist + single-use ticket gate, scrollback replay then live byte frames, - ACK-credit flow control driving engine pause/resume, latest-active-client - resize, server-side read-only enforcement, input-source attribution), a - streaming-safe outbound output filter (`neutralizeTerminalOutput`) that strips - OSC 52 clipboard writes, non-http(s) OSC 8 hyperlink URIs, and device-status / - query sequences, and a throttled `cli:session:state` SSE event with - Last-Event-ID replay. -- 243113a: Add CLI-agent adapter launch settings, an autonomy approval gate, and workflow - node-editor configuration for the CLI Agent Executor (U15). - - A new `cliAgents` slice of global settings holds per-adapter operator launch - config — command override, extra args, autonomy mode, and env allowlist - additions — validated and sanitized at the write boundary (unknown adapter ids - and invalid fields are dropped). Shipped defaults are owned by the adapters. - - The autonomy gate closes the "adjacent settings" bypass: elevation requested - through ANY channel (the autonomy field, extra args such as - `--dangerously-skip-permissions`, an autonomy-toggling env var, or a non-default - command override) is detected over the FULLY RESOLVED argv + env via per-adapter - elevation markers plus a shared generic env-pattern set. `resolveEffectivePosture` - derives the posture chip from the resolved invocation — never the autonomy field - alone — and the effective posture is denormalized onto the session record at - spawn. An elevated launch without a stored per-project approval fails with a - typed `CliAutonomyNotApprovedError` instead of stalling. Approvals are per-project - - - per-adapter (mirroring the raw workflow-CLI-command approval precedent) and the - approving principal in v1 is the daemon-token holder. - - The dashboard adds daemon-token-authed routes - (`/api/cli-agents`, `/api/cli-agents/settings`, - `/api/cli-agents/:adapterId/approve-autonomy` + revoke), a Settings section for - per-adapter launch config with an explicit confirmation flow before elevated - autonomy is approved, and a workflow node-editor block that surfaces an adapter - picker (with native/hybrid/generic tier labels), an autonomy toggle, and the - waiting-on-input notification mode (banner / banner+notify) when a node's executor - is `cli-agent`. All new strings are localized in the `app` i18n catalog. - -- e10db81: CLI agent terminal UI (U11): a shared `SessionTerminal` component (lazy-loaded - xterm + fit/webgl/unicode11) that attaches to the U10 cli-sessions WebSocket - with ACK flow control, a posture chip (baseline vs elevated), a read-only - badge, session-idle/ended replay states, and a generic-tier confirm-advance - strip. Adds a `terminal` tab to the task detail view driven by the lifecycle - visibility matrix (live / read-only live / replay-idle / replay-ended / hidden) - with live `cli:session:state` SSE merging, waiting-on-input and needs-attention - task-card badges (distinct from staleness/stall badges), and extends - `SessionNotificationBanner` with a `cli-agent` session type plus the pinned - needs-attention variants (userExited / authFailed / resume-exhausted) and their - actions. All new strings flow through the i18n catalogs. -- 57631c7: Add full-screen TUI attach to cli-agent sessions (U14). The Ink dashboard TUI - can hand the terminal to a CLI agent session as a raw passthrough: it enters the - alternate screen, streams WebSocket terminal bytes to stdout and stdin keystrokes - back as input frames, propagates resizes, and ACKs consumed bytes for flow - control. The detach chord (Ctrl-]) restores the TUI cleanly, and a dropped - connection surfaces an error and restores the terminal. Untrusted terminal output - is neutralized through the same hardening filter the dashboard WS bridge uses - (OSC 52 clipboard writes, non-http(s) OSC 8 links, and device-status queries are - stripped before reaching the host TTY). -- 3cf13dd: Add the Compound Engineering bundled plugin: a dedicated dashboard surface for compound-engineering artifacts and interactive `ce-*` sessions, a work→board bridge, and bidirectional board↔pipeline sync. Sessions are fully multi-session: a Sessions panel lists every run with stage/status/last-activity, lets you open and switch between concurrent sessions (each keeps running server-side), resume interrupted ones, and discard settled ones (`DELETE /sessions/:id` disposes the live handle before deleting the row). - - Sessions show the agent's full working output live (streamed thinking/tool activity with an inactivity-based stall timeout instead of a fixed turn timeout), the user can steer mid-stage with free-text guidance (attached to an answer or sent on its own), and the transcript renders past questions/answers/working traces as a proper chat surface. - - This also adds two reusable host capabilities that any plugin benefits from: - - - **Interactive agent sessions for plugin routes** (`ctx.createInteractiveAiSession`), with skill-discovery forwarding (`requestedSkillNames` / `additionalSkillPaths`) and live mid-turn progress streaming (`onProgress`: thinking/text deltas + tool markers) so a plugin can load a bundled skill into a live session and surface its work in real time. - - **Real plugin event push over SSE**: a plugin's `ctx.emitEvent` calls are forwarded to connected `/api/events` clients as project-scoped `plugin:custom` events, and dashboard views can consume them via the new `subscribePluginEvents` view-context capability. - -- ee5f5e8: Add "New folder" button to DirectoryPicker for project setup - - The directory picker in the project setup flow now includes a "New folder" - button that lets users create folders directly when selecting a project path. - This includes: - - - New `POST /api/create-directory` endpoint for creating directories - - Create folder UI in DirectoryPicker with inline error handling - - Keyboard support (Enter to create, Escape to cancel) - - Client-side validation for folder names (no path separators or traversal) - - Also fixes a bug where navigating into an empty folder would revert to the - previous directory. - -- e854d33: Add `fn onboard` command: a sequential, prompt-based onboarding wizard covering central DB creation, AI provider setup (API key), first project init, core settings defaults, and a next-steps tour. Persists a `cliOnboardingCompletedAt` completion marker in global settings (distinct from the dashboard `setupComplete` first-run flag). -- 641b932: Add a safe onboarding auto-launch hook in the CLI bootstrap path. When the central DB is missing, interactive TTY commands now trigger `fn onboard` automatically before command dispatch, while non-interactive contexts (non-TTY, `serve`, `daemon`, explicit skip signals) remain unchanged and never block execution. -- 2053f3f: Add `fn onboard`: an explicit, user-invoked onboarding command that runs a sequential, prompt-based wizard for central DB creation, AI provider setup (API key), first project init (`fn init`), core settings defaults (global `testMode` and project `maxConcurrent`), and a next-steps tour. It persists a `cliOnboardingCompletedAt` completion marker in global settings so later runs are skipped unless `--force` is passed. -- e9de195: Add dashboard shared branch-group visibility and controls: branch-group list/show/assign/promote API routes, grouped task surfacing, and a completion-gated branch-group card that only reveals PR/merge actions once all members are landed. -- eb425d1: Add a dedicated dashboard Group Task Modal for shared branch groups. Grouped badges in task cards and subtask planning now open a modal showing shared branch status, member landed progress, tracked PR state, member-task quick links, and completion-gated promote actions. -- 9c29e2e: Add a new New Task branch strategy option, **Merge into a shared feature branch** (`shared-group`). - - When selected, task creation now joins an existing open branch group by shared branch name (or creates a `new-task` sourced group when missing), links `branchContext` with `assignmentMode: "shared"`, and derives a per-task working branch from the shared branch instead of running directly on the shared integration branch. - -- 3373c0b: Add shared branch-group completion-gate promotion machinery so grouped shared branches promote to the default branch exactly once after all members land. This includes idempotent promotion re-evaluation, finalized branch-group status/PR tracking persistence, and lifecycle wiring that keeps member integration and shared→default promotion as separate phases. -- 130f6f1: Custom OpenAI-compatible providers now register with explicit conservative role compatibility: Fusion defaults `compat.supportsDeveloperRole` to `false` so reasoning-capable models emit the legacy `system` role instead of relying on provider URL auto-detection. Advanced users can opt in per provider with `supportsDeveloperRole: true` when their endpoint explicitly supports the `developer` role. -- 0a418e6: Add the external plugin authoring loop for published Fusion installs: `@runfusion/fusion/plugin-sdk` is available as the public SDK subpath, `fn plugin new ` scaffolds standalone publishable plugin packages, and `fn plugin dev ` builds, installs, watches, and hot-reloads local plugins during development. -- 30a09e3: Persist mission↔goal many-to-many links with a new `mission_goals` join table, MissionStore link/unlink/list helpers, and a project schema version bump from 100 to 101. -- abbeaec: Surface mission-linked goals across mission read paths, including `fn_mission_show`, mission detail API payloads, and dashboard mission detail navigation into anchored goal cards. -- 577ce12: Document mission-to-goal linkage behavior, including the explicit no-backfill decision for existing missions, and surface an Unlinked badge for active missions without linked goals in Mission Manager. -- 3b9ff42: Add self-healing recovery for stale mission validator runs that are left in `running` after their owning execution disappears. - - Stale validator runs are now reaped to the existing terminal `error` status (rather than introducing a new `cancelled` status), the reap reason is stored in the run summary, active mission features are moved back to `needs_fix` so validation can re-trigger, and startup/maintenance sweeps emit `mission:validator-run-reaped` audit events for recovered rows. - -- cc18206: Mission validation now AI-validates all mission criteria by lazily ensuring a per-feature managed assertion at runtime and removing the zero-assertion auto-pass path. Milestone acceptance criteria are threaded into validator prompts, and the dashboard now presents mission criteria as AI-validated instead of informational-only. -- d72cb2a: Move agent logs out of the SQLite `agentLogEntries` table into per-task `.fusion/tasks/{ID}/agent-log.jsonl` files, add one-time migration + source-ref rewrite support, preserve soft-deleted log files for forensics while hiding them from live reads, and switch goal-citation source refs to `agentLog:{taskId}:{lineNo}`. -- 8aed4da: Add AI-assisted conflict resolution to the dashboard Create PR flow so users can resolve task-branch merge conflicts against the selected base branch, push the updated branch, and continue PR creation without leaving Fusion. -- 8891d4b: Add an in-app Create PR remediation that pushes the task branch to `origin`, refreshes preflight status, and unblocks PR creation without leaving Fusion. -- 13c6d96: Add workflow `notify` nodes so custom workflows can dispatch templated notifications through configured providers. -- 6271778: Add `workflow_id` support to agent task creation, delegation, and update tools so agents can select or clear task workflows directly. -- 0b7549a: Enable workflow columns, graph executor, dual-observe, and authoritative interpreter experimental flags by default. -- 1b7e52e: Expose workflow discovery and selection during triage planning, including workflow routing metadata for child task creation. -- b1454c1: Branch-group promotion now creates a single real GitHub PR for the group integration branch when promoting a completed PR-mode group. The PR number/url/state are persisted on the branch group and promotion is idempotent — re-running never opens a second PR (an existing persisted or open PR is reused). The GitHub client is injected into the engine via the same option-callback seam as `processPullRequestMerge`, wired at the `fn daemon`, `fn dashboard`, and `fn serve` construction sites. PR creation only happens for eligible (completion-gated, auto-merge-allowed) groups, and a GitHub failure leaves the group recoverable rather than persisting a false PR state. - - The single managed group PR is now kept in sync through its terminal lifecycle: as additional members land, the PR body is rewritten with the latest member checklist and x/N completion (idempotent body rewrite — sync failures are non-fatal and retry on the next landing). When the persisted PR is closed or merged out-of-band on GitHub, the stored `prState` is reconciled rather than re-opened. Abandoning a group best-effort closes its GitHub PR and marks `prState` `closed` (or preserves `merged`). New injected `syncGroupPr` callback and dashboard `updatePr`/`closePr` GitHub-client helpers back this flow. - - The branch-group surface is completion-gated end-to-end: the dashboard branch-group card and Group Task modal show member progress before completion, reveal the promote/Open-PR control only when the group is complete, render the persisted PR link once promoted, expose an Abandon action while the PR is open, and display a terminal merged/closed state. A new agent-native CLI command (`fn branch-group list | show | promote `) reaches the same promotion coordinator path the dashboard uses — promoting a complete group opens/links the same single managed PR, and an incomplete group is rejected with the same completion-gate message. - -- f9e5513: Harden the project database against the recurring "database disk image is malformed" corruption. - - - **Integrity-checked backups**: every backup copy is now verified with `PRAGMA quick_check` before it is kept, a verifiably-corrupt copy is quarantined as `*.corrupt` instead of masquerading as good, and `cleanupOldBackups` will never rotate out the last verified-good backup. - - **Startup auto-recovery**: on open, a malformed `fusion.db` is detected and rebuilt offline via `sqlite3 .recover` (corrupt original preserved as `fusion.db.corrupt-`, stale `-wal`/`-shm` dropped) before any connection is established. Opt out with `FUSION_DISABLE_DB_AUTORECOVER=1`. This also fixes a latent bug where the recovery path invoked the non-existent `.recover main` option and always failed. - - **Database shrink + retention**: scratch `lost_and_found*` tables left by prior recoveries are dropped on init, and a new `operationalLogRetentionDays` setting (default 30 days, configurable in Settings → Backups → Database Maintenance, 0 to disable) prunes unbounded append-only log tables (`activityLog`, `agentLogEntries`, `runAuditEvents`, `agentHeartbeats`) during periodic maintenance to curb the file growth that widens the corruption window. - -- 34c8ac9: Add the unified `fn pr` command namespace for CLI parity with the dashboard's - PR-entity review surface (U8, R13): `fn pr create | list | show | approve | -respond | retry | merge | close | automerge`. - - Each subcommand routes to the SAME store/engine/release path the dashboard PR - routes use, so the two surfaces can't diverge: `create` mints the GitHub PR; - `list`/`show` read PR entities; `approve`/`respond`/`retry`/`merge`/`close` fire - the workflow's user-controlled release edges via `releaseHeldTaskByEvent` - (`pr-approve`/`pr-respond`/`pr-retry`/`pr-merge`/`pr-close`); `automerge` toggles - the entity's `autoMerge` flag. - - BREAKING: the per-task `fn task pr-create` command is retired. Use `fn pr create -` instead (same flags: `--title`, `--base`, `--body`, `--draft`, - `--no-ai`, `--reviewer`). - -- 5c4c765: Add a dashboard browse-and-install flow for skills.sh catalog entries, including the new `POST /api/skills/install` API route and Skills view install actions that refresh discovered skills after a successful install. -- d071aec: Add executable custom workflows with a visual graph node editor. Author a workflow as a graph (start → prompt/script/gate steps → end) in a new React Flow–based editor, then select it per task or set a project default. Selected workflows compile to the existing WorkflowStep engine and run at the pre/post-merge boundaries — no changes to the scheduler/executor/merger. Non-linear graphs are rejected with a clear message and reserved for the (deferred) graph interpreter. - - Prompt nodes carry an execution profile: run on a chosen model, as a named agent, as a skill invocation, or as a named project script (CLI) with the prompt passed via FUSION_NODE_PROMPT — plus per-node retries and an auto-approve toggle. "User input" nodes pause the run with a needs-input badge on the task card and a banner in the task modal; replying in comments and unpausing resumes the workflow with the answer. - - CLI nodes can run arbitrary commands (not just named scripts); the first run of an exact command pauses the task for explicit user approval. The task modal's input/approval banner is interactive — reply-and-resume for user-input nodes, approve-and-run for CLI commands. - - Agents reach workflows too: the `fn_workflow_list`, `fn_workflow_get`, `fn_workflow_select`, `fn_workflow_create`, `fn_workflow_update`, and `fn_workflow_delete` tools (plus `fn_trait_list` for the column vocabulary) give agents the same author/list/select capability as the dashboard. These are exposed not only to the task executor but also to the chat and planning agents, so you can author and edit workflows directly in a chat or planning conversation; a guard test locks all six tool names to each lane to prevent silent exposure drift. Built-in workflows are now read-only in the editor (palette/inspector disabled, with a "Duplicate to edit" action), and a node's "Auto-approve requests" toggle now actually bypasses the CLI first-run approval pause. - - Also fixes a latent persistence bug where `pausedReason` was written to the in-memory task and read by queries but never stored by the task upsert or mapped back on read — so it was lost on every reload. This silently broke any pause/resume that depends on the reason (workflow CLI-approval and await-input nodes, token-budget pauses, worktrunk failures). The approve-CLI endpoint now derives the approved command solely from the task's pausedReason (ignoring any caller-supplied command), await-input nodes only resume when this node actually paused the task (not on a pre-existing steering comment), and write-capable custom nodes are refused until a task worktree exists so they never mutate the shared repo root. - - The editor itself got a major usability upgrade: card-style nodes with kind accents and live config summaries (model/agent/skill/command, gate mode, hold release, join mode); success/failure edge authoring on regular edges with distinct styling, parallel conditioned edges, and an author-time cycle guard; one-click auto-layout that respects column swimlanes; safe node/edge deletion with cascade semantics; proper dialogs (create/delete/discard) with inline rename, descriptions, and a dirty-state guard on every dismissal path; onboarding/empty states; and the Columns and Fields panels now live in the editor's left sidebar under the workflow list. - - The node editor is now the primary workflow surface: the header and mobile nav open it directly and the legacy Workflow Steps screen is retired. Existing flat steps migrate automatically (and idempotently) on first editor open — every step becomes an insertable template fragment in the new palette Templates section (alongside built-in and plugin step templates), and your default-on steps become a "Migrated steps" workflow that's set as the project default. Task creation now picks a workflow (applied atomically at create) instead of individual step checkboxes. - - Workflows and template fragments import/export as JSON files — with server-side validation, name-collision handling, and automatic stripping of approval-bypass flags from untrusted files. And you can ask AI to design a workflow: describe what you want in the create dialog (or redesign the active workflow from the toolbar) and a planning-lane model emits a validated graph, with interpreter-only branching flagged honestly. - -- 9072d71: Add a localization (i18n) foundation across the UI. Introduces react-i18next-backed translation for both the dashboard and the terminal UI, with English as the source language and Simplified Chinese, Traditional Chinese, French, and Spanish as target locales. - - - New `@fusion/i18n` package holding the authored catalogs and shared i18next configuration (namespace split, script-aware zh-CN/zh-TW fallback, plural setup). - - A `language` preference (`fusion settings`) and a Settings language switcher; the CLI resolves locale from `--lang`, settings, then environment. - - An `i18next-cli` workflow (`extract`/`sync`/`types`/`status`/`lint`) so adding a future language is a translate-only, near-zero-code operation. - -- c1a7231: Redesign the workflow editor mobile surface with a graph outline, mobile add flow, and first-class workflow settings destinations. -- fbc2c37: Convert the built-in PR lifecycle from a selectable task workflow into a reusable workflow-editor fragment template. -- bd5315f: Allow projects to enable or disable built-in workflows from settings, and show built-in workflow seam prompt text in workflow nodes. -- d8a015e: Allow built-in workflow review columns to surface the auto-merge toggle. -- 7076dd4: Make task steps workflow-modelable, behind the `experimentalFeatures.workflowGraphExecutor` flag (off by default). - - Step policy — how a task breaks into steps, how each step is reviewed, and what happens on revision/rethink — was previously fixed engine law. Workflows can now model it as graph structure: a `foreach` node instantiates a per-step template subgraph once per planned step; a `step-review` node surfaces APPROVE/REVISE/RETHINK/UNAVAILABLE verdicts as outcome edges; `rework` edges (the only legal graph cycles, bounded per instance) route revisions back to a `step-execute` seam, with RETHINK triggering a substrate reset-to-baseline (git reset + session rewind). Steps additionally gain parallel execution: with `mode: parallel` + per-instance worktrees, dependency-satisfied steps (declared via `### Step N (depends: 1,2):` annotations) run concurrently off a common base, with an ordered integration stage that lands branches in step order and routes rebase conflicts to a budget-counted rework outcome. - - Step parsing itself becomes a graph node: `parse-steps(artifact, parser)` reads a workflow-declared task artifact and runs a registry parser (built-in `step-headings`/`json-steps`, or plugin-contributed parsers under `plugin::`) to write the step list, with routable `no-steps`/`parse-error` outcomes. A `code` node runs sandboxed TypeScript (esbuild + child process, clamped timeout, no store handle) for arbitrary computed routing/field logic. Workflows also declare typed custom task fields (string/text/number/boolean/enum/multi-enum/date/url, with enum options and render hints); values are validated through a single store authority and the task UI renders the field schema dynamically (detail form widgets, card badges, and a workflow-editor Fields panel). `fn_task_update` accepts a `custom_fields` patch; `fn_workflow_create/update` accept the new IR constructs. - - The default coding workflow is untouched and byte-identical (the parity oracle); a new built-in stepwise coding workflow demonstrates the full modeling. With the flag off, step execution, review, and the board are exactly as before. - - **ROLLBACK:** This is flag-gated by `experimentalFeatures.workflowGraphExecutor` and additive on disk. Schema migration v108 only ADDS the `workflow_run_step_instances` table and the `tasks.customFields` column (default `'{}'`) — it rewrites no existing rows. The flag is read once and pinned per run, so a mid-flight toggle never switches a task between the legacy and graph step paths; flag-off rollback mid-task converges via the existing fell-back + git-reconcile recovery, because `Task.steps[]` remains the always-git-reconcilable projection sink. Instance rows are per-run prunable and are never the authority over git history. IR using the new node kinds (`foreach`/`step-review`/`parse-steps`/`code`) is v2-only, and `downgradeIrToV1IfPure` already refuses non-v1 node kinds, so the v2 rollback contract from the columns track is preserved automatically. To downgrade to a pre-v108 binary, turn the flag off and let in-flight stepwise tasks settle (or reconcile from git) first; custom-field values on the dropped column are lost on downgrade, so export any needed field values beforehand. - -- 4fa5407: Add per-column agent assignment for workflow columns, behind the combined `experimentalFeatures.workflowColumns` + `experimentalFeatures.workflowGraphExecutor` flags. - - A workflow column can now name a permanent agent from the registry plus a mode — `defer` (the column agent is the default for work in that column that carries no agent/model settings of its own) or `override` (the column agent supersedes node- and task-level agent/model settings). The binding applies to all session-running work attributable to the column's nodes: custom prompt/gate/script nodes, the execute seam's coding session, and step-execute sessions. Precedence is resolved by one shared `@fusion/core` resolver (`resolveColumnAgentBinding` + `resolveEffectiveAgent`) consumed by every reader, with defer/override expressed as explicit named rules and defer granularity all-or-nothing (an own agent identity OR a complete `modelProvider`+`modelId` pair suppresses the column agent). The binding keys off the node's declared IR column; foreach template nodes inherit the enclosing foreach node's column. A missing/deleted agent at resolution time logs and falls back to normal resolution — a live session is never aborted. The built-in default workflow carries no column agents and stays byte-identical (parity oracle); with either flag off, column agents are inert. - - The effective column agent is also the principal for the subsystems that previously assumed the running agent is always `task.assignedAgentId`: action gating (`buildActionGateContext` / `buildPermanentAgentGatingContext`) is computed for the agent actually running; heartbeat serialization honors it in both directions (the execute deferral gate, a second `resumeTaskForAgent` pass that re-dispatches tasks whose effective column agent matches, and a reverse-direction heartbeat-scheduler guard so an `allowParallelExecution=false` column agent never heartbeats concurrently with its own session); and a workflow-definition edit or agent runtimeConfig change that re-keys the column-effective agent/model hot-swaps the running graph session, while an agent deleted mid-session falls back without a restart. - - Authoring lands in the workflow editor: the column panel gains a registry-backed per-column agent picker plus a defer/override mode toggle, bound columns are badged on their headers, and a node inside an override column shows that its own executor settings are superseded (so override never reads as a bug). Picker interaction states are explicit — flags off disables the picker with a tooltip naming both required flags, an in-flight fetch disables it, a failed fetch shows an inline error, and a stored `agentId` missing from the registry renders an "Agent not found" warning that preserves the IR until the author clears or replaces it. Agent references are validated at save time: the `POST`/`PATCH` workflow routes reject an unknown `agentId` with a typed 4xx naming the offending column, and binding an agent whose permission policy is broader than the project default requires an explicit `confirmPolicyEscalation` flag so override cannot silently re-key action gates to a more-privileged agent. - -- 60605fa: Add workflow-defined custom columns with composable traits, behind the `experimentalFeatures.workflowColumns` flag (off by default). - - Workflows can now define their own columns, each carrying composable traits (declarative flags plus lifecycle hooks) instead of the fixed `triage → todo → in-progress → in-review → done → archived` pipeline. The dashboard board renders one lane per workflow in use, and graphs gain `hold`, `split`, and `join` nodes for passive dwell and parallel fan-out/join branches. The built-in default workflow reproduces today's pipeline verbatim, and migration rewrites zero task rows — a null workflow selection resolves to the default workflow at read time. With the flag off, the legacy board, transitions, and engine behavior are unchanged. - - **ROLLBACK:** Workflow IR now has a `v2` on-disk shape (custom columns + `hold`/`split`/`join` nodes). Pre-v2 binaries hard-reject any IR whose `version !== 'v1'`, so a naive downgrade would brick rows that had been re-serialized as v2. To keep rollback safe, the store downgrades a workflow back to the `v1` shape on save whenever (a) the `experimentalFeatures.workflowColumns` flag is OFF, and (b) the graph is "pure v1" — only `start`/`prompt`/`script`/`gate`/`end` nodes, no `hold`/`split`/`join`, and exactly the synthesized default columns at their default seam-derived placement. v2 is persisted only when the flag is ON or a genuine v2 feature (custom column, applied trait, custom placement, or a v2-only node) is in use. Reading a downgraded `v1` row on a v2 binary re-upgrades it to the identical v2 graph, so this is lossless. Rollback is therefore only unsafe for workflows that actually use v2 features with the flag ON; turn the flag OFF and re-save such workflows (or delete them) before downgrading to a pre-v2 binary. - -- 71822f2: Add workflow extension plugin contracts for move policies, work engines, node handlers, task verdict providers, auto-merge facts, and shared board action services. -- a504238: Add first-class workflow loop nodes with bounded template repetition, exit conditions, editor support, and plugin SDK type exports. -- 61ae1bf: Expose default-workflow Plan/Triage, Executor, and Reviewer model lanes from Project Models settings while keeping workflow setting values as the source of truth. -- e2707af: Add a first-class workflow settings mechanism and hard-move execution policy onto it. - - - **Workflow settings.** Workflows now declare typed settings in their IR (id, type, default, options) — the same authoring pattern as custom task fields. Setting _values_ persist per `(workflow, project)` behind a single validating store authority, and the engine resolves _effective settings_ per task (`stored value ?? declaration default`, dropping values that no longer validate). Built-in `builtin:coding` declares every moved key with its former default, so an untuned project behaves identically. - - **Hard-move migration.** A one-time, idempotent, per-project migration relocates the step-execution, review/approval, and per-phase model-lane keys out of project/global settings into workflow setting values, removing them from the settings schema entirely. A `MOVED_SETTINGS_KEYS` tombstone list shields cross-node sync, v1 imports, and stale writers from resurrecting a moved key; a consistency test enforces one home per key. - - **Settings UI redesign.** The Settings modal is rebuilt from shared schema-driven field primitives and per-section components; moved settings show a redirect stub linking to the workflow editor (one release). The new **Workflow editor → Settings** panel (Definitions/Values tabs) and the `fn_workflow_settings` agent tool edit values with typed validation. - - **Export v2.** Settings export bumps to version 2 with a `workflowSettings` value section; importing a v1 export upgrades any moved key it carries into the appropriate workflow's values. Workflow settings are not synced across nodes yet (surfaced in the sync UI). - -#### Patch Changes - -- f76716e: Fix custom-provider model resolution in the bundled engine for OpenAI Responses API providers. - - - Align custom-provider reads with global settings directory resolution (including legacy `~/.pi/fusion` and `~/.pi/kb` migration paths), so providers persist across restart and remain visible during agent session creation. - - Ensure custom provider registration diagnostics include enough detail for troubleshooting registration failures. - - Improve configured-model resolution errors to clearly identify the failing `provider/model` selection while retaining the existing `"was not found in the pi model registry"` matcher substring and pointing users to Settings → Custom Providers. - - Add regression tests covering legacy settings-path custom-provider loading and openai-responses provider model resolution. - -- fab8a62: Make `fn_goal_list` and `fn_goal_show` available in engine agent sessions, including executor, heartbeat, and triage runs. - - Also make `fn_goal_list` output concise by truncating descriptions to short single-line snippets while keeping full goal descriptions available through `fn_goal_show`. - -- 2d81a95: Fix mission→goal link write paths to return `400 { code: "GOAL_NOT_FOUND" }` instead of 404 for unknown goals, aligning the API, CLI, and pi tool contract. -- 40c0048: Fix built-in workflow editor graph edge visibility so read-only built-in workflows render connected, clickable React Flow edges for success, failure, and rework paths. -- 9c84ba2: Built-in coding workflow catalog (`builtin:coding`) now exposes the canonical `BUILTIN_CODING_WORKFLOW_IR` used by resolver/runtime fallback paths, removing drift between workflow surfaces. -- 934071c: Agent-created tasks without explicit titles now request AI title summarization regardless of the project auto-summarize setting. -- d75f861: Harden AI merge temporary worktree cleanup with same-task pre-merge pruning and task-aware stale tempdir sweeping for completed or deleted tasks. -- db971a9: Initialize missing Git repositories automatically when registering Fusion projects. -- 30ba1f0: Expose the dashboard file viewer to plugin views and use it for Compound Engineering artifact documents. -- 07dcb16: Add the Codex, Droid, and Pi CLI agent adapters (U5). - - Three new launch adapters join the engine's CLI agent executor, each declaring honest, verified capability flags so surfaces can render tier differences: - - - **Codex** (hybrid tier): native turn-complete via the session-scoped `notify` config program (`-c notify=[…]`), capturing `thread-id` as the native session id; waiting-on-input is inferred from ANSI-stripped PTY prompt-pattern heuristics (approval menus, idle composer markers, with a spinner/working override) because Codex has no native waiting signal; resume via `codex resume `; rollout JSONL transcript tailed by probing (not hardcoding) the sessions directory for the file matching the thread-id. - - **Droid** (native tier): Claude-style hooks (`SessionStart`, `Stop`, `Notification`, tool-activity) delivering `session_id`/`transcript_path`/`permission_mode`; a message classifier splits the conflated `Notification` event into permission-request vs idle sub-reasons (both treated as waiting-on-input); resume via interactive `droid --resume ` or headless `droid exec -s ` — never the bare `-r` that means `--reasoning-effort` in exec mode. - - **Pi** (native tier): telemetry and transcript from session-JSONL tailing under a session-scoped `--session-dir`; lifecycle events (turn/agent start→busy, end→done, input-request→waiting) plus message rows→transcript; resume via `pi --session `. - - A new `session-jsonl` transcript source is added to the adapter capability union for Pi. - -- f3b700a: Add the generic heuristic-tier CLI agent adapter (U6). - - Arbitrary user-configured CLI commands can now run as engine-owned PTY sessions. The generic adapter declares every native capability disabled (no native done/waiting signal, no transcript) and infers state purely from the terminal byte stream: busy while output progresses or a spinner animates, and a synthetic idle after a configurable quiet window when a prompt-like glyph is showing and no spinner overrides it. Per the completion-gating decision (origin R20) the generic tier NEVER reports done — idle surfaces a "looks idle — confirm to advance" affordance via a new busy-equivalent idle sub-state and never advances the pipeline. - -- b9afce3: Fix a batch of CLI Agent Executor review defects: - - - **Schema-version gate**: bump `SCHEMA_VERSION` to 110 so a DB already at 109 - runs migration 110 and gains the `chat_sessions.cliExecutorAdapterId` column - (it was previously short-circuited). Add the column to the compat-fingerprint - `MIGRATION_ONLY_TABLE_SCHEMAS.chat_sessions` entry so the fingerprint matches. - - **Generic adapter double-wrap**: `formatInjection` no longer re-wraps injected - text in bracketed-paste markers when `bracketedPasteActive`; the session - manager's security path is the sole wrapper, so the generic adapter (like every - native one) only appends a carriage return. - - **Output-filter cross-boundary bypass**: thread one carry buffer across the - scrollback→live seam in the CLI session WS bridge so a dangerous escape (e.g. - OSC 52) split across the seam is fully neutralized instead of the held - introducer being flushed verbatim into the scrollback frame. - - **Output-filter overflow leak**: when an over-length carry begins with a - recognized dangerous introducer (OSC `ESC ]` / DCS `ESC P`), drop the - introducer instead of flushing it as literal, so it cannot recombine with a - later terminator at the client. - - **Follow-up never resolves**: `followUp()` now drives the authoritative state - machine `done→busy` before injecting, so the re-armed result promise resolves - on the next positive `done` instead of hanging on an idempotent done. - -- 38b84a3: Recover failed Planning Mode session loads into the existing retryable error view instead of dropping back to the empty planner. Failed or malformed persisted planning sessions now keep their session id so Retry/Dismiss recovery remains available, while deleted sessions still quietly fall back to a new session. -- 68e52e3: Fix in-review tasks showing other tasks' files in the "files changed" list. `baseCommitSha` was captured as `merge-base(HEAD, origin/main)` at task start, but task branches fork from local main — when local main was ahead by merged-but-unpushed task commits, the recorded base rewound past them, and after the post-merge rebase-and-push rewrote their SHAs the diff range permanently swept the predecessors' files into the new task's diff. The capture now measures against local main first (origin/main as fallback), matching the contamination-base sites. -- 314411c: Fix mission triage silently stranding features when two missions share a base branch. - - `branch_groups.branchName` is globally unique, but `ensureBranchGroupForSource` only checked for an existing group by `(sourceType, sourceId)`. When a second mission's shared-branch triage resolved to a base branch (e.g. `main`) that another mission already owned a branch group for, `createBranchGroup` threw `UNIQUE constraint failed: branch_groups.branchName`. That error escaped `triageFeature` and was swallowed by both of its callers (the validation-failure auto-triage and the startup/maintenance reconcile sweep), leaving the mission's `defined` features — including auto-generated fix features — permanently un-triaged and the mission unable to progress. - - `ensureBranchGroupForSource` now reuses an existing open group for the same branch name (matching the established `getBranchGroupByBranchName(...) ?? ensureBranchGroupForSource(...)` idiom) instead of colliding on the unique constraint. - -- 7d417a1: Fix the bundled Compound Engineering dashboard plugin build so its CSS is included in `dist`. -- 978d07c: Fix opencode-go model sync: pass API key to CLI and strip provider prefix from model IDs - - Two bugs when using OpenCode Go as a provider: - - 1. **Model discovery only returned free models** — the saved Go API key was never passed as `OPENCODE_API_KEY` to the spawned `opencode models opencode --refresh` process. The CLI's internal plugin checks this env var and, when absent, disables all paid models (those with `cost.input > 0`). Only 20 free models appeared instead of all 67. - - 2. **API requests failed with 401** — `normalizeOpencodeGoModel` was registering models with prefixed IDs like `opencode-go/deepseek-v4-flash`. The Pi SDK sends `model.id` verbatim in API requests; the OpenCode API expects bare model names (e.g. `deepseek-v4-flash`). The prefix is now stripped during normalization. - - Also deduplicates models when the CLI emits both `opencode/foo` and `opencode-go/foo` for the same model, guards against empty model IDs, and refactors the duplicated `onApiKeySaved` handler into a shared `handleOpencodeGoApiKeySaved` helper. - - After this change, users must re-select their opencode-go model in Settings because model IDs have changed from prefixed to bare names. - -- c2604d5: Fix missions stalling when a feature is marked `done` but stranded mid-loop. - - A mission feature could be left `status: "done"` while its `loopState` never advanced past `"implementing"` and it had no linked board task (so it was never validated). The slice-completion gate (`MissionStore.computeSliceStatus`) correctly refuses to count an assertion-linked `done` feature until its validator passes, but nothing re-drove a task-less feature, so the slice — and the whole mission — could never auto-progress. - - Active-mission recovery now detects these stranded `done` features and re-runs assertion validation directly (no board task), so the gate can resolve: on pass the feature becomes legitimately complete, on fail the normal fix-feature flow takes over. The feature-validation path was extracted into a shared `runFeatureValidation` helper used by both task-completion and recovery. - -- a27921a: Fix project selector review regressions around optional selection handlers and bookmarked search matches, and tighten retry/backoff timeout and rate-limit handling. -- 77a1099: Fix a spurious Settings → Plugins error for the bundled Dependency Graph plugin where plugin startup could fail with `Invalid state transition from "started" to "started"`. - - Plugin state transitions now treat same-state updates as idempotent no-ops, while still allowing same-state calls with an explicit error payload to update the persisted error field without emitting a state-changed transition. - -- 944c03d: Fixes the UsageIndicator popup hidden-window recovery flow by preventing hide/show controls from acting as implicit form-submit buttons. - - - Sets the per-window hide control and provider-level **Show hidden (N)** control to `type="button"` so they do not trigger parent form submits. - - Adds a regression test that verifies clicking **Show hidden** reveals hidden windows, persists the unhidden state, and remains correct after rerender/state re-sync. - -- feceedb: Repair dropped spaces after sentence-ending punctuation when streamed agent text is split across separate assistant messages by tool-call round-trips (chat and agent logs), by tracking a per-session running tail at the shared engine streaming-delta chokepoints. Completes FN-5789, which only covered within-message boundaries. -- 40b4919: `fn onboard` now allows each onboarding step to be skipped individually without aborting the overall wizard. Skipping steps still marks onboarding as completed, while interactive cancellation behavior remains unchanged. -- e1a35a3: Harden CLI onboarding auto-launch backward compatibility by adding an explicit skip when both the central DB and local project DB already exist. This preserves established agent/headless behavior by ensuring non-TTY, `serve`, and `daemon` invocations continue without onboarding prompts or blocking. -- 38e0422: Refine onboarding auto-launch bypass behavior by treating `--skip-onboarding` and `FUSION_SKIP_ONBOARDING` as first-class skip paths. - - - Parse `FUSION_SKIP_ONBOARDING` with strict truthiness (`1`, `true`, `yes`, `on` only). - - Return distinct auto-launch skip reasons for flag (`skip-flag`) and env (`skip-env`). - - Strip `--skip-onboarding` as a global CLI flag so it never leaks into downstream command parsers while still informing onboarding gate decisions. - -- 245129e: Add orchestrator-level regression coverage and CLI docs that guarantee onboarding auto-launch never blocks existing projects, non-TTY/headless workflows, or agent-run `fn` commands. -- c676cbe: Update `fn onboard` CLI HELP text and CLI reference docs to match shipped onboarding behavior, including auto-launch conditions, skip paths, and onboarding escape hatches (`--skip-onboarding`, `FUSION_SKIP_ONBOARDING`). -- 1aef3c9: Fixes a mobile dashboard crash path where toggling the in-review auto-merge switch could blank the UI until refresh on some Android/legacy WebView environments. -- 327f0a9: Fix shared branch-group execution to always derive per-task working branches (`fusion/`) for checkout/worktree operations while keeping the branch-group branch as the merge target. -- e16893a: Classify provider 400 errors for unsupported `messages.[n].role` values as operator-actionable agent errors, and annotate prompt-boundary failures with a clear model/provider compatibility hint. This stops invisible retry loops and makes misconfigured imported agent model/provider combinations fail fast with actionable diagnostics. -- b4230c0: Reuse imported GitHub source issues as task tracking links when GitHub tracking is enabled, instead of creating a duplicate issue. Tasks imported from GitHub now link their existing `sourceIssue` (when valid) as `githubTracking.issue` with no GitHub auth or issue creation call required. -- 8376781: Fix mobile Task Detail Logs scrolling for branch-group tasks by making the branch-group card collapsible and re-pinning the agent log viewer when its container height changes. -- e561290: Fix shared-branch-group member finalization so routed members land on the group's shared branch instead of being auto-finalized against the project default branch. Also harden already-landed commit attribution so the recovery detector never claims a commit that merely mentions a task ID in prose (2026-05-23 lost-work regression): the `git log --grep` ancestry fallback is now ownership-anchored on a Fusion trailer or a task-scoped conventional-commit subject. -- d4db0b0: CLI auto-launch now honors the persisted `cliOnboardingCompletedAt` marker so onboarding fires only once, even when the Central DB step was skipped during `fn onboard`. -- 7d1708f: Fix `fn_goal_list` and `fn_goal_show` so tool calls made from Fusion worktree directories resolve the canonical project database and return goals created through the dashboard UI. -- 684baa0: Stop queued chat messages from disappearing after back-navigation while the assistant is still responding (GitHub #1279). - - Re-entering a chat restored the queued follow-up and immediately flushed it based on the client's local `isGenerating` flag — which is stale mid-generation (it is a route-level enrichment the `chat:session:updated` SSE payload lacks). The premature send aborted the live generation server-side and could lose the queued message entirely, since its persisted copy was deleted before the send. - - The restore path in both Chat and Quick Chat now confirms with the server before flushing: if a generation is still in flight it re-attaches to the stream and lets completion deliver the queued message; the message is sent immediately only when the server reports no active generation. On a failed check the queued bubble is kept for a later flush trigger. - -- e6ce500: Fix the dashboard skills interface so enabled and disabled skill toggles persist across refreshes for both top-level and package-scoped skills. The adapter now normalizes stored skill paths consistently when writing settings and when rediscovering installed skills. -- c60dae1: Fix the desktop quick chat panel so moving the FAB while the panel is closed no longer shrinks or overwrites the saved panel size before the next reopen. -- f3732af: Fix chat message sends with file attachments by parsing multipart form bodies on the chat messages SSE endpoint. - - Uploaded message attachments are now validated, persisted to the session attachment directory, converted into chat attachment metadata, and forwarded to the chat manager while JSON-only message sends continue to work unchanged. - -- de23db3: Bump `@earendil-works/pi-coding-agent` and `@earendil-works/pi-ai` from `^0.77.0` to `^0.78.0`. See the upstream pi coding agent changelog for [`0.78.0` (2026-05-29)](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/CHANGELOG.md#0780---2026-05-29). -- 7d20a99: Clear stale active-session registry entries when PR-mode merge cleanup removes a task worktree. -- 48e08c0: Recover mission interview drafts that were sent to the background from the final summary step. Plan-ready `complete` mission interview sessions now remain resumable across the dashboard, `fn mission list`, and `fn_mission_list` until they are approved into a mission or discarded. -- a66b128: Fix Planning Mode single-task session history so completed sessions remain restorable from the summary view after task creation. -- d9e1cdb: Fix agent-created ntfy task notifications so they include the task description when a title has not been assigned yet. -- dab1569: Fix Planning Mode session history so duplicate AI-session rows are collapsed by session id and deleting a history entry only succeeds when the server-side delete persists. -- ac92174: Fix a Planning Mode reliability bug where creating a single task could fail with a browser-level `Failed to fetch` error when post-create side effects threw or rejected before the dashboard finished responding. -- cf23c6f: Run the configured `worktreeInitCommand` on merge worktrees before AI merge verification across warm and cold integration modes, so merge verification uses the same project-specific bootstrap as executor worktrees. -- e33dadd: Fix fresh-install `pnpm install` bin-link warnings by pointing the published `fn`/`fusion` bins at a committed `bin.mjs` launcher that forwards to the built CLI output. -- 3d18872: Fix the dashboard OAuth login flow for ChatGPT Plus/Pro (Codex Subscription) so multi-option provider selection prompts no longer cancel the login before browser auth starts. -- a1b7556: persist the OAuth expiry alert/notification throttle so users are alerted at most once per provider every 12 hours, even across server restarts. -- 419f688: Fix the dashboard auto-merge toggle blanking on mobile by keeping board stabilization tied to viewport events instead of a one-shot resize listener. - - The in-review board now stays visible when auto-merge is toggled across Android mobile, iOS mobile, tablet, and desktop layouts, with regression coverage for populated and empty columns plus rollback and error-boundary paths. - -- de3273e: Clear the in-review stall deadlock auto-pause on user-initiated retry so dashboard, CLI, and extension retries can actually resume merge/execution work without overriding manual pauses. -- 6a00dd2: Stop missions from silently looping or stalling when agents can't run their tasks (GitHub #1261). - - Importing a catalog ("company") agent assigns it the role `custom`, which the scheduler never auto-assigns mission/queue work to. Combined with a model/provider that rejects the `developer` system role, this surfaced to users as an invisible, repeating failure loop. - - - **Auto-recover from incompatible roles:** an "unsupported message role" provider rejection (e.g. a reasoning model sending the `developer` role to a provider that only accepts `system`/`user`/`assistant`/`tool`) is now treated as a model-selection error, so a configured fallback model is tried once before the task is marked failed. The single-swap guard keeps an incompatible fallback from looping. - - **Stop the retry loop:** operator-actionable failures (unsupported role, auth, quota) now block the mission feature immediately with a clear event instead of burning the full retry budget re-running the same cryptic error. - - **Preflight mission start:** when ephemeral agents are disabled and no eligible executor agent exists, starting a mission now fails fast with an actionable message instead of queueing tasks forever. - - **Warn on import:** importing only `custom`-role agents now surfaces a warning that they won't be auto-assigned mission work unless one is given the `executor` role. - -- 08d25f0: Streamline the Task Changes tab header controls on mobile so diff navigation and actions use a more compact layout. -- fa23782: Fix the dashboard mobile auto-merge toggle blank-screen regression by restoring shared mobile breakpoint coverage and strengthening the regression suite across mobile, tablet, desktop, rollback, and task-review detail surfaces. -- e84410e: Fix duplicate GitHub tracking issues and harden GitHub issue import deduping. -- 60eb2ec: Allow failed agents to be stopped and deleted consistently across the dashboard and CLI guidance. - - Agents in the error state can now transition to paused, the dashboard exposes delete actions for failed agents in list/detail views, and regression coverage protects the updated behavior. - -- f77aa07: Fix auto-merge toggle not appearing on the built-in coding workflow's in-review column. The builtin:coding IR now carries the correct column traits (merge-blocker, human-review) so the dashboard resolves and passes the auto-merge toggle to the in-review column. -- 4ffd0a2: Restore terminal task notifications for workflow/PR-backed completions that move tasks to done before emitting the canonical merged lifecycle event. -- 8bc3d7b: Harden dependency security floors by forcing protobufjs resolutions to patched versions and upgrading Vitest tooling to the patched 4.1 line. -- a2f4bb1: Removed the `collapsible`, `collapseStorageKey`, and `collapsedLabel` props from `WorkflowSelector`. Callers should stop passing these props; workflow selectors now always render expanded. -- fc33a42: Open the workflow editor on the selected board workflow when using the workflow-mode edit action. -- be7645f: Right-align the task-card promote action at the end of the card action row. -- 07a5365: Fix workflow/AI merge ntfy notification delivery by preserving merge-backed task metadata, treating an empty ntfy event allowlist as the documented default events, and allowing failed/no-provider notification attempts to retry after settings refresh. -- 6ec0e2b: Fix task changed-file counts for stacked or cherry-equivalent task branches by filtering active review diffs to commits attributed to the current task. -- 7c4e44d: Prevent QuickEntry quick-action buttons from stealing or restoring textarea focus on mouse down, preserving existing click behavior while avoiding unwanted mobile keyboard refocus. -- 576ff77: Stop failing task worktree acquisition and branch authority checks when a task branch contains foreign task-attributed commits. -- b7a56cc: Stop classifying benign workflow-graph exits after a task already advanced or paused as failures. These exits now use info-level benign wording while genuine in-progress graph failures keep the existing failure handling. -- 99661c1: Add an expand/collapse control for the workflow prompt editor so long prompts can be edited in a fullscreen overlay. -- 477c8f1: Tokenize bare hex colors in ScriptsModal and SettingsSyncLog CSS to use semantic custom properties. -- 4435ca2: Detect Codex model-auth-tier incompatibility as a model-selection error, trigger configured fallback models, and surface an actionable diagnostic when no fallback is available. -- d7e1454: Make the Nodes screen open as a full-screen mobile overlay so it covers the header while staying above the mobile nav. -- 1c69ea7: Fix CLI task retry behavior and plugin SDK runtime shims, and harden CLI tests against stale constructor mocks. -- de7b110: Fix the Nodes view tablet overlay so node cards and topology content no longer bleed through node detail modals. -- bbf3de9: Fix merger AI commit finalization so deleted tasks no longer crash settings resolution while the merge is completing. -- d9d67fb: Hide the compound engineering built-in workflow unless the `fusion-plugin-compound-engineering` plugin is installed. -- c9d48fb: Revalidate dashboard service-worker assets before falling back to cache so rebuilt tabs cannot stay on stale bundles and render a blank page. -- fa68edf: Fix the integrated dashboard terminal so Ctrl/Cmd+C copies selected terminal text without swallowing plain SIGINT behavior, and Ctrl/Cmd+V pastes clipboard text into the active session. -- e883a8d: Fix retry handling for stranded in-review tasks whose status is unset by allowing retry when execution is incomplete or a merge retry has already been attempted. -- 7a9d2b0: Suppress in-review stall and merge-stalled signals for tasks already owned by the merge queue. -- 0b0186a: Suppress legacy stalled-review badges and re-enqueue churn for tasks already owned by the merge queue. -- 5f5852d: Fix coding-agent startup and tool boundary checks from AI merge temp worktrees on macOS by comparing Git worktree paths with filesystem-canonical paths. -- 85c3420: Fix Fusion task tools from AI merge temp worktrees so merger agents can fetch task details without trying to bootstrap a nested project. -- 6f37806: Fix missing model rows in the Minimax provider usage panel. The primary `general` model meters quota purely via `current_interval_remaining_percent` (its count fields are `0`), so the previous count-based visibility filter dropped it entirely. - - Minimax usage now prefers the authoritative `*_remaining_percent` field (with a count-based fallback) and renders a window only when a model exposes any quota signal. Each model's separate weekly quota window (`current_weekly_remaining_percent`, `weekly_*` timing) is now surfaced as its own indicator alongside the interval window. - -- ad46881: Respect per-task auto-merge overrides when the global auto-merge setting is off. Tasks with auto-merge explicitly enabled now get enqueued for merge and covered by the in-review self-healing sweeps (stall surfacing, merged-task finalization, retry recovery) even when the project-level setting is disabled; tasks without an explicit override keep the PR-based/manual review flow untouched. -- 1c49ae6: Fix mobile quick-entry action buttons so nested icons and labels do not trigger browser touch gestures instead of toggling their controls. -- be0140c: Fix the bundled dependency graph plugin so the graph view fills the available dashboard width. -- aa8bd3d: Fix stuck task recovery by preserving retryable requeues, supervising verification subprocesses, and narrowing executor verification guidance to impacted work. -- b6243d6: Suppress transient dashboard fetch errors after tab resume so cached data remains visible and executor status shows a reconnecting state instead of raw network errors. -- c27c321: Fix mobile Quick Entry action buttons so taps rely on native browser click synthesis instead of a manual touchend click. -- 614bec2: Fix the vitest memory-pressure auto-kill firing on a garbage metric and killing innocent processes. The guard probed `os.availableMemory` (which does not exist) and silently fell back to `os.freemem()`, which on macOS reads ~99% used on an idle machine — so with the toggle on, every vitest process was SIGKILLed every 30 seconds regardless of real memory pressure. It now reads `process.availableMemory()` (Node 22+) and refuses to auto-kill when only the unreliable freemem fallback is available. Kill targeting is also fixed: `pgrep -f vitest` matches full command lines (wrapper shells, monitors, editors that merely mention vitest); the TUI auto-kill/manual kill and the dashboard `POST /api/kill-vitest` + system-stats count now filter matches to actual node processes via a shared `findVitestProcessIds` helper. -- e138971: Fix workflow board/list workflow selection, custom workflow task creation controls, workflow editor defaults, built-in workflow node prompt display, and executor handling for built-in workflow runs. -- 4b4c32d: Fix workflow scheduling so in-progress column limits are enforced from fresh task state after hold-advancing sweep dispatches. -- ff0750c: Fix the workflow graph editor opening invisibly and bundle the Compound Engineering and Roadmaps plugins. - - - The "Graph editor" button now actually shows the editor: its overlay was rendered without the `open` class, leaving it `display: none`, so opening it looked like the workflow steps view was just dismissed. - - `fusion-plugin-compound-engineering` and `fusion-plugin-roadmap` are now listed in the dashboard's built-in plugins, so they appear under Settings → Built-in Plugins (they were implemented and registered but missing from the list). - - Installing Compound Engineering (and CLI Printing Press) from Settings → Built-in Plugins no longer fails with "Plugin manifest not found": both ids are now in the dashboard's bundled-plugin fallback set, and the Compound Engineering plugin is staged into `dist/plugins/` so packaged installs can resolve it. - - Plugins installed from Settings now load instead of erroring with "Plugin entry must be a file, got directory": the dashboard install routes register the plugin's loadable entry file (`bundled.js`/`dist/index.js`/`src/index.ts`) rather than the package directory, and enabling a plugin heals legacy directory-path registrations in place. - -- 8f42098: Route task execution through workflow-native runtime primitives and make the built-in coding workflow explicitly own planning before execute/review/merge. -- a533307: Restore file-overlap blocking for workflow-column task releases so cards stay queued with overlap badges until active file-scope leases clear. -- 83565a5: Fix workflow-native dispatch capacity accounting and publish workflow node task metadata to the existing task fields used by scheduler and dashboard surfaces. -- cd8126d: Honor the worktree execution limit when workflow-column hold releases dispatch tasks. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [61d6874] -- Updated dependencies [f76716e] -- Updated dependencies [93e8bd9] -- Updated dependencies [26bc80a] -- Updated dependencies [fab8a62] -- Updated dependencies [2d81a95] -- Updated dependencies [40c0048] -- Updated dependencies [9c84ba2] -- Updated dependencies [489a287] -- Updated dependencies [934071c] -- Updated dependencies [d75f861] -- Updated dependencies [db971a9] -- Updated dependencies [30ba1f0] -- Updated dependencies [07dcb16] -- Updated dependencies [c1c99a9] -- Updated dependencies [f3b700a] -- Updated dependencies [d8248b4] -- Updated dependencies [ace7106] -- Updated dependencies [7a80d29] -- Updated dependencies [8bac390] -- Updated dependencies [10acf17] -- Updated dependencies [b9afce3] -- Updated dependencies [5872331] -- Updated dependencies [17c9303] -- Updated dependencies [243113a] -- Updated dependencies [e10db81] -- Updated dependencies [57631c7] -- Updated dependencies [3cf13dd] -- Updated dependencies [ee5f5e8] -- Updated dependencies [38b84a3] -- Updated dependencies [68e52e3] -- Updated dependencies [314411c] -- Updated dependencies [7d417a1] -- Updated dependencies [978d07c] -- Updated dependencies [c2604d5] -- Updated dependencies [a27921a] -- Updated dependencies [77a1099] -- Updated dependencies [944c03d] -- Updated dependencies [feceedb] -- Updated dependencies [e854d33] -- Updated dependencies [40b4919] -- Updated dependencies [641b932] -- Updated dependencies [e1a35a3] -- Updated dependencies [38e0422] -- Updated dependencies [245129e] -- Updated dependencies [c676cbe] -- Updated dependencies [2053f3f] -- Updated dependencies [1aef3c9] -- Updated dependencies [327f0a9] -- Updated dependencies [e9de195] -- Updated dependencies [eb425d1] -- Updated dependencies [9c29e2e] -- Updated dependencies [3373c0b] -- Updated dependencies [e16893a] -- Updated dependencies [130f6f1] -- Updated dependencies [b4230c0] -- Updated dependencies [0a418e6] -- Updated dependencies [8376781] -- Updated dependencies [e561290] -- Updated dependencies [d4db0b0] -- Updated dependencies [7d1708f] -- Updated dependencies [684baa0] -- Updated dependencies [e6ce500] -- Updated dependencies [c60dae1] -- Updated dependencies [f3732af] -- Updated dependencies [de23db3] -- Updated dependencies [7d20a99] -- Updated dependencies [48e08c0] -- Updated dependencies [a66b128] -- Updated dependencies [d9e1cdb] -- Updated dependencies [dab1569] -- Updated dependencies [30a09e3] -- Updated dependencies [abbeaec] -- Updated dependencies [577ce12] -- Updated dependencies [3b9ff42] -- Updated dependencies [cc18206] -- Updated dependencies [ac92174] -- Updated dependencies [cf23c6f] -- Updated dependencies [d72cb2a] -- Updated dependencies [e33dadd] -- Updated dependencies [3d18872] -- Updated dependencies [a1b7556] -- Updated dependencies [419f688] -- Updated dependencies [de3273e] -- Updated dependencies [6a00dd2] -- Updated dependencies [8aed4da] -- Updated dependencies [8891d4b] -- Updated dependencies [08d25f0] -- Updated dependencies [fa23782] -- Updated dependencies [e84410e] -- Updated dependencies [60eb2ec] -- Updated dependencies [f77aa07] -- Updated dependencies [4ffd0a2] -- Updated dependencies [13c6d96] -- Updated dependencies [8bc3d7b] -- Updated dependencies [a2f4bb1] -- Updated dependencies [fc33a42] -- Updated dependencies [6271778] -- Updated dependencies [be7645f] -- Updated dependencies [07a5365] -- Updated dependencies [6ec0e2b] -- Updated dependencies [7c4e44d] -- Updated dependencies [0b7549a] -- Updated dependencies [576ff77] -- Updated dependencies [b7a56cc] -- Updated dependencies [99661c1] -- Updated dependencies [477c8f1] -- Updated dependencies [4435ca2] -- Updated dependencies [1b7e52e] -- Updated dependencies [d7e1454] -- Updated dependencies [1c69ea7] -- Updated dependencies [de7b110] -- Updated dependencies [bbf3de9] -- Updated dependencies [d9d67fb] -- Updated dependencies [c9d48fb] -- Updated dependencies [b1454c1] -- Updated dependencies [f9e5513] -- Updated dependencies [34c8ac9] -- Updated dependencies [5c4c765] -- Updated dependencies [fa68edf] -- Updated dependencies [e883a8d] -- Updated dependencies [d071aec] -- Updated dependencies [9072d71] -- Updated dependencies [7a9d2b0] -- Updated dependencies [0b0186a] -- Updated dependencies [5f5852d] -- Updated dependencies [85c3420] -- Updated dependencies [6f37806] -- Updated dependencies [c1a7231] -- Updated dependencies [ad46881] -- Updated dependencies [fbc2c37] -- Updated dependencies [1c49ae6] -- Updated dependencies [bd5315f] -- Updated dependencies [d8a015e] -- Updated dependencies [be0140c] -- Updated dependencies [7076dd4] -- Updated dependencies [aa8bd3d] -- Updated dependencies [b6243d6] -- Updated dependencies [c27c321] -- Updated dependencies [614bec2] -- Updated dependencies [e138971] -- Updated dependencies [4b4c32d] -- Updated dependencies [4fa5407] -- Updated dependencies [60605fa] -- Updated dependencies [71822f2] -- Updated dependencies [ff0750c] -- Updated dependencies [a504238] -- Updated dependencies [61ae1bf] -- Updated dependencies [8f42098] -- Updated dependencies [a533307] -- Updated dependencies [83565a5] -- Updated dependencies [e2707af] -- Updated dependencies [cd8126d] - - @runfusion/fusion@0.40.0 - -## 0.39.0 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion-plugin-examples/cli-printing-press@0.1.17 -- @fusion-plugin-examples/cursor-runtime@0.1.19 -- @fusion-plugin-examples/dependency-graph@0.1.31 -- @fusion-plugin-examples/droid-runtime@0.1.26 -- @fusion-plugin-examples/hermes-runtime@0.2.50 -- @fusion-plugin-examples/openclaw-runtime@0.2.50 -- @fusion-plugin-examples/paperclip-runtime@0.2.50 -- @fusion-plugin-examples/roadmap@0.1.19 -- @fusion/core@0.39.0 -- @fusion/engine@0.39.0 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/dashboard@0.39.0 -- @fusion/core@0.39.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.39.0 -- @fusion/pi-claude-cli@0.39.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- 3d22a98: Fix Windows binary-release build failure: add the DOM lib to `@fusion/plugin-sdk`'s tsconfig. Because `@fusion/core` exports its types as raw `src/*.ts`, plugin-sdk recompiles core's source under its own compiler options; without the DOM lib the global fetch `Response` type (`.ok`/`.status`/`.json`) resolved inconsistently across platforms and broke the Windows CLI and desktop release jobs (TS2339). - - @fusion/core@0.39.0 - -### @runfusion/fusion - -#### Minor Changes - -- 3b59487: Add a new `fn_mission_update` extension tool to patch mission `title`/`description` without recreating missions, and classify it as a mission mutation tool in readonly/permanent gating policy. -- 194dfa9: Add a run-audit cited-goal trail for goal anchoring flows. - - - Enrich `goal:injection-applied`, `goal:injection-skipped`, and `goal:retrieval-invoked` events with `metadata.goalIds` (IDs/counts only). - - Add core aggregation helper `collectCitedGoalIdsFromAudit(...)` to derive injected/retrieved/combined cited goal IDs from run-audit events. - - Add dashboard API endpoint `GET /api/agents/:id/runs/:runId/cited-goals` to query cited goal IDs for a run. - -- 3d22a98: Add the Workflow IR v1 contract surface via `@fusion/core`, including versioned graph types (`WorkflowIr`), runtime parsing/validation (`parseWorkflowIr`), serialization (`serializeWorkflowIr`), and a canonical built-in fixture (`BUILTIN_WORKFLOW_IR_FIXTURE`) for interpreter parity testing. -- 0ffe7f0: Add mission delete tooling for agents: `fn_feature_delete`, `fn_slice_delete`, and `fn_milestone_delete`. - - Mission feature/slice/milestone deletes now enforce a linked live-task guard by default and return clear conflict errors. Callers can pass `force: true` to clear mission linkage and proceed with hard deletion. - -- acad46c: Expose mission assertion backfill through operator-facing surfaces. - - - Added dashboard API route `POST /api/missions/:missionId/backfill-assertions` with dry-run default and `MissionAssertionBackfillReport` response. - - Added agent/CLI tool `fn_mission_backfill_assertions` for dry-run/apply remediation of FN-5696 legacy zero-assertion features. - - Updated mission operator docs and synced fusion skill/tool reference docs. - -- 1edbb54: Add a flagged-off Workflow Graph Executor scaffold and built-in coding lifecycle Workflow IR exports. - - - Adds `BUILTIN_CODING_WORKFLOW_IR` and `buildBuiltinCodingWorkflowIr` to `@fusion/core`. - - Adds `WorkflowGraphExecutor` and `WORKFLOW_GRAPH_EXECUTOR_FLAG` to `@fusion/engine`. - - Adds parity-harness skeleton tests and IR documentation updates. - - The new executor path is gated by `experimentalFeatures.workflowGraphExecutor` and remains strict no-op while disabled (default). - -- ba81d1f: Add workflow graph interpreter node handlers and traversal semantics behind the default-off `workflowGraphExecutor` experimental flag. The interpreter now supports prompt/script/gate dispatch through legacy seam DI, edge-condition routing (`success`/`failure`/`outcome:`), bounded retries, and parity-oriented tests for no-op flag behavior and lifecycle routing. -- 5b4eecb: Add workflow interpreter dual-observe parity instrumentation surfaces for phased rollout. - - - Export pure workflow parity comparison helpers from `@fusion/core` (`compareWorkflowRunObservations`, `compareWorkflowRunAudits`) with structured drift reports. - - Add `observeWorkflowParity` in the engine as a default-OFF, fail-soft observer gated by `experimentalFeatures.workflowInterpreterDualObserve`. - - Emit run-audit parity events (`workflow:parity-observed`, `workflow:parity-drift`) for shadow agreement/drift visibility without changing authoritative legacy execution. - -- 0c42578: Wire branch-group-aware merge routing into the merge path. Tasks marked with `branchContext.assignmentMode = "shared"` now merge onto their group's integration branch (`branch_groups.branchName`) in both direct merge and PR-mode base-branch resolution, while ungrouped and `per-task-derived` tasks keep existing default-branch behavior. - - This release also adds reliability backstop coverage for grouped vs ungrouped routing and branch-group merge audit telemetry (`merge:branch-group-routed`). - -- 06d8490: feat(FN-5783): enforce branch-group autoMerge precedence for grouped promotion gating and audit visibility -- e2101ea: Add single group-level pull request behavior for shared `branch_groups` in PR merge mode. - - When tasks share a `branchContext.groupId`, Fusion now opens and tracks one PR for the group's integration branch instead of creating one PR per task. The group PR metadata is written back to `branch_groups` and refreshed from merge-status polling. - -- 7b70e7f: Add a branch-group promotion eligibility hook to the engine merge lifecycle via `evaluateBranchGroupPromotion`, and emit `merge:branch-group-promotion-gated` audit telemetry whenever shared-group member landings are evaluated for downstream group→default promotion readiness. -- 5930c18: Add a new opt-in `task-created` notification event for ntfy/webhook providers. - - - `task-created` fires when a task is created by an agent (`sourceAgentId` present), including agent-issued `fn_task_create` calls. - - Event is off by default and must be explicitly enabled in Settings → Notifications (`ntfyEvents` / provider `events`). - - ntfy formatting includes agent attribution and task deep-linking to the created task. - -- b1c1a33: Add safe `fn task deps` commands for audited task dependency mutations. - -#### Patch Changes - -- 62bc1e4: Removed the `showGitHubStarButton` setting and its Project General toggle from Settings. - - The Settings header "Star on GitHub" button remains available (always shown) while the dedicated visibility setting is no longer configurable. - -- a7347ad: Skip self-owned branch reclaim for dependency-blocked todo tasks so repaired queued work is not repeatedly resumed before its blocker clears. -- 6ba3cbf: Respect dashboard task-list column filters so API callers receive only tasks in the requested persisted column. -- 3dee395: Block AI merge finalization when the checked-out integration worktree is dirty instead of stashing local changes into the merge landing path by default, with an explicit Merge settings UI escape hatch for the legacy dirty-checkout sync behavior. -- 716f396: Fix room chat send reliability by preventing concurrent in-flight room dispatches, classifying ambiguous delivered sends as delivered (so composer text is not restored), and hardening optimistic/SSE reconciliation to avoid duplicate user message rendering. -- 4148f43: Fix the Binary Release workflow so platform binaries publish to GitHub Releases again: - - - The release job now tolerates a single failing build leg instead of being skipped, which previously suppressed all assets. - - The node_modules cache key includes CPU arch (so arm64 runners no longer restore x64 native deps, fixing the `@rollup/rollup-linux-arm64-gnu` build crash) and the job id (so same-OS/arch jobs don't race on one key and fail the post-job cache save). - - The macOS and Windows CLI signing steps are skipped gracefully when their certificate secrets are absent, so unsigned binaries still publish. - - Desktop packaging now invokes `electron-builder` directly via `pnpm exec` instead of the `dist:*` scripts: pnpm leaked the `--` separator into script args, which made electron-builder ignore `--publish never` (auto-publishing to the wrong repo and 404ing) and drop the Linux `--x64 --arm64` flags. - - The desktop build spawns workspace `.cmd` bins with a shell on Windows, fixing the `spawn EINVAL` failure. - - The desktop package declares an `author` with email so the Linux `.deb` target (fpm) can build. - - The Linux AppImage verify step matches electron-builder's actual x64 output name (`-linux-x86_64.AppImage`). - - `@types/node` is pinned workspace-wide via a pnpm override so the desktop/plugin-sdk build is deterministic (a stale transitive `@types/node` lacking global `fetch`/`Response` types intermittently broke the Windows desktop build). - - The `build-exe-cross` tests that cross-compile platform binaries are now opt-in (`FUSION_TEST_BUILD_EXE=1`) instead of auto-running on every CI run; native per-platform binary builds remain covered by `test-release.yml`. - - A workflow_dispatch run now builds and uploads binaries as artifacts for validation without creating a release (release creation is gated to tag pushes). - - The dependency-graph plugin build uses a cross-platform copy step that no longer breaks the Windows desktop build. - - The macOS Intel (`bun-darwin-x64`) CLI binary is no longer built/shipped — `macos-13` runners are too scarce to build reliably and were blocking releases. The macOS CLI is now Apple-Silicon-only; the desktop macOS DMG/ZIP remains universal. - -- f8bda56: Fix scheduler overlap starvation for coordination-only tasks by allowing no-commit/coordination scopes to bypass active file-scope leases when overlaps are limited to safe read-only paths. Implementation tasks with real write-scope overlaps remain serialized behind active leases. -- 033f74c: Improve `fn_feature_link_task` error handling when linking to tasks that are not on the active board. Instead of surfacing a raw SQLite foreign key failure, the tool now returns a clear validation error explaining that only active (non-archived, non-deleted) tasks can be linked to mission features. -- 3255965: Fix mission assertion-validation trigger gaps so mission-linked tasks reaching done no longer bypass validator execution. - - Assertion-linked features now stay completion-gated until validator pass, and startup recovery replays implementing features whose linked tasks are already done/archived but still lack a passing validator status. - -- 1594470: Fix mission loop no-assertions auto-pass handling so completion deterministically advances feature `loopState` to `passed`, sets `lastValidatorStatus` to `passed`, and emits the structured `validation_auto_passed_no_assertions` audit event exactly once. -- 9c4e8ed: Realize the mission completion-gate contract for live Goals mission workflows. - - - Fix mission execution auto-pass behavior so zero-assertion features move to `loopState: "passed"` (not stuck in `implementing`) and emit `feature_auto_passed_no_assertions` telemetry while preserving `validation:passed` emission. - - Add milestone guard signaling for prose acceptance criteria with zero structured assertions via `hasProseButNoAssertions` rollup and warning event `milestone_missing_structured_assertions`. - - Add an idempotent `seedContractAssertionsForFeatures(...)` helper for operator-run assertion persistence and coverage tests. - - Reconcile MissionManager labels/copy to clearly separate enforced contract assertions from informational feature acceptance criteria, including warning badge and indicators. - -- 20c1c32: Persist merge-request handoff shadow contract and accepted marker for Phase 1 reliability scaffolding. -- bb0f693: Fixes a dashboard regression where toggling the in-review Auto-merge switch could leave the UI in a broken/blank state until refresh. Auto-merge toggle state updates now remain consistent during rapid toggles, and regression coverage was added for the settings hook path. -- 292bf07: Fix merger agent-log visibility by flushing buffered `AgentLogger` output before disposing AI sessions used for autostash conflict resolution, autostash hard-fail recovery, and rebase conflict resolution. This ensures trailing text/thinking deltas are persisted so merger activity reliably appears in the task agent log panel. -- 5396730: Harden mission validation end-to-end by locking the canonical zero-assertion auto-pass path, strengthening assertion pass/fail regression coverage, and wiring bounded periodic mission recovery into existing self-healing maintenance so stranded implementing features recover without engine restart. -- b154844: Fixes an executor worktree self-heal gap where `task.worktree` could be recorded as a nested subdirectory of a valid git worktree root. - - When a nested path is detected under a registered worktree inside the configured worktrees directory, Fusion now re-anchors `task.worktree` to the actual git top-level and continues execution. Genuine mismatches (repo root, outside configured worktrees dir, or unregistered top-level) still fail with existing `wrong_toplevel` and liveness guard behavior. - -- 93e8a5f: Persist AI merge agent text, thinking, and tool output to task agent logs in AI merger mode. -- 9f29935: Throttle `oauth-token-expired` notifications to at most once per provider every 12 hours, even when the credential `expires` timestamp changes across refreshes/replacements. -- 793da2c: Refinement tasks now inherit the source task’s GitHub tracking state, preventing auto-created tracking issues when the source task was not GitHub-linked. -- 2140ab2: Repair dropped spaces after sentence-ending punctuation in streamed agent responses (chat and agent logs) across all providers by applying the streaming-delta sentence-boundary fix at the shared engine delta chokepoints, not just the per-provider CLI bridges. -- ffadb0c: Fix GitHub tracking reconciliation for soft-deleted and archived tasks by adding a periodic 15-minute sweep, paginating archive/deleted candidate scans, and correcting done-task filtering to use the task column. -- fa428a4: Run the configured `worktreeInitCommand` when the merger has to create a fresh merge worktree during reuse-worktree reacquisition. This bootstraps newly created merge workspaces before merge verification/workflow steps run, while leaving pooled/reused existing worktrees unchanged. -- ab38ee0: Requeue incomplete stuck-loop exhausted tasks in todo with progress preserved instead of routing them through review/merge or requiring manual unpause. -- c6b3b77: Treat foreign-attributed commits reachable from origin/main as already integrated during branch contamination checks to avoid false-positive recovery loops when local main is stale. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [62bc1e4] -- Updated dependencies [a7347ad] -- Updated dependencies [6ba3cbf] -- Updated dependencies [3dee395] -- Updated dependencies [716f396] -- Updated dependencies [4148f43] -- Updated dependencies [f8bda56] -- Updated dependencies [3b59487] -- Updated dependencies [033f74c] -- Updated dependencies [3255965] -- Updated dependencies [1594470] -- Updated dependencies [9c4e8ed] -- Updated dependencies [20c1c32] -- Updated dependencies [bb0f693] -- Updated dependencies [292bf07] -- Updated dependencies [5396730] -- Updated dependencies [194dfa9] -- Updated dependencies [3d22a98] -- Updated dependencies [0ffe7f0] -- Updated dependencies [acad46c] -- Updated dependencies [1edbb54] -- Updated dependencies [ba81d1f] -- Updated dependencies [5b4eecb] -- Updated dependencies [b154844] -- Updated dependencies [93e8a5f] -- Updated dependencies [9f29935] -- Updated dependencies [793da2c] -- Updated dependencies [0c42578] -- Updated dependencies [06d8490] -- Updated dependencies [e2101ea] -- Updated dependencies [7b70e7f] -- Updated dependencies [2140ab2] -- Updated dependencies [ffadb0c] -- Updated dependencies [fa428a4] -- Updated dependencies [5930c18] -- Updated dependencies [ab38ee0] -- Updated dependencies [c6b3b77] -- Updated dependencies [b1c1a33] - - @runfusion/fusion@0.39.0 - -## 0.38.1 - -### @fusion/dashboard - -#### Patch Changes - -- bad8f52: Improve the mission manager mobile stacked layout so mission rows reflow cleanly: stacked mission list items switch to a column layout with stretched content, item actions become full-width and wrap instead of cramped inline controls, and run controls span the full width. - - @fusion-plugin-examples/cli-printing-press@0.1.16 - - @fusion-plugin-examples/dependency-graph@0.1.30 - - @fusion-plugin-examples/roadmap@0.1.18 - - @fusion/core@0.38.1 - - @fusion/engine@0.38.1 - - @fusion-plugin-examples/cursor-runtime@0.1.18 - - @fusion-plugin-examples/droid-runtime@0.1.25 - - @fusion-plugin-examples/hermes-runtime@0.2.49 - - @fusion-plugin-examples/openclaw-runtime@0.2.49 - - @fusion-plugin-examples/paperclip-runtime@0.2.49 - -### @fusion/desktop - -#### Patch Changes - -- Updated dependencies [bad8f52] - - @fusion/dashboard@0.38.1 - - @fusion/core@0.38.1 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.38.1 -- @fusion/pi-claude-cli@0.38.1 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.38.1 - -### @runfusion/fusion - -#### Patch Changes - -- bad8f52: Fix the Binary Release workflow so platform binaries publish to GitHub Releases again. The release job now tolerates a single failing build leg instead of being skipped (which previously suppressed all assets), the node_modules cache key includes CPU arch to stop arm64 runners restoring x64 native deps, the macOS CLI signing step is skipped gracefully when Apple certs are absent, and the dependency-graph plugin build uses a cross-platform copy step that no longer breaks the Windows desktop build. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [bad8f52] - - @runfusion/fusion@0.38.1 - -## 0.38.0 - -### @fusion/dashboard - -#### Patch Changes - -- Updated dependencies [9112b7d] - - @fusion/engine@0.38.0 - - @fusion-plugin-examples/cli-printing-press@0.1.15 - - @fusion-plugin-examples/dependency-graph@0.1.29 - - @fusion-plugin-examples/roadmap@0.1.17 - - @fusion/core@0.38.0 - - @fusion-plugin-examples/cursor-runtime@0.1.17 - - @fusion-plugin-examples/droid-runtime@0.1.24 - - @fusion-plugin-examples/hermes-runtime@0.2.48 - - @fusion-plugin-examples/openclaw-runtime@0.2.48 - - @fusion-plugin-examples/paperclip-runtime@0.2.48 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/dashboard@0.38.0 -- @fusion/core@0.38.0 - -### @fusion/engine - -#### Patch Changes - -- 9112b7d: Fix scheduler overlap deferral starvation by considering only runnable queued todo tasks as higher-priority overlap competitors. Dependency-blocked queued tasks now keep their unmet-dependency queue state without reserving overlapping files from ready work, while active in-progress and eligible in-review tasks continue to hold explicit file-scope leases. Dispatch logs now distinguish unmet dependencies, active file-scope lease blocking, and higher-priority runnable queued-task deferral. - - @fusion/core@0.38.0 - - @fusion/pi-claude-cli@0.38.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.38.0 - -### @runfusion/fusion - -#### Minor Changes - -- afc3b47: Adds goal-anchoring run-audit observability for Slice 2 hybrid anchoring with three `database` mutation types: `goal:injection-applied`, `goal:injection-skipped`, and `goal:retrieval-invoked`. - - Events carry count-only metadata contracts (`count`, plus `lane` for injection and `toolName` for retrieval, with optional `truncated`/`reason`/`notFound`) and avoid prompt bodies or goal title/description payloads. These events are available through the existing `GET /api/agents/:id/runs/:runId/audit` timeline route with standard date-range filtering via `startTime`/`endTime`. - -- 71e2aec: Add a goal-citation audit trail to support Slice 2 anchoring success-signal measurement. - - - Introduce a persisted `goal_citations` table (schema v93) with deduplication on `(goalId, surface, sourceRef)`. - - Record citations from `agent_log` and `task_document` write seams. - - Extract goal IDs using `GOAL_ID_PATTERN` (`/\bG-[0-9A-Z]+(?:-[0-9A-Z]+)*\b/g`) and store bounded snippets (max 200 chars). - - Add `fn goals citations` with filters: `--goal`, `--agent`, `--surface`, `--since`, `--until`, `--limit`, and `--json`. - -- 4fee2c1: Add a branch-strategy dropdown to the New Task dialog with project-default, auto-new, existing, and custom-new modes. - - New tasks now submit `branchSelection`, and `auto-new` derives a persisted branch name using `fusion/{task-id}-{short-name}`. - -- 0605d13: Add mission-level branch strategy defaults so missions can persist whether triaged tasks should use project default branching, a shared existing/custom branch, or per-task derived branches. - - Mission create/edit flows now save both `baseBranch` and `branchStrategy`, and mission triage handlers apply that stored strategy by default (including autopilot triage when no explicit branch options are supplied). - - Also fix planning breakdown task creation to forward the selected branch options so multi-task planning respects the same branch selection used by single-task planning. - -- 7221413: Add per-mission/planning branch-group data-model foundations in `@fusion/core`. - - - Introduce durable `branch_groups` storage with source linkage (`mission`/`planning`), branch metadata, PR state, status, and auto-merge override. - - Add `TaskStore` branch-group APIs: create/get/getBySource/list/update/setTaskBranchGroup. - - Persist `Task.autoMerge` and `Mission.autoMerge` as optional overrides. - - Reuse `Task.branchContext.groupId` for task↔group linkage (no separate `branchGroupId` column). - - Bump project schema version to `94` with migration coverage and schema assertions. - -#### Patch Changes - -- 53d97e2: Clarify no-task heartbeat prompts when eligible Todo tasks exist but role policy filters them out of auto-claim candidates. -- dbb0804: Fix per-task diff view incorrectly including a task's base commit when a done task lands as a no-op or its resolved merge SHA equals `baseCommitSha`. -- 668e3a5: Mission creation now always returns a stopped mission. `POST /api/missions` and the mission store ignore create-time `autopilotEnabled` input, forcing new missions to `status: "planning"` with autopilot disabled and inactive. - - Autopilot remains a post-creation action via explicit mission start/update flows. - -- a014c6d: Auto-merge now treats transient provider/network failures during merge (for example "This operation was aborted", "socket hang up", and provider `server_error` payloads) as bounded retryable errors instead of immediate terminal failures. The engine re-enqueues affected in-review merges with exponential backoff for both direct and pull-request merge strategies, then parks the task as failed with explicit transient-retry exhaustion logs once the retry cap is reached. -- d5b3336: Dashboard: OAuth re-login banner now clears a provider immediately after successful OAuth re-authentication, instead of waiting for the next auth-status polling interval. -- 0044c23: Fix dashboard OAuth login for `github-copilot` when upstream auth storage invokes device-code callbacks. The `/api/auth/login` route now provides the expected callback wiring and preserves `deviceCode: { userCode, verificationUri }` in responses so Copilot login no longer crashes with `options.onDeviceCode is not a function`. -- 4a60c2a: Backfill done-task "N files changed" chips when mergeDetails enrichment arrives after the initial done websocket snapshot. Task cards now pass a done-mode merge enrichment signature into diff-stats invalidation so `/api/tasks/:id/diff` is re-fetched and authoritative lineage stats render without requiring a manual refresh. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [53d97e2] -- Updated dependencies [afc3b47] -- Updated dependencies [71e2aec] -- Updated dependencies [dbb0804] -- Updated dependencies [4fee2c1] -- Updated dependencies [0605d13] -- Updated dependencies [668e3a5] -- Updated dependencies [a014c6d] -- Updated dependencies [d5b3336] -- Updated dependencies [0044c23] -- Updated dependencies [4a60c2a] -- Updated dependencies [7221413] - - @runfusion/fusion@0.38.0 - -## 0.37.0 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.37.0 -- @fusion/engine@0.37.0 -- @fusion-plugin-examples/cli-printing-press@0.1.14 -- @fusion-plugin-examples/dependency-graph@0.1.28 -- @fusion-plugin-examples/roadmap@0.1.16 -- @fusion-plugin-examples/cursor-runtime@0.1.16 -- @fusion-plugin-examples/droid-runtime@0.1.23 -- @fusion-plugin-examples/hermes-runtime@0.2.47 -- @fusion-plugin-examples/openclaw-runtime@0.2.47 -- @fusion-plugin-examples/paperclip-runtime@0.2.47 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.37.0 -- @fusion/dashboard@0.37.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.37.0 -- @fusion/pi-claude-cli@0.37.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.37.0 - -### @runfusion/fusion - -#### Minor Changes - -- b335f3d: Add a new `fn_goal_show` tool for goal retrieval by ID, including structured JSON output via `details.goal` and a stable not-found contract (`GOAL_NOT_FOUND`). - - Also register `fn_goal_list` and `fn_goal_show` in the engine readonly tool allowlist so agent runtime sessions can use goal retrieval on the readonly path. - -#### Patch Changes - -- 230efa1: Update `useAiMergeCommitSummary` docs/JSDoc to match the intended default of `true`, including that merge commit summaries include a subject plus body summary (narrative + bullets + diff-stat). - - Also fixes AI merge-mode prompt guidance so AI-authored squash commits include a summarized body instead of subject-only commit messages. - -- b5f2f91: Do not mark executor sessions as failed when they are parked for pending code review. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [230efa1] -- Updated dependencies [b335f3d] -- Updated dependencies [b5f2f91] - - @runfusion/fusion@0.37.0 - -## 0.36.0 - -### @fusion/dashboard - -#### Patch Changes - -- @fusion/core@0.36.0 -- @fusion/engine@0.36.0 -- @fusion-plugin-examples/cli-printing-press@0.1.13 -- @fusion-plugin-examples/dependency-graph@0.1.27 -- @fusion-plugin-examples/roadmap@0.1.15 -- @fusion-plugin-examples/cursor-runtime@0.1.15 -- @fusion-plugin-examples/droid-runtime@0.1.22 -- @fusion-plugin-examples/hermes-runtime@0.2.46 -- @fusion-plugin-examples/openclaw-runtime@0.2.46 -- @fusion-plugin-examples/paperclip-runtime@0.2.46 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/core@0.36.0 -- @fusion/dashboard@0.36.0 - -### @fusion/engine - -#### Patch Changes - -- @fusion/core@0.36.0 -- @fusion/pi-claude-cli@0.36.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.36.0 - -### @runfusion/fusion - -#### Minor Changes - -- 2a35358: Add Goals REST API (`/api/goals`) with list/create/update/archive/unarchive endpoints. - Creating a 6th active goal or unarchiving when already at 5 active now returns HTTP 409 with `ACTIVE_GOAL_LIMIT_EXCEEDED` details. -- 009d569: Add `fn goals` CLI subcommand (`list` / `create` / `archive`) and pi extension tools (`fn_goal_list`, `fn_goal_create`, `fn_goal_archive`) for Slice 1 of the Goals primitive. Author-facing only — no agent anchoring yet. - -#### Patch Changes - -- f258a75: Fix ntfy JSON publish notifications to encode `priority` as the integer scale expected by ntfy so unicode mailbox/room notifications deliver successfully. -- 2c4683a: Widen task detail modal on tablet viewports to use more of the 769px–1024px viewport. -- e84673c: Close source-imported GitHub issues when their linked Fusion task is deleted, with parity to tracking-issue delete handling. Dashboard delete confirmation now prompts for `close`, `delete`, or `leave` on source-imported issues and forwards `githubIssueAction` through task deletion flows. For API callers that omit `githubIssueAction` (or send `auto`) on source-imported issue deletes, Fusion now defaults to `close`. -- 200dda9: Suppress a misleading transient failure state when a worktree-local `.fusion/tasks//task.json` read briefly returns ENOENT during executor session startup. Fusion now treats this as recoverable, routes through existing auto-recovery, and avoids persisting `status: "failed"`/`error` so the red task-card error banner and failed notification are not shown for self-healed runs. -- 6b27ab5: fix(FN-5627): default auto-prerebase to fire when branch is >=1 commit behind integration - - `decideAutoPrerebase()` previously defaulted `prerebaseDivergenceThreshold` to `0`, which meant the threshold path **never fired** unless the user explicitly set a positive value. Only hot-file matches could trigger prerebase. - - The result: tasks whose branch was started against an older main tip (because other tasks landed concurrently) would skip prerebase, build their squash commit against the stale base, and then fail at the `git update-ref` step because the squash commit didn't descend from current main. The merger correctly detected this as a non-fast-forward advance and threw `IntegrationBranchConcurrentAdvanceError` — with both "expected" and "observed" SHAs set to the current main tip (because `observedCurrentSha` was captured from the pre-update rev-parse). This produced the misleading "expected X, observed X" same-SHA error signature that stranded FN-5632 stuck at `mergeRetries=3`. - - New default: `prerebaseDivergenceThreshold = 1`. Any branch behind by at least 1 commit auto-rebases before squash. Users who want the legacy never-fire behavior can explicitly set `prerebaseDivergenceThreshold = 0`. Threshold comparison also changed from `>` to `>=` so an explicit threshold of N rebases at N+ commits behind instead of N+1+. - - The self-healing classifier comment for `spurious-concurrent-advance-same-sha` is updated to reflect that the signature can come from either the pre-FN-5627 misclassification OR the legitimate post-FN-5627 non-fast-forward path; the auto-recovery sweep is unchanged because both cases self-heal cleanly once prerebase fires on the retry. - - Tests: - - - Default threshold (undefined) fires at 1 commit behind - - Explicit threshold = 0 stays as opt-out (never fire on commit-count) - - Default threshold doesn't fire when branch is up-to-date (commitsBehind=0) - -- b2d547e: fix(FN-5627): close TOCTOU window between merger optimistic `mergeConfirmed: true` write and integration ref advance, add reachability gate on auto-merge fast-path - - The merger previously persisted `mergeConfirmed: true` + `commitSha` to the task row as soon as the local squash commit was built, **before** running `git update-ref refs/heads/` to actually advance the integration branch. If the ref-advance then failed for any reason (lock contention, hook rejection, packed-refs race, or a misclassified non-CAS error via the `merger-ref-update-advance.ts` string heuristic), the task row was poisoned: the auto-merge scheduler's `mergeConfirmed` fast-path would silently promote the never-landed work to `done` on the next tick, including emitting `task:merged` and closing the GitHub tracking issue. - - This affected at least 9 tasks across 2026-05-27/28 (FN-5596, FN-5597, FN-5599, FN-5612, FN-5613, FN-5614, FN-5616, FN-5623, FN-5625) — the merger silently dropped real work and marked the tasks complete. - - The fix has three layers: - - 1. **merger.ts** — In `reuseTaskWorktreeMerge` mode, persist `mergeConfirmed: false` initially. Promote to `true` only after `advanceIntegrationBranchRef` returns `advanced: true`. Other merge paths (legacy in-place merge, verified no-op fast-paths, owned-commit recovery) are unchanged because they advance the ref before this point. - - 2. **project-engine.ts** — Defense-in-depth reachability gate on the auto-merge "merge already confirmed" fast-path. Before `moveTask(taskId, "done")`, verify `git merge-base --is-ancestor ` succeeds. On failure, clear `mergeConfirmed`, mark task `status: "failed"`, leave in `in-review`, and emit `merger:fast-path-blocked-foreign-commit` run-audit event. Legitimate no-op merges (no `commitSha`) bypass the gate. - - 3. **merger-ref-update-advance.ts** — Replace the fragile string heuristic that classified update-ref failures as `concurrent-advance` (matching `"is at"` / `"expected"` / `"cannot lock ref"` in error text) with structured detection. After update-ref fails, re-read the ref: if observed equals expected, classify as `ref-update-refused` (no actual race occurred). Eliminates the misleading "expected X observed X" same-SHA log signature seen on FN-5625. - -- 694970b: fix(FN-5627): always rebase behind branches before squash regardless of user-configured prerebase threshold - - After the FN-5627 default-threshold fix landed (threshold=1 default), tasks were still getting stuck at `mergeRetries=3` with `Integration branch main advanced concurrently (expected X, observed X)` errors because user projects with explicit `prerebaseDivergenceThreshold` values higher than the branch's commits-behind count still skipped prerebase entirely. - - Example: a project with `prerebaseDivergenceThreshold: 50` for low-noise PR experience would skip prerebase on a task branched 4 commits behind main. The squash commit then doesn't descend from current main, and `git update-ref` correctly refuses the non-fast-forward advance — producing the misleading same-SHA error signature that stranded FN-5626, FN-5628, FN-5633. - - Root distinction missed in the earlier fix: the user-configurable `prerebaseDivergenceThreshold` controls the _user-visible severity reporting_ ("this branch is N commits behind"), while engine correctness requires a _safety invariant_ ("any branch behind main MUST be rebased before squash, or update-ref will fail"). These are independent concerns. - - New behavior: - - - After the hot-file and threshold checks, `decideAutoPrerebase()` now returns `fire: true` with `reason: "safety-fallback-any-divergence"` whenever `commitsBehind > 0`. - - The threshold-based path still wins when tripped (so user-visible audit `reason` reflects the configured policy when applicable). - - Full opt-out remains `prerebaseAutoEnabled: false` — that case skips the safety fallback too, and the user accepts that behind-branch merges will fail. - - `prerebaseDivergenceThreshold: 0` is no longer a complete opt-out from the commit-count gate — it only suppresses the threshold-based reason label. Safety fallback still fires. - - Tests: - - - New `safety-fallback-any-divergence` reason added to `AutoPrerebaseDecision.reason` union. - - 4 commits behind with threshold=50 → fires via safety fallback (was: skipped). - - `prerebaseAutoEnabled=false` → no fire (full opt-out preserved). - - Configured threshold tripping still wins the `reason` label. - - Branch fully up-to-date (commitsBehind=0) → no-divergence (unchanged). - -- 5768d5e: feat(FN-5627): self-heal transient merge failures stuck at mergeRetries=3 - - After the FN-5627 merger fix landed, two in-review tasks (FN-5628, FN-5632) remained stuck at `mergeRetries=3` with `status='failed'` due to transient merge errors that the merger correctly identified but had no auto-recovery for: - - - `lease-handoff-failed: target-not-queued` — FN-5353 class race where the merge queue lease acquisition saw the task drop out of the queue between enqueue and handoff (typically due to a self-healing sweep cleaning stale `mergeQueue` rows mid-flight). - - Legacy same-SHA spurious concurrent-advance errors persisted before FN-5627's `merger-ref-update-advance.ts` classifier fix landed. - - These tasks had no path forward except manual intervention. The `AUTO_MERGE_COOLDOWN_MS` cooldown reset takes hours and gives up too easily. - - This change adds `SelfHealingManager.recoverTransientMergeFailures()`, wired into both startup recovery and the periodic Batch 2 maintenance loop. For each in-review task with `mergeRetries >= MAX_AUTO_MERGE_RETRIES`, `status='failed'`, and an `error` matching `classifyTransientMergeError()`: - - 1. Reset `mergeRetries=0`, clear `status`/`error`. - 2. Increment `mergeDetails.transientRecoveryCount` (new field on `MergeDetails`). - 3. Re-enqueue via `requeueForAutoMerge`. - 4. Emit `merger:transient-failure-auto-recovered` run-audit event. - - Bounded by `MAX_TRANSIENT_MERGE_RECOVERIES = 2` to avoid infinite loops on genuinely stuck tasks. Once exhausted, the task stays parked as failed and emits `merger:transient-failure-budget-exhausted` once with a `[transient-recovery-budget-exhausted]` marker on `error` for repeat-suppression. - - Non-transient failure classes (verification, build, real conflicts, etc.) are not eligible — only the pattern-matched transient classes auto-recover. No-op when `autoMerge=false`, no `requeueForAutoMerge` callback wired, or pause is active. - - Tests: - - - Lease-handoff transient recovery path - - Same-SHA spurious-advance recovery (legacy pre-FN-5627) - - Genuine concurrent-advance (different SHAs) NOT recovered - - Non-transient failures (verification errors) NOT recovered - - Budget exhaustion behavior - - autoMerge=false no-op - -- e75c4da: fix(FN-5627): suppress ntfy notifications for transient merge failures the engine auto-recovers - - Even with the FN-5627 merger TOCTOU fix + transient-failure self-healing sweep + safety-fallback auto-prerebase landed, the merger can still hit transient failure classes (lease handoff races, brief same-SHA non-FF advances) for tasks whose branches are particularly out-of-sync. The self-healing sweep auto-recovers them within bounded budget — but each individual failure cycle was firing a ntfy alarm before the recovery cleared the failed state, producing user-facing alarm spam for tasks that were never actually stuck. - - Two layers of fix: - - 1. `NotificationService.handleTaskUpdated` now classifies `task.error` via the new shared `classifyTransientMergeError` helper before scheduling the deferred failure notification. Transient classes (`lease-handoff-target-not-queued`, `spurious-concurrent-advance-same-sha`) get logged as suppressed and never schedule a ntfy timer. - - 2. Defense-in-depth: `fireDeferredFailureNotification` re-classifies the error at dispatch time, so a failure scheduled before the suppression landed on a newer cycle still suppresses if the error matches a transient class. - - The classifier itself moved from `self-healing.ts` to a new logger-free `transient-merge-error-classifier.ts` module so consumers in `NotificationService` don't pull `createLogger` through the import chain and break test mocks of `../logger.js`. `self-healing.ts` re-exports the symbol for backward compatibility. - - Log prefix for the recovery actions also changed from `[FN-5627] Auto-recovering...` to `Auto-recovered:` so that `NotificationService.maybeSuppressTransientFailedNotification`'s existing `/^Auto-recovered:/` log-prefix check cancels any already-scheduled failure notification when the sweep runs mid-grace-window. - - Tests: - - - 3 new notification-service tests covering transient suppression for both error classes plus a control case ensuring genuine non-transient failures still notify. - - Existing transient-recovery tests in self-healing.test.ts continue to pass against the relocated classifier. - -- b2dce7d: FN-5631 re-lands FN-5616 to add an opt-in `githubCloseSourceIssueOnDone` setting that closes source-imported GitHub issues when linked tasks are completed, including startup reconciliation for previously missed closes. -- 1153b09: feat(FN-5637): update `fn init` to add `fusion.db`, `fusion.db-wal`, and `fusion.db-shm` to project `.gitignore` alongside `.fusion` and `.pi` so stray runtime SQLite files are not committed. -- 5b5da2c: Fix bundled runtime plugin auto-install in globally installed CLI builds. Save/Save & Test for Paperclip, Hermes, OpenClaw, Cursor, and Droid runtime providers no longer fails with `unavailable in this build` when bundled plugins are present under `dist/plugins/`. -- b96b0bc: Fix `fn update` npm EEXIST bin-link collisions by retrying once with `--force` and showing manual recovery guidance when the retry fails. -- 2a35358: Add a new project-level `goals` table to the core schema and fresh database DDL. - Bump `SCHEMA_VERSION` from 91 to 92 with an idempotent migration that creates `goals` and `idxGoalsStatus`. -- 29ac58f: feat(FN-5633): standalone AI merge path (clean-room merge + AI reviewer) - - Adds a self-contained AI merge path (`merger.mode: "ai"`, the new default) that the engine dispatches to instead of the legacy `aiMergeTask` pipeline. It does not share the legacy scaffolding (prerebase / conflict-strategy ladder / post-merge audit / transient self-heal), which was buggy and error-prone. - - How it works: - - - **Clean room**: a throwaway detached worktree is created at the target branch's current tip, so the user's real checkout is never the merge surface — dirty files cannot be clobbered and the landing is a fast-forward by construction. - - **AI merge**: an AI agent merges the task branch into the clean room and produces one squash commit, resolving conflicts in favor of the task's intent. - - **AI reviewer with retries**: a fresh read-only reviewer audits the squash (completeness / collateral / conflict-soundness) and classifies any veto blocking vs advisory. It drives up to `merger.maxReviewPasses` corrective re-merges. After the budget, advisory concerns land with a logged warning; an unfixable BLOCKING (correctness) concern hard-fails (`AiMergeBlockedError`) rather than ship wrong code. Verdict parsing fails safe to blocking. - - **Per-task target branch**: each task merges into its own target branch (or the default integration branch). The local checkout is only synced when it is on that target. - - **Local checkout sync**: when the checkout is on the target branch, the ref + working tree advance together via `git merge --ff-only` (dirty state read accurately before the move); dirty edits are stashed, fast-forwarded, and restored — and if the restore conflicts the AI merger reconciles them (the original edits are also kept in a stash as a backup). A checkout on a different branch is advanced via `update-ref` and left untouched. Un-stashable dirty state advances the ref and leaves the working tree with a warning. Concurrent advances trigger a bounded rebuild on the new tip. - - **Status + logs**: progress (merging / reviewing / corrective passes / landing / blocked / landed) is written to the task status pill and the task log stream. - - Settings: `merger.mode` (`ai` default / `deterministic` legacy), `merger.reviewerModel`, `merger.maxReviewPasses` (default 3), surfaced in Settings → Merge. When AI merge is on, the legacy merge-mechanics settings (integration worktree, conflict strategy, overlap guard, post-merge audit, direct-commit routing) are hidden since they do not apply. - - Commit message: the AI agent writes the squash commit subject as a concise summary of the actual changes (not just the task title), and every landed squash carries the board-association trailers — `Fusion-Task-Id: ` plus the canonical lineage trailer when the task has a `lineageId` — guaranteed via an idempotent amend even if the agent omits them, so the board associates the commit with the task. - - Verification: the merge agent is instructed to run the project's tests, type-check, and lint after resolving the merge and to fix any NEW failure the merge introduced (without being on the hook for pre-existing breakage) before committing. - - Editable prompt: the AI merge agent's base persona is the editable "merger" role prompt (Settings → Prompts); the non-negotiable clean-room / verification / commit-trailer rules are always appended so a custom prompt can't drop them. - - Reviewer model: the reviewer agent uses the project's reviewer/validator model lane (`resolveValidatorSettingsModel`: project validator → global validator → project default), not a merge-specific setting. - - No-branch guard: a missing task branch is a benign no-op only when the task was never executed or was already merged (branch cleaned up on re-process); if the task was executed (`baseCommitSha` recorded) and was never merged, the merge fails loudly rather than silently marking the task done. - - The legacy `aiMergeTask` pipeline is retained unchanged and used when `merger.mode: "deterministic"`. - - Tests: `merger-ai.test.ts` covers the verdict parser, clean merge, blocking hard-fail (no advance), advisory land, empty no-op, per-task target branch isolation, missing-target-branch error, and `landSquash` (clean ff, other-branch update-ref, dirty stash-restore, AI-resolved restore conflict). Engine merge-orchestration tests that assert the legacy path are pinned to `merger.mode: "deterministic"`. - -- cec191e: Migrate Fusion's pi dependencies from `@mariozechner/pi-coding-agent` / `@mariozechner/pi-ai` to the new `@earendil-works/*` scope and bump to `^0.77.0`. - - This follows the upstream project move to `https://github.com/earendil-works/pi` and updates transitive dependency resolution to the maintained package namespace. - -- aa7eccb: When `useAiMergeCommitSummary` is enabled, AI-authored merge commits now include a richer body: the short narrative headline plus an AI-generated bullet summary of changed modules/files, followed by a `Files changed` diff stat block. - - `mergeDetails.mergeCommitMessage` remains the short headline summary so dashboard UI consumers keep their existing concise display behavior. - -- d78fbcc: Fix GitHub PR modal/review fetches that call `gh api` through `runGhJsonAsync`. - - `runGhJson` and `runGhJsonAsync` now skip auto-appending `--json` for the `gh api` subcommand (which already returns JSON and rejects that flag), preventing runtime `unknown flag: --json` errors when loading PR comments/reviews. - -- 2df891f: ci: re-enable auto-trigger of binary release workflow on `v*` tags so GitHub Releases include CLI and desktop binaries - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [f258a75] -- Updated dependencies [2c4683a] -- Updated dependencies [e84673c] -- Updated dependencies [2a35358] -- Updated dependencies [009d569] -- Updated dependencies [200dda9] -- Updated dependencies [6b27ab5] -- Updated dependencies [b2d547e] -- Updated dependencies [694970b] -- Updated dependencies [5768d5e] -- Updated dependencies [e75c4da] -- Updated dependencies [b2dce7d] -- Updated dependencies [1153b09] -- Updated dependencies [5b5da2c] -- Updated dependencies [b96b0bc] -- Updated dependencies [2a35358] -- Updated dependencies [29ac58f] -- Updated dependencies [cec191e] -- Updated dependencies [aa7eccb] -- Updated dependencies [d78fbcc] -- Updated dependencies [2df891f] - - @runfusion/fusion@0.36.0 - -## 0.35.0 - -### @fusion/dashboard - -#### Patch Changes - -- Updated dependencies [1992049] - - @fusion/engine@0.35.0 - - @fusion-plugin-examples/cli-printing-press@0.1.12 - - @fusion-plugin-examples/dependency-graph@0.1.26 - - @fusion-plugin-examples/roadmap@0.1.14 - - @fusion/core@0.35.0 - - @fusion-plugin-examples/cursor-runtime@0.1.14 - - @fusion-plugin-examples/droid-runtime@0.1.21 - - @fusion-plugin-examples/hermes-runtime@0.2.45 - - @fusion-plugin-examples/openclaw-runtime@0.2.45 - - @fusion-plugin-examples/paperclip-runtime@0.2.45 - -### @fusion/desktop - -#### Patch Changes - -- @fusion/dashboard@0.35.0 -- @fusion/core@0.35.0 - -### @fusion/engine - -#### Minor Changes - -- 1992049: Add opt-in RTK command rewriting for Pi bash tools via `FUSION_RTK_REWRITE`. - -#### Patch Changes - -- @fusion/core@0.35.0 -- @fusion/pi-claude-cli@0.35.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- @fusion/core@0.35.0 - -### @runfusion/fusion - -#### Minor Changes - -- d767e2e: Add `openai-responses` as a supported custom provider `apiType` across CLI, engine, dashboard API validation, and dashboard forms. - - Custom providers configured with this apiType now route through pi-ai's built-in `openai-responses` transport while probe-model discovery continues to use the OpenAI-compatible `/v1/models` path. - -#### Patch Changes - -- da34bd0: Dashboard now shows a top-level "Re-login required" banner when a stored OAuth provider credential (Codex, Claude, etc.) has expired, and the engine logs the expired set on startup and once every 24 hours. -- d76b6f9: TUI System panel now reliably shows the full auth token at all terminal widths so it can be selected and copied manually when the `[c]` shortcut is unavailable. -- d767e2e: Fixed custom provider registration so provider keys are derived from the configured provider name (with deterministic collision suffixing) instead of internal UUID ids, ensuring model selector and logs show stable human-readable keys. Also fixed the OpenAI-compatible custom-provider registration path by validating end-to-end openai-completions round-trip behavior with a regression test. -- 8a0fbf0: Fix the Bun-compiled `fn` executable so `--help` no longer crashes with a missing `react-devtools-core` module. The build now defines `process.env.DEV` as `false` during compile, allowing Ink's DEV-only devtools import path to be removed from the bundled binary. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [da34bd0] -- Updated dependencies [d76b6f9] -- Updated dependencies [d767e2e] -- Updated dependencies [d767e2e] -- Updated dependencies [8a0fbf0] - - @runfusion/fusion@0.35.0 - -## 0.34.0 - -### @fusion/core - -#### Patch Changes - -- 6a6c6fd: Dashboard startup and request-storm fixes: - - - **Faster startup**: parallelized independent store inits, started CentralCore init early in background, and ran plugin loading concurrently with extension resolution. The duplicate-runtime root cause is also fixed — `shouldUseHybridExecutor` no longer auto-enables for local-only multi-project setups, where `ProjectEngineManager` already handles project lifecycle (set `FUSION_HYBRID_EXECUTOR=1` to force-enable). Eliminates ~7s of redundant self-healing pipeline work per cold start. - - **Per-page request reduction**: added in-flight request dedupe (`packages/dashboard/app/api/dedupe.ts`) wrapped around the top API offenders. A single page load went from ~177 requests to ~101, with `/api/plugins/ui-slots` dropping from 17× to 1×. - - **Stale-data-after-mutation hazard**: `forceFresh` option on the deduped fetchers now redirects ALL in-flight waiters to receive the fresh post-mutation response, not just the forcing caller. Generation counters in `useAgents` and `AgentListModal` provide a second layer of protection against slow polls overwriting fresh state. - - **SSE refresh storm**: agent SSE event handler now debounces (250ms) with a trailing-edge guard, so multi-agent activity bursts coalesce to at most 2 refetches per burst instead of one per event. - - **Live isolation-mode transition**: PATCH `/api/projects/:id` with an `isolationMode` change now returns a 503 with actionable guidance when HybridExecutor is unavailable (local-only single-node), instead of silently persisting a config that the live runtime won't honor. - - **Error handling regression**: restored try/catch around `HybridExecutor.initialize` and `engineManager.ensureEngine` in the parallel engine setup so a paused or broken cwd project no longer aborts dashboard startup. - - **TaskStore migration race**: sequenced the SQLite store inits (TaskStore → AutomationStore → PluginStore → AgentStore) since they all open the same `.fusion/fusion.db` and run `addColumnIfMissing` migrations with a TOCTOU `hasColumn` → `ALTER` pattern. - - **`gh` CLI invocation storm**: `isGhAvailable()` and `isGhAuthenticated()` now memoize their results with a 60s TTL. `GitHubTrackingReconciler` was scanning up to 200 done tasks at startup and calling `hasGhAuth()` per task — each call shelled out to `gh --version` and `gh auth status` (which makes a network roundtrip), pinning the event loop for ~60s of synchronous `spawnSync` work. CPU-profile-confirmed: dropped from 71s (69% of cold-start CPU) to 2s. The cache benefits all 28+ call sites in `dashboard/src/github.ts`, the engine PR monitor, the research provider, and the API routes automatically. `resetGhAvailabilityCache()` is exported for login/logout flows that need to invalidate immediately. - - **SQLite integrity check delay**: `PRAGMA integrity_check(100)` walks every page of the database file and was scheduled 3 seconds after init — landing right in the responsiveness-critical window for ~7s per database. Pushed the deferred-check timer to 60 seconds so the user is already interacting with the dashboard by the time it runs. The check itself is unchanged; corruption detection still works. - - **Engine init event-loop yields**: `InProcessRuntime.start()` now awaits a `setImmediate`-based yield between major init phases (TaskStore → Plugins → WorktreePool → AgentStore → Scheduler → Executor → HeartbeatMonitor → SelfHealing) so HTTP requests can be processed between them instead of waiting on the entire stack. Same yield is now interleaved between each step of `SelfHealingManager.runStartupRecovery()` (34 steps per project) and its periodic maintenance batches. - - **Deferred startup recovery**: `InProcessRuntime.start()` no longer awaits `resumeStartupRecoverySequence()` or `workerManager.reconcileOrphaned()` — both are correctness-preserving background operations and their git/SQLite work was blocking server-listen for several seconds. - - **Deferred orphan-task AI agent resumption**: orphaned in-progress tasks resumed at engine restart now wait 30 seconds before spawning their AI agent session (worktree setup + pi-coding-agent session creation is heavy and saturates the event loop). Override via `FUSION_RESUME_ORPHAN_DELAY_MS=`; auto-zeroes under Vitest. - - **Event-loop lag tracer**: opt-in debug aid for diagnosing cold-start regressions. Set `FUSION_TRACE_EL_LAG=/path/to/file.txt` to capture every block >150ms with a timestamp relative to process start. - -### @fusion/dashboard - -#### Patch Changes - -- 6a6c6fd: Dashboard startup and request-storm fixes: - - - **Faster startup**: parallelized independent store inits, started CentralCore init early in background, and ran plugin loading concurrently with extension resolution. The duplicate-runtime root cause is also fixed — `shouldUseHybridExecutor` no longer auto-enables for local-only multi-project setups, where `ProjectEngineManager` already handles project lifecycle (set `FUSION_HYBRID_EXECUTOR=1` to force-enable). Eliminates ~7s of redundant self-healing pipeline work per cold start. - - **Per-page request reduction**: added in-flight request dedupe (`packages/dashboard/app/api/dedupe.ts`) wrapped around the top API offenders. A single page load went from ~177 requests to ~101, with `/api/plugins/ui-slots` dropping from 17× to 1×. - - **Stale-data-after-mutation hazard**: `forceFresh` option on the deduped fetchers now redirects ALL in-flight waiters to receive the fresh post-mutation response, not just the forcing caller. Generation counters in `useAgents` and `AgentListModal` provide a second layer of protection against slow polls overwriting fresh state. - - **SSE refresh storm**: agent SSE event handler now debounces (250ms) with a trailing-edge guard, so multi-agent activity bursts coalesce to at most 2 refetches per burst instead of one per event. - - **Live isolation-mode transition**: PATCH `/api/projects/:id` with an `isolationMode` change now returns a 503 with actionable guidance when HybridExecutor is unavailable (local-only single-node), instead of silently persisting a config that the live runtime won't honor. - - **Error handling regression**: restored try/catch around `HybridExecutor.initialize` and `engineManager.ensureEngine` in the parallel engine setup so a paused or broken cwd project no longer aborts dashboard startup. - - **TaskStore migration race**: sequenced the SQLite store inits (TaskStore → AutomationStore → PluginStore → AgentStore) since they all open the same `.fusion/fusion.db` and run `addColumnIfMissing` migrations with a TOCTOU `hasColumn` → `ALTER` pattern. - - **`gh` CLI invocation storm**: `isGhAvailable()` and `isGhAuthenticated()` now memoize their results with a 60s TTL. `GitHubTrackingReconciler` was scanning up to 200 done tasks at startup and calling `hasGhAuth()` per task — each call shelled out to `gh --version` and `gh auth status` (which makes a network roundtrip), pinning the event loop for ~60s of synchronous `spawnSync` work. CPU-profile-confirmed: dropped from 71s (69% of cold-start CPU) to 2s. The cache benefits all 28+ call sites in `dashboard/src/github.ts`, the engine PR monitor, the research provider, and the API routes automatically. `resetGhAvailabilityCache()` is exported for login/logout flows that need to invalidate immediately. - - **SQLite integrity check delay**: `PRAGMA integrity_check(100)` walks every page of the database file and was scheduled 3 seconds after init — landing right in the responsiveness-critical window for ~7s per database. Pushed the deferred-check timer to 60 seconds so the user is already interacting with the dashboard by the time it runs. The check itself is unchanged; corruption detection still works. - - **Engine init event-loop yields**: `InProcessRuntime.start()` now awaits a `setImmediate`-based yield between major init phases (TaskStore → Plugins → WorktreePool → AgentStore → Scheduler → Executor → HeartbeatMonitor → SelfHealing) so HTTP requests can be processed between them instead of waiting on the entire stack. Same yield is now interleaved between each step of `SelfHealingManager.runStartupRecovery()` (34 steps per project) and its periodic maintenance batches. - - **Deferred startup recovery**: `InProcessRuntime.start()` no longer awaits `resumeStartupRecoverySequence()` or `workerManager.reconcileOrphaned()` — both are correctness-preserving background operations and their git/SQLite work was blocking server-listen for several seconds. - - **Deferred orphan-task AI agent resumption**: orphaned in-progress tasks resumed at engine restart now wait 30 seconds before spawning their AI agent session (worktree setup + pi-coding-agent session creation is heavy and saturates the event loop). Override via `FUSION_RESUME_ORPHAN_DELAY_MS=`; auto-zeroes under Vitest. - - **Event-loop lag tracer**: opt-in debug aid for diagnosing cold-start regressions. Set `FUSION_TRACE_EL_LAG=/path/to/file.txt` to capture every block >150ms with a timestamp relative to process start. - -- Updated dependencies [6a6c6fd] -- Updated dependencies [97f1143] -- Updated dependencies [4e4830f] - - @fusion/engine@0.34.0 - - @fusion/core@0.34.0 - - @fusion-plugin-examples/cli-printing-press@0.1.11 - - @fusion-plugin-examples/dependency-graph@0.1.25 - - @fusion-plugin-examples/roadmap@0.1.13 - - @fusion-plugin-examples/cursor-runtime@0.1.13 - - @fusion-plugin-examples/droid-runtime@0.1.20 - - @fusion-plugin-examples/hermes-runtime@0.2.44 - - @fusion-plugin-examples/openclaw-runtime@0.2.44 - - @fusion-plugin-examples/paperclip-runtime@0.2.44 - -### @fusion/desktop - -#### Patch Changes - -- Updated dependencies [6a6c6fd] - - @fusion/dashboard@0.34.0 - - @fusion/core@0.34.0 - -### @fusion/engine - -#### Minor Changes - -- 97f1143: Add optional dependencies parameter to fn_task_update tool. Executors can now programmatically modify task dependency arrays during execution with `fn_task_update({ id: "FN-XXX", dependencies: ["FN-001", "FN-002"] })`. The parameter is optional and backward-compatible; omitting it preserves existing dependencies. Includes validation for self-dependency and non-existent task IDs. Eliminates the need for direct task.json editing workarounds. - -#### Patch Changes - -- 6a6c6fd: Dashboard startup and request-storm fixes: - - - **Faster startup**: parallelized independent store inits, started CentralCore init early in background, and ran plugin loading concurrently with extension resolution. The duplicate-runtime root cause is also fixed — `shouldUseHybridExecutor` no longer auto-enables for local-only multi-project setups, where `ProjectEngineManager` already handles project lifecycle (set `FUSION_HYBRID_EXECUTOR=1` to force-enable). Eliminates ~7s of redundant self-healing pipeline work per cold start. - - **Per-page request reduction**: added in-flight request dedupe (`packages/dashboard/app/api/dedupe.ts`) wrapped around the top API offenders. A single page load went from ~177 requests to ~101, with `/api/plugins/ui-slots` dropping from 17× to 1×. - - **Stale-data-after-mutation hazard**: `forceFresh` option on the deduped fetchers now redirects ALL in-flight waiters to receive the fresh post-mutation response, not just the forcing caller. Generation counters in `useAgents` and `AgentListModal` provide a second layer of protection against slow polls overwriting fresh state. - - **SSE refresh storm**: agent SSE event handler now debounces (250ms) with a trailing-edge guard, so multi-agent activity bursts coalesce to at most 2 refetches per burst instead of one per event. - - **Live isolation-mode transition**: PATCH `/api/projects/:id` with an `isolationMode` change now returns a 503 with actionable guidance when HybridExecutor is unavailable (local-only single-node), instead of silently persisting a config that the live runtime won't honor. - - **Error handling regression**: restored try/catch around `HybridExecutor.initialize` and `engineManager.ensureEngine` in the parallel engine setup so a paused or broken cwd project no longer aborts dashboard startup. - - **TaskStore migration race**: sequenced the SQLite store inits (TaskStore → AutomationStore → PluginStore → AgentStore) since they all open the same `.fusion/fusion.db` and run `addColumnIfMissing` migrations with a TOCTOU `hasColumn` → `ALTER` pattern. - - **`gh` CLI invocation storm**: `isGhAvailable()` and `isGhAuthenticated()` now memoize their results with a 60s TTL. `GitHubTrackingReconciler` was scanning up to 200 done tasks at startup and calling `hasGhAuth()` per task — each call shelled out to `gh --version` and `gh auth status` (which makes a network roundtrip), pinning the event loop for ~60s of synchronous `spawnSync` work. CPU-profile-confirmed: dropped from 71s (69% of cold-start CPU) to 2s. The cache benefits all 28+ call sites in `dashboard/src/github.ts`, the engine PR monitor, the research provider, and the API routes automatically. `resetGhAvailabilityCache()` is exported for login/logout flows that need to invalidate immediately. - - **SQLite integrity check delay**: `PRAGMA integrity_check(100)` walks every page of the database file and was scheduled 3 seconds after init — landing right in the responsiveness-critical window for ~7s per database. Pushed the deferred-check timer to 60 seconds so the user is already interacting with the dashboard by the time it runs. The check itself is unchanged; corruption detection still works. - - **Engine init event-loop yields**: `InProcessRuntime.start()` now awaits a `setImmediate`-based yield between major init phases (TaskStore → Plugins → WorktreePool → AgentStore → Scheduler → Executor → HeartbeatMonitor → SelfHealing) so HTTP requests can be processed between them instead of waiting on the entire stack. Same yield is now interleaved between each step of `SelfHealingManager.runStartupRecovery()` (34 steps per project) and its periodic maintenance batches. - - **Deferred startup recovery**: `InProcessRuntime.start()` no longer awaits `resumeStartupRecoverySequence()` or `workerManager.reconcileOrphaned()` — both are correctness-preserving background operations and their git/SQLite work was blocking server-listen for several seconds. - - **Deferred orphan-task AI agent resumption**: orphaned in-progress tasks resumed at engine restart now wait 30 seconds before spawning their AI agent session (worktree setup + pi-coding-agent session creation is heavy and saturates the event loop). Override via `FUSION_RESUME_ORPHAN_DELAY_MS=`; auto-zeroes under Vitest. - - **Event-loop lag tracer**: opt-in debug aid for diagnosing cold-start regressions. Set `FUSION_TRACE_EL_LAG=/path/to/file.txt` to capture every block >150ms with a timestamp relative to process start. - -- 4e4830f: Fix two bugs that compounded to produce bare `feat(FN-XXXX): merge fusion/fn-XXXX` merge commits in the dashboard: - - - **`Provided value cannot be bound to SQLite parameter 4` (TypeError) mid-merge**: the verification-fix finalize path called `upsertTaskCommitAssociation` with `commitSha` derived from a `git rev-parse HEAD` whose surrounding exec could reject under the parallel-attempt race, leaving `commitSha` undefined when bound to positional parameter 4. Extracted both duplicated callsites into a `recordCommitAssociationFromHead` helper that catches exec failures and validates each git output is non-empty before binding. The merge no longer fails over a denormalized lookup write when the commit itself landed cleanly. - - **Bare-fallback subjects persisted into `mergeDetails.mergeCommitMessage`**: when `buildDeterministicMergeMessage`'s tier-3 fallback (`merge ${branch}`) made it onto a landed commit, the four `classification.commit.subject` / `landedCommit.subject` recovery sites in `self-healing.ts` and `aiMergeTask` copied that bare subject verbatim into `mergeDetails`. Added `regenerateBareMergeSubject` (in a new `merger-bare-subject.ts` module to keep self-healing's import graph narrow) which detects the bare pattern via `BARE_MERGE_SUBJECT_RE` and regenerates a descriptive subject from the landed commit's diff stat via the existing AI commit-subject summarizer. Cosmetic only — the git commit is never amended; the regenerated subject only populates the persisted `mergeDetails` and the in-process `MergeResult`. Gated by `settings.useAiMergeCommitSummary`. - -- Updated dependencies [6a6c6fd] - - @fusion/core@0.34.0 - - @fusion/pi-claude-cli@0.34.0 - -### @fusion/plugin-sdk - -#### Patch Changes - -- Updated dependencies [6a6c6fd] - - @fusion/core@0.34.0 - -### @runfusion/fusion - -#### Minor Changes - -- 5eacd79: Add optional `baseBranch` support to mission creation and task planning flows. - - - `fn_mission_create` now accepts `baseBranch` to persist a mission-level default integration branch. - - Mission feature/slice triage inherits mission `baseBranch` when no explicit triage base branch is supplied. - - `fn_task_plan`/CLI planning paths now accept and forward `baseBranch` to created tasks. - -- 1fb905a: Planning Mode now lets you pick a branch strategy (project default, auto-named, existing, or custom new) and an optional base/merge-target branch when creating a task from a completed planning session. - -#### Patch Changes - -- 0a6da9f: Fix ntfy notification deep links: project-only links now switch projects, and task links to non-current projects resolve against the correct project before opening the modal. -- 06a107d: Fix triage/executor not swapping to the configured planning fallback model when the primary provider's API key is missing (or returns 401/403/rate-limit). The top-level `promptWithFallback` now delegates to the rich session-attached path (which runs `isRetryableModelSelectionError` and `swapPromptSession`), with a WeakSet re-entry guard preserving the FN-4900 recursion fix. -- 88c465c: Fix two engine reliability bugs surfaced by CI sharding repair: - - - Self-healing in-review branch rebind now dedups case-variant candidate refs by resolved SHA rather than lowercase name, so two distinct branches sharing a case-insensitive name on case-sensitive filesystems (Linux) are correctly flagged as ambiguous instead of one being silently picked. - - CI test sharding: removed the `--` separator between `pnpm test` and `--shard`, which vitest's CLI parser was treating as end-of-flags and turning the shard selector into a positional file filter — silently disabling sharding so every shard ran the full suite. Test shards now run their actual slice. - - CI test-shards jobs now check out with `fetch-depth: 0` so engine tests that depend on real git history (merge-base, ref resolution) behave the same on CI as locally. - - PR Checks workflow now also runs on push to `main`, so post-merge regressions surface immediately instead of waiting for the next PR. - -- 6a6c6fd: Dashboard startup and request-storm fixes: - - - **Faster startup**: parallelized independent store inits, started CentralCore init early in background, and ran plugin loading concurrently with extension resolution. The duplicate-runtime root cause is also fixed — `shouldUseHybridExecutor` no longer auto-enables for local-only multi-project setups, where `ProjectEngineManager` already handles project lifecycle (set `FUSION_HYBRID_EXECUTOR=1` to force-enable). Eliminates ~7s of redundant self-healing pipeline work per cold start. - - **Per-page request reduction**: added in-flight request dedupe (`packages/dashboard/app/api/dedupe.ts`) wrapped around the top API offenders. A single page load went from ~177 requests to ~101, with `/api/plugins/ui-slots` dropping from 17× to 1×. - - **Stale-data-after-mutation hazard**: `forceFresh` option on the deduped fetchers now redirects ALL in-flight waiters to receive the fresh post-mutation response, not just the forcing caller. Generation counters in `useAgents` and `AgentListModal` provide a second layer of protection against slow polls overwriting fresh state. - - **SSE refresh storm**: agent SSE event handler now debounces (250ms) with a trailing-edge guard, so multi-agent activity bursts coalesce to at most 2 refetches per burst instead of one per event. - - **Live isolation-mode transition**: PATCH `/api/projects/:id` with an `isolationMode` change now returns a 503 with actionable guidance when HybridExecutor is unavailable (local-only single-node), instead of silently persisting a config that the live runtime won't honor. - - **Error handling regression**: restored try/catch around `HybridExecutor.initialize` and `engineManager.ensureEngine` in the parallel engine setup so a paused or broken cwd project no longer aborts dashboard startup. - - **TaskStore migration race**: sequenced the SQLite store inits (TaskStore → AutomationStore → PluginStore → AgentStore) since they all open the same `.fusion/fusion.db` and run `addColumnIfMissing` migrations with a TOCTOU `hasColumn` → `ALTER` pattern. - - **`gh` CLI invocation storm**: `isGhAvailable()` and `isGhAuthenticated()` now memoize their results with a 60s TTL. `GitHubTrackingReconciler` was scanning up to 200 done tasks at startup and calling `hasGhAuth()` per task — each call shelled out to `gh --version` and `gh auth status` (which makes a network roundtrip), pinning the event loop for ~60s of synchronous `spawnSync` work. CPU-profile-confirmed: dropped from 71s (69% of cold-start CPU) to 2s. The cache benefits all 28+ call sites in `dashboard/src/github.ts`, the engine PR monitor, the research provider, and the API routes automatically. `resetGhAvailabilityCache()` is exported for login/logout flows that need to invalidate immediately. - - **SQLite integrity check delay**: `PRAGMA integrity_check(100)` walks every page of the database file and was scheduled 3 seconds after init — landing right in the responsiveness-critical window for ~7s per database. Pushed the deferred-check timer to 60 seconds so the user is already interacting with the dashboard by the time it runs. The check itself is unchanged; corruption detection still works. - - **Engine init event-loop yields**: `InProcessRuntime.start()` now awaits a `setImmediate`-based yield between major init phases (TaskStore → Plugins → WorktreePool → AgentStore → Scheduler → Executor → HeartbeatMonitor → SelfHealing) so HTTP requests can be processed between them instead of waiting on the entire stack. Same yield is now interleaved between each step of `SelfHealingManager.runStartupRecovery()` (34 steps per project) and its periodic maintenance batches. - - **Deferred startup recovery**: `InProcessRuntime.start()` no longer awaits `resumeStartupRecoverySequence()` or `workerManager.reconcileOrphaned()` — both are correctness-preserving background operations and their git/SQLite work was blocking server-listen for several seconds. - - **Deferred orphan-task AI agent resumption**: orphaned in-progress tasks resumed at engine restart now wait 30 seconds before spawning their AI agent session (worktree setup + pi-coding-agent session creation is heavy and saturates the event loop). Override via `FUSION_RESUME_ORPHAN_DELAY_MS=`; auto-zeroes under Vitest. - - **Event-loop lag tracer**: opt-in debug aid for diagnosing cold-start regressions. Set `FUSION_TRACE_EL_LAG=/path/to/file.txt` to capture every block >150ms with a timestamp relative to process start. - -- bad6759: Enable editing the agent name during the review step of the New Agent dialog. -- 7f01b53: Fix chat session API endpoints ignoring `projectId` in multi-project mode. - - `GET /chat/sessions`, `GET /chat/sessions/:id`, `GET /chat/sessions/:id/messages` - and related mutation endpoints all used `options.chatStore` (the home-directory - project's store) regardless of the `projectId` query parameter. In a multi-project - daemon (e.g. running from `~/`) sessions belonging to secondary projects were - invisible — list returned empty, fetching by ID returned 404. - - Root cause: `registerChatRoutes` accessed `options.chatStore` directly instead of - routing through the per-project `resolveProjectChatContext` helper (already used - correctly by `registerChatRoomRoutes` for the rooms API). - - Fix: introduce a `resolveScopedChatStore(projectId)` helper inside - `registerChatRoutes` that delegates to `resolveProjectChatContext`, and replace - all ten `options.chatStore` usages with calls to this helper. When `engineManager` - is present and has an engine for the given `projectId`, the engine's own - `ChatStore` is used; otherwise falls back to the default store (backward compatible). - -- 64056b3: Fix `useChat` truncating sessions longer than 50 messages on initial open. - - `loadMessages()` fetched `{ limit: 50 }` for the initial load. The - `loadMoreMessages` callback was never called from `ChatView` (no scroll - sentinel exists), so sessions beyond 50 messages were permanently cut off. - - Fix: introduce `fetchAllMessagesInChat()` that paginates through the API's - 200-message cap and replace the initial load path. A stale-session guard - (via `activeSessionRef`) prevents overwriting a switched session's messages. - The forward-pagination path (`isPaginationRequest = true`) is preserved - unchanged for backward compatibility. - -- 629aa29: Fix Windows compatibility in cloudflared install fallback by replacing `execFileAsync("mkdir", ["-p", ...])` with `fs.mkdir({ recursive: true })`. The shell-level `-p` flag is Unix-only and breaks installation on Windows cmd.exe with "A subdirectory or file -p already exists". The worktree-hooks fix from the original report was already landed independently. - -### runfusion.ai - -#### Patch Changes - -- Updated dependencies [0a6da9f] -- Updated dependencies [06a107d] -- Updated dependencies [88c465c] -- Updated dependencies [6a6c6fd] -- Updated dependencies [bad6759] -- Updated dependencies [7f01b53] -- Updated dependencies [64056b3] -- Updated dependencies [5eacd79] -- Updated dependencies [1fb905a] -- Updated dependencies [629aa29] - - @runfusion/fusion@0.34.0 - -## 0.33.0 - -### @fusion/core - -#### Minor Changes - -- a201f56: feat(core): add `mergeAdvanceAutoSync` project setting (`"off" | "ff-only" | "stash-and-ff"`) - - Adds the schema for a new project setting that controls what happens in **other** worktrees still checked out on the integration branch when the merger advances the branch ref. Previously the merger only updated `refs/heads/` and left every other checkout's index and working tree pinned at the old tip, so `git status` in the user's project-root checkout reported the new commits as inverted "staged changes to be committed." - - Modes (default `"stash-and-ff"`): - - - `"off"` — preserve the legacy behavior; user must `git pull` or click the Merge Advance Notice banner Pull button. - - `"ff-only"` — auto-fast-forward only clean worktrees; dirty worktrees stay untouched and the banner still surfaces. - - `"stash-and-ff"` — run the Smart Pull pipeline (stash → fast-forward → pop). Pop conflicts emit `merge:auto-sync` audit events with `outcome: "stash-pop-conflict"` and surface through the existing dashboard stash-conflict modal. - - Schema-only in this changeset; the merger hook that consumes the setting lands in the follow-up engine change. - -- 51fc826: fix(engine,core): dedup heartbeat-spawned follow-ups by parent task - - Heartbeat agents create follow-up tasks via `fn_task_create`. Until - now, the intake similarity guard scoped candidates by `sourceAgentId` - only, so the same parent task could spawn many sibling tasks across - heartbeats whenever triage rewrote their titles enough to dodge the - title-fingerprint guard. - - The task-scoped heartbeat now stamps `sourceParentTaskId` (and - `sourceRunId`) on every `fn_task_create`, and the intake duplicate - matcher treats a candidate as a sibling when it shares either the - caller's agent ID or the caller's parent task ID. Same-parent - siblings with similar descriptions are auto-archived as before. - - Tool description and heartbeat prompts also now instruct agents to - scan existing open tasks before creating, as a belt-and-suspenders - layer above the deterministic dedup. - -#### Patch Changes - -- 408e20b: fix(merger): two root-cause fixes for tasks landing in Done with no commit on main - - **Bug 1: sibling fusion/fn-\* branch as merge target** — `resolveTaskMergeTarget` - previously returned `task.baseBranch` unconditionally before falling back to the - project default. When a task was dispatched as a sibling/dependent off another - in-flight task's worktree, `baseBranch` ended up as the upstream's - `fusion/fn-` branch. The merger then detached onto that sibling, squashed - on top of it, and advanced `refs/heads/fusion/fn-` — never main. FN-5233's - squash (`84563e549`) stranded on `fusion/fn-5339`; FN-5530's - (`4140a3e0a`) stranded on `fusion/fn-5543`. The resolver now refuses any - `fusion/fn-\*` candidate as a merge destination and falls through to the - project default. The merger emits a new `merge:merge-target-rejected-fusion-sibling` - audit event so the upstream `baseBranch`-propagation bug stays observable. - - **Bug 2: deadlock-recovery mis-attributed tasks to unrelated commits** — - `findLandedTaskCommit` step (4) used `git log --grep=FN-XXXX` which matches the - entire commit message (not just the subject) and blindly accepted the first - hit. FN-5441 and FN-5446 were both marked done against `e3dbfaae` — an - FN-5483 commit whose body merely _mentioned_ them by name in a paragraph about - a refusal. The grep fallback now fetches each candidate's body and re-verifies - ownership via a tightened `commitOwnedByTask`: trailers must be line-anchored - (`(?:^|\n)Fusion-Task-Id: (?:\n|$)`), and the subject fallback must match - a conventional-commit form (`():` or `:`), not a substring. - Prose mentions can no longer claim a task. - - The historical recovery for FN-5233 has been cherry-picked to main as - `2d2e5b809`. The other 11 affected tasks (FN-5441, FN-5446, FN-5472, FN-5484, - FN-5487, FN-5490, FN-5515, FN-5517, FN-5526, FN-5539, FN-5540, FN-5542) - remain in Done but need separate triage — 3 look like legitimate - verification-only no-ops, the remaining 9 likely lost real work. - -- ec6643e: fix(test-utils): cancel subprocess tracking timer for every proc in afterEach - - The vitest subprocess guard registered a 60 s "command timed out" timer for - each tracked child process and relied on `afterEach` to cancel it. Under - concurrent load (`pnpm` recursive test runs) the timer could outlive the - originating test and fire during a later test's `afterEach`, surfacing as - spurious "Test subprocess guard detected unsafe child-process usage: - Timed out after 60000ms" failures attributed to a different test name. - - The cleanup loop now scopes "Left running" failure reporting + SIGKILL to - processes spawned by the current test, but unconditionally clears each - tracked subprocess's timer so the 60 s timeout cannot fire after the - afterEach completes. The grace period before declaring a process leaked - is also raised from 200 ms to 1 s to absorb event-loop contention from - slow git shells under recursive test load. - -- 4c31e88: feat(engine): merger auto-syncs project-root checkout after advancing integration-branch ref - - Wires `mergeAdvanceAutoSync` into the merger's post-ref-advance code path. After `advanceIntegrationBranchRef` ff-updates `refs/heads/`, the merger now enumerates other worktrees still on that branch (typically the user's project-root checkout) and reconciles each one's index + working tree to the new tip via `syncWorktreeToHead`. - - The reconciliation primitive is **not** a `git pull` — origin may still be at the previous tip (no `pushAfterMerge`), in which case `git pull --ff-only` is a no-op and a naive `stash → pull → pop` ends with the worktree restored to the old state. Instead `syncWorktreeToHead`: - - 1. Diffs the worktree against the _previous_ tip to isolate real user edits from the stale-index "phantom diff" that looks like inverted commits. - 2. When the worktree is clean against the previous tip, runs `git reset --hard HEAD` to snap index + files forward. - 3. In `stash-and-ff` mode with real edits, captures them as a binary patch against the previous tip, snaps to HEAD, then `git apply --3way` to restore. Untracked files are copied to a temp dir and restored after the snap. Patch conflicts surface as `synced-with-pop-conflict` with the patch left on disk for manual recovery. - - Each per-worktree attempt emits a `merge:auto-sync` audit event (new `GitMutationType`) with the outcome; the per-step `pull:fast-forward`, `stash:push`, `stash:pop`, and `stash:pop-conflict` events that pass through the auditor are tagged `metadata.autoSync = true` so downstream consumers can attribute them. - - The user-facing effect: with the default `mergeAdvanceAutoSync: "stash-and-ff"`, after a Fusion task merges the user's `git status` in the project-root checkout becomes clean and the working tree shows the new commits' content — no manual `git reset` or Pull-button click required. Set `mergeAdvanceAutoSync: "off"` to restore the legacy behavior (the Merge Advance Notice banner still surfaces and the user pulls by hand). - - Backstopped by `merger-auto-sync.slow.test.ts` covering: clean-sync snaps both index and files forward, ff-only with real edits is a no-op, stash-and-ff preserves untracked local files across the snap, task worktrees on `fusion/fn-*` branches are correctly skipped, and an empty branch map emits nothing. - -### @fusion/dashboard - -#### Minor Changes - -- 6e7f1e5: feat(dashboard): explain "Recent integration-branch advances" and add a one-click "Sync working tree" fix - - Two additions to Git Manager → Status: - - **Info disclosure** — an `[i]` button next to the "Recent integration-branch advances (N need action)" header toggles an inline explainer. Covers what an "advance" is, what each `autoSyncOutcome` value means (`clean-sync`, `synced-with-edits-restored`, `off / not run`, `stash-failed`, `would-conflict`, …), and where to enable `mergeAdvanceAutoSync` for the permanent fix. - - **Sync working tree button** — when ≥1 advance shows `needsAction`, a button surfaces in the same header that calls the existing `POST /api/git/pull` (FN-5358 Smart Pull machinery: auto-stash dirty edits, fast-forward pull, restore stash, surface conflicts). On success the extended git status auto-refetches and the "need action" count drops; on conflict, the existing error toast fires. - - No new state machine — `handlePull`/`remoteLoading === "pull"` is the same plumbing the existing Pull button uses. - -- 85786e7: feat(dashboard): show extended integration-branch + working-tree state in Git Manager - - Repository Status panel now answers "what is the actual state of my project root vs the integration branch?" so operators can be sure of the picture even when the Merge Advance Notice banner has been dismissed. - - `GET /api/git/status` accepts a new `?extended=1` query and returns additional optional fields: - - - **integrationBranch** + **integrationBranchSource** — the canonical branch (resolved via `settings.integrationBranch` → legacy `baseBranch` → `origin/HEAD` → `main`) and where the value came from. - - **integrationTipSha / originIntegrationTipSha** — SHAs at both ends, so operators can spot when local main has been advanced by the merger but origin/main hasn't caught up. - - **aheadOfIntegration / behindIntegration** — HEAD vs local integration tip (useful when on a non-integration branch). - - **aheadOfOriginIntegration / behindOriginIntegration** — local integration tip vs `origin/`. - - **dirtyDetails** — staged/modified/untracked/conflicted counts + a 12-line porcelain sample. - - **indexStaleVsHead** — true when the index reflects a previous tip and the worktree is clean against the index but not against HEAD. Surfaces the exact "phantom staged changes" scenario that `mergeAdvanceAutoSync` exists to fix. - - **stashCount** — for at-a-glance recovery awareness. - - **recentMergeAdvances** — up to 5 recent `merge:integration-ref-advance` audit events for the project root, joined with their `merge:auto-sync` outcomes; entries whose auto-sync didn't successfully bring this worktree forward are flagged `needsAction: true`. - - `GitManagerModal` now renders all of this: - - - The existing Branch / Commit / Working Tree / Remote Sync cards gain sub-text — Working Tree shows staged/modified/untracked/conflicted breakdown; Branch shows whether you're on the integration branch. - - A second row of cards adds Integration branch (with resolution source + tip SHA), HEAD-vs-integration ahead/behind, local-integration-vs-origin ahead/behind, and stash count. - - A yellow warning panel appears when `indexStaleVsHead` is true, telling the operator to enable `mergeAdvanceAutoSync` or run `git reset --hard HEAD`. - - A "Recent integration-branch advances" list shows the last few merger advances with their per-advance auto-sync outcome, color-coded by whether they still need action. - - All `fetchGitStatus(projectId)` calls inside `GitManagerModal` now pass `{ extended: true }`. Other callers in the app are unaffected — the extra fields are optional and the un-extended response shape is unchanged. - -#### Patch Changes - -- 60a0012: fix(dashboard): stop main-chat and quick-chat composers from instantly dismissing the Android soft keyboard - - Two layered Android-specific fixes for the chat composers: - - 1. The body scroll-lock applied while the keyboard is open in main chat was an iOS-specific workaround for visualViewport drift. On Android Chrome it does the opposite of what we want — mutating `body { position: fixed; ... }` while the keyboard is opening causes Chrome to treat it as a focus-target relayout and immediately dismisses the keyboard. `useMobileScrollLock` is now gated to iOS UAs. - - 2. ChatView and QuickChatFAB both had an iOS-specific `onTouchStart` on the textarea that called `event.preventDefault()` and then programmatically refocused the input (to suppress iOS's visualViewport auto-scroll on re-focus). On Android, `preventDefault` on a textarea touchstart prevents the soft keyboard from opening — programmatic `focus()` alone does not raise the Android keyboard. Result: tapping the composer focused the input but the keyboard never appeared, looking like an instant dismiss. The touchstart workaround is now gated to iOS UAs via `isIOS()`. - -- a10fc56: fix(dashboard): keep Android keyboard open in main chat; disable kanban pinch-zoom - - Two Android-specific fixes: - - 1. **Keyboard dismissing in main chat.** `mobileKeyboardOpen` in `App.tsx` (derived from `useMobileKeyboard`) gates `project-content--with-mobile-nav` / `--with-footer` className assignment and MobileNavBar rendering. When the soft keyboard opened, those classes were removed and the nav unmounted, shrinking padding-bottom by ~80px in a single render. Android Chrome treats the resulting jump of the focused chat input as the focus target moving and instantly dismisses the keyboard. With `interactive-widget=resizes-content` set on Android, the layout viewport itself shrinks with the keyboard, so the hide-nav-on-keyboard behavior was redundant on Android (and harmful). The whole pattern is now gated to iOS via `isIOS()`. iOS path is unchanged. - - 2. **Pinch-zoom on kanban.** Android Chrome ignores `user-scalable=no` for accessibility, and the kanban board's `overflow-x: auto` columns combined with the inflated ICB produce a broken visual when the user zooms out. Adds `touch-action: pan-x pan-y` to `html, body` inside the mobile media query, which keeps scroll panning but disables pinch-zoom (Chat and MissionManager were unaffected because they don't expose a wide horizontal scrollable region). - -- de67c51: fix(dashboard): pull syncs the worktree to local integration tip, not just to origin - - The integration-mode `POST /api/git/pull` (used by the merge-advance-notice banner) only ran `git merge --ff-only origin/` after fetching. When the merger had advanced local `refs/heads/` via `update-ref` but the user hadn't pushed yet, the worktree's HEAD already resolved to the new sha (symbolic ref follow) but the working tree and index were still at the old state. The fast-forward step short-circuited (`already up to date with origin`) and the user saw "Pull completed" with `fromSha === toSha` while their files visibly stayed behind. - - Pull now explicitly resets the worktree to `refs/heads/` after the origin fast-forward step. The autostash above protects user edits, so the reset is safe regardless of whether the origin FF ran. - -- 5d35b64: fix(dashboard): remove duplicate integration-advances UI; Sync working tree is now pure-local (no origin fetch) - - **Removed duplicate UI** — Git Manager → Status had two overlapping sections rendering the same data: a `Sync local tip` button + a `Recent integration advances` list, sitting above the highlighted `Recent integration-branch advances` block (the one with the lost-work warnings). Deleted the duplicate (`gm-integration-actions` + `gm-recent-advances`) along with the dead `mergeAdvanceEvents` state, fetcher, and SSE subscription that only fed it. - - **Sync working tree is now pure-local** — for the "N need action" case the merger has already advanced `refs/heads/` locally and the worktree just needs to follow. Previously the button called the integration-mode pull which ran `tryFastForwardFromOrigin` first, silently pulling in unrelated remote commits. New `skipOriginFetch` option on `PullGitBranchOptions.integration` (and the matching `POST /api/git/pull` body field) skips the origin step entirely. The Sync button passes `skipOriginFetch: true`, so the sequence is: auto-stash → `git reset --hard refs/heads/` → restore stash. Origin is not touched. - - Help disclosure updated to match the new behavior. - -- 4f38ed1: fix(dashboard): clear `needs action` on recent integration-branch advances after manual sync - - The Git Manager's "Recent integration-branch advances" list derived `needsAction` purely from the original `merge:auto-sync` audit-event outcome. When the operator clicked "Sync working tree" — or fixed up the worktree by hand — the worktree caught up to the integration tip, but the list kept showing "(N need action)" because the historical audit events still recorded the original failure/disabled state. - - `collectRecentMergeAdvances` now also checks whether each advance's `toSha` is reachable from the current HEAD. If it is, the worktree already contains that advance and `needsAction` is false regardless of what the audit trail recorded. - -- ef12df4: fix(dashboard): close 8 review findings on extended Git Manager status + Integration branch setting - - **Settings persistence (data-loss)** — the project-settings patch builder now applies null-as-delete to all non-model keys, matching the global-settings branch. Previously, clearing the Integration branch field (picking `(auto-detect)` or clicking `Use dropdown`) set `integrationBranch: undefined`, which `JSON.stringify` silently dropped — the server retained the stale explicit value and the operator could not un-pin the branch from the UI. - - **`isIndexStale` was wrong both directions** — the heuristic (`diff --cached --name-only` non-empty AND `diff --name-only` empty) fired false-positive on benign `git add` and false-negative whenever the worktree had any unrelated edit. Replaced with a reflog-anchored check: stale iff `refs/heads/@{1}` exists, HEAD is a descendant of it, and `git diff-index --cached ` is empty (i.e. the index exactly matches the pre-advance state). - - **Auto-sync attribution** — two fixes to `collectRecentMergeAdvances` in `register-git-github.ts`: - - - Auto-sync events are now matched by `(taskId, newSha)` instead of `taskId`-only. A task that produced multiple advances over time no longer has all its older entries mislabeled with the most-recent outcome. - - `worktreePath` comparison now runs both sides through `fs.realpathSync` first. On macOS the merger emits canonicalized paths (via `canonicalizePath` in `worktree-pool.ts`) while the route was called with the store's raw `rootDir`; symlinked project paths caused every advance to be marked `needsAction: true` indefinitely. - - **Extended path no longer 500s on git failure** — the `?extended=1` branch wraps `computeExtendedGitStatus` in its own try/catch and falls back to the basic status shape on any unhandled failure. Previously an unguarded `git branch --show-current` throw escaped to the route's outer catch and returned HTTP 500, while the basic path returned 200 with the swallowed-failure shape — surface parity matters because the dashboard always passes `extended=1` and would otherwise render an error toast where it should render the degraded panel. Also wrapped the same call inside `computeExtendedGitStatus` so detached-HEAD / non-git states return an empty `currentBranch` instead of throwing. - - **Integration branch falls back to `refs/remotes/origin/`** — when the configured branch exists only as a remote-tracking ref (e.g. operator set `integrationBranch: "release/v2"` without ever `git switch`-ing it locally), `integrationTipSha` now resolves to the origin tip instead of being null. A new `integrationTipSource: "local" | "remote-only" | "missing"` field tells the UI which side won; the Git Manager surfaces this with a `(remote-only — run git switch to track locally)` sub-text and a `no ref found` error state when both refs are missing. - - **Copy commit hash shows two buttons** — the Copy button now copies `status.commit` (the short SHA actually displayed in the `` element). A second Copy-full button surfaces `status.headSha` for git operations that need the 40-char SHA. Previously the single button silently copied the full SHA when extended was on, so what the user saw on screen was no longer what they pasted. - - **Detached HEAD no longer shows misleading "(not on main)"** — `git branch --show-current` returns empty on detached HEAD; the route now leaves `isOnIntegrationBranch` as `undefined` (not `false`) in that case, and the UI's "(not on )" sub-text only renders when we know we're on a different branch — not when we're on no branch at all. - -- d5cfa92: fix(dashboard): close 7 review findings on the extended-status hardening pass - - Follow-up to the prior fix commit; closes 7 more issues that an independent code review surfaced. - - **Settings inheritance regression (high)** — `SettingsModal.handleSave`'s non-model project branch lost the "only write if changed" gate when the prior commit added null-as-delete support. Result: every effective/inherited project key was being persisted as an explicit project override on every save, silently breaking inheritance across ~30+ keys. Restored the `value !== initialProjectValue` gate, matched against the model-lane branch's existing pattern. - - **Git Manager `Local vs origin` card showed misleading "Synced" in remote-only mode** — when `integrationTipSource === "remote-only"`, both `aheadOfOriginIntegration` / `behindOriginIntegration` are deliberately undefined (there's no local branch to compare), but the card's render fell through to `(ahead ?? 0) === 0 && (behind ?? 0) === 0 → "Synced"`. Now renders an explicit "no local tracking" sub-text in that case, with a separate `HEAD vs origin/` card surfacing a meaningful distance. - - **`isIndexStale` extended to multi-hop and gated to integration-branch worktrees** — - - - Walks up to 16 `refs/heads/` reflog entries so an A→B→C burst whose middle sync also missed is detected (the prior check only consulted `@{1}`). - - Only fires when `isOnIntegrationBranch === true`. Previously, a feature-branch worktree whose HEAD happened to descend from `@{1}` (e.g. `git switch -c hotfix main@{N}`) would trip the stale-index warning despite being perfectly healthy. - - **`enumeration-failed` auto-sync events no longer dropped** — the new `(taskId, newSha)` join filter required both `worktreePath` and `newSha` on every auto-sync event, which discarded the merger's early-failure events that emit neither. Now: events with both fields use the per-advance pair-key (with macOS realpath canonicalization on both sides); events with neither use a task-id fallback so the diagnostic outcome still surfaces on the matching advance. - - **`aheadOfIntegration` no longer silently shifts semantics** — split into three distinct distance fields so consumers don't have to read `integrationTipSource` to know which comparison they got: - - - `aheadOfIntegration` / `behindIntegration` — HEAD vs **local** integration tip; undefined when only the remote tip exists. - - `aheadOfIntegrationRemote` / `behindIntegrationRemote` — HEAD vs `origin/`; defined whenever the remote tracking ref exists. - - `aheadOfOriginIntegration` / `behindOriginIntegration` — local integration tip vs `origin/`; defined only when both refs exist. - - **`currentBranch` failure no longer masks wrong-branch state** — `git branch --show-current` returns empty on detached HEAD (success) and throws on transient git errors (lock contention, timeout). The prior catch collapsed both into `currentBranch = ""` so the UI couldn't distinguish them. New `currentBranchDetectionFailed?: boolean` field on `GitStatus` lets the UI surface "branch detection unavailable" on a real failure rather than silently hiding the wrong-branch warning. - -- 916047c: feat(dashboard): Integration branch setting is now a dropdown of local branches with Custom… fallback - - Replaces the plain text input with a `