You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
supervisor_takeover is documented as a non-destructive park: "worktrees, branches, batch state, sessions preserved." In penster batch henrylach-20260903T… (TP-2039), invoked while the single task was in a governance hold, the engine instead treated the paused wave as terminal: it marked TP-2039 skipped, "completed" the batch 0/1, ran a no-op merge onto the orch branch, and removed the lane worktree and its branch. The worker's uncommitted work in that worktree was destroyed. Committed work survived only as dangling commits and was recovered by hand into rescue/tp2039-lane-iter3.
Sequence
TP-2039 plan gate reached the REVISE cap (round 2). Per the operator's standing rule the worker entered a hard hold and both worker and supervisor escalated to the operator, who was away.
The runtime kept re-spawning worker iterations against the held task (four iterations, each idling; each re-spawn pushed "continue Steps 2–6", which the worker correctly refused).
To stop the budget burn the supervisor walked the parking ladder: trigger_wrap_up (one-shot, consumed), orch_pause (blocks new tasks only, not iterations inside a running task), then supervisor_takeover.
On takeover the engine: marked the task skipped, recorded the batch as completed 0/1, executed a merge that integrated nothing, and cleaned the lane worktree and branch.
Uncommitted files in the lane (a helper source file, its tests, a config field) were lost. Lane commits were recovered from the reflog/dangling objects.
Expected
Takeover pauses the wave and preserves the lane worktree, its branch, and batch state exactly as documented. A held or paused task is not terminal; it must not be marked skipped and must not trigger batch completion or a merge.
There is a way to park a running task that stops iteration re-spawns without ending the task. Today orch_pause does not stop in-task iterations and trigger_wrap_up is single-use, so the only remaining lever was the one that destroyed state.
Cleanup of a lane worktree never runs while that worktree has uncommitted changes, regardless of task state. At minimum: refuse and report; better: auto-stash or auto-commit with a hold:/wip: prefix onto the lane branch before any removal.
Cap-ruling hold: runtime must block .DONE and merge while an operator ruling is pending (.PENDING-RULING) #627 (cap-ruling hold: runtime must block .DONE/merge while an operator ruling is pending). This is the complementary failure: the runtime had no hold state, so the supervisor reached for takeover, which then destroyed the lane. A first-class hold state (a task status such as held that stops iteration re-spawns, blocks .DONE/merge, and preserves the lane) would resolve both.
Program history: this is the third runtime bug hit in one day on this program, after the stale-executing rehydration trap and the completion re-triggers.
Suggested minimal cut
Takeover/pause never changes a task's status to skipped and never triggers batch completion or merge.
Worktree removal refuses when git status --porcelain is non-empty in the lane.
Summary
supervisor_takeoveris documented as a non-destructive park: "worktrees, branches, batch state, sessions preserved." In penster batchhenrylach-20260903T…(TP-2039), invoked while the single task was in a governance hold, the engine instead treated the paused wave as terminal: it marked TP-2039skipped, "completed" the batch 0/1, ran a no-op merge onto the orch branch, and removed the lane worktree and its branch. The worker's uncommitted work in that worktree was destroyed. Committed work survived only as dangling commits and was recovered by hand intorescue/tp2039-lane-iter3.Sequence
trigger_wrap_up(one-shot, consumed),orch_pause(blocks new tasks only, not iterations inside a running task), thensupervisor_takeover.skipped, recorded the batch as completed 0/1, executed a merge that integrated nothing, and cleaned the lane worktree and branch.Expected
skippedand must not trigger batch completion or a merge.orch_pausedoes not stop in-task iterations andtrigger_wrap_upis single-use, so the only remaining lever was the one that destroyed state.hold:/wip:prefix onto the lane branch before any removal.Actual
skipped→ batch "completed" → no-op merge → worktree + branch removed.Related
.DONE/merge while an operator ruling is pending). This is the complementary failure: the runtime had no hold state, so the supervisor reached for takeover, which then destroyed the lane. A first-class hold state (a task status such asheldthat stops iteration re-spawns, blocks.DONE/merge, and preserves the lane) would resolve both.Suggested minimal cut
skippedand never triggers batch completion or merge.git status --porcelainis non-empty in the lane.heldtask status that suppresses iteration re-spawns until arulingmailbox message arrives (shared with Cap-ruling hold: runtime must block .DONE and merge while an operator ruling is pending (.PENDING-RULING) #627).