Files
fusion/packages/engine
gsxdsm f6e368205e self-healing: a card stuck mid-merge could not be retried on a renamed board (twenty-first sweep) (#2912)
`recoverStaleMergingStatus` clears a `merging`/`merging-pr` stamp left
on a review card with no live merger behind it. The literal read meant
that on a renamed board the stamp was never cleared.

**The operator's escape hatch was closed by the same bug that caused the
stall.** That stamp is consulted by the merger *and* by the dashboard's
manual Retry gate, so the card could neither progress on its own nor be
retried by hand.

## The redundant guard converts

`task.column !== "in-review"` was redundant while the query pinned the
column; under a resolved read it becomes the per-card verdict. Carries
the #2891 shape — **narrow when the card can answer, broad when it
cannot**.

## Fixture note worth keeping

`updatedAt` in the test is deliberately ancient.
`isStaleMergeActiveStatus` requires the stamp to have sat untouched for
`minAgeMs`, so a fresh fixture would be filtered out for a reason that
has nothing to do with lanes — and would then have passed with the fix
reverted. That is the shape of most of the vacuous assertions on this
branch: a *later* filter rejecting the card, masking whether the lane
logic worked at all.

## Revert results

Each applied alone and the file re-run:

| conversion | reverted → |
| --- | --- |
| the resolved read | fails — the card is never listed |
| the per-card verdict | fails — the renamed review lane is filtered out
|

A non-vacuous companion (same stamp on a wip card → untouched) rules out
a read that returns everything; a merge stamp in the wip lane belongs to
`recoverInProgressLimbo` and the executor, not here.

## Verification

`pnpm test:gate` 161 + 487 + 13 + 71, plus `self-healing.test.ts` 412;
`tsc` engine clean; `pnpm lint`, `check:changesets`, census `--strict`
and `check-sql-column-literals` clean, each run explicitly.
2026-07-30 18:16:14 -07:00
..
2026-07-26 18:11:47 -07:00