Commit Graph

12010 Commits

Author SHA1 Message Date
gsxdsm
e514e134da fix: apply project model lanes across workflows (#2400)
## Summary

Project workflow model lanes now apply to tasks on every workflow
instead of only tasks using the active default workflow. Model selection
consistently resolves task-specific choice -> project workflow baseline
-> global lane -> selected-workflow value -> project/global default for
primary models, fallback models, and thinking levels.

The active default workflow remains the storage owner for backward
compatibility, while runtime resolution keeps its project baseline
distinct from lower-priority selected-workflow values. Non-model
workflow policies remain isolated to their selected workflow.

## Validation

- Core workflow/model resolution: 60 tests passed
- Engine effective settings and session resolution: 59 tests passed
- Reviewer: 85 tests passed
- Scheduler: 154 tests passed
- Heartbeat: 90 tests passed
- Settings UI: 67 tests passed
- Workspace lint and core/engine/dashboard typechecks passed
- `pnpm verify:fast` passed workspace builds, the published CLI build,
and real `/api/health` boot smoke

---

[![Compound
Engineering](https://img.shields.io/badge/Built_with-Compound_Engineering-6366f1)](https://github.com/EveryInc/compound-engineering-plugin)


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

* **New Features**
* Added **Project workflow model lanes** to establish a project baseline
for model selection and thinking levels across workflows.
* Updated model/fallback resolution to account for task overrides,
project baselines, global lanes, and selected-workflow values.
* **Bug Fixes**
* Improved effective settings merging so project baselines are applied
correctly (including scheduled/idle and heartbeat flows) while
preserving selected-workflow provenance.
* **Documentation**
* Refreshed settings and dashboard guidance for workflow lane
inheritance and resolution precedence.
* **Tests**
* Expanded unit test coverage for lane precedence, fallback detection,
and thinking-level behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-22 08:53:31 -07:00
gsxdsm
71baf98855 fix(dashboard): center mobile Settings footer button cluster
Override the desktop edge-split footer on mobile so Help/Version, Import/Export/Reset, and Close sit as one evenly spaced centered group, with safe-center overflow and token gaps. Cover the layout in settings-mobile tests.
2026-07-22 08:33:48 -07:00
gsxdsm
4efa7b51c6 fix(dashboard): harden mobile board column snap direction and settle
Lock snap direction at finger-up from the net swipe, page only in that scroll direction, hard-jump and pin until the next touch so residual fling and CSS proximity no longer drift after settle.
2026-07-22 08:32:33 -07:00
flexi767
f21d3ce132 feat(core): support additive archived task documents (#2375)
## Summary

Re-lands the completed Fusion board task FX-005 on current upstream
`main`, stacked on #2374 (FX-004).

- adds a narrowly authorized additive publication path for archived task
documents
- preserves archived task and mission state and keeps ordinary
replacement/deletion writes rejected
- exposes retained archived current/revision reads
- requires project-scoped revision/hash CAS for publication
- maps malformed, unauthorized, missing, inconsistent, and stale states
safely
- rebases preserved dashboard drafts explicitly after CAS conflicts

## Why

Operators need to append a correction or evidence revision to an
archived task without unarchiving it or weakening ordinary archived-task
immutability.

## Dependency

This branch contains #2374 plus the eight FX-005 commits because
cross-fork PRs cannot target a fork-only base branch. After #2374 lands,
this PR should be rebased or refreshed so its diff collapses to FX-005
only.

## Validation

- PostgreSQL task-store and archived-default suites: 33/33
- dashboard route and editor suites: 321/321
- agent document tools: 22/22
- core, dashboard, and engine typechecks pass

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

## Summary by CodeRabbit

* **New Features**
* Added optimistic concurrency controls for task document creation and
editing using revisions and content hashes.
* Added safe, authenticated append-only corrections for documents
retained on archived tasks.
* Archived documents and revision history remain available for direct
reading.
* Agent and dashboard tools now report conflicts clearly and support
explicit draft rebasing.
* **Bug Fixes**
  * Prevented stale updates from overwriting newer document content.
* Preserved archived-task immutability while allowing controlled
corrections.
* **Documentation**
* Updated CLI, dashboard, storage, task-management, and agent guidance
for these workflows.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: fusion-merge-train <merge-train@topkoli.local>
Co-authored-by: Fusion <noreply@runfusion.ai>
Co-authored-by: v <v@v.speedport.ip>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 08:30:12 -07:00
gsxdsm
241a5c94ea chore: bump @earendil-works/pi to 0.81.1 (#2399)
## Summary
- Bump `@earendil-works/pi-ai` and `@earendil-works/pi-coding-agent`
from **0.80.10 → 0.81.1** (exact matched pins).
- Update `pnpm-workspace.yaml` overrides so floating `*` consumers
(`droid-cli`, `pi-llama-cpp`, runtime plugins) stay on the same
ModelRuntime surface.
- Refresh pin-guard tests, package-config assertions, and FNXC notes for
the new pin.

## What's new in pi 0.81.x
- Qwen Token Plan providers
- Expanded usage accounting (tools/compaction/branch summaries)
- Resilient compaction retries + retry lifecycle events
- Full provider-extension registration API
- Built-in llama.cpp router management
- Provider/catalog fixes (Bedrock env credentials, OpenAI Responses
early-stream retry, Codex 272K defaults, extension stream-fallback
restore)

## Test plan
- [x] `scripts/check-pi-versions-pinned` (4/4)
- [x] Typecheck: core, engine, dashboard, cli, pi-claude-cli
- [x] `package-config.test.ts` (35)
- [x] `provider-registration.test.ts` (14)
- [x] `auth-storage-concurrency` + `model-registry-refresh` (15)
- [x] `register-model-routes-kimi-k3-supplemental` (1)
- [ ] CI gate green
- [ ] Spot-check Anthropic OAuth + API key session
- [ ] Spot-check openai-codex model picker / supplemental models

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

## Summary by CodeRabbit

* **Updates**
  * Updated the bundled Pi runtime to version 0.81.1.
* Added support for newer models and providers, including Qwen Token
Plan.
  * Improved usage accounting and session reliability.
* Strengthened compaction retry handling and provider catalog accuracy.
  * Added support for the expanded maximum thinking level.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-22 01:32:14 -07:00
gsxdsm
ddb5c5eca4 FN-8481: enable GitHub tracking for Ideas tasks
Allow operators to manage GitHub tracking from Ideas intake and Coding (Ideas) task details.

- Permit GitHub tracking toggles in the Ideas column and the built-in Coding (Ideas) workflow.
- Cover fallback and resolved workflow metadata paths with dashboard tests.
- Add a patch changeset for the operator-facing capability.

Files changed:
 .changeset/fn-8481-ideas-github-tracking.md        |  7 ++++
 .../dashboard/app/components/TaskDetailModal.tsx   | 13 +++++--
 ...lModal.inline-editing-and-integrations.test.tsx | 40 ++++++++++++++++++++--
 3 files changed, 56 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-8481
Fusion-Task-Lineage: d267e203-bceb-492b-b218-8829406ef537
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-22 01:00:07 -07:00
gsxdsm
a9de6b27c5 FN-8482: remove ellipses from task card merging badges
Task cards now show compact active-merge status labels without ellipses.

- Strip terminal ellipses from active merge labels only in TaskCard.
- Cover every active merge status with no-ellipsis badge assertions.
- Add a patch changeset for the dashboard fix.

Files changed:
 .changeset/fn-8482-merging-badge.md                |  7 ++++++
 packages/dashboard/app/components/TaskCard.tsx     | 14 ++++++++---
 .../app/components/__tests__/TaskCard.test.tsx     | 29 +++++++++++++++-------
 3 files changed, 37 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-8482

Fusion-Task-Lineage: e084fda8-21bc-4c8b-b100-26d2f02635fc

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-22 00:49:13 -07:00
gsxdsm
8ab4241afd FN-8476: restore Ideas detail move action
Restore Coding (Ideas) task-detail moves to Todo while preserving supplied workflow field definitions.

- Resolve selected workflow columns independently for detail move actions
- Use workflow-specific primary action labels and add desktop/mobile regression coverage
- Add a patch changeset for the restored detail action

Files changed:
 .changeset/fn-8476-coding-ideas-move.md            |  7 ++
 .../dashboard/app/components/TaskDetailModal.tsx   | 85 +++++++++++++-------
 .../TaskDetailModal.custom-fields.test.tsx         |  9 ++-
 .../__tests__/TaskDetailModal.rendering.test.tsx   | 91 ++++++++++++++++++++++
 4 files changed, 160 insertions(+), 32 deletions(-)

Fusion-Task-Id: FN-8476

Fusion-Task-Lineage: 37975987-91e4-47f2-9fa4-57b2074391f9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-22 00:43:04 -07:00
gsxdsm
93b693c639 FN-8480: remove redundant board header descriptions
Remove redundant readiness descriptions from Todo and In Review board headers.

- Make column descriptions optional and omit Todo/In Review entries
- Render description markup only when a description is present
- Cover empty and populated header states and add a patch changeset

Files changed:
 .../fn-8480-remove-column-header-descriptions.md   |  7 +++++
 packages/core/src/types.ts                         |  9 ++++--
 packages/dashboard/app/components/Column.tsx       |  2 +-
 .../app/components/__tests__/Column.test.tsx       | 35 ++++++++++++++++++++++
 4 files changed, 49 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-8480

Fusion-Task-Lineage: e14bcf8c-1a44-4de3-9cfe-833bf8bb697e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-22 00:37:15 -07:00
gsxdsm
0ade15481d FN-8477: label planning model activity logs
Planning activity consistently identifies its model provenance while preserving legacy log compatibility.

- Emit Planning using model markers from the planning lane.
- Accept Planning and legacy Triage markers in dashboard model resolution.
- Update documentation, regression coverage, and release metadata.

Files changed:
 .changeset/fn-8477-planning-model-marker.md        |  7 +++++++
 docs/agents.md                                     |  2 +-
 packages/dashboard/app/components/TaskChatTab.tsx  |  2 +-
 .../app/components/__tests__/TaskChatTab.test.tsx  |  2 +-
 ...skDetailModal.models-progress-workflow.test.tsx |  4 ++--
 .../__tests__/WorkflowResultsTab.test.tsx          |  2 +-
 .../__tests__/effective-model-resolution.test.ts   | 24 ++++++++++++++--------
 .../app/components/effective-model-resolution.ts   | 20 ++++++++++++------
 packages/engine/src/__tests__/triage.test.ts       |  8 ++++----
 packages/engine/src/triage.ts                      |  8 ++++++--
 10 files changed, 52 insertions(+), 27 deletions(-)

Fusion-Task-Id: FN-8477

Fusion-Task-Lineage: 7ddce64a-d378-4d08-ad63-ade1b20d4b87

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-22 00:30:34 -07:00
gsxdsm
fee920d366 FN-8478: open board deep tabs in task popups
Make board task deep-tab actions preserve their requested popup tab when task popups are enabled.

- Route Changes, Retries, and Workflow board actions through the popup preference.
- Store and refresh each popup's requested initial tab for its task and view.
- Add regression coverage, documentation, and a patch changeset.

Files changed:
 .changeset/task-card-popup-deep-tabs.md            |  7 +++++
 docs/dashboard-guide.md                            |  4 +--
 docs/settings-reference.md                         |  2 +-
 packages/dashboard/app/App.tsx                     | 25 ++++++++++-----
 .../__tests__/App.openTasksInRightSidebar.test.ts  | 36 ++++++++++++----------
 .../__tests__/navigation-history.test.tsx          | 25 ++++++++++++++-
 .../settings/sections/AppearanceSection.tsx        |  4 +--
 .../app/hooks/__tests__/usePoppedOutTasks.test.ts  | 13 ++++++++
 packages/dashboard/app/hooks/usePoppedOutTasks.ts  | 15 ++++++---
 9 files changed, 97 insertions(+), 34 deletions(-)

Fusion-Task-Id: FN-8478

Fusion-Task-Lineage: e12452c0-24d5-4f19-b50c-39526d72d7ab

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-22 00:22:42 -07:00
gsxdsm
69bd64d950 FN-8475: show planning status badges in Todo
Restore truthful planning status badges for Coding Ideas tasks across Todo views.

- Replace column-based planning badge suppression with real-status detection
- Render planning badges in board cards and desktop/mobile list rows
- Add regression coverage and a patch changeset

Files changed:
 .changeset/fn-8475-planning-status-badge.md        |  7 ++++
 packages/dashboard/app/components/ListView.tsx     | 11 +++---
 packages/dashboard/app/components/TaskCard.tsx     |  7 ++--
 .../app/components/__tests__/ListView.test.tsx     | 40 ++++++++++++++--------
 .../app/components/__tests__/TaskCard.test.tsx     | 10 +++---
 .../utils/__tests__/taskStatusBadgeLabel.test.ts   | 33 +++++++++---------
 .../dashboard/app/utils/taskStatusBadgeLabel.ts    | 16 ++++-----
 7 files changed, 70 insertions(+), 54 deletions(-)

Fusion-Task-Id: FN-8475

Fusion-Task-Lineage: 98bff84e-bee7-4e3c-b7b2-e0a24709576b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-22 00:15:54 -07:00
gsxdsm
82b8b0251e FN-8474: remove tablet task popup gutter
Remove desktop resize clearance from tablet task-detail popups.

- Remove the tablet-only right body gutter and suppress resize handles.
- Preserve desktop resize clearance and mobile sheet behavior.
- Cover empty and populated tablet task popup contracts.

Files changed:
 .changeset/fn-8474-tablet-task-popup-gutter.md     |  7 +++
 packages/dashboard/app/components/FloatingWindow.css    | 14 ++++++
 packages/dashboard/app/components/__tests__/FloatingWindow.test.tsx   | 57 +++++++++++++++++++++-
 3 files changed, 77 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-8474

Fusion-Task-Lineage: 975478fa-c0da-4490-8b47-b09e02c6ff5e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-22 00:09:30 -07:00
gsxdsm
e68c48dabd FN-8472: restore Coding (Ideas) header color indicator
Restore the shared triage color indicator for Coding (Ideas) headers.

- map the Ideas header dot to the shared triage design token
- cover empty and populated Ideas columns plus the token mapping
- add a patch changeset for the operator-facing fix

Files changed:
 .changeset/fn-8472-ideas-column-indicator.md       |  7 +++++
 .../app/components/__tests__/Column.test.tsx       | 36 ++++++++++++++++++++++
 packages/dashboard/app/styles.css                  |  9 ++++++
 3 files changed, 52 insertions(+)

Fusion-Task-Id: FN-8472

Fusion-Task-Lineage: dcaf556d-e8d4-4441-aa94-094e35f33824

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-22 00:00:04 -07:00
gsxdsm
06a49998f5 FN-8473: align Activity Live composer radius
Align the Activity Live composer with the transcript panel’s corner radius.

- Apply the shared large radius token to the chat input
- Cover matching desktop and mobile composer styling

Files changed:
 packages/dashboard/app/components/TaskChatTab.css         |  5 +++++
 .../app/components/__tests__/TaskChatTab.test.tsx         | 15 +++++++++++++++
 2 files changed, 20 insertions(+)

Fusion-Task-Id: FN-8473

Fusion-Task-Lineage: 7ec5033d-f051-40d5-9cea-4d29a70632aa

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 23:53:52 -07:00
gsxdsm
ceaf0cc996 refactor: package code organization wave 14 (#2391)
## Summary

Wave 14 of package code organization (stacks on #2367 / wave 13).

### Peels

| New module | Parent |
|---|---|
| `types/task-review.ts` | task review + PR review surface types |
| `types/documents-artifacts.ts` | documents, artifacts, review-artifact
helpers, goal citations |
| `task-store/workflow-task-create-ops.ts` | rename of `remaining-ops-4`
|
| `task-store/task-mutation-ops.ts` | rename of `remaining-ops-2` |

Public paths stay stable via `types.ts` / `store.ts` re-exports.

### LOC

- `types.ts` ~6264 → ~5871

### Shims

- `types.ts` → peels above (delete-when: consumers import domain
modules)
- `remaining-ops-4` → `workflow-task-create-ops` (rename complete)
- `remaining-ops-2` → `task-mutation-ops` (rename complete)

Only `remaining-ops-1.ts` remains of the numbered ops series.

## Test plan

- [x] `@fusion/core` typecheck
- [x] `review-artifacts` unit tests
- [x] `pnpm check:line-count` (baseline updated)
- [ ] CI merge gate

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

- **Refactor**
- Split task review, document, artifact, and goal-citation type
definitions into dedicated shared modules.
- Updated task-operation wiring to use the newer task-create/mutation
operation surfaces (no API changes intended).
- **Documentation**
- Corrected inline references and refreshed module headers to match the
current task-operation structure and domain naming.
- **Tests**
- Updated a test import to point to the current duplicate-auto-archive
backend implementation source.
- **Chores**
- Refreshed line-count baseline values to reflect the latest code
layout.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-21 23:33:05 -07:00
gsxdsm
6422cb93a4 fix(engine): stop overseer hard-cancel thrash on live step sessions (#2393)
## Summary

Prevents the FN-8471 failure mode where planner overseer `retry_step`
bounced `in-progress → todo` while a live step-execute session was still
coding, hard-cancelling the agent up to three times until recovery
budget exhausted.

Also closes concurrent resume races after plan-review release that
parked `status=failed` on a losing graph while a peer session still
owned work.

### Changes
- **Overseer live gate:** `retryStep` skips the hard-cancel bounce when
`isTaskLiveForOverseerRetry` is true; returns `false` so attempt budget
is not burned; durable skip log is deduped per task/stage.
- **Single-flight graph dispatch:** `executeCore` claims `graphRouting`
before any await; `executeWorkflowGraph({ alreadyClaimed })` owns
release.
- **Single-flight unpause resume:** claim `resumingUnpaused` before
await; treat existing graph claim as already-owned; clear claim before
completed-work recovery.
- **No false park:** execute-family graph endings with a peer live
session no longer stamp `status=failed` (merge-region failures still
park).

### Tests
- `executor-live-overseer-retry-gate.test.ts` — live probe matrix,
execute-family preserve, merge still parks
- `planner-overseer-intervention-wiring.test.ts` — live skip keeps
column in-progress and `getAttemptCount === 0`

## Test plan
- [x] `vitest run` scoped to the two new/updated test files (16 passed)
- [ ] CI gate (lint/typecheck/build/test:gate)
- [ ] Optional manual: fail a raced graph with a live step session and
confirm overseer does not bounce to todo

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

- **Bug Fixes**
- Improved overseer-retry “live session” gating to avoid interrupting
active work, covering more live surfaces and preventing multi-resume
races.
- Updated failure handling so execute-family failures can be preserved
when another live session is still running, while merge-attempt failures
are still marked failed.
- Added deduping for “retry skipped due to live session” logs so they’re
emitted only once per task stage, and ensured the recovery attempt
budget isn’t consumed when intentionally skipped.
- **Tests**
- Added coverage for live-gating, retry-skip/budget behavior, and the
revised failure-parking rules.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-21 23:32:18 -07:00
flexi767
0818fc1da1 fix(engine): respect user-paused dispatch stops (#2371)
Re-lands #2337 directly on current main after its temporary base branch
was merged and deleted.\n\n- excludes userPaused tasks from scheduler
and remembered-owner selection\n- includes userPaused in candidacy
fingerprints and unpause scheduling\n- keeps normal unpaused dispatch
behavior\n- includes regressions and a release changeset\n\nValidation
on current main: scheduler suites 50/50, @fusion/core typecheck, and
@fusion/engine typecheck passed. The PostgreSQL routing file was
discovered but skipped without a configured test database.

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

* **Bug Fixes**
* Manually parked/paused tasks are no longer selected or dispatched
while they remain paused.
  * A task only re-enters dispatch flow after it is explicitly unpaused.
* Unpausing a task promptly refreshes scheduling and makes it eligible
for dispatch.
* Scheduler state updates now correctly react to pause status changes
(including when pause is represented via `userPaused`).
* **Tests**
* Expanded scheduler and routing regression coverage for pause/unpause
and dispatch invalidation behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: v <v@v.speedport.ip>
Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com>
2026-07-21 23:10:34 -07:00
gsxdsm
3a7684b90e refactor: package code organization wave 12 (#2362)
## Summary

Behavior-preserving package code organization (wave 12), continuing
after wave 11 (#2333).

- **Dashboard client API peels** from `app/api/legacy.ts` into focused
modules with stable re-exports:
- `git.ts` — remotes, PR management, terminal sessions, git management
(`withRepoPath` preserved)
  - `workspace-files.ts` — file browser + workspace file ops
  - `provider-status.ts` — auth/CLI and runtime provider status
  - `github-import.ts` / `gitlab-import.ts` — issue/PR import clients
  - `run-audit.ts` — run-audit, timeline, org tree, task review
  - `task-diff.ts` — task diffs and commit associations
  - `agent-import-generation.ts` — agent import catalog + generation
- **Core types peels** from `types.ts`:
  - `types/run-audit.ts`
  - `types/planner-intervention.ts`
- **Domain rename**: `task-store/remaining-ops-5.ts` →
`task-store/task-id-integrity.ts` (call sites updated)
- **Line-count ratchet**: `legacy.ts` ceiling ~5665 → ~3339; baseline
refreshed

No intentional behavior changes; public import paths via `app/api` /
`@fusion/core` remain stable.

## Test plan

- [x] `@fusion/core` typecheck
- [x] Dashboard `tsconfig.app` typecheck (wave12-related errors cleared;
pre-existing playwright/plugin env noise unchanged vs main)
- [x] ESLint on peeled API modules
- [x] `pnpm check:line-count` (baseline updated)
- [ ] CI: Lint / Typecheck / Build / Gate

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

- **New Features**
- Added dashboard client support for Git remotes/PR workflows,
GitHub/GitLab importing, terminals (HTTP/SSE) and PTY sessions,
workspace file browsing/editing/search, and task diff viewing with
file/ZIP download helpers.
- Added new dashboard APIs for planning/onboarding streaming, mission
interview flows, provider/auth status, dev server sessions,
run-audit/timelines & task review, agent import/generation, and AI title
summarization.
- Added backup and settings export/import helpers, plus model
discovery/usage reporting and task steering actions.
- **Refactor**
- Modularized dashboard API clients into focused modules while
preserving the existing integration style.
- **Tests**
- Updated a backend-mode SQLite guidance regression test to exercise the
intended implementations.
- **Chores**
  - Refreshed internal line-count baselines.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-21 23:10:08 -07:00
gsxdsm
1e05793876 fix(ci): green full-suite bookkeeping after origin/main cutover (#2392)
## Summary

Restores green merge-gate and package-default suites after repeated
`origin/main` merges brought workflow-graph ownership cutover drift into
CI.

- Align engine/dashboard/core tests with post-cutover contracts
(`moveTaskIf`/`deleteTaskIf`, graph handoff, worktree-pool reclaim via
`removeWorktree` + `RemovalReason`, multi-step RESUMING parse,
soft-pause merge requester, graph-terminal failure surfaces).
- Small product fixes needed for real regressions uncovered by the
suite: soft-delete refuse before graph routing, skip DUPLICATE
step-heading withhold when an explicit marker is present, PG schema
applier guards, and related bookkeeping (research promote tool inventory
/ migration seed, stop shell `psql` in PG admin DDL).
- Quarantine/ledger hygiene only where required by standing rules; no
timeout/worker appeasement.

## Verification

- `pnpm test:gate` ×2 green
- `@fusion/engine` full package suite green (~9083 tests)
- Targeted core/dashboard clusters green (schema applier, agent-runs UI,
settings descriptions, mobile close)

## Test plan

- [x] `pnpm test:gate` (twice)
- [x] `pnpm --filter @fusion/engine test`
- [ ] CI full suite / PR checks on this branch
- [ ] Confirm no unrelated product behavior changes beyond the listed
regression fixes

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

* **New Features**
* Added support for `roadmap-item` native structure kinds, including
native structure embeds and metadata validation.
  * Added Stable and Beta release channel options in General settings.
* Added per-action reporting target configuration with clearer “unset”
guidance.

* **Bug Fixes**
  * Improved heartbeat/prompt behavior when patrol is disabled.
  * Prevented deleted tasks from continuing through execution.
  * Made recovery for explicit duplicate redirects more permissive.
* Hardened database migration and test database cleanup to reduce flaky
failures.

* **Documentation**
* Updated settings text for release channels, reporting targets, and
inheritance/unset behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-21 23:09:30 -07:00
gsxdsm
cd51e1c0d8 FN-8471: add color theme filtering
Add a searchable shared color-theme picker for Settings and Command Center.

- Filter translated theme labels case- and diacritic-insensitively
- Preserve keyboard navigation, focus management, and selection behavior
- Document the picker and add a minor release changeset

Files changed:
 .changeset/fn-8471-theme-filter.md                 |   7 +
 docs/dashboard-guide.md                            |   3 +-
 .../dashboard/app/components/ThemeDropdown.css     |  32 ++++
 .../dashboard/app/components/ThemeDropdown.tsx     | 172 +++++++++++++++------
 .../components/__tests__/ThemeDropdown.test.tsx    | 106 +++++++++++++
 .../components/__tests__/ThemeSelector.test.tsx    |   1 +
 .../__tests__/CommandCenterControls.test.tsx       |   1 +
 7 files changed, 277 insertions(+), 45 deletions(-)

Fusion-Task-Id: FN-8471

Fusion-Task-Lineage: 1f73dfb8-18bb-48e6-a3ed-0ee3a200cf03

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 23:03:35 -07:00
gsxdsm
edc7bf2c90 fix(engine): stop orphaned planning continuations from starving dispatch
Soft-deleted tasks with leftover plan-review work items caused getTask to throw
mid-drain, aborting the due list before later live cards (e.g. FN-8471) could
run. Isolate per-item loads, cancel terminal/missing orphans, and surface
pre-release unplanned promote failures distinctly from WIP capacity.
2026-07-21 22:40:14 -07:00
gsxdsm
8dc66bf3dd fix(dashboard): badge lane-owned gates and keep WIP progress clean
Suppress Ready while Plan Review is active, show only implementation steps
on In-progress progress, and surface Plan Review / Code Review / Browser
Verification as header badges on their lanes instead of progress bullets.
2026-07-21 22:37:10 -07:00
gsxdsm
88e343e331 chore(release): v0.73.0-beta.2
Version bump via changesets.
2026-07-21 21:01:23 -07:00
gsxdsm
757b423370 chore: add changeset for beta Settings update-check fix 2026-07-21 20:58:00 -07:00
gsxdsm
d1c3b63cff fix(dashboard): honor beta channel on Settings check for updates
Settings "Check for updates" called a legacy endpoint that only queried npm
latest and ignored prerelease ordering, so beta users never saw newer
X.Y.Z-beta.N releases. Route the check through channel-aware force refresh
and add a beta.0 → beta.1 regression test.
2026-07-21 20:40:55 -07:00
gsxdsm
7911fdb9b1 fix(release): preserve distilled changelog summaries across releases
syncRootChangelog rewrote every prior release from raw package notes, so only
the latest distilled Highlights view survived. Re-emit already-distilled bodies
on sync, keep the archive pointer outside version sections, and restore wiped
summaries from release history.
2026-07-21 20:29:46 -07:00
gsxdsm
dcc249c674 chore(release): v0.73.0-beta.1
Version bump via changesets.
2026-07-21 20:22:16 -07:00
gsxdsm
824762cdd8 FN-8469: prevent workflow definition ID reuse
Prevent workflow definition ID reuse across projects and insertion races.

- Scan global workflow IDs before advancing SQLite or PostgreSQL allocators.
- Retry only confirmed workflow primary-key collisions while preserving unrelated constraint errors.
- Cover stale counters and concurrent allocation behavior in SQLite and PostgreSQL tests.

Files changed:
 .../fn-8469-workflow-definition-id-allocator.md    |   7 ++
 .../__tests__/postgres/workflow-create.pg.test.ts  |  68 +++++++++++
 .../workflow-definition-id-allocator-sync.test.ts  |  60 +++++++++
 .../workflow-definition-id-allocator.test.ts       |  26 ++++
 packages/core/src/task-store/remaining-ops-1.ts    | 134 +++++++++++----------
 .../core/src/task-store/workflow-definitions.ts    | 132 +++++++++++++-------
 6 files changed, 323 insertions(+), 104 deletions(-)

Fusion-Task-Id: FN-8469

Fusion-Task-Lineage: ba5bde88-67ca-47dd-ba86-00aef5258d13

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 20:05:39 -07:00
gsxdsm
c94920d885 FN-8466: allow reads of advertised plugin skills
Allow isolated worktree sessions to read only host-advertised plugin skill roots.

- Normalize additional skill paths once for resource loading and boundary checks
- Permit read, glob, and grep while keeping write, edit, and Bash worktree-bound
- Document the boundary and cover root normalization and access restrictions

Files changed:
 .changeset/fn-8466-skill-path-read-boundary.md     |   7 ++
 docs/agents.md                                     |   4 +
 .../src/__tests__/pi-create-fn-agent.test.ts       | 108 +++++++++++++++++++++
 packages/engine/src/pi.ts                          |  75 +++++++++++---
 4 files changed, 183 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-8466

Fusion-Task-Lineage: ff6566be-803d-48b8-8550-aa1bfe080fed

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 19:46:29 -07:00
gsxdsm
080a8e7134 FN-8464: guard baseline capture against invalid worktrees
Prevent baseline Git probes from using stale or non-directory task worktrees.

- Gate baseline capture on an existing worktree directory
- Defer graph step projection until worktree acquisition completes
- Cover missing, non-directory, and filesystem-race worktree paths
- Add a patch changeset for the operator-facing fix

Files changed:
 .changeset/fn-8464-baseline-cwd.md                 |   7 ++
 .../__tests__/executor-fast-mode-workflows.test.ts | 100 ++++++++++++++++++++-
 .../engine/src/__tests__/executor-test-helpers.ts  |   6 +-
 packages/engine/src/__tests__/step-runner.test.ts  |  62 +++++++++++++
 packages/engine/src/executor.ts                    |  16 +++-
 packages/engine/src/step-runner.ts                 |  24 +++++
 6 files changed, 210 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-8464

Fusion-Task-Lineage: e4116dd0-decd-4f9d-87f0-e695cc7f182b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 19:40:36 -07:00
gsxdsm
859475d0bd FN-8467: align project plugin enablement state
Keep project-scoped plugin enablement consistent across dashboard and loaders.

- Resolve plugin loaders from the requested project's store and reuse scoped fallback loaders.
- Preserve authoritative enable and disable responses during dashboard refresh races.
- Add route and manager regression coverage, documentation, and a patch changeset.

Files changed:
 .../fn-8467-plugin-enable-state-consistency.md     |   7 ++
 docs/multi-project.md                              |   1 +
 docs/plugin-management.md                          |   4 +-
 .../dashboard/app/components/PluginManager.tsx     |  36 ++++--
 .../__tests__/PluginManager.toggle.test.tsx        |  38 ++++++
 .../src/__tests__/plugin-routes.routes.test.ts     | 134 ++++++++++++++++++---
 .../src/routes/register-plugins-automation.ts      | 118 +++++++++++++-----
 7 files changed, 281 insertions(+), 57 deletions(-)

Fusion-Task-Id: FN-8467
Fusion-Task-Lineage: 697a0783-9771-4140-bc82-53491a2d0b70
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 19:35:03 -07:00
gsxdsm
746d33e7e6 FN-8468: prevent duplicate plugin startup loads
Ensure plugins share one process-wide startup lifecycle.

- Coalesce concurrent host and engine plugin loads into a single onLoad invocation.
- Synchronize reload and stop operations across participating loaders.
- Add regression coverage and document single-load lifecycle behavior.

Files changed:
 .changeset/fn-8468-plugin-single-onload.md         |   7 +
 docs/PLUGIN_AUTHORING.md                           |   1 +
 .../__tests__/plugin-loader-single-load.test.ts    | 126 +++++++++++++
 packages/core/src/plugin-loader.ts                 | 194 +++++++++++++++++++--
 .../__tests__/plugin-startup-single-load.test.ts   |  59 +++++++
 5 files changed, 370 insertions(+), 17 deletions(-)

Fusion-Task-Id: FN-8468

Fusion-Task-Lineage: a211f445-d236-44de-837b-28b9e15c7c52

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 19:28:35 -07:00
gsxdsm
51fc34f585 FN-8465: align skill toggles with canonical paths
Align session skill filtering with Skills-view path identities.

- Match session inclusions, exclusions, and diagnostics by skills-relative body path.
- Ignore stale flat toggle keys for categorized skills and cover the display/session invariant.
- Document the behavior and add a patch changeset.

Files changed:
 .../fn-8465-legacy-skill-toggle-path-match.md      |   7 ++
 docs/dashboard-guide.md                            |   2 +-
 .../legacy-flat-skill-toggle-session-divergence.md |  41 ++++++++
 .../engine/src/__tests__/skill-resolver.test.ts    |  73 ++++++++++++++
 packages/engine/src/skill-resolver.ts              | 105 ++++++++++++++-------
 5 files changed, 191 insertions(+), 37 deletions(-)

Fusion-Task-Id: FN-8465

Fusion-Task-Lineage: 042fc7f4-08a3-42f4-9a6f-52f066d585e8

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 19:17:20 -07:00
gsxdsm
190dc07521 FN-8462: fix legacy-adoption marker permissions
Prevent inaccessible legacy-adoption markers from triggering repeated CLI sweeps and warning spam.

- Grant fusion_runtime public schema access for the drained-marker read path
- Deduplicate permanent marker infrastructure diagnostics while preserving fail-open sweeps
- Cover runtime-role marker access and migration registration
- Add a patch changeset for the CLI fix

Files changed:
 .../fn-8462-legacy-adoption-drained-marker.md      |  7 ++
 .../core/src/__tests__/legacy-adoption.test.ts     | 37 ++++++++-
 .../legacy-adoption-runtime-marker.test.ts         | 90 ++++++++++++++++++++++
 .../src/__tests__/postgres/schema-applier.test.ts  | 16 ++++
 ...gacy_adoption_drained_marker_runtime_grants.sql |  8 ++
 packages/core/src/task-store/lifecycle-ops.ts      | 70 +++++++++++++----
 6 files changed, 210 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-8462

Fusion-Task-Lineage: cb93de43-32f3-4c13-9989-b3dd08d33af8

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 19:10:55 -07:00
gsxdsm
648971634a FN-8461: suppress spurious workflow skill-load warnings
Prevent optional CE configuration from producing warnings when a requested plugin skill is discoverable.

- Merge plugin skill body directories with the optional CE discovery root
- Warn only when the named workflow skill lacks every viable discovery source
- Cover plugin, CE-namespaced, and unrelated-skill discovery cases

Files changed:
 .changeset/fn-8461-skill-load-warning.md           |   7 +
 docs/workflow-steps.md                             |   8 +-
 .../__tests__/ce-workflow-step-executor.test.ts    | 149 ++++++++++++++++++++-
 .../engine/src/__tests__/executor-test-helpers.ts  |   1 +
 packages/engine/src/executor.ts                    |  53 ++++++--
 5 files changed, 200 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-8461

Fusion-Task-Lineage: ef743df4-8bd2-44e6-9498-f6448738d6dc

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 19:05:48 -07:00
gsxdsm
2bf3d81a76 fix(dashboard): restore accurate executing/total column headers
Show live agents over card count (e.g. 3/4) using the shared Running
predicate so unpaused WIP counts without sessionFile, and document the
badge semantics for operators.
2026-07-21 18:59:52 -07:00
gsxdsm
771fe71760 fix(dashboard): restore board card counts and WIP Running totals
FN-8453 column headers showed active/total (always 0/N on Todo) and Running
required sessionFile, which is not a DB/board field, so footer capacity
undercounted live WIP. Show lane card totals again and count unpaused WIP as
Running without durable session/checkout evidence.
2026-07-21 18:52:59 -07:00
gsxdsm
315bc1a764 FN-8463: cover root-level File Scope files
Extend File Scope regression coverage for root-level configuration and solution files.

- Cover .NET and ecosystem-neutral root-level file entries
- Verify task-store and public store validation exports share classification
- Add a patch changeset for the File Scope validation fix

Files changed:
 .changeset/fn-8463-file-scope-root-extensions.md   |  7 +++
 .../__tests__/file-scope-classification.test.ts    | 64 +++++++++++++++++++++-
 2 files changed, 69 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8463

Fusion-Task-Lineage: 149f0066-8ec5-4f9d-b5be-29f158a274cc

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 18:48:47 -07:00
gsxdsm
483c33a323 fix(planning): remove extra mobile and tablet pane padding
Flush question and plan-review surfaces on phone and tablet so workspace gutters, scroll padding, and nested card chrome no longer stack as dead space.
2026-07-21 18:44:48 -07:00
gsxdsm
d486bf49dd FN-8456: add Dawn dashboard color theme
Add a persisted Dawn indigo-and-amber color theme across dashboard and desktop first paint.

- Register Dawn in theme persistence, selector metadata, and pre-hydration validation.
- Define dark and light Dawn tokens plus mode-aware selector swatches.
- Cover persistence, theme registries, token completeness, and selector previews with tests.

Files changed:
 .changeset/fn-8456-dawn-theme.md                   |  7 ++
 docs/dashboard-guide.md                            |  3 +-
 docs/settings-reference.md                         |  2 +-
 .../core/src/__tests__/global-settings.test.ts     |  8 ++
 packages/core/src/types/execution-and-ui.ts        |  2 +
 .../dashboard/app/__tests__/dawn-theme.test.ts     | 98 ++++++++++++++++++++++
 .../dashboard/app/components/ThemeSelector.css     | 14 ++++
 .../components/__tests__/ThemeDropdown.test.tsx    | 22 ++---
 .../components/__tests__/ThemeSelector.test.tsx    |  2 +-
 .../__tests__/CommandCenterControls.test.tsx       |  7 +-
 packages/dashboard/app/components/themeOptions.ts  |  1 +
 .../dashboard/app/hooks/__tests__/useTheme.test.ts | 12 +++
 packages/dashboard/app/index.html                  |  2 +-
 packages/dashboard/app/public/theme-data.css       | 86 ++++++++++++++++++-
 packages/desktop/src/renderer/index.html           |  1 +
 15 files changed, 248 insertions(+), 19 deletions(-)

Fusion-Task-Id: FN-8456

Fusion-Task-Lineage: 44d9eb05-210d-4be8-8d35-c66ac4857194

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-21 18:33:22 -07:00
gsxdsm
63c4742f52 chore: add changeset for fn_task_prompt_write approval exemption 2026-07-21 18:03:48 -07:00
gsxdsm
72223ab318 fix(engine): exempt fn_task_prompt_write from agent approval gates
Classify the durable PROMPT.md writer as coordination-exempt (same class as
fn_task_document_write) so triage, replan, and Plan Review can persist specs
without an operator approval gate. Keep dashboard policy examples in sync.
2026-07-21 18:03:36 -07:00
gsxdsm
7251e7e146 fix(core): ignore fenced File Scope samples on GitHub import
Issue #2389 embeds a unit repro with ## File Scope and escaped backticks
inside a code fence; createTask treated those as real scope tokens
(global.json\, etc.) and threw InvalidFileScopeError. Locate File Scope
outside fenced blocks, share extraction with create validation, and skip
hard scope checks on freeform bootstrap intake prompts.
2026-07-21 18:00:35 -07:00
gsxdsm
7353b7be5d fix(FN-8456): keep prompt writer in triage toolset 2026-07-21 17:54:00 -07:00
gsxdsm
d393168771 fix(core): accept root-level files in File Scope validation
Root paths with extensions (global.json, Directory.Packages.props, MyApp.slnx)
were rejected because isValidFileScopeEntry required a slash, which failed GitHub
imports whose issue bodies declare those paths and dropped them from effective
write scope. Share one validator between create/update and classification.
2026-07-21 17:50:25 -07:00
gsxdsm
a38524dd54 fix(engine): do not read TaskStore in ProjectEngine constructor
FN-8453 merge-admission registration called getTaskStore() before
runtime.start(), which threw, left the singleton lock held, and made every
later engine start fail with blocked-by-lockfile. Use config.projectId instead.
2026-07-21 17:35:48 -07:00
gsxdsm
4d588ad091 fix(postgres): allow fusion_runtime to write legacy-adoption drained marker
Store-open adoption runs as fusion_runtime, which lacked grants on
public.fusion_schema_migrations, so the drained-marker write failed every
boot. Migration 0032 grants SELECT plus a SECURITY DEFINER helper limited
to the exact marker, and store-open calls that helper instead of raw INSERT.
2026-07-21 17:27:09 -07:00
gsxdsm
396090fc03 fix(startup): bound model registry refresh so dashboard cannot hang
Post-extension modelRegistry.refresh() had no timeout, so a hung remote
catalog fetch left the TUI on "Loading extensions…" forever. Use a shared
15s-bounded refresh across dashboard/serve/daemon and related registration paths.
2026-07-21 17:14:30 -07:00
gsxdsm
515d77cea8 fix(planning): remove extra padding around interview panes
Make the question/plan workspace flush edge-to-edge on desktop with a single column divider, while keeping a compact card inset on mobile.
2026-07-21 17:14:30 -07:00