Router: rank the spine's cards too, shown and never queued (#173) #205

Merged
time merged 1 commits from claude/card-173-rank-spine-cards into main 2026-10-20 01:08:04 +00:00
1 Commits
Author SHA1 Message Date
Claude 961e8dfa83 Router: rank the spine's cards too, shown and never queued (#173)
heartbeat / tick (pull_request_review) Successful in 10s
ci / test (pull_request) Successful in 44s
Astra reads the open issues of TIME_SPINE (teahubxyz/teahub: Tea MCP, the Pages server, the Gitea look) through the
same API, and every one with a `DONE:` line joins the ranked table as `teahub#N`, judged by the seat like any other
candidate. Those rows carry `why_not` "spine: not queued (Time builds in this repo only)", so the table marks them and
code cannot act on them: `n` is None, as for the new-venture candidate, which keeps them out of `pick`, `pick_cloud`
and the promotion `order`, and they are never labelled from here. Their value is for the owner or the CEO to read:
what the platform needs next, now visible beside Time's own cards instead of invisible.

The spine's rows get the same label check `tm.issues` uses (Gitea ignores a filter on a label a repo does not have and
answers with every issue, #137) and PRs are left out. The spine stays context, not a dependency: a failed read is a log
line and the day's ranking goes up without it.

Checks: a spine card with a `DONE:` line is ranked, never picked, never sent to the cloud lane, never in the promotion
order and never labelled; one without a `DONE:` line is not a candidate; a PR of the spine is not an issue; a label
filter is checked on every row; a read failure prints one line and the tick still queues its two cards.

No workflow change is needed: astra.yml already passes nothing the spine read depends on (TIME_SPINE has a default).

Closes #173

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017E7Qf55mVnHmowgaGseNRh
2026-10-20 00:57:53 +00:00