Router: a card that waits is never picked; Astra gets TIME_WORKER #185

Merged
teahubxyz merged 5 commits from astra-worker-env into main 2026-10-19 13:55:04 +00:00
Owner

The router's first live run (13:50 UTC, Astra log) queued #84, whose PR #75 is mergeable: false against main. The seat wrote that #75 "must be reconciled with current main first", then scored #84 S and put it first. Its header also said $12.37 left to queue against (daily cap): astra.yml doesn't pass TIME_WORKER, so #181's pool lookup never ran in Astra's own job. (#84 now says Depends on #123, so the heartbeat skips it.)

  • router.py
    • A candidate whose Depends on #N card is still open is not actionable (why_not: waits on #N); a closed or absent dependency counts as done.
    • The seat's optional blocked note (what it waits on: a PR that can't merge, a human) makes a card not actionable (why_not: blocked: …). Empty, "none", "no" and non-strings are ignored.
    • order() puts cards that can move first and the ones that wait after, so the heartbeat promotes unblocked work first. It already skipped open dependencies; now a seat-blocked card goes last too.
    • The table shows "lined up; waits on #97" for a lined-up card that waits.
  • astra.py: the ROUTER prompt describes blocked.
  • .github/workflows/astra.yml: passes TIME_WORKER and TIME_PACE, so money left is the worker pool's allowance in Astra's run, paced the same as in the heartbeat.
  • Tests (80): an open dependency waits and a closed one doesn't; the seat's blocked keeps the top scorer out of the picks and sends it to the end of the order; falsy blocked values are ignored; the table shows "lined up; waits on". The fixture gains #9 ("Depends on #1"), and #5 now depends on a closed card.

test_time.py green locally (23 sections). The workflow change is a human-class file; landing it as the operator.

🤖 Generated with Claude Code

https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD

The router's first live run (13:50 UTC, Astra log) queued **#84**, whose PR #75 is `mergeable: false` against main. The seat wrote that #75 "must be reconciled with current main first", then scored #84 S and put it first. Its header also said `$12.37 left to queue against (daily cap)`: `astra.yml` doesn't pass `TIME_WORKER`, so #181's pool lookup never ran in Astra's own job. (#84 now says `Depends on #123`, so the heartbeat skips it.) - `router.py` - A candidate whose `Depends on #N` card is still open is not actionable (`why_not: waits on #N`); a closed or absent dependency counts as done. - The seat's optional `blocked` note (what it waits on: a PR that can't merge, a human) makes a card not actionable (`why_not: blocked: …`). Empty, "none", "no" and non-strings are ignored. - `order()` puts cards that can move first and the ones that wait after, so the heartbeat promotes unblocked work first. It already skipped open dependencies; now a seat-blocked card goes last too. - The table shows "lined up; waits on #97" for a lined-up card that waits. - `astra.py`: the ROUTER prompt describes `blocked`. - `.github/workflows/astra.yml`: passes `TIME_WORKER` and `TIME_PACE`, so money left is the worker pool's allowance in Astra's run, paced the same as in the heartbeat. - Tests (80): an open dependency waits and a closed one doesn't; the seat's `blocked` keeps the top scorer out of the picks and sends it to the end of the order; falsy `blocked` values are ignored; the table shows "lined up; waits on". The fixture gains #9 ("Depends on #1"), and #5 now depends on a closed card. `test_time.py` green locally (23 sections). The workflow change is a human-class file; landing it as the operator. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
teahubxyz added 5 commits 2026-10-19 13:54:22 +00:00
teahubxyz merged commit bc1da90c33 into main 2026-10-19 13:55:04 +00:00
Sign in to join this conversation.