diff --git a/.changeset/desktop-pg-migrations-packaging.md b/.changeset/desktop-pg-migrations-packaging.md deleted file mode 100644 index 9b906749ea..0000000000 --- a/.changeset/desktop-pg-migrations-packaging.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@runfusion/fusion": patch ---- - -summary: Fix packaged desktop app crashing on first boot because PostgreSQL migrations were missing from the build. -category: fix -dev: "@fusion/core's bare tsc build never copies src/postgres/migrations/*.sql into dist; the CLI compensates in packages/cli/tsup.config.ts but the desktop staging did not, so packaged Local mode crashed schema init (ENOENT dist/postgres/migrations/0000_initial.sql) after embedded Postgres started. packages/desktop/scripts/workspace-tools.ts now stages the migrations in buildCore(), re-stages them into the pnpm-deploy closure in stageDesktopDeploy(), and fails the build via verifyCoreMigrationsStaged() if the baseline migration is absent. Fixed in 6e5bb5d3d." diff --git a/.changeset/gh-4-pr-merge-repo-resolution.md b/.changeset/gh-4-pr-merge-repo-resolution.md deleted file mode 100644 index f2c43d03b5..0000000000 --- a/.changeset/gh-4-pr-merge-repo-resolution.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@runfusion/fusion": patch ---- - -summary: Fix PR-mode auto-merge failing with "Could not determine repository" in centrally-installed multi-project deployments. -category: fix -dev: processPullRequestMergeTask, createGroupPrCallback, and createPrNodeGithubOps now pass explicit owner/repo (resolved from the per-project cwd / task worktree) into findPrForBranch/createPr/mergePr instead of relying on GitHubClient.resolveRepo's process.cwd() fallback; the engine's buildRespondCallback resolves the review-response run cwd from the task's recorded worktree. Fixes Tchori-Labs/Fusion#4; non-workspace sibling of upstream #1924/FN-7610. diff --git a/CHANGELOG-archive.md b/CHANGELOG-archive.md index 7febb5791a..e58db4ccf2 100644 --- a/CHANGELOG-archive.md +++ b/CHANGELOG-archive.md @@ -14134,6 +14134,14 @@ for reference. - Updated dependencies [a2ed6d0] - @runfusion/fusion@0.1.0 +## 0.39.27 + +### @fusion/i18n + +#### Patch Changes + +- @fusion/core@0.70.1 + ## 0.39.26 ### @fusion/i18n @@ -14345,6 +14353,14 @@ for reference. - @fusion/core@0.40.0 +## 0.11.53 + +### @fusion/droid-cli + +#### Patch Changes + +- @fusion-plugin-examples/droid-runtime@0.1.53 + ## 0.11.52 ### @fusion/droid-cli diff --git a/CHANGELOG.md b/CHANGELOG.md index ea5acae6e7..4b5e8260cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,310 +2,1203 @@ User-facing release notes aggregated across all packages. This file is auto-synced from each `packages/*/CHANGELOG.md` by `scripts/release.mjs` — do not edit by hand. -## 0.70.0 +## 0.70.1 ### Highlights - -- Require PostgreSQL storage and complete runtime parity across projects, archives, missions, plugins, and maintenance. -- Settings theme selector is merged into the current-theme row and lists every color theme. -- Refresh workspace dependencies before a full System panel rebuild. -- Show migration details once in the dashboard and system inbox after SQLite cutover. -- Bundle embedded PostgreSQL for zero-system-install local storage when DATABASE_URL is unset. - -### New - -- Settings theme selector is merged into the current-theme row and lists every color theme. -- Refresh workspace dependencies before a full System panel rebuild. -- Show migration details once in the dashboard and system inbox after SQLite cutover. -- Bundle embedded PostgreSQL for zero-system-install local storage when DATABASE_URL is unset. -- Default local backend is now embedded PostgreSQL; set FUSION_NO_EMBEDDED_PG=1 for legacy SQLite. -- Add a workflow setting to disable idle heartbeat task patrol. -- Show when Plan Review budget exhaustion needs approval and make the replan cap configurable. -- Chat agents and Grok CLI sessions now have board, delegation, web, and knowledge retrieval tools. -- Auto-retry executor tool-call failures before parking tasks. -- Optionally escalate an executor run to a stronger model or configured node after same-model retries are exhausted. -- Add a diagnostic summary and one-click "Retry with a different model/node" to the Task Failed banner. -- Add a Hide imported toggle that filters imported issues, PRs, and GitLab items from Import Tasks. -- Planning summary description now renders formatted markdown by default. -- Quick Add image attachments now show compact previews you can tap to open full-size in a resizable window. -- Add a dedicated fallback model lane for the AI merger, configurable under Project Models. -- Pin up to 3 chat conversations to keep important ones at the top. -- Add a read-only tool to review a task's full agent log from chat. -- Task-detail chat now proactively narrates step progress, failures, and review outcomes in real time. -- Planning Mode now previews the generated plan before you choose whether to refine it. -- Show a Reverted badge on completed tasks whose changes were rolled back. -- Add a setting to write generated task definitions in the operator's supported input language. -- Dashboard keyboard shortcuts now toggle — re-press a shortcut to close its interface. -- Add a global option to skip confirmation dialogs for critical actions. -- Add an executor fallback model and retry the primary model before blocking on fallback exhaustion. -- Triage-detected duplicate tasks are now blocked for a Keep/Delete decision instead of auto-deleted. -- Add a Create fix task button on failed PR checks in the GitHub import preview. -- Add planner clarification controls with ntfy and mailbox alerts. -- Add a per-task Merger model and thinking selection to the Quick Add model dropdown. -- Split backup settings into global Database Backups and project Memory Backups. -- Show a local codebase token estimate and on-disk size on the project Dashboard Overview. -- Add a one-click "Restart Fusion" button to the update banner after an in-app update. -- Add a Refresh checks button to GitHub import PR previews for fresh CI status. -- Add a one-click "Restart Fusion" button to the Settings modal after an in-app update. -- Add three new dashboard color themes: Cobalt, Clay, and Moss. -- Show active task reasoning by default in Activity Live logs. -- Add Kimi K3 model selection and token-cost support. -- Model dropdowns keep the provider header pinned while scrolling and let you collapse each provider list. -- Task detail action row now matches Quick Add — Eye icon for oversight, plus attach and GitHub-tracking buttons. -- Add tap-to-reveal names for mobile executor footer stats. -- Add Todo API read + create-task endpoints so scripts can turn a todo into a running task. -- Choose which quick-action tabs appear in the mobile footer nav. -- Let operators post GitHub issue comments directly from Import Tasks. -- Add a first-class Claude runtime that drives Claude Code over ACP. -- Remove the footer AI session pill; background progress now appears in the session notification banner. -- Reorder and add more mobile footer quick actions, applied in real time. -- The Import from GitHub screen now shows a status indicator while issues are being translated. -- GitHub import pages all open issues with Prev/Next; linked issues close when tasks reach Done. -- Auto-translate foreign-language GitHub issues in the Import Tasks panel, with a target language and model you choose. -- The GitHub import screen shows far more issues at once, and Import now sits under the issue you are reading. -- Imported GitHub and GitLab issues now carry their screenshots as task attachments, so agents can see them. -- Offer AI translation in Import Tasks when issue/PR content is not the dashboard language. -- Keep the operator's original task description at the top of generated PROMPT.md specs. -- Optional LLM session advisor for planner overseer (off by default; enable and set model to use). -- Command Center productivity, team, token, and tool analytics work on the PostgreSQL backend. -- Command Center workflow, GitHub-issue, signal, and live-snapshot analytics now work on the PostgreSQL backend. -- Goals work on the PostgreSQL backend — the Goals view and mission goal-links load instead of erroring. -- Generating insights works on the PostgreSQL backend — the insight run executor and stale-run sweeper run in PG mode. -- Insights work on the PostgreSQL backend — the Insights dashboard loads instead of erroring. -- Dashboard banner after SQLite auto-migration to PostgreSQL with backup location and help link. -- Mission autopilot runs on the PostgreSQL backend — missions advance automatically instead of autopilot being disabled. -- Missions work on the PostgreSQL backend — the Missions dashboard and goal→mission links load instead of erroring. -- Isolate projects sharing the embedded PostgreSQL cluster — tasks, config, and archived tasks are scoped per project. -- Remove node settings sync on the PostgreSQL backend — nodes share the database, so settings are already shared. -- Remove task mesh replication entirely — nodes replicate through the shared PostgreSQL database. -- Research runs actually execute on the PostgreSQL backend instead of staying queued forever. -- Research works on the PostgreSQL backend — the Research dashboard loads and runs CRUD instead of erroring. -- Live dashboard updates (SSE) work on the PostgreSQL backend for missions, research, and insights. -- Creating, editing, and deleting custom workflows works on the PostgreSQL backend. -- Plans that need approval now also post a task-linked message to your dashboard mailbox. -- AI planning, subtask, and mission interviews are now multi-tab — any tab can use the same session. -- Add Quality plugin with Task QA tab for preview servers, test runs, reports, and suggested cases. -- Control the overseer session advisor from project settings, per task, and Quick Add. -- Settings search now finds and jumps to individual settings, and settings screens share one type scale. -- Pin each task to one derivable worktree directory when worktree naming is "Task ID". -- Todo lists now work on the embedded-PostgreSQL backend instead of erroring. +- Fixed packaged desktop app crashing on first launch due to missing PostgreSQL migrations +- Fixed PR-mode auto-merge failures in centrally-installed multi-project setups ### Fixed +- Packaged desktop builds no longer crash on first boot — the PostgreSQL migration files that power Local mode schema setup are now correctly bundled into the app. +- PR-mode auto-merge no longer fails with a "Could not determine repository" error when running centrally-installed, multi-project deployments; repository resolution now uses the correct per-project context instead of falling back to the wrong working directory. -- Suppress the Planning Mode reconnecting hint on persisted question screens. -- Hide the interview reconnecting hint on persisted question and review screens. -- Settings now uses the same compact color-theme dropdown as the dashboard. -- Restore agent models, workflow lanes, Skills, goals, and Reliability after PostgreSQL migration. -- A task honestly parked as blocked now stays parked through engine pause/abort and workflow-graph teardown. -- Fix agent AI interviews to use the configured planning model and preserve runtime suggestions. -- Show live phase, table, row-copy, verification, and failure progress during SQLite migration. -- Recover agent interviews when models return thinking-only or malformed JSON responses. -- Fix dashboard skill discovery lifecycle in PostgreSQL mode. -- Preserve late task, workflow, and mission fields during SQLite-to-PostgreSQL migration. -- Recover stale executor sessions with bounded fresh-session retries while preserving task progress. -- Settings now opens on the Appearance section by default. -- Fix startup failures and a leaked server when two Fusion processes start embedded Postgres at the same time. -- Repair macOS embedded PostgreSQL dylib compatibility links before startup. -- Starting a second Fusion process no longer fails with a Postgres lock-file error. -- Block empty-diff task finalizes that skipped verification steps so reverted work can't reach done. -- Reverted-work tasks no longer merge to done as empty no-ops; they park for review. -- Executors can end a genuinely-impossible task as "blocked" instead of laundering it into done. -- Dashboard API requests now resolve an explicit registered project instead of silently using the launch directory. -- Failed tasks with pre-fix promotion history can no longer auto-promote past the failure-provenance guard. -- Fix manual agent-run creation failing on PostgreSQL when a heartbeat executor is attached. -- Keep Anthropic subscription sessions connected by refreshing OAuth credentials with the correct client identity. -- Fix Anthropic subscription logins failing tasks with "Provider is not configured: anthropic". -- Fix protected image artifacts so previews and links load in authenticated dashboards. -- Fix a dashboard/app boot crash on databases created before the bulk-completion-refusal change. -- Fix startup failures when several projects migrate against one PostgreSQL cluster at the same time. -- Stop more agents from running than the global concurrency cap allows. -- The task composer's Save button no longer has its label cut off on mobile. -- Fix first-boot SQLite migration failures while preserving all legacy project data. -- Fix data stores that silently failed against PostgreSQL by hitting removed SQLite paths. -- Plan Review revisions no longer loop forever; tasks escalate to approval after repeated revises. -- Completed Planning Mode sessions that create multiple tasks now stay in planning history. -- Prevent startup crashes while recovering plugins from retained SQLite data. -- Fix task refinement/duplication, merge verification, and workflow checkpoint persistence on PostgreSQL. -- Harden session-routing header wiring so a missing model-auth method can't break agent startup. -- Fix tasks getting stuck in Planning forever after a plan review asks for revisions. -- Fix branch-group controls for tasks in non-default dashboard projects. -- Prevent implementation-incomplete workflow merge failures from false-completing as no-op done. -- Stop posting two completion comments on a linked issue when a task is both imported and tracked. -- Fusion self-repo issues now actually show the target release version when a task closes. -- Grok CLI failures now show the actual error instead of an empty chat message. -- Fix a deleted Planning Mode session silently reappearing after an in-flight generation finishes. -- Fix plugin skill toggles for custom skillFiles paths so sessions honor them. -- Fix Compound Engineering plugin skills missing from the published package. -- Reports, CLI Printing Press, and WhatsApp Chat plugins now load from global installs. -- Pressing "New session" in Planning now always focuses the compose input. -- Give terminally failed planning tasks deterministic fallback titles. -- Make idle triage patrol back off during model outages. -- Fix Project Models workflow model lane saves. -- Surface duplicate-decision tasks on cards and in the operator mailbox. -- Tasks parked by a refused fn_task_done no longer resurrect and strand at code review. -- The planner overseer now notices a failed in-progress task immediately instead of after two hours. -- Honor custom project workflow defaults in triage guidance. -- Hide the GitLab import tab when GitLab integration is disabled in settings. -- Fix Agents controls panel overlapping surrounding content on narrow viewports. -- Fix concurrency sliders being undraggable on mobile touch devices. -- Chat "Thinking" reasoning blocks now start collapsed for a cleaner transcript. -- Exclude long engine pauses from in-progress task execution time. -- Fix Mailbox artifact messages — "Open artifact" now loads without an auth error and "View task" opens the task. -- Transient provider failures of the Plan Review gate no longer bounce tasks back to planning. -- GitHub import skips prior issues after description edits or owner/repo casing changes. -- Fix task chat showing a stale agent message while generating a new reply. -- Move project summarization model controls next to summarization settings. -- Chat agents no longer switch your checked-out branch unless you ask. -- Prevent inline Code Review steps from failing before they can run. -- The GitHub/GitLab Import Tasks screen now marks an issue, PR, or item as "Imported" immediately after importing it. -- Show the underlying error message for failed tool calls in the task Activity feed. -- Auto-merge now retries AI provider blips instead of permanently failing the task. -- AI merge rejections now say why, and a stranded merge can be retried without waiting. -- Concurrent soft-delete during a heartbeat move no longer strands an agent in error. -- Quick Add overseer, priority, fast, GitHub, and attach icons now render at one uniform size. -- Plan Review now backs off and pauses on provider rate limits instead of retrying every 30s for hours. -- Plan Review no longer loops forever on reviewer retry storms — it fails the task with a clear error. -- Concurrency slider current-use dots now line up with the running-count value on the dashboard and footer. -- Fix already-approved plans being re-asked for approval after recovery. -- Task-detail popups now open in — and stay scoped to — the view where you opened them. -- Move the room thinking-effort control from the room header into the composer Brain icon next to attach. -- Fix dashboard secondary text labels rendering an unintended color from an undefined CSS token. -- Ensure required database schemas always initialize before plugin tables on boot. -- Per-task token budgets now enforce — soft caps alert once and hard caps pause the task. -- Planning Mode and interview questions now render markdown formatting correctly. -- Fix chat room messages rendering out of chronological order. -- Auto-summarized task titles now match the language of the task description. -- Keep task deletion confirmations visible until users explicitly choose an action. -- Preserve GitLab import tracking metadata when tasks are read or restored. -- Embedded PostgreSQL now boots on hosts with a 64MB /dev/shm. -- Preserve GitLab import tracking metadata in normal task reads. -- Keep the Settings GitHub star counter up to date with a lightweight, in-view refresh. -- Archiving a task now deletes its git worktree so pinned worktrees no longer leak. -- Mobile "More" navigation drawer now closes with a swipe-down gesture. -- GitHub import "Close issue" button is now red and asks for confirmation before closing. -- Align mobile Settings provider cards with the section header's left edge. -- Fix fn backup and scheduled database backups in the default embedded PostgreSQL setup. -- Show the CLI Binary panel in default Settings instead of behind the Advanced switch. -- Keep Quality hub actions visible beneath the title on mobile. -- Fix tasks stalling when a leftover git branch collided with a new worktree. -- Keep agent reads responsive by reusing the host TaskStore across extension loads. -- Archiving a workspace task now removes its per-sub-repo worktrees. -- Quick Add action buttons are no longer shrunk in shadcn themes. -- Make Respecify replan tasks across workflow board layouts. -- Fix excessive right padding in the task detail Feed on mobile. -- Quick Add action buttons read at a proper size on mobile. -- Fix lopsided right padding in the task detail view on mobile. -- Don't show tasks as failed with Retry while an automatic transient retry is pending. -- Group each workflow model fallback lane directly under its primary lane in Settings. -- Stop tasks that are still being planned from being moved to Todo prematurely. -- Keep task-card action menus open and usable after they receive keyboard focus. -- Align the bundled pi coding-agent SDK to the ModelRuntime API so the engine builds. -- Fix heartbeat multiplier so long-cadence agents stop false-flagging as stale or zombie. -- Quick Add action buttons read at a proper size on mobile. -- Refinement tasks now inherit the default workflow's optional review steps. -- Fix lopsided right gutter in the task detail view on mobile. -- Keep mobile task delete confirmations open through synthesized ghost clicks. -- Task status badge now reads "Replan" instead of the raw "needs-replan" token. -- Move task Merge Details from Plan to the done-only Summary tab. -- Add spacing below the Settings theme selector before the Font Size section. -- Make global npm installs reliable by pinning the @earendil-works/pi-* version set. -- Stop fn dashboard from making macOS rename its own local hostname over mDNS. -- Prevent transient credential-file lock contention from terminating provider runs. -- Mission feature validator now inspects the merged commit and defers instead of false-failing on branch divergence. -- Correct duplicate delegation ownership and add engine task reassignment. -- Reject messages addressed to nonexistent agent recipients. -- Task detail toolbar is now icon-only and matches Quick Add — fixes the mis-sized oversight icon on mobile. -- Quick Add Deps/Models/Agent icons no longer render oversized on mobile. -- Remove the gap above the pinned provider header in model dropdowns so list rows no longer show through while scrolling. -- The overseer eye badge no longer appears on in-progress/in-review tasks when oversight is off. -- Closed GitHub tracked issues now reliably link the landing commit. -- GitHub-import auto-translate now translates issues on every page, not just the first 50. -- Fix the task-detail attach-file icon when the Definition tab is not open. -- Mobile Kanban board now magnetically snaps to a single column when you swipe between columns. -- The board card overseer eye icon now hides when a task's oversight is off, matching the task detail. -- Stop now disables the session advisor, and its on/off state correctly updates the task-detail oversight icon. -- Mobile "More" menu now pins Settings to the bottom below the divider. -- Hide the task-card overseer eye when the selected workflow has oversight turned off. -- fn db migrate now stamps migrated rows so tasks, config, and workflow settings stay visible after a cutover. -- Fix the mobile task detail panel being shifted left with a dead gutter on the right. -- Restore provider usage, workflow routing, and failed-task stability after PostgreSQL migration. -- Fix clean-CI packaging for bundled Quality and PostgreSQL plugins. -- Fix cramped GitHub/GitLab import detail header and show translated titles in its title bar. -- GitHub/GitLab import translations now persist across app restarts. -- Auto-recover tasks whose workflow step hits a missing or recycled worktree instead of parking them failed forever. -- Stop abandoned AI-session prompts when planning and interview generations are aborted. -- Preserve and isolate bundled plugin state during the PostgreSQL cutover. -- Stop re-asking approval for plans approved before the Original Description update. -- Keep Global and Project MCP settings bound to their own scopes in the Settings UI. -- Cancelling a merging task now stops it immediately instead of stalling for 30 minutes. -- Block a zero-change task from completing when its executor last failed with work unfinished. -- Fix cross-project data mixups by separating a record's owning project from PostgreSQL isolation. -- Stop logging a false "operator action required" pause-abort failure on tasks that already merged and completed. -- Fix Artifacts, Documents, and Evals dashboard views returning 500 in PostgreSQL mode. -- Stop PostgreSQL-mode boots from opening and checkpointing the legacy SQLite files. -- Fix startup failure where the SQLite → PostgreSQL migration aborted on CE session timestamps. -- Fix engine failing to connect after the PostgreSQL migration with "Project not found". -- Bind dashboard/serve stores to the central project registry instead of relying on cwd identity. -- CLI agent tools now boot PostgreSQL instead of the removed SQLite runtime. -- Standalone CLI, GitLab analytics, and plugin stores now run on PostgreSQL. -- Root project-scoped PostgreSQL stores and merges at the project directory, and fix backend-mode agent watching. -- Fix post-insert task rollback and add GitLab tracking reconcile. -- Mailbox — sending a message to an agent works in PG mode instead of erroring. -- Fix empty task board after the PostgreSQL migration when booting via fn dashboard. -- Fix SQLite → PostgreSQL migration silently skipping legacy camelCase tables. -- Preserve PostgreSQL jsonb defaults when legacy SQLite rows contain NULL. -- Preserve legacy empty JSON text during PostgreSQL cutover. -- Not-yet-ported features (missions, insights, research, goals) degrade cleanly in PG mode instead of erroring. -- Regression storm-guard and agent wake-on-message work on the PostgreSQL backend. -- Fix PostgreSQL-mode merge recovery, lost task-field writes, first-boot SQLite auto-migration, and backup tool discovery. -- Incident-signal ingestion records incidents on the PostgreSQL backend instead of being skipped. -- Workflow definitions load in PG mode — /api/workflows no longer errors. -- Fix Planning Mode getting stuck retrying and re-asking a question that was already answered. -- Fix PostgreSQL-mode crashes — agent-log flush no longer kills the server, and Command Center activity loads. -- Ensure PostgreSQL-backed CLI commands release project resources before exiting. -- Fix task creation dropping the workflow selection when a workflow and step toggles are submitted together. -- Fix custom workflow columns on PostgreSQL: tasks land in their workflow's intake column and can move out of it. -- Fix residual SQLite store constructions so chat, messages, backups, MCP secrets, and project setup work on PostgreSQL. -- Make PostgreSQL cutover fail safely and preserve project-scoped core data. -- Restore PostgreSQL persistence across bundled workflows and integrations. -- Keep multi-node management connected to the active PostgreSQL registry. -- Restore stalled-review badges, timed-execution totals, and fresh-agent-log stall suppression on board listings. -- Keep the quick-add Save button inline with its icon controls and center the control rows on mobile. -- Make SQLite cutover converge when multiple registered projects share embedded PostgreSQL. -- Quiet repetitive scheduler hold-release and task-routing lines that flooded the engine log pane. -- Merge autostashes no longer pile up in `git stash list`, and untracked work in them is never dropped. -- Stop reviewer rate limits and network blips from looping and spamming the task log. -- Safely classify and resolve whitespace-only merge conflicts. -- Prevent bundled plugin commands from delaying or crashing the Fusion CLI on spawn failures. -- Settings: consistent checkbox theming, inline help moved behind "?" icons, mobile ntfy help bubble fix. -- Block tasks that skip unreviewed steps after a completion refusal from auto-promoting to review. -- Self-healing no longer promotes a failed/refused task into review after its work was reverted. -- Preserve legacy migration data and isolate PostgreSQL records, task IDs, and merge queues by project. -- Stop triage Plan Review from looping to the replan cap by converging the spec reviewer. -- A task actively re-executing can no longer launder an empty reverted branch into done. -- Fix WhatsApp Chat plugin failing to connect (405 rejection) and its bundled build failing to load. -- Embedded Postgres now boots on Windows when Fusion runs elevated, fixing the Windows installer build. -- Fix workflow settings and prompt overrides appearing reset after the PostgreSQL migration. +## 0.70.0 -### Breaking +### @fusion/core -- Require PostgreSQL storage and complete runtime parity across projects, archives, missions, plugins, and maintenance. +#### Patch Changes -### Performance +- be55d0a: summary: Fix dashboard skill discovery lifecycle in PostgreSQL mode. + category: fix + dev: Reuse and close backend-aware project stores, keep request-scoped discovery loaders from mutating persistent plugin runtime state, and make cluster-wide PostgreSQL runtime-role creation race-safe. -- Keep Planning session history visible while its latest data loads. -- Make local `pnpm build` skip unchanged packages and use fast CLI packaging by default. -- Speed up dashboard and serve startup by sharing the PostgreSQL store and deferring non-route work. -- Make task deletion return faster while cleanup continues in the background. -- Speed up board listing and agent chat on PostgreSQL with SQL-side pagination and a conversation history cap. -- Fix PostgreSQL performance and credential-redaction gaps surfaced by the migration review. +### @fusion/dashboard -### Internal +#### Patch Changes -- Deprecate the built-in Coding (Ideas) workflow — it no longer appears for new task selection. -- Deprecate the built-in Brainstorming workflow — it no longer appears for new task selection. -- Plan Review now allows more automatic replan attempts (default 8) before asking a human. -- Multi-node fleets on shared Postgres no longer replicate tasks or settings over mesh HTTP. +- Updated dependencies [be55d0a] + - @fusion/core@0.61.0 + - @fusion/engine@0.61.0 + - @fusion/i18n@0.39.26 + - @fusion-plugin-examples/claude-runtime@0.1.1 + - @fusion-plugin-examples/cli-printing-press@0.1.43 + - @fusion-plugin-examples/compound-engineering@0.1.26 + - @fusion-plugin-examples/dependency-graph@0.1.57 + - @fusion-plugin-examples/grok-runtime@0.2.4 + - @fusion-plugin-examples/omp-runtime@0.1.1 + - @fusion-plugin-examples/quality@0.1.1 + - @fusion-plugin-examples/roadmap@0.1.45 + - @fusion-plugin-examples/cursor-runtime@0.1.45 + - @fusion-plugin-examples/droid-runtime@0.1.52 + - @fusion-plugin-examples/hermes-runtime@0.2.76 + - @fusion-plugin-examples/openclaw-runtime@0.2.76 + - @fusion-plugin-examples/paperclip-runtime@0.2.76 + +### @fusion/desktop + +#### Patch Changes + +- Updated dependencies [be55d0a] + - @fusion/core@0.61.0 + - @fusion/dashboard@0.61.0 + - @fusion/engine@0.61.0 + +### @fusion/engine + +#### Patch Changes + +- Updated dependencies [be55d0a] + - @fusion/core@0.61.0 + - @fusion/pi-claude-cli@0.61.0 + +### @fusion/plugin-sdk + +#### Patch Changes + +- Updated dependencies [be55d0a] + - @fusion/core@0.61.0 + +### @runfusion/fusion + +#### Minor Changes + +- 945d629: summary: Show migration details once in the dashboard and system inbox after SQLite cutover. + category: feature + dev: Persists banner dismissal and inbox-delivery markers with a Discord support link. +- c15c78f: summary: Bundle embedded PostgreSQL for zero-system-install local storage when DATABASE_URL is unset. + category: feature + dev: Adds `embedded-postgres` lifecycle manager (initdb/pg_ctl start/stop, graceful SIGTERM/SIGINT shutdown, data persistence across restarts). Platform binaries bundled for macOS/Linux/Windows arm64/x64. Used by `createTaskStoreForBackend` when DATABASE_URL is unset. +- a242f1b: summary: Require PostgreSQL storage and complete runtime parity across projects, archives, missions, plugins, and maintenance. + category: breaking + dev: Remove FUSION_NO_EMBEDDED_PG and sync runtime fallbacks; legacy SQLite files remain one-time migration inputs only. +- c15c78f: summary: Default local backend is now embedded PostgreSQL; set FUSION_NO_EMBEDDED_PG=1 for legacy SQLite. + category: feature + dev: `createTaskStoreForBackend` now boots embedded PostgreSQL by default when DATABASE_URL is unset (previously required FUSION_EMBEDDED_PG=1). FUSION_EMBEDDED_PG=1 is now a no-op alias; FUSION_NO_EMBEDDED_PG=1 is the opt-out back to legacy SQLite. `embedded-postgres` is now a direct dependency of @runfusion/fusion so the bundled CLI can resolve the platform binary at runtime. Boot smoke exercises the embedded path by default (initdb-aware 180s health timeout). Also hardens three backend-mode gaps the flip exposed: ResearchStore/insights router/watch() now degrade gracefully instead of crashing `fn serve` when the sync SQLite satellite stores are unavailable in PG backend mode. +- c0bef0b: summary: Deprecate the built-in Coding (Ideas) workflow — it no longer appears for new task selection. + category: internal + dev: builtin:coding-ideas is excluded from defaultEnabledBuiltinWorkflowIds() and hidden from listWorkflowDefinitions via the shared DEPRECATED_BUILTIN_WORKFLOWS registry / isBuiltinWorkflowDeprecated helper; it remains resolvable by id for existing task selections. Applied only after a preflight verified no active task (including parked ideas in the `ideas` intake column) selects it. +- 1c02e68: summary: Deprecate the built-in Brainstorming workflow — it no longer appears for new task selection. + category: internal + dev: builtin:brainstorming is excluded from defaults and listWorkflowDefinitions through the deprecation registry/helper, but remains resolvable by id. Applied after a successful live-store query verified no active task selects it. +- e46ffeb: summary: Show when Plan Review budget exhaustion needs approval and make the replan cap configurable. + category: feature + dev: Adds a number-typed workflow setting (unset → falls back to PLAN_REVIEW_GATE_REPLAN_CAP) read in triage blockAfterPlanReviewRevise; adds a distinct TaskCard/ListView badge + TaskDetailModal callout gated on awaitingApprovalReason === "plan-review-replan-cap". +- 667f4c8: summary: Chat agents and Grok CLI sessions now have board, delegation, web, and knowledge retrieval tools. + category: feature + dev: Dashboard chat and room responders share a safe coordination toolset; destructive agent lifecycle tools remain excluded. +- 60b6e3e: summary: Auto-retry executor tool-call failures before parking tasks. + category: feature + dev: Adds project-scoped bounded retry settings, durable PostgreSQL claim state, and same-model retry auditing. +- d870878: summary: Optionally escalate an executor run to a stronger model or configured node after same-model retries are exhausted. + category: feature + dev: New opt-in project settings provide one model/node escalation attempt with durable task state and audit events. +- 96b1f21: summary: Add a diagnostic summary and one-click "Retry with a different model/node" to the Task Failed banner. + category: feature + dev: TaskDetailModal now renders the banner for all failed tasks (including errorless), surfaces the latest tool_error detail (FN-7995), and applies model/node overrides via updateTask before re-running the existing retry path. +- adcba0e: summary: Add a Hide imported toggle that filters imported issues, PRs, and GitLab items from Import Tasks. + category: feature + dev: GitHubImportModal renders a persisted per-project hideImported toggle in the list-pane header (and the GitLab toolbar/header); when on, imported rows (importedUrls predicate) are excluded from the issues/pulls/GitLab render sets while the "{n} imported" count still reflects the full fetched set, with a dedicated all-imported empty state. Toggle persists via GitHubImportPersistedState.hideImported. +- 72378cb: summary: Quick Add image attachments now show compact previews you can tap to open full-size in a resizable window. + category: feature + dev: QuickEntryBox/TaskForm/InlineCreateCard pending-image previews shrink via InlineCreateCard.css and open in the shared FloatingWindow (dedicated floating-window--image-preview class, full-screen on mobile); remove button stays a separate click target. +- 5b4ec4c: summary: Add a dedicated fallback model lane for the AI merger, configurable under Project Models. + category: feature + dev: New project settings mergerFallbackProvider/mergerFallbackModelId/mergerFallbackThinkingLevel; resolveMergerFallbackModel resolves project merger-fallback → global fallbackProvider/fallbackModelId. Every merger session builder consumes the resolved merger fallback pair and lane-specific fallback thinking; unset keys preserve existing behavior. +- e87b51b: summary: Pin up to 3 chat conversations to keep important ones at the top. + category: feature + dev: Adds nullable chat_sessions.pinned_at (self-heals on boot); PATCH /chat/sessions/:id accepts `pinned`; ChatStore.setSessionPinned enforces the max-3 per-project-scope limit (null projectId scoped as "default" via isNull predicate + non-null advisory-lock key) with a per-scope advisory lock; archiving clears pinnedAt on both archive paths and archived sessions cannot be pinned. +- 274318a: summary: Per-task token budgets now enforce — soft caps alert once and hard caps pause the task. + category: fix + dev: Wires persist-time enforcement and token-budget notifications; budgets exclude cache-read tokens. +- 3f133e0: summary: Add a read-only tool to review a task's full agent log from chat. + category: feature + dev: New `fn_task_logs_read` tool reads TaskStore logs with type filtering and runtime-normalized pagination across agent lanes and the pi extension. +- c2475b0: summary: Task-detail chat now proactively narrates step progress, failures, and review outcomes in real time. + category: feature + dev: Adds bounded, secret-redacted engine status narration across step-session, default execution, graph review, and legacy review paths. +- f3b68c9: summary: Planning Mode now previews the generated plan before you choose whether to refine it. + category: feature + dev: The deepening checkpoint PlanningQuestion carries an optional planPreview payload. +- 99b79e4: summary: Show a Reverted badge on completed tasks whose changes were rolled back. + category: feature + dev: Persists clean and already-reverted git outcomes in source metadata for task-card rendering. +- 19ab7a9: summary: Add a setting to write generated task definitions in the operator's supported input language. + category: feature + dev: `taskDefinitionInInputLanguage` localizes prose only; headings, markers, and code stay English. Supports es/fr/ko/zh-CN, normalizes Chinese to zh-CN, and falls back to English for unsupported or uncertain input. +- 5661582: summary: Dashboard keyboard shortcuts now toggle — re-press a shortcut to close its interface. + category: feature + dev: Shortcut handlers in useDashboardKeyboardShortcuts + App.tsx now dispatch toggle callbacks (open on first press, close/revert on re-press). Modal-backed shortcuts use existing nav-aware closers; view-backed shortcuts (Settings/Command Center) retain the exact revert callback pushed by handleTaskViewChange, removeNav it, and restore the captured prior view (not board), so both shortcut-opened and UI-opened views close without leaking a browser-back entry. +- f63818a: summary: Add a global option to skip confirmation dialogs for critical actions. + category: feature + dev: New global setting `skipConfirmationDialogs` (default false); when on, `ConfirmDialogProvider` resolves confirm/confirmWithChoice/confirmWithCheckbox to the primary/default choice without rendering the dialog. Toggle in Settings → Global → General. Reset-task guards in TaskCard/TaskDetailModal/ListView migrated to the useConfirm seam. +- 1a337df: summary: Add an executor fallback model and retry the primary model before blocking on fallback exhaustion. + category: feature + dev: Adds executionFallbackProvider, executionFallbackModelId, and executionFallbackThinkingLevel workflow settings. +- 5f70447: summary: Triage-detected duplicate tasks are now blocked for a Keep/Delete decision instead of auto-deleted. + category: feature + dev: New project setting `triageDuplicateResolution` (`prompt` default | `keep` | `delete`) gates triage explicit-duplicate-marker handling and links the existing decision banner to the duplicate. +- 68583b5: summary: Add a Create fix task button on failed PR checks in the GitHub import preview. + category: feature + dev: Reuses createTask with an auto-composed PR and check context prompt (FN-8110). +- fd03666: summary: Add planner clarification controls with ntfy and mailbox alerts. + category: feature + dev: Adds the disabled-by-default agentClarificationEnabled setting and session override. +- e72629c: summary: Add a per-task Merger model and thinking selection to the Quick Add model dropdown. + category: feature + dev: Per-task merger model and thinking overrides are persisted and honored by merger sessions. +- c6be0b1: summary: Split backup settings into global Database Backups and project Memory Backups. + category: feature + dev: Moves autoBackup settings to global scope and routes in-process backup commands through the canonical global backup root. +- 4df5c62: summary: Show a local codebase token estimate and on-disk size on the project Dashboard Overview. + category: feature + dev: New GET /api/projects/:id/codebase-metrics; calibrated cl100k_base pre-tokenization estimator with separate bounded source/disk domains, symlink-safe local traversal, two-minute caching, and granular shared B/KB/MB/GB formatting. +- 255e9c1: summary: Add a one-click "Restart Fusion" button to the update banner after an in-app update. + category: feature + dev: Reuses POST /api/system/restart via requestSystemRestart and the SystemInfoResponse.restartSupported capability flag; button degrades to a disabled state with a manual-restart note when unsupervised. +- 6f99fdb: summary: Add a Refresh checks button to GitHub import PR previews for fresh CI status. + category: feature + dev: Refresh evicts the selected pull-detail cache entry and guards stale cache writes (FN-8137). +- e7c5de0: summary: Add a one-click "Restart Fusion" button to the Settings modal after an in-app update. + category: feature + dev: Adds a capability-aware restart affordance to SettingsModal's footer update-success state; reuses POST /api/system/restart via requestSystemRestart and restartSupported, with a disabled manual-restart fallback when unsupervised. +- 07e1ceb: summary: Add three new dashboard color themes: Cobalt, Clay, and Moss. + category: feature + dev: Extends ColorTheme with synchronized dark/light token blocks and selector swatches. +- 26cb0cc: summary: Add Kimi K3 model selection and token-cost support. + category: feature + dev: Aligns pi SDK consumers to 0.80.10 and verifies native `kimi-coding:k3` catalog availability. +- 3fdc2c1: summary: Model dropdowns keep the provider header pinned while scrolling and let you collapse each provider list. + category: feature + dev: CustomModelDropdown gains CSS sticky provider headers and a per-provider collapse chevron persisted to localStorage (key fusion-dashboard-model-dropdown-collapsed-providers). +- 7b54095: summary: Add Todo API read + create-task endpoints so scripts can turn a todo into a running task. + category: feature + dev: New `/api/todos/:id`, `/api/todos/:id/items`, `/api/todos/items/:id`, and `POST /api/todos/items/:id/create-task` routes in todo-routes.ts; AsyncTodoStore gains getList/getItem/listItems; create-task validates title/priority/workflowId/assignedAgentId, honors body projectId scoping, and delegates to TaskStore.createTask with source.sourceType="api". +- d6860b5: summary: Choose which quick-action tabs appear in the mobile footer nav. + category: feature + dev: Adds project setting `mobileNavPrimaryItems` (ordered list of the seven selectable canonical nav-item ids: command-center, tasks, agents, missions, chat, mailbox, planning); MobileNavBar renders primary tabs from it and routes omitted selectable destinations to the More sheet. Default reproduces the prior order. +- 86c281b: summary: Let operators post GitHub issue comments directly from Import Tasks. + category: feature + dev: Adds gh-first and token REST fallback comment posting with optimistic preview updates. +- adb3eb3: summary: Add a first-class Claude runtime that drives Claude Code over ACP. + category: feature + dev: New bundled `fusion-plugin-claude-runtime` (provider `claude-cli`, runtime `claude`) composes the pinned `claude-code-cli-acp` bridge and is additive to experimental `pi-claude-cli` Route A. +- 9152d8f: summary: Remove the footer AI session pill; background progress now appears in the session notification banner. + category: feature + dev: Deletes BackgroundTasksIndicator and its footer wiring. The banner now shows non-planning generating and retained error sessions; planning remains in its docked view and nav badge, while cli-agent progress is observational to avoid a dead Resume action. +- 44c7842: summary: Reorder and add more mobile footer quick actions, applied in real time. + category: feature + dev: Refines mobileNavPrimaryItems with an expanded destination registry, ordered settings controls, and immediate preview state. +- 1d0feb2: summary: GitHub import pages all open issues with Prev/Next; linked issues close when tasks reach Done. + category: feature + dev: The import picker (GitHubImportModal) fetches up to 300 open issues in one request and pages the result client-side at 30/page with Prev/Next controls and a page indicator; a truncation notice appears past the cap. NewTaskModal's reference picker limit rose 30→100. GitHubClient.listIssues now pages the REST path (per_page loop until limit/exhaustion, PR-filtering no longer stops paging early) and lifts the gh path's 100 cap (gh --limit paginates internally); gh-CLI label filtering fetches the full cap before client-side OR filtering. Separately, the GitHub-tracking reconcile sweep now isolates its three passes in runSweep so a throw in one pass no longer silently starves the others — previously a failure in the first pass disabled the entire close-on-Done backstop, leaving linked/imported issues open; failures are now logged instead of swallowed. +- 0863c0f: summary: Auto-translate foreign-language GitHub issues in the Import Tasks panel, with a target language and model you choose. + category: feature + dev: New project settings `githubImportAutoTranslate` (default false) and `importTranslateTargetLocale`, plus an `import-translate` model lane (project `importTranslateProvider`/`importTranslateModelId`, global `importTranslateGlobalProvider`/`importTranslateGlobalModelId`) resolved by `resolveImportTranslateSettingsModel`. Translations persist in the new `project.import_translation_cache` table (migration 0010) keyed by project+repo+issue+locale+source hash, and are pruned when an issue closes. `POST /api/github/issues/auto-translate` translates the 50 most recent open foreign issues per load on its own rate-limit budget; both single and batch import read the cache so imported tasks carry the translated title/body. Language detection moved from the dashboard app to `@fusion/core` so the panel and server share one heuristic. Auto-translation runs in the background and streams in chunks of 8 (`AUTO_TRANSLATE_CHUNK_SIZE`), so list titles fill in progressively and one failed chunk cannot discard the page; nothing in the panel awaits it. The two controls live in Settings -> Project General using that section's native checkbox/select markup, and Settings search advertises translation terms for General plus the Project/Global Models lane. +- 5ab46a6: summary: The GitHub import screen shows far more issues at once, and Import now sits under the issue you are reading. + category: feature + dev: Provider, type tabs, origin, filter and Load collapse into one wrapping control row (chrome 93px -> 70px at 412px; ~9 -> ~13 issues visible). Load is icon-only (label kept as aria-label/title). The labels filter is a popover whose trigger doubles as its readout, so collapsing never hides applied state; dismisses on outside pointerdown or Escape (stopPropagation so the modal survives). Origin stays visible as an inline chip. Import moves out of the preview header into a bottom action bar alongside Close issue, and the list footer's duplicate Import is removed — the footer keeps only Cancel, so an issue can no longer be imported without opening it. Obsolete `flex: 1 1 100%` mobile stacking on the toolbar zones removed. +- 203557e: summary: Imported GitHub and GitLab issues now carry their screenshots as task attachments, so agents can see them. + category: feature + dev: `importIssueImageAttachments` (packages/dashboard/src/issue-image-attachments.ts) downloads images embedded in an issue's body and comments and stores them via `addAttachment`, wired into `POST /github/issues/import`, `POST /github/issues/batch-import`, and every GitLab import route via `importItem`. Provider differences sit behind an `ImageImportPolicy`: GitHub images are absolute URLs on a fixed host allowlist; GitLab `/uploads/...` are project-relative and restricted to the configured instance origin. GitLab note bodies come from the new read-only `GitLabClient.listNotes`. Extraction runs on the original (untranslated) body; downloads are capped at 10 images / 5MB each with a 15s timeout, authenticated per provider (gh CLI token / PRIVATE-TOKEN), and best-effort so a failed image or comment fetch never fails the import. +- bc2d22d: summary: Offer AI translation in Import Tasks when issue/PR content is not the dashboard language. + category: feature + dev: Adds POST /api/ai/translate-text and opt-in Translate/Show original controls in the GitHub/GitLab import preview; translation is display-only and does not change imported task text. +- 8fe122d: summary: Keep the operator's original task description at the top of generated PROMPT.md specs. + category: feature + dev: Deterministic `## Original Description` injection on AI-planned finalize and non-AI generateSpecifiedPrompt; planning templates instruct verbatim copy. +- 4f03767: summary: Optional LLM session advisor for planner overseer (off by default; enable and set model to use). + category: feature + dev: OMP-advisor parity — OverseerEmissionGuard, delta runtime, OVERSEER.md/WATCHDOG.md. Gate: plannerOverseerAdvisorEnabled (default false) plus provider/model ids. Lifecycle supervisor unchanged. +- c15c78f: summary: Command Center productivity, team, token, and tool analytics work on the PostgreSQL backend. + category: feature + dev: Ports aggregateProductivityAnalytics/aggregateTeamAnalytics/aggregateTokenAnalytics/aggregateToolAnalytics to accept Database | AsyncDataLayer, adding a PG branch ("ping" in dbOrLayer) that runs schema-qualified raw SQL over project.tasks/task_commit_associations/pull_requests/agents/usage_events/approval_request_audit_events with snake_case columns and the same aggregation semantics as the SQLite path. The command-center tokens/tools/productivity/team routes pass getAsyncLayer() ?? getDatabase() and await; the interim 503 guards are removed. GitHub-issue, signal, and live-snapshot analytics remain 503 in PG mode (follow-up). Adds command-center-analytics.pg.test.ts to test:pg-gate. +- c15c78f: summary: Command Center workflow, GitHub-issue, signal, and live-snapshot analytics now work on the PostgreSQL backend. + category: feature + dev: Ports aggregateWorkflowAnalytics/aggregateGithubIssueAnalytics/aggregateSignalsAnalytics/composeLiveSnapshot to accept Database | AsyncDataLayer, adding a PG branch ("ping" in dbOrLayer) that runs schema-qualified raw SQL over project.tasks/task_workflow_selection/workflows/incidents/cli_sessions/agent_runs with snake_case columns and the same aggregation semantics as the SQLite path. The command-center workflows/github/signals/live routes pass getAsyncLayer() ?? getDatabase() and await; the interim 503 guards are removed. Every /api/command-center/\* route now functions in backend mode. Adds command-center-remaining-analytics.pg.test.ts to test:pg-gate. +- c15c78f: summary: Goals work on the PostgreSQL backend — the Goals view and mission goal-links load instead of erroring. + category: feature + dev: Ports GoalStore to the AsyncDataLayer. Adds AsyncGoalStore (over the existing async-goal-store.ts helpers; ACTIVE_GOAL_LIMIT enforced atomically in the helpers' transactionImmediate, same as sync). getGoalStoreImpl returns it in backend mode; the dashboard /api/goals routes await it and the interim 503 is removed. Reverts the PG-mode goal-resolution degradations added earlier — mission routes and `fn mission` now resolve/validate real linked goals on both backends. CLI goals/mission/extension and engine agent-tools converted to await; goal-injection-diagnostics stays on its instanceof-guarded sync fallback. Adds goal-store.pg.test.ts to test:pg-gate. +- c15c78f: summary: Generating insights works on the PostgreSQL backend — the insight run executor and stale-run sweeper run in PG mode. + category: feature + dev: Await-converts the insight run executor (insight-run-executor.ts) and the stale-run sweeper (insight-run-sweeper.ts) and widens their store type to InsightStore | AsyncInsightStore, so POST /api/insights/run and /runs/:id/retry drive the async store instead of throwing 503 (getSyncInsightStore removed). The startup/background/drive-by sweeper is now enabled for both backends. The AI extraction step still needs a configured provider at runtime; a run without one records a clean failed run rather than 503. Adds insight-run-execution.pg.test.ts (create→complete, create→fail, retry-with-lineage against embedded PG) to test:pg-gate. +- c15c78f: summary: Insights work on the PostgreSQL backend — the Insights dashboard loads instead of erroring. + category: feature + dev: Ports InsightStore to the AsyncDataLayer. Adds AsyncInsightStore (wrapping async-insight-store.ts helpers, incl. 6 new helpers — updateInsight, updateInsightRun [faithful run-lifecycle state machine: terminal-immutable, transition validation, auto completed/cancelled timestamps], listInsightRunEvents, countInsights, countInsightRuns, listStalePendingRuns); getInsightStoreImpl returns it in backend mode; dashboard insights routes await it and the interim 503 is removed for the read/write/cancel surface. The 3 engine reporters stay on graceful fallback (instanceof-gated). Known partial: AI insight-run generation/retry (POST /run, /runs/:id/retry) and the stale-run sweeper remain sync-only and still 503 in PG mode until the run executor is ported. Adds insight-store.pg.test.ts to test:pg-gate. +- c15c78f: summary: Dashboard banner after SQLite auto-migration to PostgreSQL with backup location and help link. + category: feature + dev: startup-factory persists settings.sqliteMigrationNotice (migratedAt/rows/tables/sqliteBackups) after a successful first-boot auto-migration; SqliteMigrationBanner renders it once, dismiss persists dismissed:true via PUT /settings. Auto-migration now also stamps archive.archived_tasks.project_id. +- c15c78f: summary: Mission autopilot runs on the PostgreSQL backend — missions advance automatically instead of autopilot being disabled. + category: feature + dev: Await-converts MissionAutopilot to drive MissionStore | AsyncMissionStore (every this.missionStore.\* call awaited; watchMission/unwatchMission/getAutopilotStatus and helpers async) and removes the instanceof MissionStore gates in InProcessRuntime (construction + recover paths) so the autopilot loop watches/recomputes/recovers in both backends. Slice execution + validator-loop methods stay scheduler-gated (degrade gracefully in PG). getAutopilotStatus async ripples through mission-routes/server. Adds mission-autopilot.pg.test.ts to test:pg-gate. +- c15c78f: summary: Missions work on the PostgreSQL backend — the Missions dashboard and goal→mission links load instead of erroring. + category: feature + dev: Ports MissionStore (dashboard surface) to the AsyncDataLayer. Adds AsyncMissionStore (63 methods over the 71 existing async helpers + 8 new primitives), assembling the composites (getMissionWithHierarchy, listMissionsWithSummaries, mission/milestone health rollups, computeMissionStatus + the feature→slice→milestone→mission recompute cascade, triageFeature, getFeatureLoopSnapshot) by mirroring the sync store. getMissionStoreImpl returns it in backend mode; mission-routes + goal→mission routes await it and the interim 503 is removed (the GoalStore 503 stays — GoalStore is still deferred). Mission AUTOPILOT, live SSE mission events, mesh hierarchy snapshot apply/collect, and engine validator-loop methods stay degraded in PG mode behind instanceof guards. Also fixes the mission-create path which resolved linked goals via the unported sync GoalStore: goal resolution now degrades to empty in backend mode (links live in MissionStore; full Goal objects return once GoalStore is ported). Adds mission-store.pg.test.ts to test:pg-gate. +- c15c78f: summary: Isolate projects sharing the embedded PostgreSQL cluster — tasks, config, and archived tasks are scoped per project. + category: feature + dev: PR #2007 (Approach A) — project_id partition key on project.tasks/project.archived_tasks/archive.archived_tasks with taskProjectScope threaded through every scan/claim/count; per-project config rows; startup factory binds the AsyncDataLayer to options.projectId; drift self-heal generalized to schema-qualified entries; archived-board reads scoped (review P1 fix). +- c15c78f: summary: Remove node settings sync on the PostgreSQL backend — nodes share the database, so settings are already shared. + category: feature + dev: In backend mode the mesh sync route ignores inbound settings payloads and returns none; PeerExchangeService force-disables settings gossip; /nodes/:id/settings (fetch/push/pull/sync-status) and /settings/sync-receive answer 409 code settings-sync-disabled-postgres; the NodesView sync hook treats that 409 as a quiet steady state (no chips, no polling). Provider auth sync (/nodes/:id/auth/sync, auth-receive/auth-export) is intentionally kept — auth material is per-machine file state, not database state. +- c15c78f: summary: Remove task mesh replication entirely — nodes replicate through the shared PostgreSQL database. + category: feature + dev: POST /mesh/tasks/create is deleted (with applyReplicatedTaskCreate and the replicated-create payload helpers); /mesh/sync shared-state is reduced to projectSettings (legacy sqlite settings sync only) + authMaterial in both directions, and the task-metadata/mission/agent/agent-run/activity-log/run-audit snapshot machinery is removed from the stores; /mesh/task-ids/\* never forwards to a remote coordinator in backend mode (the shared distributed_task_id_state rows are the coordinator). Peer topology exchange unchanged. +- c15c78f: summary: Research runs actually execute on the PostgreSQL backend instead of staying queued forever. + category: feature + dev: Await-converts the engine ResearchOrchestrator + ResearchRunDispatcher to drive InsightStore | AsyncResearchStore (every this.store.\* call awaited; addEvent→appendEvent for union compatibility) and removes the instanceof ResearchStore gate in ProjectEngine.start that disabled the orchestrator/dispatcher in PG mode. Exports AsyncResearchStore from @fusion/core. A queued run now advances queued→running→completed/failed in PG; the AI/web step still needs runtime providers (a run with none fails cleanly). Adds research-execution.pg.test.ts to test:pg-gate. +- c15c78f: summary: Research works on the PostgreSQL backend — the Research dashboard loads and runs CRUD instead of erroring. + category: feature + dev: Ports ResearchStore to the AsyncDataLayer. Adds AsyncResearchStore (12 new helpers incl. faithful replicas of the run-lifecycle state machine — updateResearchStatus per-status auto-lifecycle fields, terminal-immutability, transition validation — and the retry gate/lineage in createResearchRetryRun); getResearchStoreImpl returns it in backend mode; dashboard research routes await it and the interim 503 is removed. AI research EXECUTION (engine ResearchOrchestrator/dispatcher, agent-tools research tools, CLI research run) stays degraded in PG mode behind instanceof guards — same boundary as the insight run executor. Adds research-store.pg.test.ts (13 tests incl. lifecycle machine + retry gate) to test:pg-gate. +- c15c78f: summary: Live dashboard updates (SSE) work on the PostgreSQL backend for missions, research, and insights. + category: feature + dev: The async store wrappers (AsyncMissionStore/AsyncResearchStore/AsyncInsightStore) now extend EventEmitter and emit the same events as their sync counterparts at the same mutation points (after the persistence await), so the SSE handler's subscriptions fire in PG mode instead of no-op'ing. sse.ts/server.ts drop the instanceof-sync narrowing and subscribe to the union store in both backends. Live push for mission/milestone/slice/feature/assertion/validator-start, research run lifecycle, and insight create/update events. Validator-loop-completed and fix-feature emits remain sync-only (those methods aren't in AsyncMissionStore yet). +- c15c78f: summary: Creating, editing, and deleting custom workflows works on the PostgreSQL backend. + category: feature + dev: Completes the workflow-definition write path in PG. Adds a next_workflow_definition_id counter to project.config (schema + 0000_initial.sql baseline) with an async counter (nextWorkflowDefinitionIdAsyncImpl) that preserves project settings on bump; createWorkflowDefinitionImpl gains a backend branch that INSERTs into project.workflows via Drizzle (ir/layout as jsonb objects). Complements the update/delete/select backend branches in workflow-ops.ts. Adds workflow-create.pg.test.ts to test:pg-gate. +- 4e4b6be: summary: Plans that need approval now also post a task-linked message to your dashboard mailbox. + category: feature + dev: NotificationService.handleTaskUpdated writes a `system`-typed mailbox message via `MessageStore.sendMessageOnce` (idempotency key `plan-approval:`) on the awaiting-approval transition, alongside the existing ntfy push. Content links to the task using `buildNtfyClickUrl(ntfyDashboardHost, projectId, taskId)`; `system` type avoids re-triggering the `message:agent-to-user` ntfy pipeline. Covers both the manual plan gate and the plan-review-replan-cap escalation. +- cdf67c1: summary: AI planning, subtask, and mission interviews are now multi-tab — any tab can use the same session. + category: feature + dev: Removed the per-tab session lock end to end: the `/ai-sessions/:id/lock{,/force,/beacon}` routes, `checkSessionLock` on every planning/subtask/mission/milestone route, the store's acquire/release/force/holder/stale-release methods and their `@fusion/core` async helpers, the `useSessionLock` hook, the `getSessionTabId` util, the Take Control overlay + "active in another tab" banners, and the `useAiSessionSync` tab-ownership half (activeTabMap, broadcastLock/Unlock/Heartbeat, owningTabId). `tabId` params are gone from the session API client; routes ignore any tabId older clients still send. The persisted session row is the single source of truth, with per-session SSE plus global `ai_session:updated` events keeping tabs current and each producer's generation-in-progress guard resolving concurrent writes. The `ai_sessions.locked_by_tab`/`locked_at` columns are retained as dead, always-NULL columns — dropping them is an irreversible migration that would break older installed binaries whose upsert names those columns. +- e3f9825: summary: Add Quality plugin with Task QA tab for preview servers, test runs, reports, and suggested cases. + category: feature + dev: Bundled fusion-plugin-quality; host slot task context; superviseSpawn re-exported from plugin-sdk-core-runtime-shim. +- 4f03767: summary: Control the overseer session advisor from project settings, per task, and Quick Add. + category: feature + dev: Adds `sessionAdvisorEnabledByDefault` project setting, `task.sessionAdvisorEnabled` override, Quick Add eye toggle, and `resolveTaskSessionAdvisorEnabled` (task override → project default; workflow `plannerOverseerAdvisorEnabled` is a legacy/master gate that can still enable when the project default is off — not the final inheritance fallback after project). +- 55745af: summary: Settings search now finds and jumps to individual settings, and settings screens share one type scale. + category: feature + dev: Sections render through the shared `settings/` row primitives (`SettingsToggleRow`/`SelectRow`/`NumberRow`/`TextRow`/`TextareaRow`) instead of hand-rolled `form-group`/`checkbox-label` markup; global `.form-group` is unchanged for the 35 non-settings files that use it. Search is indexed from per-section `Section.search.ts` entries aggregated in `settings/search/entries.ts`, replacing the hand-curated `searchableText` keyword arrays as the primary match path (keywords remain a fallback for unmigrated sections). `settings-search-index.test.ts` fails the build when a rendered descriptor `key` is missing from the index. Adds the missing `--font-size-sm`/`--font-size-md` tokens plus `2xs`/`lg`, which were referenced by 12 declarations but never defined. +- edc6413: summary: Pin each task to one derivable worktree directory when worktree naming is "Task ID". + category: feature + dev: `worktreeNaming: "task-id"` now enables task-pinned worktrees — a task always lives in `/` (derive → validate → reuse-or-recreate in `worktree-pinning.ts`/`worktree-acquisition.ts`), and stale/foreign `task.worktree` metadata self-corrects (audit `worktree:pin-rederived`) without consuming session retries. Task pinning and `recycleWorktrees` are mutually exclusive: enabling both is rejected at the settings-write boundary (`assertWorktreeNamingRecycleExclusive`, enforced in `store.updateSettings` + dashboard `PUT /settings`), the Settings → Worktrees UI enforces the exclusivity bidirectionally (disabling whichever control would create the conflict), and pinning applies only when recycling is off. `"random"`/`"task-title"` naming and the recycle pool are unchanged; worktrunk-managed layouts bypass pinning. +- c15c78f: summary: Todo lists now work on the embedded-PostgreSQL backend instead of erroring. + category: feature + dev: Ports TodoStore to the AsyncDataLayer. Adds an `AsyncTodoStore` class (in async-todo-store.ts) wrapping the already-tested async CRUD helpers over project.todo_lists/project.todo_items; `getTodoStoreImpl` returns it in backend mode instead of throwing "TodoStore is not available in PG backend mode" (which 500'd every /api/todos route). The dashboard todo routes now await the store methods so the same code path serves both the sync SQLite store and the async PG store. Adds todo-store.pg.test.ts to the blocking test:pg-gate lane. Known gap: the async store does not yet emit list/item events for SSE live-refresh (updates land on next read). + +#### Patch Changes + +- 80f2028: summary: Keep Planning session history visible while its latest data loads. + category: performance + dev: Planning fetches request only planning-type session summaries. +- 7daa16f: summary: Suppress the Planning Mode reconnecting hint on persisted question screens. + category: fix + dev: Gate the `planning.reconnecting` indicator in `PlanningModeModal` to `view.type === "loading"` so idle `awaiting_input`/DB-backed views render purely from persisted state. +- db05a77: summary: Hide the interview reconnecting hint on persisted question and review screens. + category: fix + dev: Gate the shared reconnecting indicator in MissionInterviewModal/MilestoneSliceInterviewModal to view.type === "loading" and in SubtaskBreakdownModal to view.type === "generating", mirroring FN-8002 so idle awaiting-input screens render purely from persisted state. +- 47f9aa7: summary: Settings now uses the same compact color-theme dropdown as the dashboard. + category: fix + dev: AppearanceSection/ThemeSelector reuse ThemeDropdown; the old .theme-grid affordance and orphaned CSS were removed. Shared swatch classes retained. +- 6206af8: summary: Settings theme selector is merged into the current-theme row and lists every color theme. + category: feature + dev: ThemeDropdown gains a current-row trigger variant used by ThemeSelector; the static preview markup/CSS was removed. Tests assert the explicit historical theme set on Settings and Command Center, including restored Shadcn Mono. +- 9b9d6a2: summary: Refresh workspace dependencies before a full System panel rebuild. + category: feature + dev: Full rebuilds run pnpm install before building and restarting. +- 2d61976: summary: Restore agent models, workflow lanes, Skills, goals, and Reliability after PostgreSQL migration. + category: fix + dev: Moves backend workflow, plugin, goal, and audit reads to PostgreSQL and recovers false heartbeat model parks. +- f116d05: summary: A task honestly parked as blocked now stays parked through engine pause/abort and workflow-graph teardown. + category: fix + dev: handleGraphFailure honors a live blocked park (status "failed", error "BLOCKED:") before every pause-abort/graph-failure classifier — no requeue-to-todo, no auto-continue, no BLOCKED: error overwrite — and releases its worktree/maxWorktrees slot. FN-8141 follow-up 1. +- 883f38d: summary: Fix agent AI interviews to use the configured planning model and preserve runtime suggestions. + category: fix + dev: Resolves onboarding model settings before session creation and aligns the prompt with supported runtime draft fields. +- 678265a: summary: Show live phase, table, row-copy, verification, and failure progress during SQLite migration. + category: fix + dev: Adds structured migration progress events to first-boot startup and `fn db migrate` terminal output. +- 514ccd3: summary: Recover agent interviews when models return thinking-only or malformed JSON responses. + category: fix + dev: Preserves structured thinking output and retries one JSON-only reformat turn before surfacing an error. +- be55d0a: summary: Fix dashboard skill discovery lifecycle in PostgreSQL mode. + category: fix + dev: Reuse and close backend-aware project stores, keep request-scoped discovery loaders from mutating persistent plugin runtime state, and make cluster-wide PostgreSQL runtime-role creation race-safe. +- 0312d2e: summary: Preserve late task, workflow, and mission fields during SQLite-to-PostgreSQL migration. + category: fix + dev: Adds PostgreSQL schema migration 0007 and restores runtime persistence for active late-added fields. +- 30a83f2: summary: Recover stale executor sessions with bounded fresh-session retries while preserving task progress. + category: fix + dev: Clears the persisted assistant-last transcript, defers requeue until lock release, and exhausts through the shared recovery budget. +- f111a40: summary: Settings now opens on the Appearance section by default. + category: fix + dev: Sets SettingsModal DEFAULT_SETTINGS_SECTION to appearance. +- 130c702: summary: Fix startup failures and a leaked server when two Fusion processes start embedded Postgres at the same time. + category: fix + dev: A lifecycle joining an already-running instance returned a URL before the owner's `ensureDatabase()` had created the database, so the joiner's first connect failed. Both join paths now verify the database on the joined instance's port (never `getPort()`, which prefers this instance's requested port) and create it if absent. Verification is best-effort so an unreachable/stale-pid join still resolves optimistically as before. `CREATE DATABASE` races tolerate both `42P04` and `23505` on `pg_database_datname_index`. The startup-race join now fires only on a lock-collision error — joining on any failure let a start that took the lock and then failed later join its own postmaster with `ownsProcess=false`, orphaning it — and reaps its own losing wrapper via the new `NonAdminServerHandle.stopWrapperOnly()`, since `stop()`/`pg.stop()` resolve through the shared data dir and would kill the winner. +- c15c78f: summary: Repair macOS embedded PostgreSQL dylib compatibility links before startup. + category: fix + dev: Adds an idempotent embedded-postgres macOS preflight that creates missing ABI-name symlinks such as `libpq.5.dylib` and `libzstd.1.dylib` from bundled versioned dylibs before `initdb`/`postgres` spawn, fixing zero-config startup when package symlink hydration is absent or incomplete. +- e33039a: summary: Starting a second Fusion process no longer fails with a Postgres lock-file error. + category: fix + dev: `EmbeddedPostgresLifecycle.start()` wraps the start path in a try/catch; on failure it re-reads `postmaster.pid` via `isAlreadyRunning()` and, when a live instance exists, joins it (`ownsProcess=false`) instead of surfacing the expected lock collision. Closes the window between the preflight singleton check and `pg.start()` where a competing process can create the lock. Non-`isAlreadyRunning` failures still rethrow unchanged. +- 19eb179: summary: Block empty-diff task finalizes that skipped verification steps so reverted work can't reach done. + category: fix + dev: Generalizes evaluateNoCommitsNoOpFinalize (packages/core) to block any zero-diff finalize when a step is skipped — verification/QA/review-named skips block unconditionally, other skips block unless every non-skipped step is done AND the task is noCommitsExpected. Applies at all finalize lanes (merger-ai empty lane, merger.ts, self-healing stranded-todo promoter + no-op review finalize). Closes the FN-8141 laundering path. +- 1c4fdb7: summary: Reverted-work tasks no longer merge to done as empty no-ops; they park for review. + category: fix + dev: merger-ai.ts empty-outcome lane now requires positive already-landed proof (recorded merge, prior no-op proof, branch tip ancestor of main, or a strong already-on-main classifier match) before finalizing a commit-expected task; otherwise it sets task.error, emits `task:empty-merge-finalize-blocked-no-landed-proof`, and moves the task back to todo. Same guard mirrored in the workspace all-empty finalize (blocks the reverted/net-zero shape). noCommitsExpected tasks keep their existing path (FN-8141). +- 9a37415: summary: Executors can end a genuinely-impossible task as "blocked" instead of laundering it into done. + category: fix + dev: fn_task_done gains outcome="blocked" (plus reason + optional blockedBy). Blocked parks the task failed (error "BLOCKED: "), bypasses the completion/bulk-completion gates, keeps steps in their true statuses, records blockedBy as task.dependencies, and emits run-audit task:execution-blocked-parked. Prompt guidance now names the blocked exit as the correct escape hatch, replacing skip-then-complete. Motivating incident: FN-8141. +- 9aa2852: summary: Dashboard API requests now resolve an explicit registered project instead of silently using the launch directory. + category: fix + dev: routes/context.ts gains a shared resolveRequestProjectId/getScopedStore/getProjectContext seam (request projectId → options.engine.getProjectId() → raw launch-dir store with a one-time warn, for unregistered dirs only). A resolved id always binds through the engine store or getOrCreateProjectStore; the launch project reuses the injected registry-bound store to avoid a duplicate pool. server.ts resolveScopedStore threads the launch project id, and the todo/goals/mission/insights/research/evals routers route their request middleware through the same seam. +- 46866a5: summary: Failed tasks with pre-fix promotion history can no longer auto-promote past the failure-provenance guard. + category: fix + dev: Removed the promoter's own recovery line ("Auto-recovered: task work was complete but stranded") from CLEAN_COMPLETION_MARKERS in completed-promotion-failure-provenance.ts; clean-completion evidence is now execution outcomes only (accepted/implicit fn_task_done). FN-8141 follow-up 2. +- e9f14bf: summary: Make local `pnpm build` skip unchanged packages and use fast CLI packaging by default. + category: performance + dev: Content-hash skip cache now covers non-plugin packages; CLI packaging stages desktop/plugins/DTS only with FUSION_CLI_FULL_PACKAGE=1 or CI (`pnpm build:full`). Added maxConcurrentVerifications (default 1) and tsc incremental builds. +- 05151a2: summary: Speed up dashboard and serve startup by sharing the PostgreSQL store and deferring non-route work. + category: performance + dev: Dashboard injects externalTaskStore for cwd engine (serve parity); multi-project engines only share when working directories match. ProjectEngine defers notifiers/OAuth (refresh-before-monitor), automation syncs, and merge sweep. Serve no longer awaits startAll before listen. Phase timing logs on both surfaces. +- c15c78f: summary: Fix manual agent-run creation failing on PostgreSQL when a heartbeat executor is attached. + category: fix + dev: POST /api/agents/:id/runs built its AgentStore without the scoped store's AsyncDataLayer on the heartbeat-executor branch, hitting the removed SQLite runtime in backend mode; it now borrows the layer like the record-only branch. +- 703488f: summary: Keep Anthropic subscription sessions connected by refreshing OAuth credentials with the correct client identity. + category: fix + dev: Corrects the Claude OAuth client ID used by the engine refresh request and adds request-contract coverage. +- 4b150e2: summary: Fix Anthropic subscription logins failing tasks with "Provider is not configured: anthropic". + category: fix + dev: pi >=0.80.8 moved session auth from `ModelRegistry.getApiKeyAndHeaders` (fusion's `getApiKey`) to `ModelRuntime.getAuth` -> pi-ai `resolveProviderAuth`, which reads `credentials.read("anthropic")` and refreshes OAuth via `credentials.modify("anthropic")`. Fusion stores the subscription login under `anthropic-subscription` (no raw `anthropic` row), so the refresh saw `current === undefined` and auth resolved to undefined. Fix: `createFusionCredentialStore.read("anthropic")` now resolves through `getApiKey("anthropic")` (handles refresh + raw/legacy/subscription/fallback precedence) and returns a ready `api_key` credential; pi-ai routes it as OAuth by the `sk-ant-oat` token prefix. Also add "not configured" to `isRetryableModelSelectionError` so an unresolved provider triggers the configured fallback model instead of hard-failing. +- 329fc1f: summary: Fix protected image artifacts so previews and links load in authenticated dashboards. + category: fix + dev: Artifact media URLs now use the existing same-origin query-token fallback required by browser image and link navigation. +- d1e9b56: summary: Fix a dashboard/app boot crash on databases created before the bulk-completion-refusal change. + category: fix + dev: PR #2260 added project.tasks.bulk_completion_refusal_at to the Drizzle model and the 0000 baseline but shipped no forward migration, so any pre-existing PostgreSQL database (already carrying the 0000 marker) never gained the column and crashed on the first TaskStore SELECT. Adds forward migration 0018 (wired via BULK_COMPLETION_REFUSAL_AT_VERSION, SCHEMA_BASELINE_VERSION → "0018"), a per-column upgrade regression test, and a migration-wiring-integrity guard (baseline marker must equal the highest migration file; every .sql must be registered). +- 4f03767: summary: Fix startup failures when several projects migrate against one PostgreSQL cluster at the same time. + category: fix + dev: Migration 0006's `fusion_runtime` setup used a check-then-CREATE ROLE that cannot be atomic — roles live in cluster-wide `pg_authid`, but the applier's `pg_advisory_xact_lock('fusion:schema-applier')` is per-database, so concurrent appliers on different databases of one cluster all saw the role as absent and raced, and the losers failed with 23505 on `pg_authid_rolname_index`. The create now tolerates losing the race (`EXCEPTION WHEN duplicate_object OR unique_violation`), catching the index-level violation the race actually raises as well as the plain duplicate. +- e97081f: summary: Stop more agents from running than the global concurrency cap allows. + category: fix + dev: Scheduler tryAcquires a shared slot before todo→in-progress and hands it to the executor/graph; triage admits planners against live running-agent claim (planning + in-progress + active in-review), not only semaphore.availableCount. +- 7aeefe2: summary: The task composer's Save button no longer has its label cut off on mobile. + category: fix + dev: At narrow widths `.quick-entry-primary-group` needed ~275px in a 260px column. Its five icon controls are floored by `min-width: 36px`, while Save's automatic minimum size was zeroed by the `overflow: hidden` that FN-7680/FN-7683 added for height equalization (per spec, automatic minimum size applies only when overflow is `visible`), making Save the sole shrinkable item — it absorbed the whole deficit and clipped its own label. Save is now pinned with `flex: 0 0 auto; min-width: max-content`, and the group may `flex-wrap: wrap` with `justify-content: flex-end` so a deficit reflows instead of clipping. Not breakpoint-scoped (FN-5751); inert where the row already fits. Verified in-browser at 412px and 1400px. +- 99870ba: summary: Fix first-boot SQLite migration failures while preserving all legacy project data. + category: fix + dev: Handles stale partitions, retired tables, derived FTS indexes, seeded singletons, and cross-database checksum collation. +- 5acea6c: summary: Fix data stores that silently failed against PostgreSQL by hitting removed SQLite paths. + category: fix + dev: Residual SQLite-stub sites reachable in backend mode are now routed through the AsyncDataLayer: the executor's authoritative assigned-agent fallback (executor.ts) now inherits the TaskStore asyncLayer (was silently returning null → model drift); `pruneAgentLogFilesAsync` replaces the sync self-healing prune call (was throwing every maintenance sweep); `cleanupOrphanedMaterializedSteps` deletes PG workflow_steps rows on failed create (was leaking); PG hard-delete now runs the async mission feature/task-link unlink (deleteTaskBackendImpl); `getWorkflowSettingsProjectId` no longer touches the SQLite stub for unscoped backend stores; the `fn plugin` unregistered-project fallback bootstraps a CentralCore AsyncDataLayer. Formerly-unported paths are now real backend implementations: `cleanupArchivedTasks` and `deleteWorkflowStep` delete via the async layer; `AgentStore.importLegacyFileRuns` cleanly no-ops in backend mode (no legacy SQLite run-files exist there); the dead zero-caller `applyTaskPatch` SQLite primitive was removed. +- bc34834: summary: Plan Review revisions no longer loop forever; tasks escalate to approval after repeated revises. + category: fix + dev: The triage pre-execution plan-review gate now seeds replan feedback from the plan-review REVISE output in workflowStepResults and caps consecutive REVISE replans at 3 (new planReviewReplanCount counter — a plan_review_replan_count integer column on the PostgreSQL tasks table, self-healing on existing embedded-PG databases via postgres-health), routing the task to awaiting-approval instead of looping. +- 3fce536: summary: Completed Planning Mode sessions that create multiple tasks now stay in planning history. + category: fix + dev: The multi-task create-tasks route now uses releaseSession instead of cleanupSession, retaining the persisted ai_sessions row like the single-task path. +- 78ef307: summary: Prevent startup crashes while recovering plugins from retained SQLite data. + category: fix + dev: Runs the plugin bridge before switching PostgreSQL connections to the restricted runtime role. +- daa34fb: summary: Fix task refinement/duplication, merge verification, and workflow checkpoint persistence on PostgreSQL. + category: fix + dev: atomicCreateTaskJson now routes to the AsyncDataLayer in backend mode (fixing the refineTask/duplicateTask createTaskWithId paths that bypassed \_createTaskInternal's backend routing), and the merger verification-cache ops (getVerificationCacheHit/recordVerificationCachePass) are now async with a PostgreSQL branch; the upsert targets verification_cache_pkey by constraint name since migration 0006 rebuilds project-schema PKs to lead with project_id. The full sync-SQLite residue sweep also ports workflow run-branch/step-instance persistence, branch progress, plugin column-transition hooks, getTaskColumns, getWorkflowStep/listWorkflowSteps stored-row reads, readRawProjectSettings, and listWorkflowPromptOverridesForProject to the async layer (several store methods became async: saveWorkflowRunBranch, loadWorkflowRunBranches, clearWorkflowRunBranches, saveWorkflowRunStepInstance, loadWorkflowRunStepInstances, clearWorkflowRunStepInstances, getBranchProgressByTask, readRawProjectSettings, listWorkflowPromptOverridesForProject). Also bumps @earendil-works/pi-ai and pi-coding-agent to ^0.80.10 — the FN-8142 pi SDK migration targeted APIs (ModelRuntime et al.) absent from the previously pinned 0.80.6, which broke the engine build. +- f079245: summary: Harden session-routing header wiring so a missing model-auth method can't break agent startup. + category: fix + dev: attachSessionRoutingHeaders now no-ops (warns) when ModelRuntime.getAuth is absent instead of throwing on getAuth.bind, restoring the pre-FN-8142 defensive invariant. Also realigns the pi-create-fn-agent and pi-session-routing-headers engine tests to the ModelRuntime.getAuth routing seam (mocks add the ModelRuntime export) so both suites pass against the 0.80.10 SDK landed by FN-8179. +- 1d6a044: summary: Fix tasks getting stuck in Planning forever after a plan review asks for revisions. + category: fix + dev: `hasAdvancedPastPlanning` (replan-target.ts) counted `steps.length > 0` as proof a task had advanced past planning. Replan cards legitimately retain the steps their previous planning pass materialized, so the guard at triage's `specifyTask` claim silently skipped its `status:"planning"` write, re-claimed the card every poll, and starved healthy cards out of `maxTriageConcurrent`. Steps are no longer advancement evidence in a planner lane ("triage", or "todo" for plan-in-place workflows carrying a planning status); worktrees and execution/terminal columns still are, preserving FN-7977. The primary claim path now warns instead of skipping silently. +- 03966ec: summary: Fix branch-group controls for tasks in non-default dashboard projects. + category: fix + dev: Resolves branch-group route stores from each request's projectId. +- 5185914: summary: Prevent implementation-incomplete workflow merge failures from false-completing as no-op done. + category: fix + dev: Merge graph failures with missing implementation proof now fail closed or requeue resumable parsed steps before any no-branch no-op merge requester path can run. +- 1b9c7a7: summary: Stop posting two completion comments on a linked issue when a task is both imported and tracked. + category: fix + dev: A task can carry both linkages at once (GitHub adopts a sourceIssue as githubTracking.issue via `source_issue_linked`; GitLab's buildGitLabTaskProvenance always emits both), so with githubCommentOnDone/gitlabCommentOnDone on, the issue-comment and tracking-comment services both commented on the same issue. The issue-comment services now suppress themselves when the tracking service provably posts to the same target — matched on issue identity for GitHub (case-insensitive owner/repo + number) and by construction for GitLab (resolveGitLabTarget prefers the tracked item). The tracking comment wins because it carries commit/branch/PR/files plus the release lines. Tracking pointed at a different issue, tracking disabled/unlinked, and same-column re-emits (where the tracking service no-ops) all still post as before; the custom comment template no longer renders on tracked issues. +- 71275ab: summary: Fusion self-repo issues now actually show the target release version when a task closes. + category: fix + dev: FN-7575 added the release lines to `GitHubIssueCommentService`, which is gated on the `githubCommentOnDone` setting (default false, no Settings UI) and so never fired. `GitHubTrackingCommentService` is the surface that posts the "✅ Done —" comments. The version logic moved to a shared `fusion-release-version.ts` and now applies to all four done-comment surfaces (GitHub/GitLab × tracking/issue). Lines join `optionalLines` so they count against `DONE_COMMENT_MAX_LENGTH`; GitLab self-repo matching uses `item.projectPath`, since the resolved target prefers the numeric `projectId`. +- d48537b: summary: Grok CLI failures now show the actual error instead of an empty chat message. + category: fix + dev: `GrokRuntimeAdapter` surfaces every silent-failure path as visible `onText` text plus an assistant message and `state.errorMessage`, instead of resolving into a blank bubble. Covers session-create failure (`describeCreateFailure`, which returns a dead session), prompt failure (`describePromptFailure`), a dead/disposed session with no ACP connection on a follow-up turn, and a turn ending with a non-`end_turn` stopReason and no assistant text. A turn with genuinely empty assistant text stays silent. Resolve-never-reject is preserved so chat/executor always receive a well-formed turn. Fixes the root cause behind the FN-7779 "No message" placeholder. +- 6e0fde8: summary: Fix a deleted Planning Mode session silently reappearing after an in-flight generation finishes. + category: fix + dev: AiSessionStore now records a bounded-TTL delete tombstone (10 min) in `delete()`/`deleteByIdAndType()`/bulk cleanup paths; `upsert()` drops writes for tombstoned ids without emitting `ai_session:updated`. Fixes the root cause in the shared store rather than in `planning.ts`/`subtask-breakdown.ts`/`mission-interview.ts`/`milestone-slice-interview.ts`, so all AiSessionType producers are protected. +- 49a459a: summary: Fix plugin skill toggles for custom skillFiles paths so sessions honor them. + category: fix + dev: resolvePluginSkillEnabled now keys reads by the resolved plugin skillFiles path when available. +- 9bdbdc5: summary: Fix Compound Engineering plugin skills missing from the published package. + category: fix + dev: Stages bundled plugin src/skills into dist/plugins//skills during bundlePluginEntry() for #2094 / FN-7955. +- d956abc: summary: Reports, CLI Printing Press, and WhatsApp Chat plugins now load from global installs. + category: fix + dev: Stages the three plugins through bundlePluginEntry with postgresSchema shim coverage and bundle-output regression assertions. +- 16b0109: summary: Pressing "New session" in Planning now always focuses the compose input. + category: fix +- ddc8e6d: summary: Give terminally failed planning tasks deterministic fallback titles. + category: fix + dev: Adds non-LLM title derivation for terminal triage/specification failure paths. +- ec78981: summary: Make idle triage patrol back off during model outages. + category: fix + dev: Updates built-in standard and concise triage heartbeat prompt guidance. +- de25e32: summary: Add a workflow setting to disable idle heartbeat task patrol. + category: feature + dev: Adds plannerHeartbeatPatrolEnabled for no-task heartbeat and triage prompt gating. +- a8b6387: summary: Fix Project Models workflow model lane saves. + category: fix + dev: Keeps pending default-workflow model lane overrides registered for Settings Save after section navigation. +- 6ca7e48: summary: Surface duplicate-decision tasks on cards and in the operator mailbox. + category: fix + dev: Triage-marker duplicate decisions now use an idempotent task-linked system message. +- f1b528f: summary: Tasks parked by a refused fn_task_done no longer resurrect and strand at code review. + category: fix + dev: FN-7965. `fn_task_done`'s in-session refusal handler parks the row terminally (status=failed, worktree/branch/sessionFile cleared) once `MAX_TASK_DONE_REQUEUE_RETRIES` is exhausted, but the executor's no-fn_task_done retry loop never observed that park and spawned a fresh session. That session completed and marked the task done against a worktree-less row, so the pre-merge graph failed on the first write-capable node (`no-worktree-for-write-node`) and surfaced as a misleading "Workflow graph terminated with failure at node 'code-review-remediation'". The loop now re-reads state and honors the park (`terminallyParked`), stopping without requeue or review handoff — deliberately not routed through the FN-4806 reclaim branch, whose silent todo requeue would clear the park and re-park on next pickup in a todo→execute→park loop. The pre-existing reclaim probes could not catch this: they test `worktree === null`, but the store maps a cleared column to `undefined` (`task-store/serialization.ts` — `row.worktree || undefined`); tightening that probe is left as separate work. +- 0e84731: summary: The planner overseer now notices a failed in-progress task immediately instead of after two hours. + category: fix + dev: FN-7965. `deriveSignalAndSources`'s `executor` branch never read `task.status`, so a row parked `status: "failed"` (e.g. the terminal fn_task_done refusal/invariant park) reported `signal: "progressing"` with reason "Task is actively executing in-progress work". `failed` was only ever derived for the merger/pull-request stages, leaving the FN-7743 2h stall proxy (`columnMovedAt ?? updatedAt`) as the sole backstop. The branch now reports `failed`, which routes into the pre-existing failed-signal policy — `retry_step` at executor stage (sources are `agent-log`, never an ERROR_SOURCE_KIND), bounded by `PLANNER_RECOVERY_MAX_ATTEMPTS` and escalated on exhaustion. `paused` keeps precedence (operator/user-paused stays `blocked`), the reason is held constant so the FN-7577 `stage|signal|reason` feed dedup still holds, and `status` was added to `OverseerTaskRef`. +- f9c19f9: summary: Honor custom project workflow defaults in triage guidance. + category: fix + dev: `triageDefaultWorkflowId` and `triageDecisionOnlyWorkflowId` now accept custom IDs; unset/default triage routing inherits `config.settings.defaultWorkflowId`. +- 6e3a338: summary: Make task deletion return faster while cleanup continues in the background. + category: performance + dev: Defers branch cleanup and dashboard agent-binding release off the user-visible delete path. +- d893a02: summary: Hide the GitLab import tab when GitLab integration is disabled in settings. + category: fix + dev: Gates GitHubImportModal.tsx GitLab provider visibility on effective gitlabEnabled and coerces disabled persisted state to GitHub. +- aa0d863: summary: Fix Agents controls panel overlapping surrounding content on narrow viewports. + category: fix + dev: Elevated the .agent-controls-panel stacking context in AgentsView.css so the open controls popover sits above agent cards and token usage. +- 2179a61: summary: Fix concurrency sliders being undraggable on mobile touch devices. + category: fix + dev: The footer Engine Control menu and Command Center Concurrency card range inputs now use touch-action:none so the mobile pan-y ancestor lock no longer hijacks a horizontal thumb drag into page pan. +- d74018f: summary: Chat "Thinking" reasoning blocks now start collapsed for a cleaner transcript. + category: fix + dev: Removed the `open` attribute from TaskChatTab's task-chat-thinking
; StandardChatSurface already collapses thinking. Regression tests assert collapsed-by-default + expand-on-click across persisted, streaming, and Task Detail chat surfaces (FN-7974). +- 836e53c: summary: Exclude long engine pauses from in-progress task execution time. + category: fix + dev: Reuses FN-7011 active-timing reconciliation on full Global/Engine unpause. Engine-pause time is excluded even if in-flight agents continue, matching restart behavior. +- 5ff7a20: summary: Fix Mailbox artifact messages — "Open artifact" now loads without an auth error and "View task" opens the task. + category: fix + dev: artifactMediaUrl now appends the fn_token query fallback for authenticated element/link loads (script-capable HTML artifact iframes stay token-free); isTaskPopupVisibleForView no longer gates non-board/list popup opens and usePoppedOutTasks.popOut upgrades same-id entries. +- 214af98: summary: Transient provider failures of the Plan Review gate no longer bounce tasks back to planning. + category: fix + dev: workflow-graph-executor shouldRequestPreMergeFix + executor requestPreMergeOptionalStepFix now classify plan-review hard failures via isTransientError/isOperatorActionableAgentError/model-fallback signatures and skip the needs-replan handoff for non-plan-defect failures; genuine REVISE still replans. Fixes issue #2124 / FN-7977. +- 10b8045: summary: GitHub import skips prior issues after description edits or owner/repo casing changes. + category: fix + dev: Consolidated GitHub import dedup into shared isGitHubIssueAlreadyImported/buildGitHubIssueSource (sourceIssue-first, case-insensitive repository, source.sourceMetadata and description-URL fallbacks) used by both CLI import functions (runTaskImportGitHubInteractive and runTaskImportFromGitHub, now listing with slim:false), both extension tools, and dashboard single/batch routes; removed the description Source-URL-regex-only importedUrls dedup. +- b2977d1: summary: Fix task chat showing a stale agent message while generating a new reply. + category: fix + dev: TaskPlannerChatTab now clears streamingThinking and the streaming-assistant row on fresh generations while preserving attach-to-in-flight snapshots. +- d9843f7: summary: Move project summarization model controls next to summarization settings. + category: fix + dev: Dashboard Project Models layout only; no settings key or persistence changes. +- a167272: summary: Chat agents no longer switch your checked-out branch unless you ask. + category: fix + dev: Adds a branch-stickiness clause to CHAT_SYSTEM_PROMPT in packages/dashboard/src/chat.ts. +- 0b33281: summary: Plan Review now allows more automatic replan attempts (default 8) before asking a human. + category: internal + dev: Raised triage PLAN_REVIEW_GATE_REPLAN_CAP from 3 to 8 in packages/engine/src/triage.ts; escalation to awaiting-approval (awaitingApprovalReason "plan-review-replan-cap") now fires at 8 consecutive REVISE replans. +- dc7bb40: summary: Prevent inline Code Review steps from failing before they can run. + category: fix + dev: Shares workflow write-capability classification between graph preparation and runtime. +- e83116a: summary: The GitHub/GitLab Import Tasks screen now marks an issue, PR, or item as "Imported" immediately after importing it. + category: fix + dev: GitHubImportModal unions a local optimistic imported-URL set (populated in handleImport/handleImportGitLab success handlers, cleared on modal reset and on provider/owner/repo/GitLab-resource change) with the tasks-derived importedUrls at every consumer (rows, count labels, top/bottom/GitLab Import buttons), so a just-imported row shows the badge and disables re-import without waiting for the tasks prop round-trip. +- 3639169: summary: Show the underlying error message for failed tool calls in the task Activity feed. + category: fix + dev: tool_error agent-log entries now always persist bounded `detail` regardless of `persistAgentToolOutput`; TaskChatTab renders it in an expandable "Error" block. +- cae7847: summary: Auto-merge now retries AI provider blips instead of permanently failing the task. + category: fix + dev: ACP provider faults (`promptAcpSession` now preserves the JSON-RPC code as `acp rpc code -32603`) classify as transient via a new `ai-provider-turn-failure` class. `classifyTransientMergeError` also delegates to `isTransientError`, so the self-healing sweep and the inline retry gate share one definition — previously network errors got inline retries but were invisible to the sweep once parked `failed`. Pure predicates moved to the import-free leaf `transient-error-patterns.ts` (re-exported from `transient-error-detector.ts`) to keep the logger chain out of the classifier per FN-5627. Transient budgets raised: `MAX_AUTO_MERGE_TRANSIENT_RETRIES` 3→5, `MAX_TRANSIENT_MERGE_RECOVERIES` 2→5. +- 7b31d54: summary: AI merge rejections now say why, and a stranded merge can be retried without waiting. + category: fix + dev: Two FN-8004 follow-ups. (1) The review prompt said both "End with a single decision line" and "Then list each concrete reason as a bullet"; reviewers obeyed the former, so reasons landed above the verdict where `extractRejectReasons` never looked, degrading every rejection to "rejected the merge without a stated reason" — which was then fed to the corrective re-merge as its instruction. The parser now recovers reasons from either side of the verdict (inline → after → before, capped at 8) and the prompt ordering is unambiguous. (2) `isStaleMergeActiveStatus` moves to the leaf `merge-active-status.ts`, shared by `SelfHealingManager.recoverStaleMergingStatus` and the dashboard Retry gate, which previously refused every merge-active status; an orphaned `landing` stamp is now retryable by hand while a live merge (holding the lease or refreshing `updatedAt`) is still protected. +- 402b3a9: summary: Concurrent soft-delete during a heartbeat move no longer strands an agent in error. + category: fix + dev: New engine classifier isConcurrentSoftDeleteRaceError short-circuits the agent-heartbeat failed-run handler for TaskDeletedError races (agent stays active, budget untouched) and emits run-audit agent:heartbeat-move-skipped-soft-delete. +- a646ae3: summary: Quick Add overseer, priority, fast, GitHub, and attach icons now render at one uniform size. + category: fix + dev: QuickEntryBox primary-group icon-only buttons (Eye/EyeOff, PriorityIcon, Zap, GitHub ProviderIcon, Paperclip) all use the icon-only btn-icon treatment (--icon-size-sm) for a uniform 14px cluster; ProviderIcon sizeMap unchanged. +- 08a10bf: summary: Plan Review now backs off and pauses on provider rate limits instead of retrying every 30s for hours. + category: fix + dev: runPlanReviewBeforeExecution fires usageLimitPauser.onUsageLimitHit for usage-limit reviewer failures (the inline reviewStep catch hid them from triage's own handler) and re-parks via computeRecoveryDecision (60s/120s/240s, terminalizing at MAX_RECOVERY_RETRIES) instead of a fixed 30s nextRecoveryAt. The borrowed recoveryRetryCount budget is cleared on any real verdict. RetryStormError gains an optional cause, surfaced as underlyingError in serializeRetryStormError, so the cap no longer masks the real error. +- 71dd191: summary: Plan Review no longer loops forever on reviewer retry storms — it fails the task with a clear error. + category: fix + dev: runPlanReviewBeforeExecution now terminalizes RetryStormError (status "failed", serialized error, nextRecoveryAt cleared) instead of re-queuing plan-review-unavailable, which had let reviewerFallbackRetryCount climb unbounded past maxReviewerFallbackRetries. +- 66ae82a: summary: Concurrency slider current-use dots now line up with the running-count value on the dashboard and footer. + category: fix + dev: Match the current-use marker's native range coordinate mapping and thumb-size edge inset in CommandCenterControls and EngineControlMenu. +- 3dcb62f: summary: Fix already-approved plans being re-asked for approval after recovery. + category: fix + dev: Plan-approval fingerprint now ignores auto-injected ## Original Description / Frontend UX hygiene sections so finalizeApprovedTask idempotency survives on-disk PROMPT.md injection (FN-8008). Keeps approve-plan producer and manual-gate consumer hashing identical normalized content. +- 7cec078: summary: Task-detail popups now open in — and stay scoped to — the view where you opened them. + category: fix + dev: isTaskPopupVisibleForView now scopes by origin view for all views (not just Board/List); taskPopupsBoardListOnly defaults on and popups dedupe per (task id, origin view) so the same task can open independently in multiple views. Escape/keyboard close carries (taskId, originView) identity. FN-8016. +- a821bce: summary: Move the room thinking-effort control from the room header into the composer Brain icon next to attach. + category: fix + dev: Rooms now reuse ChatThinkingLevelControl in level-only mode (showTargetSection={false}); header