Commit Graph

2154 Commits

Author SHA1 Message Date
Fusion (runfusion.ai)
86c3063d9d test(FN-4763): expand reclaim guard-path coverage
Fusion-Task-Id: FN-4763
Fusion-Task-Lineage: b3628e63-682b-4a39-9a7d-2c96278c5366
2026-05-17 13:46:23 -07:00
Fusion (runfusion.ai)
893fb32b69 fix(FN-4763): add run-audit type and reclaim outcome coverage
Fusion-Task-Id: FN-4763
Fusion-Task-Lineage: b3628e63-682b-4a39-9a7d-2c96278c5366
2026-05-17 13:46:23 -07:00
Fusion (runfusion.ai)
2f0e1c6c24 test(FN-4763): add PR conflict reclaim engine coverage
Fusion-Task-Id: FN-4763
Fusion-Task-Lineage: b3628e63-682b-4a39-9a7d-2c96278c5366
2026-05-17 13:46:23 -07:00
Fusion (runfusion.ai)
e00f7ec714 feat(FN-4763): complete Step 3 — add PR conflict reclaim hooks
Fusion-Task-Id: FN-4763
Fusion-Task-Lineage: b3628e63-682b-4a39-9a7d-2c96278c5366
2026-05-17 13:46:23 -07:00
Fusion (runfusion.ai)
5992f043eb feat(FN-4913): complete Step 5 — register secrets sync audit event types
Fusion-Task-Id: FN-4913
Fusion-Task-Lineage: 2fa1fe49-a2a9-405d-833b-cb34d41ef19a
2026-05-17 12:58:01 -07:00
gsxdsm
14c5a17844 fix(FN-4939): preserve worktree on contamination auto-recovery
The in-line branch-cross-contamination auto-recovery in executor.ts had
two related bugs that produced transient "no-worktree-no-merge-confirmed"
stall signals in the dashboard while a live worktree was still mapped
on disk:

1. autoRecoverCrossContamination was called with repoDir=this.rootDir.
   The recovery does: git checkout --detach <baseSha> → cherry-pick
   wanted commits → git update-ref → git checkout <branch>. When the
   branch is checked out in a worktree (the normal case), that final
   recheckout in rootDir is blocked by git with "branch already used
   by worktree at ...", so the in-line happy path silently failed for
   every contaminated task that had a real worktree. Pass the task's
   worktree as repoDir when available so the operations stay internal
   to the worktree and the recheckout succeeds.

2. The successful-recovery branch called
       moveTask(taskId, 'todo', { preserveResumeState: true })
   without preserveWorktree:true. moveTask defaults to nulling
   task.worktree on requeue. The worktree directory and git mapping
   were still live — the dashboard's in-review-stall classifier
   (no-worktree-no-merge-confirmed) and TaskChangesTab both keyed off
   task.worktree being null and lied about the worktree being gone.
   Sibling recovery paths (auto-recovery-handlers/contamination.ts,
   tryBootstrapMisbindingRecovery, self-healing.ts:1639) all already
   pass preserveWorktree:true; this site was inconsistent.

Updated the existing FN-4428 regression test and added a new
FN-4939 test asserting repoDir uses task.worktree (with fallback
to rootDir when the task has no worktree pointer).

Refs: packages/core/src/in-review-stall.ts:116
2026-05-17 12:03:55 -07:00
Fusion (runfusion.ai)
439716165b test(FN-4761): complete Step 5 — add review transition regression coverage
Fusion-Task-Id: FN-4761
Fusion-Task-Lineage: b6b1ed73-c396-4dd2-b97f-366272d05c7f
2026-05-17 11:39:19 -07:00
Fusion (runfusion.ai)
47eaf089bf feat(FN-4904): complete Step 3 — align engine and CLI root resolution
Fusion-Task-Id: FN-4904
Fusion-Task-Lineage: 5da52c8c-0ed6-4e3a-920e-aa1b56d0b719
2026-05-17 10:45:41 -07:00
Fusion (runfusion.ai)
87d259b366 feat(FN-4904): complete Step 1 — promote worktree root resolver
Fusion-Task-Id: FN-4904
Fusion-Task-Lineage: 5da52c8c-0ed6-4e3a-920e-aa1b56d0b719
2026-05-17 10:45:41 -07:00
Fusion (runfusion.ai)
c61ebb85d7 test(FN-4905): complete Step 3 — cover lifecycle stale-settings refresh
Fusion-Task-Id: FN-4905
Fusion-Task-Lineage: 677b6f08-90d7-4785-a0b8-195acc42f79e
2026-05-17 09:51:49 -07:00
Fusion (runfusion.ai)
8bcc381041 feat(FN-4905): complete Step 2 — add lifecycle refresh fallback
Fusion-Task-Id: FN-4905
Fusion-Task-Lineage: 677b6f08-90d7-4785-a0b8-195acc42f79e
2026-05-17 09:51:49 -07:00
Fusion (runfusion.ai)
10455b7992 feat(FN-4898): reconcile task title-id drift in storage migrations
Adds a title-id drift detection and reconciliation system to prevent duplicate tasks when task titles change after initial creation. Core adds the `task-title-id-drift.ts` module with `markTitleIdStable` and `resolveTitleIdDrift` logic, wired through `db.ts`, `store.ts`, and `archive-db.ts`, with co

Fusion-Task-Id: FN-4898
2026-05-17 09:51:10 -07:00
Fusion (runfusion.ai)
3d0cce72f2 feat(FN-4885): complete Step 7 — finalize docs and changeset
Fusion-Task-Id: FN-4885
Fusion-Task-Lineage: 31110eed-5ca3-4d67-8f11-581185056dc6
2026-05-17 09:31:07 -07:00
Fusion (runfusion.ai)
ddfc927abd test(FN-4885): complete Step 5 — add deadlock disposition reliability interaction
Fusion-Task-Id: FN-4885
Fusion-Task-Lineage: 31110eed-5ca3-4d67-8f11-581185056dc6
2026-05-17 09:31:07 -07:00
Fusion (runfusion.ai)
4e9bfd6062 test(FN-4885): complete Step 4 — expand self-healing stall disposition coverage
Fusion-Task-Id: FN-4885
Fusion-Task-Lineage: 31110eed-5ca3-4d67-8f11-581185056dc6
2026-05-17 09:31:06 -07:00
Fusion (runfusion.ai)
7555f3d12f feat(FN-4885): complete Step 2 — add in-review stall deadlock disposition path
Fusion-Task-Id: FN-4885
Fusion-Task-Lineage: 31110eed-5ca3-4d67-8f11-581185056dc6
2026-05-17 09:31:06 -07:00
Fusion (runfusion.ai)
96b19af10a test(FN-4900): align pi fallback test with standalone dispatch
Fusion-Task-Id: FN-4900
Fusion-Task-Lineage: ec7d26d7-4d38-4afd-b029-4b68d5f2db6f
2026-05-17 09:07:28 -07:00
Fusion (runfusion.ai)
6e2f4274ff fix(FN-4900): stop standalone promptWithFallback redispatch loop
Fusion-Task-Id: FN-4900
Fusion-Task-Lineage: ec7d26d7-4d38-4afd-b029-4b68d5f2db6f
2026-05-17 09:07:28 -07:00
Fusion (runfusion.ai)
890494d00b test(FN-4900): add failing recursion regression
Fusion-Task-Id: FN-4900
Fusion-Task-Lineage: ec7d26d7-4d38-4afd-b029-4b68d5f2db6f
2026-05-17 09:07:28 -07:00
Fusion (runfusion.ai)
038d2dea2b fix(FN-4760): repair self-healing type errors blocking workspace tests
Fusion-Task-Id: FN-4760
Fusion-Task-Lineage: 71db4a53-ee59-49f0-a1f7-232954b86660
2026-05-17 08:49:51 -07:00
Fusion (runfusion.ai)
66ac44fa88 fix(FN-4847): keep engine contract test build-safe
Fusion-Task-Id: FN-4847
Fusion-Task-Lineage: af551b65-a484-496a-8bab-b46193e06104
2026-05-17 08:47:16 -07:00
Fusion (runfusion.ai)
a49b8553fb test(FN-4847): complete Step 4 — add denial-reason contract backstop
Fusion-Task-Id: FN-4847
Fusion-Task-Lineage: af551b65-a484-496a-8bab-b46193e06104
2026-05-17 08:47:16 -07:00
gsxdsm
0d0d818b77 feat(FN-4891): merge fusion/fn-4891 2026-05-17 08:24:49 -07:00
Fusion (runfusion.ai)
da6598a4c0 fix(FN-4759): complete Step 5-6 — pass gates and add changeset
Fusion-Task-Id: FN-4759
Fusion-Task-Lineage: af79d2a6-fd7b-40e0-b3c9-6c74569d9aa0
2026-05-17 08:22:26 -07:00
Fusion (runfusion.ai)
96a19309ae fix(FN-4884): finalize docs and keep workspace gates green
Fusion-Task-Id: FN-4884
Fusion-Task-Lineage: b906ade4-a9f1-4f2e-b684-4ebf49c3e7e6
2026-05-17 07:26:21 -07:00
Fusion (runfusion.ai)
030a27b40d feat(FN-4884): complete Step 2-3 fast-path and coverage
Fusion-Task-Id: FN-4884
Fusion-Task-Lineage: b906ade4-a9f1-4f2e-b684-4ebf49c3e7e6
2026-05-17 07:26:21 -07:00
gsxdsm
83ed893382 feat(FN-4879): merge fusion/fn-4879 2026-05-17 06:23:00 -07:00
Fusion (runfusion.ai)
75ac66a8a0 test(FN-4866): complete Step 2 — add named duplicate-search regression case
Fusion-Task-Id: FN-4866
Fusion-Task-Lineage: 2188be29-febc-4610-92f6-d7c1a911359e
2026-05-17 02:46:46 -07:00
gsxdsm
ee4652a492 feat(FN-4861): merge fusion/fn-4861 2026-05-17 02:08:01 -07:00
gsxdsm
404e202d7e feat(FN-4809): merge fusion/fn-4809 2026-05-17 00:53:02 -07:00
gsxdsm
3ca3b5e471 feat(FN-4851): merge fusion/fn-4851 2026-05-17 00:38:07 -07:00
Fusion
aa6d1c9851 fix(FN-4847): discard foreign branch and recreate on branch-conflict-unrecoverable
Production failure shape:
  Auto-recovery failed: branch conflict unrecoverable \u2014
  Branch fusion/fn-4847 is already checked out at /.../deft-crane
  (tip a881ccc86660, 24 stranded commits since 0b28388876).
  Run branch recovery and explicitly choose whether to reclaim or
  discard prior work.

The 24 stranded commits are cross-task contamination residue from the
FN-4781/FN-4804/FN-4814 worktree-race era \u2014 they are NOT FN-4847's work.
Previously this paused the task with pausedReason='branch-conflict-
unrecoverable' and the task got stuck forever waiting for human
adjudication.

User intent (FN-4847): 'just create a new branch and keep going and
discard the old one'. Implementation:

1. auto-recovery.ts:actionForMode \u2014 in 'deterministic-only' mode (the
   default), branch-conflict-unrecoverable now returns 'retry' (was
   'pause'). This routes the failure to the handler instead of pausing.

2. auto-recovery-handlers/branch-worktree.ts \u2014 'live-foreign' inspection
   no longer emits irreducible-pause. Instead:
   - Check FN-4811 active-session registry. If the foreign worktree is
     bound to a live executor/merger session, do NOT force-remove it
     (would yank the live agent's filesystem). Just requeue and let
     downstream conflict-recovery handle it.
   - Otherwise: force-delete the foreign worktree (--force) + prune git
     worktree admin entries + force-delete the branch. Errors at each
     step are best-effort and logged.
   - Emit new audit event 'branch-worktree:foreign-branch-discarded'
     with stranded-commit count, live-ownership flag, success flags.
   - Requeue task to 'todo' with preserveProgress, clearing
     branch+baseCommitSha.

3. run-audit.ts \u2014 register new DatabaseMutationType.

4. executor-worktree.test.ts \u2014 update the 'records recovery context'
   test to assert the new retry+requeue contract (was asserting the old
   pause-with-status-failed contract).

Verification:
  - Targeted suite (4 files, 343 tests): pass.
  - pnpm --filter @fusion/engine build: clean.
  - pnpm lint: clean.

Fusion-Task-Id: FN-4847
2026-05-16 23:53:56 -07:00
Fusion (runfusion.ai)
01f0bf625a fix(FN-4826): complete Step 6 — stabilize audit emission and tests
Fusion-Task-Id: FN-4826
Fusion-Task-Lineage: b08a58c8-66ab-43d4-bdf9-69d2b56b7bcc
2026-05-16 23:45:17 -07:00
Fusion (runfusion.ai)
1553f1dd0d test(FN-4826): complete Step 4 — cover handoff telemetry paths
Fusion-Task-Id: FN-4826
Fusion-Task-Lineage: b08a58c8-66ab-43d4-bdf9-69d2b56b7bcc
2026-05-16 23:45:17 -07:00
Fusion (runfusion.ai)
3453e77396 feat(FN-4826): complete Step 3 — emit mesh lease handoff telemetry
Fusion-Task-Id: FN-4826
Fusion-Task-Lineage: b08a58c8-66ab-43d4-bdf9-69d2b56b7bcc
2026-05-16 23:45:17 -07:00
Fusion (runfusion.ai)
56aca02250 feat(FN-4826): complete Step 2 — emit scheduler handoff events
Fusion-Task-Id: FN-4826
Fusion-Task-Lineage: b08a58c8-66ab-43d4-bdf9-69d2b56b7bcc
2026-05-16 23:45:17 -07:00
Fusion (runfusion.ai)
0705f42a38 feat(FN-4826): complete Step 1 — declare mutation types
Fusion-Task-Id: FN-4826
Fusion-Task-Lineage: b08a58c8-66ab-43d4-bdf9-69d2b56b7bcc
2026-05-16 23:45:17 -07:00
Fusion (runfusion.ai)
3605c67925 feat(FN-4791): add core secrets store for secure key-value storage
Adds a new secrets store module to `@fusion/core` (277 lines in `secrets-store.ts`) and exports it from the package index.

Fusion-Task-Id: FN-4791

Fusion-Task-Lineage: 7ff20b8a-37e1-46c6-8003-b542df9f98b1
2026-05-16 23:44:47 -07:00
Fusion (runfusion.ai)
e1667a789d test(FN-4815): complete Step 2 — add duplicate-search regression coverage
Fusion-Task-Id: FN-4815
Fusion-Task-Lineage: dc29e38d-5914-40c2-b9f7-3504606d91a3
2026-05-16 23:31:56 -07:00
Fusion (runfusion.ai)
e3aeec999c feat(FN-4815): complete Step 1 — add duplicate scenario fixture
Fusion-Task-Id: FN-4815
Fusion-Task-Lineage: dc29e38d-5914-40c2-b9f7-3504606d91a3
2026-05-16 23:31:56 -07:00
Fusion (runfusion.ai)
8c3c0206f1 feat(FN-4836): consolidate settings round-trip/default tests with it.each m
Refactors the settings store tests in `packages/core` by consolidating round-trip and default value coverage into structured `it.each` matrices, trimming the test file by roughly 60 lines while maintaining equivalent coverage.

Fusion-Task-Id: FN-4836
2026-05-16 22:47:24 -07:00
Fusion (runfusion.ai)
5cd0e66654 feat(FN-4839): harden real-git test timeouts across engine suites
Hardens test timeouts across 12 reliability and integration test files (branch-conflict recovery, merger diff/overlap guards, self-healing, worktree hydration, workflow/file-scope interactions), covering both real-git and mock-based test lanes with consistent timeout adjustments to reduce flakiness.

Fusion-Task-Id: FN-4839
2026-05-16 22:36:57 -07:00
Fusion (runfusion.ai)
1aeb070083 test(FN-4824): reliability-interaction coverage for cross-node assignment wakes
Fusion-Task-Id: FN-4824
Fusion-Task-Lineage: 65f53a33-0939-4b6f-b62b-4a255ad14d9e
2026-05-16 21:53:18 -07:00
Fusion (runfusion.ai)
46a50c123f feat(FN-4824): forward task assignment events across remote runtime
Fusion-Task-Id: FN-4824
Fusion-Task-Lineage: 65f53a33-0939-4b6f-b62b-4a255ad14d9e
2026-05-16 21:53:18 -07:00
Fusion (runfusion.ai)
70728db098 fix(FN-4834): align reliability fixture task fields with task typing
Fusion-Task-Id: FN-4834
Fusion-Task-Lineage: 714c9c73-ca66-4c3f-980c-d03e6b50316a
2026-05-16 21:34:25 -07:00
Fusion (runfusion.ai)
594ec3e515 test(FN-4834): complete Step 2 — add reliability init stderr regression coverage
Fusion-Task-Id: FN-4834
Fusion-Task-Lineage: 714c9c73-ca66-4c3f-980c-d03e6b50316a
2026-05-16 21:34:25 -07:00
Fusion (runfusion.ai)
ed8c8752f0 feat(FN-4834): complete Step 1 — surface init diagnostics in task log
Fusion-Task-Id: FN-4834
Fusion-Task-Lineage: 714c9c73-ca66-4c3f-980c-d03e6b50316a
2026-05-16 21:34:25 -07:00
Fusion (runfusion.ai)
405d24f9ab fix(FN-4823): tighten lease recovery audit semantics
Fusion-Task-Id: FN-4823
Fusion-Task-Lineage: 0034c04f-df82-4a1b-9f25-b93643a2c157
2026-05-16 21:26:04 -07:00
Fusion (runfusion.ai)
a9dfb17b3d test(FN-4823): expand central-claim recovery coverage
Fusion-Task-Id: FN-4823
Fusion-Task-Lineage: 0034c04f-df82-4a1b-9f25-b93643a2c157
2026-05-16 21:26:04 -07:00
Fusion (runfusion.ai)
bbcc0a269c feat(FN-4823): wire central claim store into mesh lease manager
Fusion-Task-Id: FN-4823
Fusion-Task-Lineage: 0034c04f-df82-4a1b-9f25-b93643a2c157
2026-05-16 21:26:04 -07:00