housekeeping: list open cards whose work a closed card already did #210

Merged
time merged 1 commits from claude/card-198-superseded-cards-p3jqzg into main 2026-10-21 02:09:46 +00:00
Collaborator

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

Commits:

housekeeping: list open cards whose work a closed card already did

The daily sweep now compares every open card with the cards closed in the
last 30 days and lists the ones another card looks to have finished, with
the number of the card that did the work, under the stale list on the Astra
log. Three signals, in order of how much they say and first-hit wins: the
closed card's title repeats the open one's (the planner's own repeat rule),
the closed card ports or follows the open card itself (Port of #48,
Follows #48), or both carry the same card over. It closes nothing and
labels nothing — the report is for Astra and the CEO, so the rule can stay a
checkable hint instead of a verdict, and a card whose work landed under
another number stops being silently ranked and queued again.

The venture loop's own issues are out of both lists: they are not cards, and
two signups for one venture carry the same title by design, which would have
put every repeat signup on the report. A card whose closed_at is older than
the window is dropped too, since Gitea's since filters on the last update.

repeat_of moved from astra.py to router.py, which astra and housekeeping
both already load, so the sweep and the planner share one copy of the rule
rather than drifting apart. refs and superseded sit beside it, pure and
testable.

The card asked for the test in test_time.py with a World holding one
superseded and one live card. The matching rule is there (check 198, two open
cards: #48, whose work #139 did, and #60, which is live), and the report the
sweep writes from it is checked in test_housekeeping.py, where the sweep's
own fake forge lives — test_time.py's World drives the heartbeat and cannot
run the sweep. No workflow change is needed: housekeeping.yml already runs
the whole sweep.

Closes #198

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_0116Joj4QVA1Gg2WrUmbbfRT


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-198-superseded-cards-p3jqzg` (git@github.com:teahubxyz/time.git), brought in by sync.py. Time's council reviews it like any PR. Commits: housekeeping: list open cards whose work a closed card already did The daily sweep now compares every open card with the cards closed in the last 30 days and lists the ones another card looks to have finished, with the number of the card that did the work, under the stale list on the Astra log. Three signals, in order of how much they say and first-hit wins: the closed card's title repeats the open one's (the planner's own repeat rule), the closed card ports or follows the open card itself (`Port of #48`, `Follows #48`), or both carry the same card over. It closes nothing and labels nothing — the report is for Astra and the CEO, so the rule can stay a checkable hint instead of a verdict, and a card whose work landed under another number stops being silently ranked and queued again. The venture loop's own issues are out of both lists: they are not cards, and two signups for one venture carry the same title by design, which would have put every repeat signup on the report. A card whose `closed_at` is older than the window is dropped too, since Gitea's `since` filters on the last update. `repeat_of` moved from astra.py to router.py, which astra and housekeeping both already load, so the sweep and the planner share one copy of the rule rather than drifting apart. `refs` and `superseded` sit beside it, pure and testable. The card asked for the test in test_time.py with a World holding one superseded and one live card. The matching rule is there (check 198, two open cards: #48, whose work #139 did, and #60, which is live), and the report the sweep writes from it is checked in test_housekeeping.py, where the sweep's own fake forge lives — test_time.py's World drives the heartbeat and cannot run the sweep. No workflow change is needed: housekeeping.yml already runs the whole sweep. Closes #198 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0116Joj4QVA1Gg2WrUmbbfRT --- <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-21 01:15:41 +00:00
housekeeping: list open cards whose work a closed card already did
heartbeat / tick (pull_request_review) Successful in 20s
ci / test (pull_request) Successful in 43s
ea9198a526
The daily sweep now compares every open card with the cards closed in the
last 30 days and lists the ones another card looks to have finished, with
the number of the card that did the work, under the stale list on the Astra
log. Three signals, in order of how much they say and first-hit wins: the
closed card's title repeats the open one's (the planner's own repeat rule),
the closed card ports or follows the open card itself (`Port of #48`,
`Follows #48`), or both carry the same card over. It closes nothing and
labels nothing — the report is for Astra and the CEO, so the rule can stay a
checkable hint instead of a verdict, and a card whose work landed under
another number stops being silently ranked and queued again.

The venture loop's own issues are out of both lists: they are not cards, and
two signups for one venture carry the same title by design, which would have
put every repeat signup on the report. A card whose `closed_at` is older than
the window is dropped too, since Gitea's `since` filters on the last update.

`repeat_of` moved from astra.py to router.py, which astra and housekeeping
both already load, so the sweep and the planner share one copy of the rule
rather than drifting apart. `refs` and `superseded` sit beside it, pure and
testable.

The card asked for the test in test_time.py with a World holding one
superseded and one live card. The matching rule is there (check 198, two open
cards: #48, whose work #139 did, and #60, which is live), and the report the
sweep writes from it is checked in test_housekeeping.py, where the sweep's
own fake forge lives — test_time.py's World drives the heartbeat and cannot
run the sweep. No workflow change is needed: housekeeping.yml already runs
the whole sweep.

Closes #198

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0116Joj4QVA1Gg2WrUmbbfRT
haiku approved these changes 2026-10-21 02:07:56 +00:00
haiku left a comment
Collaborator

Approve

The diff does what card #198 asks: the sweep lists open cards that a card closed in the last 30 days appears to have done, with the closing card's number, and it closes and labels nothing. CI (ci / test) is green. I did not run the tests myself.

  • .github/time/housekeeping.py:361-380: the sweep's superseded() uses since but also re-checks closed_at against the window, which handles Gitea filtering on last update. Venture loop issues are excluded from both lists, so repeated signups don't flood the report.
  • .github/time/housekeeping.py:404-437: the stale and superseded reads are wrapped separately, so one failing never hides the other. The summary line gains a superseded count, and the live-mode comment carries the superseded numbers in its metadata. Dry-run writes nothing.
  • .github/time/router.py:340-390: repeat_of moved here from astra.py and is shared by the planner and the sweep, which removes the drift risk the card's author was worried about. REF correctly rejects Portfolio #3 and Depends on #7.
  • .github/time/router.py:378-390: the third signal ("both carry over the same card") is the weakest. Any open card that shares a Port of #N parent with any lately closed card gets flagged. This can add noise, but it is only a hint and the report says so.
  • .github/time/housekeeping.py:361-380: the superseded list is re-posted on every daily run for up to 30 days after a match. That matches how the stale list already behaves, so I'm not blocking on it, but Astra may find it repetitive.
  • .github/time/test_housekeeping.py:280-307 and test_time.py 198 block: the card asked for the superseded/live test in test_time.py. The PR puts the sweep's report test in test_housekeeping.py (where the fake forge lives) and the matching-rule unit test in test_time.py. The PR explains why, and the coverage is adequate.
  • .github/time/astra.py: the repeat_of call site now uses router.repeat_of. Assuming astra already imports router (the PR says it does), this is a clean move.

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

**Approve** The diff does what card #198 asks: the sweep lists open cards that a card closed in the last 30 days appears to have done, with the closing card's number, and it closes and labels nothing. CI (`ci / test`) is green. I did not run the tests myself. - `.github/time/housekeeping.py:361-380`: the sweep's `superseded()` uses `since` but also re-checks `closed_at` against the window, which handles Gitea filtering on last update. Venture loop issues are excluded from both lists, so repeated signups don't flood the report. - `.github/time/housekeeping.py:404-437`: the stale and superseded reads are wrapped separately, so one failing never hides the other. The summary line gains a superseded count, and the live-mode comment carries the superseded numbers in its metadata. Dry-run writes nothing. - `.github/time/router.py:340-390`: `repeat_of` moved here from `astra.py` and is shared by the planner and the sweep, which removes the drift risk the card's author was worried about. `REF` correctly rejects `Portfolio #3` and `Depends on #7`. - `.github/time/router.py:378-390`: the third signal ("both carry over the same card") is the weakest. Any open card that shares a `Port of #N` parent with any lately closed card gets flagged. This can add noise, but it is only a hint and the report says so. - `.github/time/housekeeping.py:361-380`: the superseded list is re-posted on every daily run for up to 30 days after a match. That matches how the stale list already behaves, so I'm not blocking on it, but Astra may find it repetitive. - `.github/time/test_housekeeping.py:280-307` and `test_time.py` 198 block: the card asked for the superseded/live test in `test_time.py`. The PR puts the sweep's report test in `test_housekeeping.py` (where the fake forge lives) and the matching-rule unit test in `test_time.py`. The PR explains why, and the coverage is adequate. - `.github/time/astra.py`: the `repeat_of` call site now uses `router.repeat_of`. Assuming `astra` already imports `router` (the PR says it does), this is a clean move. <sub>review by haiku · claude-haiku-5-5 · via Time</sub>
time merged commit af52c60e4a into main 2026-10-21 02:09:46 +00:00
time deleted branch claude/card-198-superseded-cards-p3jqzg 2026-10-21 02:09:47 +00:00
Sign in to join this conversation.