A standing collector cannot say so to the ranker, so it ranks like work forever
Filed 2026-08-28 by frankB (Track B) after parking one, on a rule frank-coordinator stated the same day:
A ranked queue says a ticket is UNBLOCKED, not that it has WORK LEFT IN IT. Those are different claims and the board only checks the first.
Two mechanisms produce a false-ready, and only one of them is a data error
Both fired in Track B on 2026-08-28, on the two tickets at the head of the queue, which is how they got noticed together.
| ticket | why it ranked | is it a data error? |
|---|---|---|
feature-random-library |
a live blocker (bug-a-xtensa-refuses-to-lower-an-unreachable-syscall) was never edged onto it |
yes — fixed in 054ab4ffa by adding the edge |
feature-crtl-implement-libc-assumptions |
nothing blocks it and nothing is wrong with its data; it simply has no work in it, by design | no — and that is this ticket |
The first is a mistake anyone can make and the board already models it: the edge existed in the world and not in the file. The second is not a mistake at all. The ticket is a collector — a place to file the next batch of findings from a real-project bring-up — and its list is empty exactly when everyone has been doing their job. Emptying it does not change its rank, so a well-maintained collector ranks identically to a neglected one.
What it looks like from the inside
feature-crtl-implement-libc-assumptions has said this since 2026-07-20:
an ongoing collector by design — its own status line says so — so it does not have a "done" state and should not sit in the ready queue as if it did
It then sat in the ready queue for five weeks, at prio: 45, at the head of
Track B, and on 2026-08-28 was dispatched to an agent as work. A second banner
had been added at the top of the file that same morning, in bold, saying the
list was empty. Neither was read by the thing doing the ranking, because
progress.py reads status and prio and nothing else.
Prose in a ticket is not a signal to a ranker. That is the same shape as
bug-t-a-skipped-job-is-passlike-so-it-becomes-a-false-last-good and as
[[chore-t-a-wikilink-to-a-ticket-that-does-not-exist-is-never-detected]]: a
claim that is legible to a human reader and invisible to the tool that acts on
it.
Worked around today, not fixed
The collector is now parked in rainy-day/, which is loaded but never ranked
(progress.py's RANKED_STATUSES). That is the right behaviour and the wrong
name: rainy-day/'s own README describes big work, stretch goals and design
parks, none of which is what a live collector is. A reader who finds it there
will reasonably conclude it was demoted.
prio: 10 was considered and rejected — CLAUDE.md names that anti-pattern
directly, that parking by priority "keeps it in the ranker's scan forever at
zero value". The choice available today is rankable or parked, with nothing in
between, and a collector is neither.
Options
- A frontmatter field, e.g.
standing: true— excluded fromready_tickets()while keepingbacklogstatus, prio, and board presence. Says what is true, in the place the tool reads. Smallest change. - A
collector/folder alongsidefloat/andexperimental/, added to the deliberate-exclusion list inprogress.py. More visible, more machinery, and there may only ever be two or three of these. - A
checkwarning when a ranked ticket has been ready and unclaimed for N weeks at a high prio. Catches this case and the missing-edge case and cases nobody has thought of — but it is a heuristic, and it would have flaggedfeature-crtlin week two rather than answering what to do about it.
Recommendation: 1, with 3 as a separate ticket if the pattern recurs. The
field is honest, it is one predicate in ready_tickets(), and it makes the
ticket's own five-week-old sentence enforceable instead of decorative.
Gate
Track T tooling change, so T's own gate applies (the quick tier, per CLAUDE.md's
per-fix loop — not a wider one), plus a devtest beside
progress_ranked_statuses_devtest.py asserting a standing ticket is loaded,
satisfies blockers, appears on the board, and does NOT appear in ready/next
for its own track.
Scope note
T owns the tool. Whichever option is taken, feature-crtl-implement-libc-assumptions
moves back out of rainy-day/ and into whatever the answer is — it is a Track B
ticket and its content is unaffected.
Second instance, and it widens the field beyond collectors (coordinator, 2026-08-28)
feature-b-posix-and-fpc-named-socket-facades [B p25] is a better instance than
the crtl collector, and it is a different kind. Its own second line reads
"filed to preserve a design, not to schedule work" — it says outright that it
is not work — and it sits at p25 rather than at a queue head, so it misleads
less than the collector did. It still got offered as work, twice: once by the
ranker, once by me.
That matters for the field's scope. The collector case invites reading standing:
as "this ticket is a standing survey". This case is a preserved design:
nothing to survey, nothing recurring, no consumer — just a record someone will
want if and only if they open that work. Both belong out of the ranked queue for
the same reason, and it is not "it recurs". It is:
the ticket's value is not conditioned on anyone acting on it now.
Two shapes so far — a standing survey and a preserved design — which is why the
field should NOT be named for either. standing: true reads as the first one.
Something closer to ranked: false says what it does rather than why, and admits
the third shape nobody has hit yet.
A caution the first instance did not surface. This one was inaccurate at the
moment it was filed — written from feature-networking's design log rather than
from the tree, so it claimed the FPC-named facades were never built when
sockets.pas (633 lines, 4 consumers) and baseunix.pas (149 lines, 10 files
naming it in a uses clause) are built and load-bearing. Corrected same-day by
its own filer (f2d76bc30). Unranking a ticket makes it less likely to be
re-read, so whatever the field is called, an unranked ticket's claims decay
with nothing pushing back — the crtl collector's premise and this one's were both
wrong within days of filing. That is an argument for the field, not against it,
but it is also an argument that unranking should not be silent: it wants a date.
Deprioritised 2026-09-02 — the Track T tooling backlog was cut as a pile
This ticket is not being called wrong. It was moved as part of a pile, not judged individually, and nothing here disputes its finding.
Owner decision. 73 of the 74 open track: T tickets were filed between
2026-08-31 and 2026-09-02, 58 on one day. The pile was too large to work through
and returned almost nothing, and a ticket nobody will fix does not sit neutrally
— it stays in the ranker forever at zero value, which is the argument CLAUDE.md
already makes for a terminal folder over a low prio.
Four were kept in the ranker on a purely structural test — an active umbrella or
a hard blocked-by: edge from live work:
umbrella-one-full-tier-run-with-no-red-tier,
feature-t-freebsd-image-and-runner, and the two regression-test-core-* reds
that block the umbrella.
Kept, not deleted, for two reasons: so the finding is not rediscovered and refiled from scratch by the next agent who trips over it, and so it can be pulled back if what it touches becomes load-bearing.
To revive it: move it to the owning lane's backlog, set status: backlog,
and say in the ticket WHAT CHANGED to make it matter now. Restoring it because it
reads well is how the pile comes back.