Overnight the queue stalled for eight hours: the three ready cards (#71, #79, #80) were all parked in needs-human (an objection waiting for a human or a /time retry), promote_next() saw three ready cards and promoted nothing, and the heartbeat ran every hour doing nothing while a dozen cards sat queued. A human had to relabel one card to free a slot.
promote_next() counts toward TIME_PARALLEL only the ready cards that are moving: last real beat in dispatched, pr, ci-dispatched, no-checks, checks-failed, or none yet. A card whose last real beat is needs-human, error or stuck is waiting on a person and does not hold a slot (it keeps its ready label so a /time retry still finds it).
tick() prints the two counts (ready=N moving=M) so a stall is visible in the run log.
Tests against World: three ready cards all in needs-human → the oldest queued card is promoted; two moving plus one parked → one promotion; three moving → none (as today).
CHANGELOG line under Added.
DONE: PR open; python3 .github/time/test_time.py passes with the new checks; CI green.
Overnight the queue stalled for eight hours: the three `ready` cards (#71, #79, #80) were all parked in `needs-human` (an objection waiting for a human or a `/time retry`), `promote_next()` saw three `ready` cards and promoted nothing, and the heartbeat ran every hour doing nothing while a dozen cards sat `queued`. A human had to relabel one card to free a slot.
- `promote_next()` counts toward `TIME_PARALLEL` only the `ready` cards that are moving: last real beat in `dispatched`, `pr`, `ci-dispatched`, `no-checks`, `checks-failed`, or none yet. A card whose last real beat is `needs-human`, `error` or `stuck` is waiting on a person and does not hold a slot (it keeps its `ready` label so a `/time retry` still finds it).
- `tick()` prints the two counts (`ready=N moving=M`) so a stall is visible in the run log.
- Tests against `World`: three `ready` cards all in `needs-human` → the oldest `queued` card is promoted; two moving plus one parked → one promotion; three moving → none (as today).
- CHANGELOG line under Added.
DONE: PR open; `python3 .github/time/test_time.py` passes with the new checks; CI green.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Overnight the queue stalled for eight hours: the three
readycards (#71, #79, #80) were all parked inneeds-human(an objection waiting for a human or a/time retry),promote_next()saw threereadycards and promoted nothing, and the heartbeat ran every hour doing nothing while a dozen cards satqueued. A human had to relabel one card to free a slot.promote_next()counts towardTIME_PARALLELonly thereadycards that are moving: last real beat indispatched,pr,ci-dispatched,no-checks,checks-failed, or none yet. A card whose last real beat isneeds-human,errororstuckis waiting on a person and does not hold a slot (it keeps itsreadylabel so a/time retrystill finds it).tick()prints the two counts (ready=N moving=M) so a stall is visible in the run log.World: threereadycards all inneeds-human→ the oldestqueuedcard is promoted; two moving plus one parked → one promotion; three moving → none (as today).DONE: PR open;
python3 .github/time/test_time.pypasses with the new checks; CI green.