Commit Graph

4661 Commits

Author SHA1 Message Date
gsxdsm
35854e0479 fix(FN-4417): stop false-positive branch contamination from stale baseCommitSha
The contamination check at executor.ts was reusing task.baseCommitSha as
its reference SHA. That field is intentionally preserved across resumed
sessions for stable diff math, which means it can lag behind main by
many commits. Passing it to assertCleanBranchAtBase caused every
legitimately-merged commit on main since the stale SHA to be reported
as a foreign task-attributed contamination commit, pausing the task
with pausedReason=branch-cross-contamination.

FN-4403 was the trigger case: a pooled worktree was force-reset to
current main by WorktreePool.prepareForTask (correctly), then the
executor immediately ran assertCleanBranchAtBase(rootDir, branch,
staleBaseCommitSha, taskId) and flagged 157 commits across ~39
unrelated FN-* tasks as contamination. FN-4417 itself then hit the
same bug when it tried to start, blocking the board.

Two fixes, both in packages/engine/src/executor.ts:

1. New resolveContaminationBaseRef(worktreePath) computes a fresh
   merge-base against origin/main or main and is used in place of
   resolveDiffBaseRef for the contamination check. It never reads
   task.baseCommitSha and never falls back to HEAD~1 (which on a
   force-reset pooled branch would be a main commit and re-introduce
   the same false positive at smaller scale). Returns undefined on
   git failure so the caller treats it as check skipped.

2. captureBaseCommitSha gains an explicit { isResume: boolean }
   parameter and only preserves an existing baseCommitSha when
   isResume is true. On fresh/pool acquisitions the branch was just
   force-reset to current main, so the stored value is stale by
   definition. Always recapture in that case. Diff-base stability
   across resumed sessions (FN-4309/FN-4383) is preserved by passing
   isResume: true on resume; the existing executor call site is
   already gated on non-resume and passes false.

Tests:
- executor-base-commit-capture.test.ts: updated to thread isResume
  through assertions and added a FN-4417 regression case that verifies
  a stale-but-ancestor baseCommitSha is recaptured (not preserved) on
  non-resume.
- executor-base-commit-capture.real-git.test.ts: FN-4309/FN-4383
  multi-session test now explicitly passes isResume: true on the
  second capture, matching the real resume code path.
- executor-contamination-base.test.ts (new): three focused tests for
  resolveContaminationBaseRef covering fresh-merge-base resolution,
  graceful failure when neither origin/main nor main resolves, and a
  structural guard that the function arity is 1 (no baseCommitSha
  parameter, so the bug cannot regress through that surface).

Verified: 4265 engine tests pass; tsc clean.

Fusion-Task-Id: FN-4417
2026-05-13 18:44:41 -07:00
Fusion
e64345393e test(FN-4316): complete Step 4 — add todo aging column coverage
Fusion-Task-Id: FN-4316
Fusion-Task-Lineage: 6b2b78b4-effa-479c-9a22-5a53d0f74894
2026-05-13 18:14:23 -07:00
Fusion
c12c462be2 feat(FN-4316): complete Step 3 — mount todo aging filter in column
Fusion-Task-Id: FN-4316
Fusion-Task-Lineage: 6b2b78b4-effa-479c-9a22-5a53d0f74894
2026-05-13 18:14:23 -07:00
Fusion
f7ba4c79f9 feat(FN-4316): complete Step 2 — add todo aging summary component
Fusion-Task-Id: FN-4316
Fusion-Task-Lineage: 6b2b78b4-effa-479c-9a22-5a53d0f74894
2026-05-13 18:14:22 -07:00
Fusion
32e616c6bd feat(FN-4316): complete Step 1 — add todo aging utility
Fusion-Task-Id: FN-4316
Fusion-Task-Lineage: 6b2b78b4-effa-479c-9a22-5a53d0f74894
2026-05-13 18:14:22 -07:00
Fusion
c1f787a0df feat(FN-4409): add branch contamination assertions in worktree flows
Fusion-Task-Id: FN-4409
Fusion-Task-Lineage: c608c942-fec7-4489-9970-b8dc314f8be2
2026-05-13 17:44:46 -07:00
Fusion
e0f67f1edd test(FN-4328): complete Step 3 — update modal button expectations
Fusion-Task-Id: FN-4328
Fusion-Task-Lineage: 32d20417-4e86-4fb5-9be9-72d98aaf0761
2026-05-13 17:07:23 -07:00
Fusion
df18c55a34 feat(FN-4328): complete Step 2 — stop passing modal AI actions
Fusion-Task-Id: FN-4328
Fusion-Task-Lineage: 32d20417-4e86-4fb5-9be9-72d98aaf0761
2026-05-13 17:07:23 -07:00
Fusion
88b2ff67cd feat(FN-4328): complete Step 1 — remove modal AI action props
Fusion-Task-Id: FN-4328
Fusion-Task-Lineage: 32d20417-4e86-4fb5-9be9-72d98aaf0761
2026-05-13 17:07:23 -07:00
Fusion
1941d2133e test(FN-4397): align worktree conflict tests with stale-resolved + tripwire assertions
Fusion-Task-Id: FN-4397
Fusion-Task-Lineage: 1ffac4f7-adf5-4115-b588-108d75eadde7
2026-05-13 16:58:35 -07:00
Fusion
09e6302798 fix(FN-4397): add branch-conflict tripwire and tighten stale detection
Fusion-Task-Id: FN-4397
Fusion-Task-Lineage: 1ffac4f7-adf5-4115-b588-108d75eadde7
2026-05-13 16:58:35 -07:00
Fusion
263de0cb3d fix(FN-4397): complete Step 3 — treat unbound branch conflicts as stale-resolved
Fusion-Task-Id: FN-4397
Fusion-Task-Lineage: 1ffac4f7-adf5-4115-b588-108d75eadde7
2026-05-13 16:58:35 -07:00
Fusion
3d2997ce8e test(FN-4397): add loop reproduction for repeated branch-conflict emissions
Fusion-Task-Id: FN-4397
Fusion-Task-Lineage: 1ffac4f7-adf5-4115-b588-108d75eadde7
2026-05-13 16:58:35 -07:00
Fusion
e88b5dbb01 test(FN-4397): annotate regression coverage for stale/live branch conflict
Fusion-Task-Id: FN-4397
Fusion-Task-Lineage: 1ffac4f7-adf5-4115-b588-108d75eadde7
2026-05-13 16:58:34 -07:00
Fusion
381ecbfe21 test(FN-4397): complete Step 2 — reproduce stale/live misclassification
Fusion-Task-Id: FN-4397
Fusion-Task-Lineage: 1ffac4f7-adf5-4115-b588-108d75eadde7
2026-05-13 16:58:34 -07:00
Fusion
05f5cb0963 test(FN-4386): complete Step 5 — add skip idle heartbeat toggle tests
Fusion-Task-Id: FN-4386
Fusion-Task-Lineage: 82c1c281-8d69-42c1-8705-90e811b6df93
2026-05-13 16:38:00 -07:00
Fusion
172ff99bd4 feat(FN-4386): complete Step 4 — add idle heartbeat toggle in agent config
Fusion-Task-Id: FN-4386
Fusion-Task-Lineage: 82c1c281-8d69-42c1-8705-90e811b6df93
2026-05-13 16:38:00 -07:00
Fusion
ea4af60998 test(FN-4386): complete Step 3 — cover idle heartbeat timer gate
Fusion-Task-Id: FN-4386
Fusion-Task-Lineage: 82c1c281-8d69-42c1-8705-90e811b6df93
2026-05-13 16:38:00 -07:00
Fusion
8a9f320983 feat(FN-4386): complete Step 2 — gate timer heartbeat when idle
Fusion-Task-Id: FN-4386
Fusion-Task-Lineage: 82c1c281-8d69-42c1-8705-90e811b6df93
2026-05-13 16:38:00 -07:00
Fusion
e1f2b24685 feat(FN-4386): complete Step 1 — add runtime config field
Fusion-Task-Id: FN-4386
Fusion-Task-Lineage: 82c1c281-8d69-42c1-8705-90e811b6df93
2026-05-13 16:38:00 -07:00
Fusion
0778cd50c5 test(FN-4288): stabilize dashboard mobile and quickchat assertions
Fusion-Task-Id: FN-4288
Fusion-Task-Lineage: 09c6efc0-ea0b-443a-ab45-a89188fcf888
2026-05-13 16:29:37 -07:00
Fusion
076f132790 feat(FN-4288): add stall surface docs and changeset
Fusion-Task-Id: FN-4288
Fusion-Task-Lineage: 09c6efc0-ea0b-443a-ab45-a89188fcf888
2026-05-13 16:29:37 -07:00
Fusion
56b5f28458 feat(FN-4288): complete Step 4 — add stall diagnostics in task detail
Fusion-Task-Id: FN-4288
Fusion-Task-Lineage: 09c6efc0-ea0b-443a-ab45-a89188fcf888
2026-05-13 16:29:37 -07:00
Fusion
8d8171b9cd feat(FN-4288): complete Step 3 — add task card stall badge
Fusion-Task-Id: FN-4288
Fusion-Task-Lineage: 09c6efc0-ea0b-443a-ab45-a89188fcf888
2026-05-13 16:29:37 -07:00
Fusion
3874780cb7 feat(FN-4288): complete Step 2 — add stall log entry locator
Fusion-Task-Id: FN-4288
Fusion-Task-Lineage: 09c6efc0-ea0b-443a-ab45-a89188fcf888
2026-05-13 16:29:37 -07:00
Fusion
6dd3a01b67 feat(FN-4288): complete Step 1 — add in-review stall copy module
Fusion-Task-Id: FN-4288
Fusion-Task-Lineage: 09c6efc0-ea0b-443a-ab45-a89188fcf888
2026-05-13 16:29:37 -07:00
Fusion
1fbfe9f23f feat(FN-4402): validate file scope tokens in prompt parsing and writes
Merged: Validates file scope tokens during prompt parsing and write operations in the task store, adding ~160 lines of logic to `packages/core/src/store.ts` with corresponding test coverage in `store-parsing.test.ts`. Also updated AGENTS.md documentation and created a changeset for the `@runfusion/f

Fusion-Task-Id: FN-4402
2026-05-13 16:29:11 -07:00
Fusion
be6fe05b2f test(FN-4307): fix notification tests for strict task status typing
Fusion-Task-Id: FN-4307
Fusion-Task-Lineage: 00140a5a-af93-4905-8570-32d7ecb8a874
2026-05-13 15:58:49 -07:00
Fusion
cd7779c3e0 test(FN-4307): add recovery-notification integration coverage
Fusion-Task-Id: FN-4307
Fusion-Task-Lineage: 00140a5a-af93-4905-8570-32d7ecb8a874
2026-05-13 15:58:48 -07:00
Fusion
425926b0b4 test(FN-4307): cover suppression signals and timer cleanup
Fusion-Task-Id: FN-4307
Fusion-Task-Lineage: 00140a5a-af93-4905-8570-32d7ecb8a874
2026-05-13 15:58:48 -07:00
Fusion
fac39cf72e test(FN-4307): add failed-notification grace window coverage
Fusion-Task-Id: FN-4307
Fusion-Task-Lineage: 00140a5a-af93-4905-8570-32d7ecb8a874
2026-05-13 15:58:48 -07:00
Fusion
76a07fea21 feat(FN-4307): complete Step 2 — suppress transient failure surfacing
Fusion-Task-Id: FN-4307
Fusion-Task-Lineage: 00140a5a-af93-4905-8570-32d7ecb8a874
2026-05-13 15:58:48 -07:00
Fusion
2e7e5e091c feat(FN-4307): complete Step 1 — defer failed notifications
Fusion-Task-Id: FN-4307
Fusion-Task-Lineage: 00140a5a-af93-4905-8570-32d7ecb8a874
2026-05-13 15:58:48 -07:00
Fusion
6b9979112e test(FN-4387): complete Step 3 — update mobile padding regression assertion
Fusion-Task-Id: FN-4387
Fusion-Task-Lineage: d651d6a8-a005-4dca-89ac-1baa17e4f01d
2026-05-13 15:33:25 -07:00
Fusion
542c13e4ca feat(FN-4387): complete Step 2 — right-size mobile chat session text padding
Fusion-Task-Id: FN-4387
Fusion-Task-Lineage: d651d6a8-a005-4dca-89ac-1baa17e4f01d
2026-05-13 15:33:25 -07:00
Fusion
084047555c fix(FN-4383): satisfy tsc signatures in exec mock implementations
Fusion-Task-Id: FN-4383
Fusion-Task-Lineage: 69516bdf-34d1-405c-8bc9-b558c4780863
2026-05-13 15:28:34 -07:00
Fusion
86bcd2566b fix(FN-4383): align pooled worktree baseline tests with merge-base capture
Fusion-Task-Id: FN-4383
Fusion-Task-Lineage: 69516bdf-34d1-405c-8bc9-b558c4780863
2026-05-13 15:28:34 -07:00
Fusion
3695555757 test(FN-4383): complete Step 3 — add real-git base commit capture regression
Fusion-Task-Id: FN-4383
Fusion-Task-Lineage: 69516bdf-34d1-405c-8bc9-b558c4780863
2026-05-13 15:28:34 -07:00
Fusion
f9f8ee6f62 test(FN-4383): complete Step 2 — add base commit capture unit tests
Fusion-Task-Id: FN-4383
Fusion-Task-Lineage: 69516bdf-34d1-405c-8bc9-b558c4780863
2026-05-13 15:28:34 -07:00
Fusion
731aa7b14a feat(FN-4383): complete Step 1 — capture baseCommitSha from merge-base
Fusion-Task-Id: FN-4383
Fusion-Task-Lineage: 69516bdf-34d1-405c-8bc9-b558c4780863
2026-05-13 15:28:34 -07:00
Fusion
1e4d146b41 feat(FN-4375): consolidate mobile settings modal into single-row header lay
Completes the mobile settings header refactor by consolidating the header into a single row on small viewports, trimming CSS complexity with test coverage for the responsive layout contract.

Fusion-Task-Id: FN-4375
2026-05-13 15:28:12 -07:00
Fusion
c9e8e7a350 test(FN-4332): align notifier defaults with legacy failure behavior
Fusion-Task-Id: FN-4332
Fusion-Task-Lineage: c920ac71-906b-458d-b496-1b60540b58f3
2026-05-13 15:15:41 -07:00
Fusion
7bc58d20e7 feat(FN-4332): complete Step 5 — add changeset for notification deferral
Fusion-Task-Id: FN-4332
Fusion-Task-Lineage: c920ac71-906b-458d-b496-1b60540b58f3
2026-05-13 15:15:41 -07:00
Fusion
487a0981fe feat(FN-4332): complete Step 4 — add notification failure controls
Fusion-Task-Id: FN-4332
Fusion-Task-Lineage: c920ac71-906b-458d-b496-1b60540b58f3
2026-05-13 15:15:41 -07:00
Fusion
bbd810e28a feat(FN-4332): complete Step 2 — defer failed notifications
Fusion-Task-Id: FN-4332
Fusion-Task-Lineage: c920ac71-906b-458d-b496-1b60540b58f3
2026-05-13 15:15:41 -07:00
Fusion
f7293abaf1 feat(FN-4332): complete Step 1 — add failure notification settings defaults
Fusion-Task-Id: FN-4332
Fusion-Task-Lineage: c920ac71-906b-458d-b496-1b60540b58f3
2026-05-13 15:15:41 -07:00
Fusion
4f8959c670 test(FN-4369): complete Step 3 — add dashboard quality lane coverage for badge test
Fusion-Task-Id: FN-4369
Fusion-Task-Lineage: 3f08cecf-2e6c-41a6-804f-645c4b809e4a
2026-05-13 15:11:37 -07:00
Fusion
187a02988d feat(FN-4369): complete Step 2 — normalize badge dimensions
Fusion-Task-Id: FN-4369
Fusion-Task-Lineage: 3f08cecf-2e6c-41a6-804f-645c4b809e4a
2026-05-13 15:11:37 -07:00
Fusion
c4e0e255eb feat(FN-4370): complete Step 5 — add changeset and finalize badge fix
Fusion-Task-Id: FN-4370
Fusion-Task-Lineage: c18188d5-c478-4233-943f-943b0125b271
2026-05-13 15:05:06 -07:00
Fusion
724e983d6e feat(FN-4370): complete Step 3 — retain badge snapshots across unsubscribes
Fusion-Task-Id: FN-4370
Fusion-Task-Lineage: c18188d5-c478-4233-943f-943b0125b271
2026-05-13 15:05:05 -07:00