gsxdsm
36691e54d2
chore(release): v0.76.0-beta.1
...
Version bump via changesets.
2026-08-12 00:17:27 -07:00
gsxdsm
5e6719349d
FN-9001: test cross-route model cache invalidation
...
Add route-level coverage for shared model registry invalidation.
- Exercise credential mutations across auth and model registrars
- Cover stale in-flight refreshes, cache isolation, and rename behavior
- Ratchet model routes away from direct registry refresh calls
Files changed:
...r-model-routes-cross-route-invalidation.test.ts | 199 +++++++++++++++++++++
1 file changed, 199 insertions(+)
Fusion-Task-Id: FN-9001
Fusion-Task-Lineage: c5974546-6cc6-4ea5-99e9-2e3e9077e490
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 22:40:54 -07:00
gsxdsm
d9a0ed7837
fix(FN-8998): prevent planning lock reentry stalls
2026-08-11 21:44:22 -07:00
gsxdsm
11334b1249
FN-8998: scope workflow definitions by project
...
Keep custom workflows isolated within their owning project.
- Model workflows with a project-scoped composite key and scope definition mutations.
- Preserve globally safe ID occupancy while isolating analytics name lookups.
- Add PostgreSQL coverage and document the project partition contract.
Files changed:
.changeset/fn-8998-workflows-project-partition.md | 7 +
docs/storage.md | 1 +
.../workflows-project-isolation.pg.test.ts | 146 +++++++++++++++++++++
.../core/src/async-stores/async-workflow-store.ts | 19 ++-
packages/core/src/board/workflow-analytics.ts | 7 +-
packages/core/src/postgres/schema/project.ts | 17 ++-
.../core/src/task-store/workflow-definitions.ts | 25 ++--
packages/core/src/task-store/workflow-ops.ts | 27 +++-
8 files changed, 224 insertions(+), 25 deletions(-)
Fusion-Task-Id: FN-8998
Fusion-Task-Lineage: b6e8a100-de4d-4ff9-98df-4504d9050740
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 20:25:59 -07:00
gsxdsm
9c5176f55e
FN-8997: enforce project ownership for project tables
...
Enforce project-scoped ownership for chat and workflow records.
- Add project ownership columns, migration backfill, and schema validation.
- Scope chat-room and workflow CRUD operations to the active project.
- Add PostgreSQL regression coverage, storage documentation, and a release changeset.
Files changed: .../fn-8997-project-ownership-declaration-drift.md | 7 ++
docs/storage.md | 1 +
.../project-ownership-declaration-drift.pg.test.ts | 42 +++++++++
.../src/__tests__/postgres/schema-applier.test.ts | 9 +-
packages/core/src/async-stores/async-chat-store.ts | 100 ++++++++++++---------
packages/core/src/chat/chat-store.ts | 38 ++++----
...fn_8997_project_ownership_declaration_drift.sql | 17 ++++
packages/core/src/postgres/schema-applier.ts | 12 ++-
packages/core/src/postgres/schema/project.ts | 43 +++++++--
packages/core/src/task-store/project-store-ops.ts | 7 +-
.../core/src/task-store/workflow-definitions.ts | 4 +-
packages/core/src/task-store/workflow-ops.ts | 13 +--
.../src/task-store/workflow-task-create-ops.ts | 2 +-
13 files changed, 210 insertions(+), 85 deletions(-)
Fusion-Task-Id: FN-8997
Fusion-Task-Lineage: 01cd71b1-8f86-41e5-abdb-5ab00ff91c83
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 19:34:01 -07:00
gsxdsm
5ce3a973e6
FN-8902: bound and cache model registry refreshes
...
Bound model-catalog refreshes so requests retain available models when providers stall.
- Add timeout-bounded, single-flight engine registry refreshes with fallback model retention.
- Cache refresh outcomes per registry and invalidate them after all credential mutations, including default-instance changes.
- Cover refresh cache and route behavior, and document the resilience contract.
Files changed:
.changeset/fn-8902-models-refresh-bounding.md | 7 +
docs/dashboard-guide.md | 6 +
.../__tests__/model-registry-refresh-cache.test.ts | 77 +++++++
.../register-model-routes-refresh-bounding.test.ts | 246 +++++++++++++++++++++
.../dashboard/src/model-registry-refresh-cache.ts | 153 +++++++++++++
packages/dashboard/src/routes.ts | 5 +
.../dashboard/src/routes/register-auth-routes.ts | 24 +-
.../dashboard/src/routes/register-model-routes.ts | 12 +-
.../src/__tests__/model-registry-refresh.test.ts | 33 +++
packages/engine/src/auth/model-registry-refresh.ts | 125 +++++++----
packages/engine/src/index.ts | 3 +
11 files changed, 642 insertions(+), 49 deletions(-)
Fusion-Task-Id: FN-8902
Fusion-Task-Lineage: 9f0eaf34-6d28-49aa-b065-274be14ea500
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 19:00:44 -07:00
gsxdsm
7b4b2b547b
FN-8996: guard engine test module specifiers
...
Ensure engine test dependencies remain valid after module moves.
- Expand the engine test specifier guard to validate Vitest APIs and imports.
- Repair moved worktree, branch-conflict, and lifecycle module references in tests.
- Preserve worktree recovery coverage and document the harness contract.
Files changed:
docs/testing.md | 21 ++-
.../worktrunk-self-healing.test.ts | 14 +-
.../__tests__/vi-mock-specifiers-resolve.test.ts | 149 ++++++++++++++++-----
.../__tests__/workflow-graph-step-rerun.test.ts | 14 +-
...-sync-role-conversion-inert-live-e2e.pg.test.ts | 2 +-
.../__tests__/worktree-acquisition-pinned.test.ts | 52 ++++++-
.../__tests__/worktree-admin-entry-prune.test.ts | 12 +-
7 files changed, 212 insertions(+), 52 deletions(-)
Fusion-Task-Id: FN-8996
Fusion-Task-Lineage: dd93b4a8-cf45-42e2-9823-e5c2e6f84f82
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 18:46:48 -07:00
gsxdsm
fb5df0fc46
FN-8993: guard knowledge graph directory setting
...
Classify the knowledge graph output directory as an intentionally non-surfaced setting.
- Allowlist the CLI/engine-owned knowledgeGraphDir default with its rationale.
- Add regression coverage that preserves its Settings-description guard classification.
Files changed:
.../settings-default-descriptions.test.tsx | 33 ++++++++++++++++++++++
1 file changed, 33 insertions(+)
Fusion-Task-Id: FN-8993
Fusion-Task-Lineage: 34d82e65-5d1d-4805-8630-f3393de8e998
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 18:40:35 -07:00
gsxdsm
3b1c7881a8
FN-8988: partition agent ratings by project
...
Isolate PostgreSQL agent ratings within each project while preserving compatibility behavior.
- Add migration 0055 to enforce the (project_id, id) rating identity key and repair drifted composite keys.
- Scope rating CRUD operations to bound projects and document the storage contract.
- Cover cross-project rating isolation and drifted-key migration repair.
Files changed:
.changeset/fn-8988-agent-ratings-project-partition.md | 7 ++
docs/storage.md | 1 +
packages/core/src/__tests__/postgres/agent-ratings-project-isolation.pg.test.ts | 105 +++++++++++++++++++++
packages/core/src/__tests__/postgres/schema-applier.test.ts | 66 ++++++++++++-
packages/core/src/agents/agent-store.ts | 18 +++-
packages/core/src/async-stores/async-agent-store.ts | 11 ++-
packages/core/src/postgres/migrations/0055_fn_8988_agent_ratings_project_partition.sql | 74 +++++++++++++++
packages/core/src/postgres/schema-applier.ts | 12 ++-
packages/core/src/postgres/schema/project.ts | 5 +
9 files changed, 293 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-8988
Fusion-Task-Lineage: 5d3e5e60-1589-4641-8695-1786f1c15c5d
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 18:35:43 -07:00
gsxdsm
12eeeaf046
FN-8901: restore duplicate conflict responses
...
Require matching named proposal claims before a deterministic duplicate can be reused.
- Restore 409 duplicate responses for ordinary or unrelated proposal intake.
- Preserve duplicate reuse for matching trusted recommendation claims.
- Cover active and terminal canonical task cases.
- Add a patch changeset for the intake fix.
Files changed:
.changeset/fn-8901-deterministic-duplicate-409.md | 7 ++++
.../__tests__/routes-tasks-near-duplicate.test.ts | 47 ++++++++++++++++++++++
.../src/routes/register-task-workflow-routes.ts | 11 ++++-
3 files changed, 64 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-8901
Fusion-Task-Lineage: f9a41ceb-46aa-4589-9fdc-7f1cc35a01e1
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 18:21:24 -07:00
gsxdsm
167e17c697
fix(engine): resume planned mission follow-ups
2026-08-11 17:53:40 -07:00
gsxdsm
0e4c0c713e
FN-8995: reconcile durable-write inventory drift
...
Keep the durable-write inventory synchronized while preserving reviewed lifecycle verdicts.
- Add fail-closed manifest regeneration and regression coverage.
- Reconcile current call-site structure while retaining equivalent verdicts through module moves.
- Clarify durable wedge-notification writer classification and regeneration guidance.
Files changed:
.../merge-orphan-body-durable-write-fences.md | 18 +-
.../__tests__/_merge-durable-write-callsites.ts | 84 +-
.../merge-orphan-durable-write-inventory.json | 15414 +++++++++----------
...ge-orphan-durable-write-inventory-drift.test.ts | 88 +-
4 files changed, 7836 insertions(+), 7768 deletions(-)
Fusion-Task-Id: FN-8995
Fusion-Task-Lineage: df3d27ca-6614-418d-b09f-e1dd9f49f910
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 15:29:44 -07:00
gsxdsm
5134a55b77
FN-8958: fence orphaned merge-body writes
...
Prevent cancelled merge generations from writing stale task state.
- Add a signal-aware merge write fence with orphan audit reporting.
- Fence merge finalization, post-push metadata, and recovery-branch task logs.
- Cover durable write callsites and cancellation behavior with tests and guidance.
Files changed:
.changeset/fn-8958-orphan-merge-write-fence.md | 7 +
AGENTS.md | 1 +
.../reliability/orphan-merge-body-write-fence.md | 68 ++
.../__tests__/_merge-durable-write-callsites.ts | 4 +
.../merge-orphan-durable-write-inventory.json | 982 +++++++++++----------
.../merge-orphan-body-durable-writes.test.ts | 38 +-
.../engine/src/__tests__/merge-write-fence.test.ts | 39 +
.../engine/src/merge/auto-merge-finalization.ts | 9 +
packages/engine/src/merge/merge-write-fence.ts | 92 ++
packages/engine/src/merge/merger-ai.ts | 173 ++--
10 files changed, 875 insertions(+), 538 deletions(-)
Fusion-Task-Id: FN-8958
Fusion-Task-Lineage: 5f398c44-4320-4f0c-be15-707184f66aa8
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 15:20:19 -07:00
gsxdsm
43141467fb
FN-8955: harden reviewer verdict extraction
...
Recover structured reviewer verdicts from prose containing malformed brace or quote characters.
- Scan and recover JSON verdict candidates after parser desynchronization.
- Prevent unreadable structured verdicts from being treated as prose approvals.
- Cover malformed prose and multi-finding verdict recovery across review gates.
Files changed:
.changeset/fn-8955-verdict-extractor.md | 7 ++
docs/workflow-steps.md | 4 +-
packages/engine/src/__tests__/reviewer.test.ts | 65 +++++++++++++++
.../workflow-malformed-verdict-gate.test.ts | 14 ++++
.../workflow-step-verdict-parsing.test.ts | 86 ++++++++++++++++++--
packages/engine/src/execution/reviewer.ts | 92 ++++++++++++++++++++--
.../engine/src/executor/workflow-step-verdict.ts | 16 ++--
7 files changed, 267 insertions(+), 17 deletions(-)
Fusion-Task-Id: FN-8955
Fusion-Task-Lineage: 84107fd2-b7f3-4162-9e8c-2ec24600d9d5
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 15:01:52 -07:00
gsxdsm
778292b484
refactor: package code organization wave 19 (self-healing pure peels) ( #3403 )
...
## Summary
Starts **U5** of the package code-organization program after wave 18
(executor peels) landed.
Peels pure free-function clusters out of `self-healing.ts` into
`packages/engine/src/self-healing/` without behavior changes. Public
imports from `./self-healing.js` remain stable via re-exports.
### Peels
| Symbol | New home |
|--------|----------|
| `autoRecoverWorktreeSessionStartFailure` |
`self-healing/auto-recover-worktree-session.ts` |
| `archiveAsGhostBug` | `self-healing/archive-ghost-bug.ts` |
| `hasStepProgress` / work-complete helpers |
`self-healing/step-progress.ts` |
### Line count
- `self-healing.ts`: ~15456 → ~15231 (baseline ratcheted to post-peel
live; main had already drifted past the prior grandfathered ceiling via
organic growth)
- New modules each well under 2,000 lines
## Test plan
- [x] `pnpm --filter @fusion/engine exec tsc --noEmit`
- [x] `self-healing-trait-rekey.test.ts` (autoRecover requeue)
- [x] `self-healing-paused-abort-recovery.test.ts`
- [x] `self-healing-model-unavailable-recovery.test.ts`
- [ ] CI gate
## Follow-ups
U5 Slice B: domain method clusters (startup, in-review, merge-status,
workspace, surfacing) into additional `self-healing/*.ts` modules.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved automatic recovery when worktree sessions fail to start,
including stale or incomplete session data.
* Tasks can be safely requeued while preserving progress, or escalated
after retry limits are reached.
* Improved handling of completed work and failures where task completion
was not recorded.
* Preserved valid task branches during recovery and provided more
reliable fallback requeue behavior.
* Ghost bugs are automatically archived with recovery details and
activity history.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-11 11:29:30 -10:00
gsxdsm
9622a62425
fix(engine): preserve manual handoff holds during recovery ( #3422 )
...
## Summary
Supersedes #3421 — fork head not writable for main-merge. Same change
rebased onto current main so lifecycle-column lint stays green.
## Test plan
- [x] merges cleanly onto main
- [ ] CI green
Co-authored-by: BESA-Franz <49682134+BESA-Franz@users.noreply.github.com >
2026-08-11 11:29:23 -10:00
ischindl
d4db29f3e6
fix(dashboard): surface mergeTaskSnapshot on useTasks mocks to fix task-detail tests ( #3409 )
...
## Problem
`app/components/__tests__/navigation-history.test.tsx`,
`TaskDetail.swipe-back.test.tsx`, and
`TaskDetail.mobile-transition.board-panel.test.tsx` fail to load.
FN-8796 (`132026545`, "stabilize task-detail lifecycle snapshots") added
`mergeTaskSnapshot` to `hooks/useTasks.ts`, which
`App.tsx`/`MainContent.tsx` now import. The curated test suites that
`vi.mock("../../hooks/useTasks")` still only expose `useTasks`, so the
fixture throws at import time:
```
No "mergeTaskSnapshot" export is defined on the useTasks mock
```
Confirmed on `origin/main`: `mergeTaskSnapshot` is present in
`useTasks.ts` and imported by `App.tsx`, while these tests' `vi.mock`
shims don't surface it.
## Fix
Update the mocks to surface every export the rendered components import,
using a partial `importOriginal` mock so `mergeTaskSnapshot` keeps its
real implementation (a `vi.fn()` returning `undefined` would make
`App.tsx:2179` `liveTask.id` throw):
```ts
vi.mock("../../hooks/useTasks", async (importOriginal) => {
const actual = await importOriginal();
return { ...actual, useTasks: (_options?: any) => mockUseTasks() };
});
```
## Verification
- `FUSION_DASHBOARD_DEEP=1 vitest run navigation-history swipe-back
board-panel` → **14 files, 116 tests passed**
- Pre-existing on `origin/main`, fixes a regression introduced by
FN-8796.
## Scope
Tests + a one-line docs note only. No production behavior change.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Documentation**
- Documented improved worktree recovery behavior, including safer
handling of incomplete, inactive, and unregistered directories.
- Added guidance for recovery across different storage locations and
bounded cleanup of recognized entries.
- Clarified protections that prevent internal recovery containers from
being treated as worktrees.
- **Tests**
- Improved dashboard test coverage and reliability for task detail
rendering, mobile transitions, swipe-back navigation, and navigation
history.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Fusion <noreply@runfusion.ai >
Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com >
2026-08-11 11:28:50 -10:00
Phil Larson
ca134c2554
test(engine): align failed notification fixture with recovery ownership ( #3418 )
...
## Summary
- make the already-merged recovery fixture explicit that no maintenance
sweep owns terminal-failure recovery
- preserve the fail-open `task-wedged` notification assertion when no
landed commit is found
## Test plan
- `corepack pnpm --filter @fusion/engine exec vitest run
--silent=passed-only --reporter=dot src/__tests__/self-healing.test.ts`
(460 passed)
- `corepack pnpm --filter @fusion/engine typecheck`
- `node scripts/run-static-gate-checks.mjs` (12 passed)
- `corepack pnpm --filter @fusion/engine test:core` (422 passed)
- `corepack pnpm --filter @fusion/core test:unit-gate` (184 passed)
- `corepack pnpm --filter @runfusion/fusion test:ci-shape` (71 passed)
- `corepack pnpm test:gate` reaches the PostgreSQL harness but cannot
authenticate locally (`empty password returned by client`) before
product assertions
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Tests**
* Updated failure-notification test conditions to cover scenarios
without automatic maintenance processing.
* Added coverage confirming terminal-failure notifications fail open
when no maintenance sweep owns the task.
* Bypassed production debounce timing to make the test behavior
deterministic.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-11 11:28:46 -10:00
gsxdsm
66c51038a5
fix(engine): bind self-owned worktree liveness probe ( #3419 )
...
## Summary
Supersedes #3416 — the fork head is not writable from maintainers, so
this branch carries the same fix merged onto current `main`.
## Changes
- Bind the self-owned worktree liveness probe in task-executor pure
facades (from #3416 ).
- Merge current main so the lifecycle-column census baseline stays
green.
## Test plan
- [x] `pnpm check:lifecycle-columns` clean after merge
- [ ] CI green
Closes context from #3416 .
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Fixed cleanup for self-owned worktrees so it no longer crashes before
checking whether an active session is present.
* Improved safety during worktree reconciliation by correctly verifying
that the worktree is still active before removal.
* **Documentation**
* Added a changeset documenting the worktree cleanup fix.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: BESA-Franz <49682134+BESA-Franz@users.noreply.github.com >
2026-08-11 11:28:42 -10:00
gsxdsm
a6ce7f89ef
FN-8987: expose release-gate verdicts for Promote visibility
...
Expose server-evaluated release-gate state so Promote controls accurately reflect approval readiness.
- Attach transient release-gate verdicts to task API responses.
- Preserve only fresh REST verdicts across task snapshots and render them in task cards.
- Align hold-release gating and document the Promote-state contract.
Files changed:
.changeset/fn-8987-release-gate-verdict.md | 7 +
docs/dashboard-guide.md | 4 +
docs/solutions/workflow-learnings/project-union-versus-per-task-lanes.md | 1 +
docs/workflow-steps.md | 4 +
packages/core/src/index.gate.ts | 2 +-
packages/core/src/index.ts | 2 +-
packages/core/src/types.ts | 2 +
packages/core/src/types/task/task-core.ts | 20 +++
packages/dashboard/app/components/TaskCard.tsx | 3 +-
packages/dashboard/app/components/__tests__/TaskCard.test.tsx | 31 ++++
packages/dashboard/app/hooks/__tests__/useTasks.test.ts | 26 ++++
packages/dashboard/app/hooks/useTasks.ts | 135 +++++++++++++++--
packages/dashboard/app/utils/__tests__/releaseGate.contract.test.ts | 29 ++++
packages/dashboard/app/utils/__tests__/releaseGate.test.ts | 49 ++++++
packages/dashboard/app/utils/releaseGate.ts | 26 ++++
packages/dashboard/app/utils/reviewBudgetApproval.ts | 9 ++
packages/dashboard/src/routes/register-task-workflow-routes.ts | 20 ++-
packages/engine/src/__tests__/release-gate-verdict.test.ts | 40 +++++
packages/engine/src/execution/hold-release.ts | 166 +++++++++------------
packages/engine/src/index.ts | 3 +
20 files changed, 469 insertions(+), 110 deletions(-)
Fusion-Task-Id: FN-8987
Fusion-Task-Lineage: 6f1742bc-2b2b-4a32-9be5-92160335d90d
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 14:22:14 -07:00
Phil Larson
6cc15fd73d
fix(ci): restore clean-main CLI and lifecycle gates ( #3420 )
...
## Summary
- Complete the isolated `@fusion/core` mock used by the
experiment-finalize extension suite
- Classify three intentional physical/synthetic lifecycle literals
introduced on current main
- Re-record the strict lifecycle census baseline with zero unexamined
guards
## Test plan
- `pnpm --filter @runfusion/fusion exec vitest run
src/__tests__/extension-experiment-finalize.test.ts --silent=passed-only
--reporter=dot`
- `pnpm --filter @fusion/core exec vitest run
src/__tests__/task-intake-owner-resolver.test.ts --silent=passed-only
--reporter=dot`
- `pnpm --filter @fusion/engine exec vitest run --project engine-default
src/__tests__/mission-feature-sync-lanes.test.ts --silent=passed-only
--reporter=dot`
- `pnpm check:lifecycle-columns`
- `node scripts/check-mock-completeness.mjs`
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Bug Fixes**
- Improved mission reconciliation previews for task links, specification
alignment, and lifecycle updates.
- Prevented stale or superseded validation runs from overwriting current
feature status or ownership.
- Improved blocked-feature diagnostics and archived-task handling across
workflow configurations.
- **Documentation**
- Clarified validation, assignment checks, and mission synchronization
behavior.
- **Tests**
- Expanded coverage for reconciliation previews and validator ownership
scenarios.
- **Chores**
- Updated lifecycle baseline data for known archived-task cases.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-11 10:57:36 -10:00
gsxdsm
9f24a517cf
FN-8956: track resolved review findings
...
Add durable, scoped resolution states for workflow review findings.
- Persist reviewer-applied and superseded finding receipts without making them actionable.
- Scope supersession claims to a named prior workflow result, preserving duplicate IDs in other review lanes.
- Render informational resolution badges and reject resolved items from revision requests.
Files changed: .changeset/fn-8956-review-finding-resolution.md | 7 +
docs/dashboard-guide.md | 2 +-
docs/workflow-steps.md | 8 +-
.../src/__tests__/review-severity-gate.test.ts | 25 ++++
.../src/__tests__/workflow-step-results.test.ts | 45 +++++-
packages/core/src/index.gate.ts | 6 +
packages/core/src/index.ts | 6 +
packages/core/src/types.ts | 2 +
packages/core/src/types/task/task-review.ts | 4 +
packages/core/src/types/workflow/workflow-steps.ts | 15 +-
.../src/workflows/builtin-code-review-group.ts | 2 +-
.../src/workflows/builtin-plan-review-group.ts | 2 +-
.../core/src/workflows/review-severity-gate.ts | 37 ++++-
.../core/src/workflows/workflow-step-results.ts | 54 ++++++-
packages/dashboard/app/api/agents/run-audit.ts | 1 +
.../dashboard/app/components/TaskReviewTab.css | 22 +++
.../dashboard/app/components/TaskReviewTab.tsx | 36 +++--
.../components/__tests__/TaskReviewTab.test.tsx | 46 ++++++
.../dashboard/src/__tests__/routes-tasks.test.ts | 48 ++++++
.../src/routes/register-task-workflow-routes.ts | 14 +-
.../__tests__/review-finding-supersession.test.ts | 163 +++++++++++++++++++++
.../__tests__/review-findings-injection.test.ts | 22 +++
.../workflow-step-verdict-parsing.test.ts | 16 +-
.../engine/src/executor/execute-workflow-graph.ts | 129 ++++++++--------
.../engine/src/executor/execute-workflow-step.ts | 25 +++-
.../engine/src/executor/run-graph-custom-node.ts | 7 +
.../executor/workflow-step-failure-injection.ts | 8 +-
.../engine/src/executor/workflow-step-verdict.ts | 17 ++-
.../src/workflows/workflow-graph-executor.ts | 15 ++
packages/i18n/locales/en/app.json | 4 +-
packages/i18n/locales/es/app.json | 4 +-
packages/i18n/locales/fr/app.json | 4 +-
packages/i18n/locales/ko/app.json | 4 +-
packages/i18n/locales/pt-BR/app.json | 4 +-
packages/i18n/locales/zh-CN/app.json | 4 +-
packages/i18n/locales/zh-TW/app.json | 4 +-
36 files changed, 703 insertions(+), 109 deletions(-)
Fusion-Task-Id: FN-8956
Fusion-Task-Lineage: 80568280-85aa-4a49-a60a-99b75f88f486
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 13:34:27 -07:00
gsxdsm
6ae9299576
FN-8953: defer terminal wedge alerts during recovery
...
Hold terminal wedge alerts until their recovery window has elapsed.
- Persist and settle pending wedge notifications across restarts.
- Clear pending alerts on task progress and reconcile expired holds during self-healing.
- Expose the settle window in notification settings with coverage for store and notification flows.
Files changed:
.changeset/fn-8953-wedge-settle-window.md | 7 +
AGENTS.md | 1 +
docs/architecture.md | 3 +-
docs/settings-reference.md | 1 +
.../core/src/__tests__/store-wedge-pending.test.ts | 56 +++++
packages/core/src/config/settings-schema.ts | 1 +
packages/core/src/store.ts | 46 ++++
packages/core/src/types/settings/settings-scope.ts | 2 +
packages/core/src/types/task/task-core.ts | 15 ++
.../app/components/settings/save-split.ts | 1 +
.../sections/NotificationsSection.search.ts | 9 +
.../settings/sections/NotificationsSection.tsx | 15 ++
.../settings-default-descriptions.test.tsx | 1 +
...self-healing-pending-wedge-notification.test.ts | 148 ++++++++++++
.../__tests__/notification-service.test.ts | 7 +-
.../__tests__/task-wedge-notification.test.ts | 258 ++++++++++++++++++++-
.../src/notification/notification-service.ts | 260 +++++++++++++++++++++
packages/engine/src/self-healing.ts | 38 +++
packages/i18n/locales/en/app.json | 2 +
19 files changed, 850 insertions(+), 21 deletions(-)
Fusion-Task-Id: FN-8953
Fusion-Task-Lineage: fd5b5827-c69d-409f-86d5-01ff23405ee3
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 12:34:47 -07:00
gsxdsm
dfd88e7540
fix: resume capacity-parked workflow continuations
...
The planning-continuation drain skipped every due `kind: "task"` row whose
`waitReason` was not "planning", on the premise that such rows "belong to a
different drain". No such drain exists: `listDueWorkflowWorkItems` has exactly
two callers, this pass and the self-healing reclaim sweep, and the sweep
deliberately leaves `runnable`/`retrying` rows alone as "the dispatcher's own
queue". A capacity-parked continuation was therefore owned by nobody — skipped
here every poll with no state change and no audit row, and passed over there by
design.
Observed on the Fusion board: eight cards sat runnable for up to 8h with the
engine unpaused, 0 tasks in progress, and 4 of 10 worktrees used. Three carried
`waitReason: "capacity"` from the capacity-suspend path; five carried NULL. The
09:04 reclaim sweep had just moved them held -> runnable, handing them to this
drain and simultaneously putting them out of its own reach, so the auto-resume
fix tightened the strand it repaired.
Dispatch stays admission-gated by `admitPlanningContinuation`, so a
capacity-parked card resumes only when a slot is genuinely free.
Also repairs two stale path allowlists in planning-claim-single-writer.ts: the
mission stores and replan-target.ts moved into subdirectories, leaving that
ratchet red on main and accusing the two modules it exists to exclude.
Verified: the patched classifier returns `actionable` for all 8 live stranded
rows; gate + lint green.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-11 10:36:26 -07:00
gsxdsm
eef68fe0b9
FN-8933: capture semantic memory from completed work
...
Add inferred graph relationships and detached recall capture across completed-work memory surfaces.
- Validate and persist deterministic inferred semantic edges with audit outcomes.
- Capture completed tasks, research findings, and insights as bounded recall entries.
- Wire memory semantics through engine, research APIs, and coverage tests.
Files changed:
.changeset/fn-8933-memory-semantics-capture.md | 7 +
AGENTS.md | 1 +
docs/knowledge-graph.md | 10 +-
.../src/__tests__/memory/recall-capture.test.ts | 111 +++++++++++++
.../__tests__/postgres/insight-store.pg.test.ts | 25 +++
.../postgres/research-execution.pg.test.ts | 38 +++++
.../__tests__/research-feature-promotion.test.ts | 39 +++++
.../core/src/async-stores/async-insight-store.ts | 23 ++-
packages/core/src/index.ts | 1 +
.../__tests__/graph-builder-incremental.test.ts | 28 ++++
.../__tests__/inferred-edge-writer.test.ts | 74 +++++++++
packages/core/src/knowledge-graph/graph-builder.ts | 27 ++-
.../src/knowledge-graph/graph-serialization.ts | 2 +-
packages/core/src/knowledge-graph/graph-store.ts | 12 ++
packages/core/src/knowledge-graph/graph-types.ts | 2 +-
packages/core/src/knowledge-graph/index.ts | 1 +
.../src/knowledge-graph/inferred-edge-writer.ts | 96 +++++++++++
packages/core/src/memory/index.ts | 1 +
packages/core/src/memory/recall-capture.ts | 184 +++++++++++++++++++++
.../src/research/research-feature-promotion.ts | 23 ++-
packages/core/src/task-store/task-store-helpers.ts | 13 +-
.../src/__tests__/research-routes.test.ts | 80 ++++++++-
packages/dashboard/src/research-routes.ts | 27 ++-
.../src/__tests__/agent-mission-tools.test.ts | 60 ++++++-
.../src/__tests__/in-process-runtime.pg.test.ts | 28 +++-
.../memory-consolidation-heartbeat-hook.test.ts | 8 +-
.../__tests__/memory-consolidation-ports.test.ts | 17 +-
.../src/__tests__/memory-semantics-pass.test.ts | 115 +++++++++++++
.../engine/src/__tests__/project-engine.test.ts | 65 +++++++-
packages/engine/src/agent-heartbeat.ts | 14 +-
packages/engine/src/agent-tools.ts | 12 +-
packages/engine/src/agents/agent-reflection.ts | 9 +-
packages/engine/src/memory/index.ts | 1 +
.../src/memory/memory-consolidation-adapters.ts | 18 +-
packages/engine/src/memory/memory-consolidation.ts | 13 +-
packages/engine/src/memory/memory-semantics.ts | 67 ++++++++
packages/engine/src/project-engine.ts | 3 +
.../engine/src/research/research-orchestrator.ts | 20 ++-
packages/engine/src/runtimes/in-process-runtime.ts | 12 ++
packages/engine/src/util/run-audit.ts | 11 ++
40 files changed, 1250 insertions(+), 48 deletions(-)
Fusion-Task-Id: FN-8933
Fusion-Task-Lineage: b75a6b23-906f-4255-92f1-7684beb742b8
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 05:45:36 -07:00
gsxdsm
5a1853cac6
FN-8934: add memory pre-steering across agent prompts
...
Add bounded memory-first guidance and consolidation observability across agent workflows.
- Apply mode-aware memory pre-steering to execution, triage, reviewer, heartbeat, and merger prompts.
- Export and test shared memory nudges while documenting memory inclusion settings.
- Expose agent memory consolidation history through dashboard API and detail UI.
Files changed:
.changeset/fn-8934-memory-pre-steering.md | 7 ++
docs/agents.md | 4 +
docs/settings-reference.md | 2 +
.../core/src/__tests__/memory-pre-steering.test.ts | 28 +++++++
packages/core/src/__tests__/project-memory.test.ts | 22 ++++++
packages/core/src/index.gate.ts | 7 ++
packages/core/src/index.ts | 7 ++
packages/core/src/memory/index.ts | 1 +
packages/core/src/memory/memory-pre-steering.ts | 41 ++++++++++
packages/core/src/memory/project-memory.ts | 19 +++++
packages/dashboard/app/api/agents/agents.ts | 12 +++
packages/dashboard/app/api/legacy.ts | 2 +
.../dashboard/app/components/AgentDetailView.css | 41 ++++++++++
.../dashboard/app/components/AgentDetailView.tsx | 56 +++++++++++++-
...etailView.memory-consolidation-history.test.tsx | 58 +++++++++++++++
.../__tests__/AgentDetailView.test-helpers.ts | 3 +
.../register-agent-memory-consolidations.test.ts | 87 ++++++++++++++++++++++
.../register-agent-reflection-rating-routes.ts | 36 +++++++++
.../memory-pre-steering-injection.test.ts | 50 +++++++++++++
packages/engine/src/__tests__/reviewer.test.ts | 18 +++++
packages/engine/src/__tests__/triage.test.ts | 18 ++++-
packages/engine/src/agent-heartbeat.ts | 14 +++-
.../engine/src/agents/agent-heartbeat-prompts.ts | 2 +
packages/engine/src/agents/agent-instructions.ts | 16 ++--
packages/engine/src/execution/reviewer.ts | 31 +++++---
packages/engine/src/executor/execution-prompt.ts | 6 +-
packages/engine/src/merger.ts | 9 ++-
packages/engine/src/triage.ts | 12 ++-
28 files changed, 577 insertions(+), 32 deletions(-)
Fusion-Task-Id: FN-8934
Fusion-Task-Lineage: a062cc6b-1277-4d36-9926-b3ecba4945eb
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 04:57:14 -07:00
gsxdsm
25e292d0e6
FN-8954: preserve CLI liveness during startup
...
Ensure CLI startup operations settle before process exit on supported Node runtimes.
- Keep awaited QMD probes and ephemeral port selection ref'd until completion.
- Add CLI process regressions for init persistence and exit code 13.
- Declare the Node 22.4 runtime floor and extend boot smoke coverage.
Files changed:
.changeset/fn-8954-cli-exit-13.md | 7 ++
docs/testing.md | 4 +-
package.json | 3 +
packages/cli/agent-browser.mjs | 6 ++
packages/cli/bin.mjs | 7 ++
packages/cli/package.json | 3 +
packages/cli/src/__tests__/ci-workflow.test.ts | 9 +++
packages/cli/src/__tests__/cli-exit-code.test.ts | 82 ++++++++++++++++++++++
packages/cli/src/__tests__/package-config.test.ts | 12 ++++
packages/cli/src/bin.ts | 6 ++
.../__tests__/postgres/embedded-free-port.test.ts | 37 ++++++++++
packages/core/src/memory/memory-backend.ts | 17 +++--
packages/core/src/postgres/embedded-lifecycle.ts | 16 +++--
scripts/boot-smoke.mjs | 62 +++++++++++-----
14 files changed, 244 insertions(+), 27 deletions(-)
Fusion-Task-Id: FN-8954
Fusion-Task-Lineage: 05303d07-2662-48d5-a442-6d43fa0a4493
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 04:20:33 -07:00
gsxdsm
f038d04dc5
FN-8986: stage computer-use skill only on Darwin
...
Stage the bundled computer-use discovery skill exclusively for supported macOS runtimes.
- Gate Claude and Grok session skill resolution and staging by platform.
- Install the Hermes discovery skill on Darwin while preserving user overrides and non-Darwin suppression.
- Document runtime discovery behavior, add coverage, and add a minor release changeset.
Files changed:
.../darwin-only-computer-use-skill-staging.md | 7 +
docs/computer-use.md | 10 +-
.../custom-provider-routes-hermes-additive.test.ts | 2 +-
.../src/__tests__/skill-loader.test.ts | 197 +++++++++++++++++++++
.../src/skill-loader.ts | 145 ++++++++++-----
.../src/__tests__/skill-loader.test.ts | 51 +++++-
.../fusion-plugin-grok-runtime/src/skill-loader.ts | 145 ++++++++++-----
.../src/__tests__/fusion-skill-install.test.ts | 62 ++++++-
.../src/__tests__/index.test.ts | 37 +++-
.../src/fusion-skill-install.ts | 151 ++++++++--------
plugins/fusion-plugin-hermes-runtime/src/index.ts | 21 ++-
11 files changed, 649 insertions(+), 179 deletions(-)
Fusion-Task-Id: FN-8986
Fusion-Task-Lineage: 373d558a-1d0a-4737-99be-f53189a9aeaf
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 04:13:35 -07:00
gsxdsm
967e98194e
FN-8950: hide Promote until plan gates clear
...
Prevent task-card promotion shortcuts when plan review or approval holds remain.
- Mirror default-on plan-review gate and approval-hold predicates in dashboard helpers.
- Suppress Promote across planning, review, and approval states.
- Add regression coverage and a patch changeset.
Files changed:
.changeset/fn-8950-promote-plan-gate.md | 7 ++
packages/dashboard/app/components/TaskCard.tsx | 29 +++++--
.../__tests__/TaskCard.cost-badge.test.tsx | 2 +
.../__tests__/TaskCard.footer-wrap.test.tsx | 2 +
.../app/components/__tests__/TaskCard.test.tsx | 96 ++++++++++++++--------
.../utils/__tests__/reviewBudgetApproval.test.ts | 77 +++++++++++++++++
.../dashboard/app/utils/reviewBudgetApproval.ts | 43 ++++++++++
7 files changed, 218 insertions(+), 38 deletions(-)
Fusion-Task-Id: FN-8950
Fusion-Task-Lineage: c587b3b4-03b4-4cd2-9588-826706788eb7
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 04:00:16 -07:00
gsxdsm
637854ad36
FN-8932: add durable memory consolidation agent
...
Add a provisioned memory agent that consolidates durable recall material through idempotent heartbeat ticks.
- Provision and configure the durable memory agent with an enabled workflow setting.
- Add consolidation adapters, material collection, recall graph references, and run-audit metadata.
- Expose the setting in the dashboard and document the memory-agent behavior.
- Cover provisioning, heartbeat, consolidation, audit, and recall graph behavior with tests.
Files changed:
.changeset/fn-8932-memory-agent.md | 7 ++
AGENTS.md | 1 +
docs/agents.md | 10 ++
docs/settings-reference.md | 1 +
docs/storage.md | 2 +-
.../memoryConsolidationEnabled-default.test.ts | 22 ++++
.../memory-recall-graph-cross-reference.pg.test.ts | 115 +++++++++++++++++++++
.../__tests__/memory-agent-provisioning.test.ts | 31 ++++++
packages/core/src/agents/agent-store.ts | 85 +++++++++++++++
packages/core/src/agents/memory-agent-defaults.ts | 30 ++++++
packages/core/src/index.gate.ts | 2 +
packages/core/src/index.ts | 9 ++
packages/core/src/memory/recall/index.ts | 1 +
packages/core/src/memory/recall/recall-dedup.ts | 3 +
packages/core/src/memory/recall/recall-store.ts | 35 ++++++-
.../src/workflows/builtin-workflow-settings.ts | 14 +++
.../src/workflows/workflow-settings-resolver.ts | 12 ++-
.../__tests__/WorkflowSettingsPanel.test.tsx | 8 ++
.../__tests__/workflow-setting-display.test.ts | 6 ++
.../app/components/workflow-setting-display.ts | 5 +
.../memory-consolidation-heartbeat-hook.test.ts | 92 +++++++++++++++++
.../__tests__/memory-consolidation-ports.test.ts | 34 ++++++
...memory-consolidation-run-audit-metadata.test.ts | 19 ++++
.../__tests__/memory-consolidation-tick.test.ts | 62 +++++++++++
packages/engine/src/agent-heartbeat.ts | 55 ++++++++++
packages/engine/src/index.ts | 1 +
packages/engine/src/memory/index.ts | 3 +
.../src/memory/memory-consolidation-adapters.ts | 29 ++++++
.../src/memory/memory-consolidation-material.ts | 22 ++++
packages/engine/src/memory/memory-consolidation.ts | 41 ++++++++
packages/engine/src/util/run-audit.ts | 10 ++
31 files changed, 764 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-8932
Fusion-Task-Lineage: b4fdec50-1f42-4120-af17-0b6f3a94586e
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 03:53:11 -07:00
gsxdsm
0eaa3c7b9a
FN-8990: clean up plugin reload scratch files
...
Keep plugin hot-reload cache-busting copies ephemeral and remove legacy tracked artifacts.
- Delete tracked plugin reload scratch files.
- Remove temporary import copies after successful and failed reloads.
- Add cleanup and tracked-artifact regression coverage.
Files changed:
.changeset/fn-8990-plugin-reload-scratch-cleanup.md | 7 ++
packages/core/src/__tests__/plugin-hot-reload.test.ts | 25 ++++ -
packages/core/src/plugins/plugin-loader.ts | 16 ++-
plugins/fusion-plugin-droid-runtime/src/.index.reload-1.ts | 84 ----------------
plugins/fusion-plugin-droid-runtime/src/.index.reload-2.ts | 84 ----------------
plugins/fusion-plugin-hermes-runtime/src/.index.reload-1.ts | 108 --------------------
plugins/fusion-plugin-hermes-runtime/src/.index.reload-2.ts | 108 --------------------
plugins/fusion-plugin-hermes-runtime/src/.index.reload-3.ts | 108 --------------------
plugins/fusion-plugin-openclaw-runtime/src/.index.reload-1.ts | 95 -----------------
plugins/fusion-plugin-paperclip-runtime/src/.index.reload-1.ts | 112 ---------------------
scripts/__tests__/no-tracked-plugin-reload-artifacts.test.mjs | 27 +++++
11 files changed, 72 insertions(+), 702 deletions(-)
Fusion-Task-Id: FN-8990
Fusion-Task-Lineage: 2221ebaf-b8ab-4a3c-8934-addfa348c98c
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 03:40:21 -07:00
gsxdsm
41bb94ba77
FN-8957: isolate PostgreSQL agents by project
...
Keep durable PostgreSQL agent records and analytics isolated to their bound project.
- Scope agent reads, mutations, satellite records, ratings, reassignment links, and analytics task data by project.
- Add a project-local agent-ratings migration and schema coverage.
- Exercise duplicate agent IDs, ratings, and token analytics across shared PostgreSQL projects.
Files changed:
.changeset/fn-8957-agent-project-isolation.md | 7 +
docs/multi-project.md | 9 +
.../postgres/agent-project-isolation.pg.test.ts | 207 +++++++++++++++++++++
.../src/__tests__/postgres/schema-applier.test.ts | 13 +-
packages/core/src/agents/agent-store.ts | 52 +++---
.../core/src/async-stores/async-agent-store.ts | 118 ++++++++++--
packages/core/src/board/team-analytics.ts | 20 +-
...0054_fn_8957_agent_rating_project_isolation.sql | 32 ++++
packages/core/src/postgres/schema-applier.ts | 13 +-
packages/core/src/postgres/schema/project.ts | 6 +-
packages/core/src/task-store/task-artifacts-ops.ts | 19 +-
11 files changed, 443 insertions(+), 53 deletions(-)
Fusion-Task-Id: FN-8957
Fusion-Task-Lineage: 02cb3f13-e5d1-4cea-8afb-72bcd9fae890
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 03:32:16 -07:00
gsxdsm
cb4d94104a
docs(engine): correct the prune-before-remove rationale
...
The comment cited 89 registered worktrees against 20 on disk as evidence of stale
registrations. That comparison was against .worktrees/ alone; all 89 registrations
exist, spread across kb-worktrees, orca workspaces and .claude/worktrees. Prune
still belongs before removal on ordering grounds -- a dangling registration fails
the removal, and the throw skips the trailing prune so the retry never clears it --
but the false measurement should not stand as the justification.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-11 02:49:01 -07:00
gsxdsm
2b228383d5
test: cover model-target chat creation and non-conflict cleanup failures
...
Both suites are mutation-verified: reverting the corresponding fix fails 4 of the
chat tests and exactly the 3 new self-healing park tests.
The self-healing tests carry a positive control asserting the sweep actually
reached the tip-already-merged arm -- without it the park assertions passed
vacuously against a task shape the candidate filter rejected.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-11 02:47:24 -07:00
gsxdsm
fd68bb1bea
fix: model-target chats 404, and worktree rmdir races misreported as branch conflicts
...
Two unrelated production failures with a shared symptom of an opaque error.
Chat: FN-8869 hoisted the agent-existence check out of its else branch, so it ran
even when the client supplied an explicit model pair. Model-target chats send the
client-only sentinel `__fn_agent__`, which is never an agent row, so every one of
them 404'd behind the generic "Failed to create chat session" toast. The agent is
now required only when it is the source of model resolution.
Self-healing: a failed `tip-already-merged` cleanup was rethrown and classified
`branch-conflict-unrecoverable`, failing and pausing tasks whose branch was already
an ancestor of the integration ref. Every one of the 78 logged parks carried a
`git worktree remove --force` / `ENOTEMPTY rmdir node_modules` message -- a pnpm
race, not a conflict. Cleanup failure now retries on the next sweep, and prune runs
before removal so a stale registration stops causing the failure it would prevent.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-11 02:39:56 -07:00
gsxdsm
06ea444339
fix: uncap workflow principals and auto-resume stranded continuations
...
Two independent wedges kept cards silently stuck on the board.
1. Workflow principals were capped. `WorkflowAgentCapacity.acquire` enforced
`settings.maxConcurrent` as a project session budget plus an optional
per-agent `maxWorkflowSessions`, and `routeWorkflowPrincipal`'s availability
test applied the same per-agent ceiling. The workflow roles stand in for
STAGES, not workers, and there is typically one agent per role - so the cap
serialized the entire board behind a single Workflow Executor regardless of
maxConcurrent/maxWorktrees. Admission now always succeeds; the lease survives
as bookkeeping (it is what activeSessions counts and what the renewal timer
keeps warm). `maxProjectSessions` is removed from the input rather than
defaulted, so it cannot be reintroduced without deleting the contract, and
the agent-capacity re-route loops in triage and graph admission are deleted
with the refusal they existed to work around.
2. Continuations that stop in `running` or `held` were never re-polled. The
scheduler's due-poll takes only `runnable`/`retrying`; a row claimed through
a path that leaves `leaseExpiresAt` NULL keeps `state: "running"` forever
after its process dies, and `acquireWorkflowWorkItemLease` can only re-take a
`held` row whose blockedReason matches workflow-principal-%. Observed live:
seven cards `running` behind leases from a process that exited ~9h earlier,
two `held` with a NULL blockedReason for 46h, none emitting a single
run-audit row while stranded. A further 33 active-state rows belonged to
archived+soft-deleted tasks (the FK cascade only fires on hard delete).
New sweep `reconcileStrandedWorkflowContinuations` (startup + periodic)
re-queues both stranded shapes and retires dead tasks' rows, gated by the
canonical liveness triple, a 10-minute grace matching the capacity lease
duration, and a compare-and-set on the scanned state so a real claim wins.
The decision is the pure `evaluateStrandedContinuationReclaim`, shared with
its tests so coverage cannot drift from behavior - the drift that let the
FN-8923 sweep ship covering one ninth of this problem.
Verified: pnpm lint, engine typecheck, pnpm test:gate (606 tests), verify:fast,
and the new suite under mutation (removing either guard fails 3 cases). The two
pre-existing failures in self-healing-orphaned-pending-step-results.test.ts
reproduce identically at HEAD without these changes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-11 02:02:51 -07:00
gsxdsm
62979d8796
FN-8985: centralize CLI version resolution
...
Centralize CLI self-version discovery without widening the early boot import graph.
- Reuse one bounded manifest resolver for the CLI binary, updater, and plugin scaffold.
- Add regression coverage for manifest lookup bounds, malformed manifests, and scaffold version fallback.
- Preserve update command test isolation after the core i18n module relocation.
Files changed:
packages/cli/src/__tests__/cli-version.test.ts | 136 +++++++++++++++++++++
.../plugin-scaffold-caret-fallback.test.ts | 91 ++++++++++++++
packages/cli/src/bin.ts | 45 +------
packages/cli/src/cli-version.ts | 51 ++++++++
packages/cli/src/commands/__tests__/update.test.ts | 2 +-
packages/cli/src/commands/plugin-scaffold.ts | 40 +-----
packages/cli/src/commands/update.ts | 37 +-----
7 files changed, 292 insertions(+), 110 deletions(-)
Fusion-Task-Id: FN-8985
Fusion-Task-Lineage: dd95b651-3578-4c5f-957a-5af7b85129d7
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 01:51:22 -07:00
gsxdsm
8f6190910d
FN-8971: add mission blocked-status clearing tool
...
Add an operator-only CLI tool for repairing stale mission blocked badges.
- Register and document fn_mission_clear_blocked with PostgreSQL and status-error handling.
- Withhold the repair action from agent principals and deny it in readonly workflow steps.
- Classify the tool consistently across engine permission gates and add coverage.
- Add a minor CLI changeset for the new operator capability.
Files changed:
.changeset/fn-8971-mission-clear-blocked-tool.md | 7 +++
docs/missions.md | 7 ++-
packages/cli/skill/fusion/SKILL.md | 2 +-
.../cli/skill/fusion/references/extension-tools.md | 9 ++++
.../skill/fusion/references/fusion-capabilities.md | 1 +
.../__tests__/extension-permission-gates.test.ts | 26 ++++++++++
packages/cli/src/__tests__/extension.test.ts | 56 +++++++++++++++++++++-
packages/cli/src/extension.ts | 54 +++++++++++++++++++++
.../src/__tests__/agent-mission-tools.test.ts | 5 +-
.../src/__tests__/gating-classifications.test.ts | 8 ++++
.../workflow-step-readonly-allowlist.test.ts | 5 +-
.../engine/src/execution/gating-classifications.ts | 7 +++
12 files changed, 182 insertions(+), 5 deletions(-)
Fusion-Task-Id: FN-8971
Fusion-Task-Lineage: 650c13b3-c6c4-4dc5-a0b5-9c71d3b94fc5
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 01:45:08 -07:00
gsxdsm
7ddcf7e2a6
FN-8979: remove legacy mission resume blockers
...
Retire the deprecated v0 mission-resume blocker payload in favor of canonical descriptors.
- Remove legacy blocker types, conversions, exports, and HTTP payload mirrors.
- Deduplicate canonical blocker descriptors and update clients, tests, and documentation.
- Add a major changeset for the breaking API removal.
Files changed:
.changeset/fn-8979-removal.md | 7 +++++
docs/missions.md | 4 +--
.../suite-only-flakes-observed-register.md | 14 +++++++++
.../src/__tests__/mission-blocked-clear.test.ts | 23 ++++++++++++++-
.../core/src/__tests__/mission-blockers.test.ts | 26 +++++++++++------
.../__tests__/postgres/mission-store.pg.test.ts | 5 +---
.../core/src/async-stores/async-mission-store.ts | 7 +----
packages/core/src/index.gate.ts | 3 +-
packages/core/src/index.ts | 3 +-
packages/core/src/missions/mission-blockers.ts | 34 +++++++++++++---------
packages/core/src/missions/mission-types.ts | 9 ++----
packages/core/src/types.ts | 2 +-
packages/dashboard/app/api/missions/missions.ts | 25 +++++-----------
.../MissionManager.blocked-repair.test.tsx | 17 +++++++----
.../MissionManager.resume-conflict.test.tsx | 9 ++++--
.../src/__tests__/mission-resume-conflict.test.ts | 11 ++++---
packages/dashboard/src/mission-routes.ts | 10 +++----
17 files changed, 127 insertions(+), 82 deletions(-)
Fusion-Task-Id: FN-8979
Fusion-Task-Lineage: 2a0dd0b6-43ca-44ad-b992-79f4ef8eda67
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 01:30:04 -07:00
gsxdsm
eacd6687bc
FN-8961: add computer-use skill and version-matched guide
...
Ship the computer-use skill across bundled clients and surface its matching guide through the CLI.
- add the computer-use skill, computer command descriptor, and `fn skills get computer-use` guide
- reconcile all shipped Claude skills at project and startup entry points
- cover both skills' reconciliation outcomes and every required call site
Files changed:
.changeset/fn-8961-computer-use-skill.md | 7 +
docs/cli-reference.md | 6 +-
docs/computer-use.md | 8 +
packages/cli/skill/computer-use/SKILL.md | 31 +++
packages/cli/src/__tests__/package-config.test.ts | 20 ++
packages/cli/src/bin.ts | 14 +-
.../__tests__/claude-skills-callsites.test.ts | 64 ++++++
.../src/commands/__tests__/claude-skills.test.ts | 221 ++++++++-------------
.../__tests__/computer-surface-descriptor.test.ts | 108 ++++++++++
.../commands/__tests__/computer-use-guide.test.ts | 36 ++++
.../commands/__tests__/computer-use-skill.test.ts | 20 ++
packages/cli/src/commands/__tests__/daemon.test.ts | 36 +++-
.../__tests__/dashboard-claude-skills.test.ts | 19 ++
packages/cli/src/commands/__tests__/init.test.ts | 48 ++++-
.../cli/src/commands/__tests__/project.test.ts | 38 ++++
packages/cli/src/commands/__tests__/serve.test.ts | 36 +++-
.../commands/__tests__/skill-installation.test.ts | 12 ++
.../cli/src/commands/__tests__/skills-get.test.ts | 67 ++++++
packages/cli/src/commands/claude-skills-runner.ts | 55 ++---
packages/cli/src/commands/claude-skills.ts | 47 +++--
packages/cli/src/commands/computer.ts | 6 +-
packages/cli/src/commands/computer/contract.ts | 52 +++++
packages/cli/src/commands/computer/guide.ts | 62 ++++++
packages/cli/src/commands/init.ts | 4 +-
packages/cli/src/commands/skill-installation.ts | 45 +++--
packages/cli/src/commands/skills.ts | 24 +++
26 files changed, 853 insertions(+), 233 deletions(-)
Fusion-Task-Id: FN-8961
Fusion-Task-Lineage: b6baaebb-bf72-4991-8239-eb9bcf9cbcf1
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 01:16:59 -07:00
gsxdsm
3eec1338c5
FN-8970: add mission reconcile controls
...
Add a dry-run mission reconciliation control with explicit apply feedback.
- Add the dashboard reconcile API client and exported result type.
- Present preview, apply, empty, and archived reconciliation states in Mission Manager.
- Guard reconcile requests across direct selection and target-mission deep-link changes.
- Cover reconcile interactions, stale requests, and deep-link intent updates.
Files changed:
.changeset/fn-8970-mission-reconcile-control.md | 7 +
docs/missions.md | 6 +
packages/dashboard/app/api/legacy.ts | 2 +
packages/dashboard/app/api/missions/missions.ts | 31 +++
packages/dashboard/app/components/MissionManager.css | 48 +++++
packages/dashboard/app/components/MissionManager.tsx | 184 +++++++++++++-
packages/dashboard/app/components/__tests__/MissionManager.mobile-css.test.ts | 8 +
packages/dashboard/app/components/__tests__/MissionManager.reconcile.test.tsx | 277 +++++++++++++++++++++
8 files changed, 557 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-8970
Fusion-Task-Lineage: 62802129-a7ea-43cb-8068-5ce2c2c21b77
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-11 00:23:10 -07:00
gsxdsm
79502c67a0
FN-8978: fix CLI TypeScript external packaging
...
Keep TypeScript available as a runtime external in the published CLI package.
- Remove the duplicate TypeScript devDependency declaration.
- Assert tsup externals are published runtime dependencies.
- Document the runtime external packaging invariant.
Files changed:
.changeset/fn-8978-typescript-dedup.md | 7 +++++
packages/cli/package.json | 1 -
packages/cli/src/__tests__/package-config.test.ts | 31 +++++++++++++++++++++++
packages/cli/tsup.config.ts | 6 +++++
4 files changed, 44 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-8978
Fusion-Task-Lineage: b9630c4a-73a9-414f-9a78-25c689359509
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-10 23:04:32 -07:00
gsxdsm
844512ed3e
FN-8976: prevent concurrent automatic validator runs
...
Prevent automatic validation from running alongside a fresh manual or non-memoized validator.
- Serialize validator admission around a feature-scoped fresh-running check.
- Report feature-versus-fingerprint blocking scope and preserve memoization semantics.
- Add regression coverage, documentation, and a patch changeset.
Files changed:
.changeset/fn-8976-validator-admission.md | 7 ++
docs/missions.md | 4 +-
.../__tests__/postgres/mission-store.pg.test.ts | 110 +++++++++++++++++++--
.../core/src/async-stores/async-mission-store.ts | 61 ++++++++++--
packages/core/src/missions/mission-types.ts | 2 +
.../src/__tests__/mission-execution-loop.test.ts | 10 +-
6 files changed, 171 insertions(+), 23 deletions(-)
Fusion-Task-Id: FN-8976
Fusion-Task-Lineage: 61b487e8-5542-4cce-94f7-58d5295fe177
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-10 22:57:21 -07:00
gsxdsm
918a4c4bfa
FN-8973: add versioned mission resume blockers
...
Expose versioned mission resume blockers across API and UI.
- Add versioned blocker descriptors with fail-closed legacy normalization and v0 compatibility projections.
- Return typed resume-conflict envelopes and render root stop details in Mission Manager.
- Cover descriptor behavior, route conflicts, UI handling, and PostgreSQL persistence.
Files changed:
.changeset/fn-8973-mission-blocker-descriptor.md | 7 ++
docs/missions.md | 2 +-
.../src/__tests__/mission-blocked-clear.test.ts | 18 ++---
.../core/src/__tests__/mission-blockers.test.ts | 43 ++++++++++++
.../__tests__/postgres/mission-store.pg.test.ts | 22 ++++--
.../core/src/async-stores/async-mission-store.ts | 23 +++---
packages/core/src/index.gate.ts | 4 ++
packages/core/src/index.ts | 4 ++
packages/core/src/missions/mission-blockers.ts | 43 ++++++++++++
packages/core/src/missions/mission-types.ts | 81 ++++++++++------------
packages/core/src/types.ts | 4 +-
packages/dashboard/app/api/legacy.ts | 1 +
packages/dashboard/app/api/missions/missions.ts | 46 +++++++-----
.../dashboard/app/components/MissionManager.tsx | 11 +--
.../MissionManager.blocked-repair.test.tsx | 10 +--
.../MissionManager.resume-conflict.test.tsx | 24 +++++++
.../__tests__/mission-blocked-clear-routes.test.ts | 2 +-
.../src/__tests__/mission-resume-conflict.test.ts | 42 +++++++++++
packages/dashboard/src/mission-routes.ts | 12 +++-
19 files changed, 297 insertions(+), 102 deletions(-)
Fusion-Task-Id: FN-8973
Fusion-Task-Lineage: 5d36c9c9-dc0f-4cb0-bd0c-ad41c8dde5c0
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-10 22:36:01 -07:00
gsxdsm
79206c3f31
FN-8977: unify CLI Vitest mock resolution
...
Route CLI test mocks through dashboard and engine runtime imports.
- Anchor pi-coding-agent resolution to the CLI package instance
- Preserve real session exports while overriding runtime dependencies
- Add a regression test and document cross-package mock scoping
Files changed:
docs/testing.md | 6 ++
.../__tests__/extension-permission-gates.test.ts | 10 ++-
.../vitest-cross-package-mock-scope.test.ts | 75 ++++++++++++++++++++++
packages/cli/vitest.config.ts | 12 ++++
4 files changed, 101 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-8977
Fusion-Task-Lineage: a652cdf4-463e-4603-8d71-87db91d0b846
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-10 22:12:15 -07:00
gsxdsm
9571f73666
FN-8972: preserve blocked mission status during rollups
...
Protect explicitly blocked or archived hierarchy statuses from automatic recomputation.
- Restrict mission and milestone rollups to statuses they own.
- Make asynchronous recomputations transactional and preserve status events.
- Cover guarded rollups in SQLite and PostgreSQL tests.
Files changed:
.../fn-8972-mission-recompute-blocked-guard.md | 7 ++
docs/missions.md | 2 +
.../mission-status-recompute-guard.test.ts | 85 +++++++++++++++++
.../__tests__/postgres/mission-store.pg.test.ts | 105 +++++++++++++++++++++
.../core/src/async-stores/async-mission-store.ts | 67 +++++++++++--
packages/core/src/missions/mission-store.ts | 12 ++-
packages/core/src/missions/mission-types.ts | 21 +++++
7 files changed, 286 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-8972
Fusion-Task-Lineage: 07ede656-dec0-4d3e-b35c-06e0f6304b74
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-10 22:03:57 -07:00
gsxdsm
1da61f35f7
FN-8960: add macOS computer automation CLI
...
Add a snapshot-backed macOS computer-use surface to the Fusion CLI.
- Register fn computer commands for app state, permission, capability, and UI actions.
- Implement macOS JXA automation with locator replay and persisted snapshot safety checks.
- Document the CLI surface, add contract coverage, and include a release changeset.
Files changed:
.changeset/fn-8960-computer-use-cli.md | 7 +
docs/README.md | 1 +
docs/cli-reference.md | 21 ++
docs/computer-use.md | 156 +++++++++++++
packages/cli/src/bin.ts | 11 +
.../__tests__/computer-adapter-registry.test.ts | 154 ++++++++++++
.../commands/__tests__/computer-commands.test.ts | 71 ++++++
.../commands/__tests__/computer-contract.test.ts | 34 +++
.../__tests__/computer-snapshot-index.test.ts | 87 +++++++
packages/cli/src/commands/computer.ts | 182 +++++++++++++++
.../cli/src/commands/computer/adapter-macos.ts | 211 +++++++++++++++++
.../cli/src/commands/computer/adapter-registry.ts | 42 ++++
.../src/commands/computer/adapter-unsupported.ts | 44 ++++
packages/cli/src/commands/computer/adapter.ts | 97 ++++++++
packages/cli/src/commands/computer/contract.ts | 83 +++++++
packages/cli/src/commands/computer/exec-seam.ts | 61 +++++
.../cli/src/commands/computer/scripts/macos-jxa.ts | 37 +++
.../cli/src/commands/computer/snapshot-store.ts | 257 +++++++++++++++++++++
18 files changed, 1556 insertions(+)
Fusion-Task-Id: FN-8960
Fusion-Task-Lineage: 5870bf69-b751-4879-bf9d-5f5396cc0f55
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-10 21:56:18 -07:00
gsxdsm
90573e31b0
FN-8963: prevent concurrent mission validation runs
...
Prevent duplicate manual validation runs while preserving recovery from stale validator state.
- Add atomic mission-store claims and release handling for manual validator runs.
- Return a conflict response and disable the validation action while a run is active.
- Cover concurrent claims, API behavior, UI state, and stale-window parity.
Files changed:
.changeset/fn-8963-validate-inflight-guard.md | 7 ++
docs/missions.md | 2 +
.../__tests__/postgres/mission-store.pg.test.ts | 129 +++++++++++++++++++++
.../core/src/async-stores/async-mission-store.ts | 87 ++++++++++++--
packages/core/src/index.ts | 2 +
packages/core/src/missions/mission-store.ts | 69 ++++++++++-
packages/core/src/missions/mission-types.ts | 13 +++
packages/dashboard/app/api/legacy.ts | 2 +
packages/dashboard/app/api/missions/missions.ts | 11 +-
.../dashboard/app/components/MissionManager.tsx | 15 ++-
.../MissionManager.validate-inflight.test.tsx | 77 ++++++++++++
.../mission-validate-inflight-guard.test.ts | 55 +++++++++
packages/dashboard/src/mission-routes.ts | 32 +---
.../src/__tests__/mission-execution-loop.test.ts | 61 +++++++++-
.../validator-run-stale-window-parity.test.ts | 9 ++
15 files changed, 549 insertions(+), 22 deletions(-)
Fusion-Task-Id: FN-8963
Fusion-Task-Lineage: 7e5d0ae4-98ac-4f79-99ca-45fd1450362d
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-10 21:41:47 -07:00
gsxdsm
5dd3031e34
FN-8962: add mission blocked status repair controls
...
Add explicit diagnostics and repair paths for stale mission blocked badges.
- Expose audited core and REST APIs that recompute and clear stale mission blocked status without resuming automation.
- Add mission-manager controls, blocker diagnostics, responsive styling, and operator documentation.
- Cover clear conflicts, persistence, routes, and desktop/mobile UI behavior.
Files changed: .changeset/fn-8962-mission-blocked-clear.md | 7 ++
docs/missions.md | 12 ++-
.../src/__tests__/mission-blocked-clear.test.ts | 40 ++++++++
.../__tests__/postgres/mission-store.pg.test.ts | 71 ++++++++++++++
.../core/src/async-stores/async-mission-store.ts | 90 +++++++++++++++--
packages/core/src/index.gate.ts | 4 +
packages/core/src/index.ts | 5 +-
packages/core/src/missions/mission-types.ts | 62 ++++++++++++
packages/dashboard/app/api/legacy.ts | 3 +
packages/dashboard/app/api/missions/missions.ts | 29 ++++++
.../dashboard/app/components/MissionManager.css | 6 ++
.../dashboard/app/components/MissionManager.tsx | 90 ++++++++++++++++-
.../MissionManager.blocked-repair.test.tsx | 106 +++++++++++++++++++++
.../__tests__/MissionManager.mobile-css.test.ts | 8 ++
.../__tests__/mission-blocked-clear-routes.test.ts | 71 ++++++++++++++
packages/dashboard/src/mission-routes.ts | 49 ++++++++++
16 files changed, 638 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-8962
Fusion-Task-Lineage: 38cab277-a0c3-4c60-af3e-dd25d2f88dea
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-10 20:41:11 -07:00
gsxdsm
cef07527f6
FN-8948: reconcile mission state from task ground truth
...
Centralize mission and feature state repair around deterministic task lifecycle evidence.
- Add a reusable mission reconciliation authority with task-move, API, tool, and maintenance callers.
- Repair unambiguous title links while preserving terminal, validation, and audit safeguards.
- Route scheduler moves through the authority and reject duplicate feature-title ownership.
- Expose reconcile controls and document the operator workflow.
Files changed:
.changeset/fn-8948-mission-auto-reconcile.md | 7 +
AGENTS.md | 1 +
docs/missions.md | 8 +-
packages/cli/skill/fusion/SKILL.md | 2 +-
.../cli/skill/fusion/references/extension-tools.md | 9 +
.../skill/fusion/references/fusion-capabilities.md | 1 +
.../extension-experiment-finalize.test.ts | 2 +
.../__tests__/extension-gitlab-tracking.test.ts | 2 +
.../cli/src/__tests__/extension-web-fetch.test.ts | 2 +
packages/cli/src/extension.ts | 14 +
packages/dashboard/src/mission-routes.ts | 24 +-
.../src/__tests__/agent-mission-tools.test.ts | 2 +-
.../engine/src/__tests__/mission-autopilot.test.ts | 8 +-
.../src/__tests__/mission-state-reconcile.test.ts | 67 +++++
packages/engine/src/agent-tools.ts | 6 +
.../engine/src/execution/gating-classifications.ts | 1 +
packages/engine/src/index.ts | 6 +
packages/engine/src/missions/index.ts | 8 +-
packages/engine/src/missions/mission-autopilot.ts | 106 +------
.../engine/src/missions/mission-feature-sync.ts | 1 +
.../engine/src/missions/mission-state-reconcile.ts | 169 +++++++++++
packages/engine/src/runtimes/in-process-runtime.ts | 4 +-
packages/engine/src/scheduler.ts | 331 +++++----------------
packages/engine/src/util/run-audit.ts | 2 +
24 files changed, 426 insertions(+), 357 deletions(-)
Fusion-Task-Id: FN-8948
Fusion-Task-Lineage: 0fbccef3-eeac-46d2-b3d8-aca679b3657e
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-10 20:32:26 -07:00