feat(board): split the age column, so a silent repo cannot hide behind a fresh plan
ALDER carried two readings depending on which branch a repo fell into: STATE.md mtime for repos that had one, last-commit age for repos that did not. The consequence was one-sided -- a repo WITH a STATE.md reported only how recently its plan was touched, so one that had not committed in a year looked exactly as alive as one worked on this morning, and no column contradicted it. Now each column means one thing. ALDER is the plan's age and is blank where there is no plan; SISTE is the last commit, read for every repo, and blank where there are no commits -- a day count there would be a fabricated reading, which is what the old -1d was. The four ranking rules stay four: the new column is evidence, never sort input. The sort key was already a separate field from the displayed age, so bucket 5 keeps ordering by commit age while showing nothing in ALDER. The fixture tree was missing the only case that discriminates -- a repo with a STATE.md AND an old last commit -- so the checks land with it, plus its mirror image (old plan, fresh commit) to pin that the two ages read independently and that neither became the sort key. Backdating sets GIT_COMMITTER_DATE, not --date=: %ct is the committer date, and an author-only backdate would have left the red test failing for the wrong reason. board-selftest: 30 -> 36 checks. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QS6gYYgYgJAz7VjcFHEzbb
This commit is contained in:
parent
dbf7391d57
commit
6a09c9caa1
5 changed files with 111 additions and 17 deletions
|
|
@ -59,7 +59,8 @@ rule exists to stop. The run costs about three seconds.
|
|||
| `KOST` | Model/effort for the next step, from the rubric row table in `route.sh` (the `route` skill writes it; this one only reads it). |
|
||||
| `INN` | Unhandled inbox: **other repos are waiting on THIS one**. An obligation it owes outward. |
|
||||
| `DRT` | Uncommitted files. |
|
||||
| `ALDER` | Days since STATE.md last changed. |
|
||||
| `ALDER` | Days since STATE.md last changed — the age of the *plan*. `-` where the repo has none. |
|
||||
| `SISTE` | Days since the last commit — the age of the *work*. `-` where the repo has no commits yet. |
|
||||
| `NESTE` | First line of the STATE.md next-step block, truncated. |
|
||||
|
||||
**`INN` never means "this repo is waiting on someone."** It means the opposite:
|
||||
|
|
@ -85,8 +86,15 @@ fired — the rule is the justification, and it is what lets the operator disagr
|
|||
naming: the config backup mirrors commits, not working trees, so uncommitted
|
||||
files exist in exactly one place.
|
||||
|
||||
**`ALDER` is never a ranking input.** An old STATE.md often means a finished repo,
|
||||
not a neglected one. Report it only if the user asks about staleness directly.
|
||||
**Neither `ALDER` nor `SISTE` is a ranking input.** An old STATE.md often means a
|
||||
finished repo, not a neglected one, and an old last commit can mean the same.
|
||||
Report either only if the user asks about staleness directly — the four rules
|
||||
above stay four.
|
||||
|
||||
Read them as a **pair**, though: they answer different questions, and the gap
|
||||
between them is the reading neither gives alone. A fresh `ALDER` beside a long
|
||||
`SISTE` is a repo that keeps being re-planned without anything landing, which no
|
||||
other column on the board reports.
|
||||
|
||||
`deferred` is a deliberate choice, not neglect — do not surface a deferred repo as
|
||||
a candidate unless nothing else qualifies, and say that it was deferred if you do.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue