U4 trim: delete the dead resetStepsIfWorkLost duplicate in self-healing (#2474)

Stacked on #2472 (Phase B slice B3.1). Base is
`feature/workflow-vocabulary-b3-stranded-todo` — do not merge before it.

First output of the **U4 reshape survey**: dead code removed with
reachability evidence, not a redundancy argument.

## What is deleted

**`SelfHealingManager.resetStepsIfWorkLost`** — 50 lines including its
docblock and a section header left with no other member.

Evidence:
- `private`, with **zero in-file references** beyond its own
declaration.
- TypeScript already reported it as `declared but its value is never
read` — the compiler has been flagging this.
- The **live** implementation is `executor.ts:20080`, an independent
copy that `executor.ts` actually calls (12667, 14664). The self-healing
copy is an orphaned duplicate of it.
- Not in either sweep registry, no test of its own, no caller anywhere
in engine / dashboard / cli.

Safe against every U4 constraint: it enforces none of user pause,
`autoMerge:false`, dependency, capacity, merge-proof, or an at-most-once
safeguard.

## Why the second approved deletion is NOT here

`surfaceDependencyBlockedTodos` was approved alongside this one as a
28-line orphan. It is not. On inspection it is the **tip of an entire
unreachable feature**:

```
surfaceDependencyBlockedTodos   (in NEITHER registry, no production caller)
  └─ getDependencyBlockedTodoReporter()        ← sole caller
      └─ engine/dependency-blocked-todo-reporter.ts   223 lines  ← sole caller of ↓
          └─ core/dependency-blocked-todo-report.ts   184 lines
```

≈ **450 production lines across three files, plus 684 lines of tests in
four files.** The operator-visible setting
`dependencyBlockedTodoReportEnabled` defaults `true` in
`settings-schema.ts` and drives nothing.

Deleting only the approved 28-line tip would be **strictly worse than
leaving it** — it orphans the getter and field and strands 407 lines of
module with no remaining reference to explain why. Escalated for a
decision (delete the subtree / wire the feature up / leave it) rather
than resolved unilaterally.

## Verification

- `tsc --noEmit` clean, `pnpm lint` clean
- self-healing suite: **415 passed**, 1 failure **pre-existing**
(`archiveStaleDoneTasks` — fails identically before this change)

No changeset: `@fusion/engine` is private.

🤖 Generated with [Claude Code](https://claude.com/claude-code)


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

## Summary by CodeRabbit

* **Behavior Changes**
* Removed automatic detection and reset of task steps when no unique
work is found on a task branch.
* Tasks with completed or in-progress steps will no longer be
automatically returned to pending based on this condition.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
gsxdsm
2026-07-27 14:44:28 -07:00
committed by GitHub
parent a4dee1162e
commit 923a7c0fc9

View File

@@ -1986,58 +1986,6 @@ export class SelfHealingManager {
}
}
// ── Lost work detection ────────────────────────────────────────────
/**
* Check whether a task's branch has any unique commits compared to main.
* If the branch has no unique commits and the task has steps marked done,
* those steps represent lost uncommitted work — reset them to "pending"
* so the next execution doesn't skip them.
*/
private async resetStepsIfWorkLost(task: Task): Promise<void> {
const completedSteps = task.steps.filter(
(s) => s.status === "done" || s.status === "in-progress",
);
if (completedSteps.length === 0) return;
const branchName = resolveTaskWorkingBranch(task);
try {
const { stdout: mergeBaseOut } = await execAsync(
`git merge-base "${branchName}" HEAD`,
{ cwd: this.options.rootDir, encoding: "utf-8", timeout: 30_000 },
);
const mergeBase = mergeBaseOut.trim();
const { stdout: branchHeadOut } = await execAsync(
`git rev-parse "${branchName}"`,
{ cwd: this.options.rootDir, encoding: "utf-8", timeout: 30_000 },
);
const branchHead = branchHeadOut.trim();
if (mergeBase === branchHead) {
log.warn(
`${task.id} branch has no unique commits — resetting ${completedSteps.length} step(s) to pending`,
);
for (let i = 0; i < task.steps.length; i++) {
if (task.steps[i].status === "done" || task.steps[i].status === "in-progress") {
await this.store.updateStep(task.id, i, "pending");
}
}
await this.store.logEntry(
task.id,
`Reset ${completedSteps.length} step(s) to pending — branch had no commits (uncommitted work lost with worktree)`,
);
}
} catch (err: unknown) {
const errorMessage = err instanceof Error ? err.message : String(err);
log.warn(
`Failed to reset steps for ${task.id} after branch/worktree loss (${branchName}): ${errorMessage} — non-fatal`,
);
}
}
// ── Periodic maintenance ──────────────────────────────────────────
private async startMaintenance(): Promise<void> {