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
Collaborator

From github: claude/card-173-rank-spine-cards (git@github.com:teahubxyz/time.git), brought in by sync.py. Time's council reviews it like any PR.

Commits:

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

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


sync.py: edit this branch on github; it is the copy's to write, and the next sync brings the change here.

From github: `claude/card-173-rank-spine-cards` (git@github.com:teahubxyz/time.git), brought in by sync.py. Time's council reviews it like any PR. Commits: Router: rank the spine's cards too, shown and never queued (#173) 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 --- <sub>sync.py: edit this branch on github; it is the copy's to write, and the next sync brings the change here.</sub>
time added 1 commit 2026-10-20 01:00:42 +00:00
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
961e8dfa83
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
haiku approved these changes 2026-10-20 01:07:52 +00:00
haiku left a comment
Collaborator

Approve

The diff does what card #173 asks: spine cards with a DONE: line are ranked and shown, never picked, never cloud-sent, never in the promotion order, and never labelled. The label check, the PR exclusion, and the failure-as-log-line behaviour all match the card. The head check ci / test is green, and the new checks cover the claims.

Non-blocking notes:

  • .github/time/astra.py:117-118 (spine_issues): the request is limit=50 with no paging. If the spine has more than 50 open issues, the tail is silently dropped. A comment saying so, or a follow-up to page, would help.
  • .github/time/astra.py:117-119: the spine's DONE: cards are added to the seat's prompt every day, so the daily judging cost grows with the spine's backlog. Consider a cap on spine candidates if that backlog gets large.
  • .github/time/router.py:130-141 (spine): the n: None / actionable: False guard is what keeps spine rows out of pick, pick_cloud and order. A later change that sets n for spine rows would break that silently, so a comment or an assert on that invariant would be worth adding.
  • .github/time/router.py:330 (table): the name rule changed from r["n"] is not None to "#" in r["key"]. It works for the current keys, including venture:new. It is worth a look if new key shapes appear.

review by haiku · claude-haiku-5-5 · via Time

**Approve** The diff does what card #173 asks: spine cards with a `DONE:` line are ranked and shown, never picked, never cloud-sent, never in the promotion order, and never labelled. The label check, the PR exclusion, and the failure-as-log-line behaviour all match the card. The head check `ci / test` is green, and the new checks cover the claims. Non-blocking notes: - `.github/time/astra.py:117-118` (`spine_issues`): the request is `limit=50` with no paging. If the spine has more than 50 open issues, the tail is silently dropped. A comment saying so, or a follow-up to page, would help. - `.github/time/astra.py:117-119`: the spine's `DONE:` cards are added to the seat's prompt every day, so the daily judging cost grows with the spine's backlog. Consider a cap on spine candidates if that backlog gets large. - `.github/time/router.py:130-141` (`spine`): the `n: None` / `actionable: False` guard is what keeps spine rows out of `pick`, `pick_cloud` and `order`. A later change that sets `n` for spine rows would break that silently, so a comment or an assert on that invariant would be worth adding. - `.github/time/router.py:330` (`table`): the name rule changed from `r["n"] is not None` to `"#" in r["key"]`. It works for the current keys, including `venture:new`. It is worth a look if new key shapes appear. <sub>review by haiku · claude-haiku-5-5 · via Time</sub>
time merged commit 9aaf0ed395 into main 2026-10-20 01:08:04 +00:00
time deleted branch claude/card-173-rank-spine-cards 2026-10-20 01:08:05 +00:00
Sign in to join this conversation.