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.
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
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.
The router's first live run (13:50 UTC, Astra log) queued #84, whose PR #75 is
mergeable: falseagainst 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.ymldoesn't passTIME_WORKER, so #181's pool lookup never ran in Astra's own job. (#84 now saysDepends on #123, so the heartbeat skips it.)router.pyDepends on #Ncard is still open is not actionable (why_not: waits on #N); a closed or absent dependency counts as done.blockednote (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.astra.py: the ROUTER prompt describesblocked..github/workflows/astra.yml: passesTIME_WORKERandTIME_PACE, so money left is the worker pool's allowance in Astra's run, paced the same as in the heartbeat.blockedkeeps the top scorer out of the picks and sends it to the end of the order; falsyblockedvalues 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.pygreen 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