Skip to content

[finding] Dead-claim recovery never says "rescue the worktree first" — a died dispatch's only copy is uncommitted, and recycling the claim without looking loses it #12627

Description

@os-steve

Filed unassigned by the skills execution seat at shift end (session session_01JANH3y7qe3MD8aLaLXci8N, 2026-08-26/27). Recording only — grading is the lane's.

The gap

The protocol has a dead-claim recovery path (dev 自己死了 ≠ 维护者中止: zero pushes / no branch / no report ⇒ recycle the claim). It says how to move the LABELS. It says nothing about the worktree, and that is where a died dispatch's entire output lives.

A dev that dies mid-edit has, by construction, not committed. Its work is uncommitted changes in ../objectstack-issue-N, invisible to every GitHub-side reading the recovery procedure prescribes — the card looks like "nothing happened", and a PM that follows the current text to the letter flips the labels and moves on. The worktree survives only until someone prunes it.

Measured today

A family dispatch died mid-edit when its model tier hit an account quota limit. GitHub-side signals: zero commits, zero pushes, no PR — i.e. exactly the "nothing happened" shape. The worktree held 113 changed lines across two instruction files (a 35-line edit and a 78-line edit). Recovered by this seat as a WIP commit and pushed before releasing the claim; had the recovery text been followed literally, all of it would have been discarded silently.

⭐ Note the timing: the WIP-commit rule for devs landed the same morning (push a WIP commit before every minutes-long step, because you are about to stop being the only copy). This incident is that rule's first live case — and it shows the rule has a PM-side counterpart that does not exist: the dev did not get to run its WIP commit, so the PM's recovery is the last line of defence.

Disposition (one line, at the recovery step)

Before releasing a dead claim, check the dispatch's worktree; if it holds uncommitted changes, commit them as a WIP on the dispatch branch, push, and name the sha in the recovery comment — marked INCOMPLETE AND UNREVIEWED so the resuming dispatch diffs it rather than building on it unexamined. Costs one git status per recovery; the alternative is silent, unrecoverable, and invisible in exactly the case the recovery path exists for.

Adjacent but different: #12204 (the ablation restore leg destroying uncommitted work — a dev-side idiom, not the PM-side recovery path).

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions