Repository navigation
fix: unattended-run fixes from the #768 run - #107
Merged
Merged
Conversation
…t-half runs Three direct `coordinator.cli` calls (two in _park_back_half, one in run_item's rc=4 branch) ran without PYTHONPATH, never imported from the wave's cwd, and read back empty: every back-half park concluded it had not been recorded and posted no notice, and every parked scorecard row lost its reason. A guard test now requires PYTHONPATH on every coordinator.cli call in batch/, and the front-half seam harness no longer answers the bare call. The journal sweep now selects every open run short of its pull request (front-half, shaping, planned). A human ruling consumes the park while the issue keeps `bircher:running`, so neither clause found #768 after its approval. This subsumes the unresolved-dispute clause, which is removed.
OwnershipLost escaped run_loop as a traceback, the runner read rc 1 as a failure, and recorded a terminal `failed` over a run a newer pass still owned (#768, a hand-run loop overlapping a wave). run_loop now returns Exit.SUPERSEDED (6); run_item logs it, writes a `superseded` row, keeps the queue file, and records nothing.
The kernel admits revise_bundle only in the front half and shaping, so on every back-half resume it was asked and refused, one noise refusal per wave.
The wave timer fires every 30 minutes, and each empty wave probed both providers with a model call, opened two dispatch-probe sessions and uploaded three bundles before learning the queue held nothing. main now generates the queue (after the kernel preflight, which the sweep and the generator read) and exits on an empty one before any provider work.
seats_used counted every reviewer dispatch, so a back-half repair loop would meet the front half's max_seats wall and be refused its review with no park to say why (#768 reached 42 of 50). The closed-loop spec removes every count-based bound past the seam (§2) and ends the back half on no progress (§3); dispatch now checks the bound only outside the back half.
3 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
Fixes from the #768 run, each one a live incident:
coordinator.clicalls (parkedandpark-noticein_park_back_half,parkedin run_item's rc 4 branch) never imported from the wave's working directory, so they always read back empty. As a result, every back-half park concluded it had not been recorded and posted no notice, and every parked scorecard row readparked:with no reason. The calls now go through_coordinator. A guard test requires PYTHONPATH on everycoordinator.clicall inbatch/. The front-half seam harness used to answer the bare call itself, so it passed while production failed; it no longer does.bircher:running, so neither the park clause nor the labels found #768 after its approval. The journal sweep now selects every open run short of its PR (front half, shaping,planned). This subsumes the unresolved-dispute clause, which is removed.OwnershipLostescapedrun_loopas a traceback. The runner read rc 1 as a failure and tried to recordfailedover a run that a newer pass owned.run_loopnow returnsExit.SUPERSEDED(6). run_item writes asupersededrow, keeps the queue file and records nothing.max_seats, so a long repair loop would have been refused its review with no park (#768 reached 42 of 50). The closed-loop spec removes count bounds past the seam (§2), and dispatch now checks the bound only outsideBACK_HALF_DERIVING_STATES.mainnow generates the queue after the kernel preflight and exits on an empty queue before any provider work.The "silent park" from the same run was not a defect. The rc 4 pass came before the approval and correctly re-parked on the standing gate. Its empty reason was the PYTHONPATH bug. The post-approval pass was working, and a hand-run loop superseded it (the case above).
Effect on the merge gate
None. No change to review, CI observation or merge authorization. The seat change affects only dispatch counting past
planned. Back-half rounds were always meant to be bounded by the no-progress park, not by count.Testing
bash batch/run-queue.sh --self-testpasses (macOS; Linux via CI)cancelledreds its control, the oldmainorder reds the empty-wave test, and every other new test failed before its fixWhole suite: 2003 passed, 3 skipped. A cross-vendor (codex) review found nothing critical. It raised two pre-existing gaps, listed below.
Anything a reviewer should look at twice
implementingthat dies before recording output has no PR.next_stepreturnswaitfor it, and nothing re-dispatches its implementer. It needs a recovery path, not a sweep change.cancelrecordscancel_runbut no terminal outcome, and a front-half cancelled run is not swept, so it never ends. The four legacy cancelled runs (Bircher launch: detached run-queue.sh dies with the exec session (use setsid) #11, feat(bircher): bircher-bot approval to self-merge on protected repos (#10) #12 ×2, harden(bircher): lint-before-CI + PR issue-number mapping fallback + code-naming defense #20) are in this state. Sweeping them would relabel those issues, so they are deliberately left out; the fix belongs incancelitself.