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).
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>
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
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 main2026-10-20 01:08:04 +00:00
time
deleted branch claude/card-173-rank-spine-cards2026-10-20 01:08:05 +00:00
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.
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 asteahub#N, judged by the seat like any othercandidate. Those rows carry
why_not"spine: not queued (Time builds in this repo only)", so the table marks them andcode cannot act on them:
nis None, as for the new-venture candidate, which keeps them out ofpick,pick_cloudand 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.issuesuses (Gitea ignores a filter on a label a repo does not have andanswers 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 promotionorder and never labelled; one without a
DONE:line is not a candidate; a PR of the spine is not an issue; a labelfilter 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.
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 checkci / testis green, and the new checks cover the claims.Non-blocking notes:
.github/time/astra.py:117-118(spine_issues): the request islimit=50with 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'sDONE: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): then: None/actionable: Falseguard is what keeps spine rows out ofpick,pick_cloudandorder. A later change that setsnfor 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 fromr["n"] is not Noneto"#" in r["key"]. It works for the current keys, includingventure:new. It is worth a look if new key shapes appear.review by haiku · claude-haiku-5-5 · via Time