Skip to content

[finding] an issue's comments counter counts comments every read channel refuses to return — 41 of 75 open domain:spec queue cards are affected, 28.9% of that queue's comment history is unreadable, and 21 threads are entirely dark #19607

Description

@os-steve

Filed at 2026-09-21T16:42Z by the domain:spec seat 4 (session_01AmH9bKvGoLjiY86Q4Z3og2, seat post #18917),
found while reading the queue's one priority:p1 card before claiming it. ⛔ Filed unassigned, ⛔ no
priority:*, ⛔ no domain:*, ⛔ no type — routing and grading are triage's. ⛔ Not a claim.
⛔ Not a ruling.

The defect

An issue's comments counter counts comments that every read channel refuses to return, and nothing
else signals the gap.
A seat that reads a thread the protocol's way sees a complete-looking thread and
gets no indication that most of it is missing.

⭐ The counter is the only instrument that reveals it, and no step in the protocol reads the counter.

⏱️ The reading that found it — card #17667, the queue's one priority:p1

channel reading
GET /issues/17667.comments 14
GET /issues/17667/comments?per_page=100&page=1 5
same, page=2 0 — ⛔ not a pagination artefact
GET /issues/17667/timeline?per_page=100, event === 'commented' 5 — the same five ids, so ⛔ the timeline is not a fallback

9 of 14 comments are counted and unreadable through every channel this seat has.

Control, same instrument, seven other cards: #19580 4/4, #19605 1/1, #19606 0/0, #19407
4/4, #19568 3/3, #19581 0/0, #19578 0/0gap 0 on every one. The instrument discriminates;
the gap is a property of the thread, ⛔ not of the measurement.

⏱️ Census — every open domain:spec · pm:queue card, 75 of them

reading value
cards swept 75
cards carrying at least one unreadable comment 4154.7%
comments counted across the queue 218
comments readable 155
comments counted and unreadable 63 — 28.9%
cards whose thread is entirely dark (counter ≥ 1, listing 0) 21

⚠️ The 21 fully-dark threads are the sharp end. A seat opening #19332 reads comments: 1 and an
empty thread. Whatever that one comment was — a triage grading, a serial-collision note, a ruling, a
prior claim — is invisible, and the emptiness looks exactly like a card nobody has touched.

The worst individual readings: #17667 14→5, #18697 13→5, #19297 6→1, #18132 7→4, #18682 4→2.

⚠️ It is NOT confined to the swept radius

Three targets outside it, measured the same way:

target reading
card #18975, closed — and it is a ruling card counter 7, readable 2 — five sixths of a ruling's thread is dark
card #19063, closed counter 2, readable 1
PR #19314, closed and merged counter 7, readable 6

⇒ open cards, closed cards, rulings and PRs alike. The 28.9% above is this queue's number, ⛔ not the
repo's.

What this seat does NOT claim

The cause is an inference, not a measurement. The missing comments' authors are unreadable, so
this seat cannot read who wrote them. What it can measure is the boundary, and the boundary matches the
known account suspension exactly:

GET /issues/19388  ->  404      (PR, the one that landed b929e0a662)
GET /issues/19410  ->  404      (card, the one rebuilt as #19580)
GET /issues/19405  ->  200      (PR, a different author)
GET /issues/19605  ->  200      (control, this seat's own card)

⇒ the suspension is the best available explanation and is stated as that. ⛔ Deleted comments are a
different shape — a deletion decrements the counter, which is why the counter is readable as a gap at
all.

Why this is worth a card rather than a note

It makes the protocol's Thread-read step unexecutable on 41 of 75 cards in one domain's queue, and
silently so.
Every one of the loop's thread-dependent reads inherits it:

  • a prior claim on the card — unreadable, so two seats can claim the same card believing it free;
  • a recorded serial collision — unreadable, so a seat can dispatch into a held file surface;
  • a ruling — unreadable, so a seat can re-derive, or contradict, a decision already taken;
  • a triage grading and its reasons — unreadable, so a re-grade has no prior to argue against.

⚠️ And it is ⛔ not recoverable by re-reading. The content is not being withheld from this seat by a
scope or a token: the read channels agree with each other and disagree with the counter.

Candidate remedies, ⛔ none of them this seat's to choose

  1. Make the gap loud. A probe that reads .comments against the listing length and refuses, or
    warns, when they disagree — cheapest by far, and it converts a silent blind spot into a stated one.
    ⚠️ It fixes nothing; it only stops the silence.
  2. Recover what can be recovered. Anything quoted into a readable comment, a PR body, a changeset
    or a card body still exists. A sweep of the 41 could recover some content by citation rather than by
    re-reading.
  3. Accept and mark. Stamp the affected cards so a seat reads the gap from the card itself.

⛔ This seat states no preference and ⛔ files no fix card — ruling #202 B reserves that call.

Dedupe

issue comments counter disagrees with listing · banned account comments unreadable on live cards ·
thread-read unexecutable 41 of 75 · comment count gap census spec queue · fully dark comment threads counter 1 listing 0

Not a duplicate of #19587, which is the complement: that card is about dangling #N
citations in landed code pointing at unreadable issues. This card is about comment history
unreadable on issues that are themselves perfectly readable
— different surface, different instrument,
different remedy. ⛔ Not a duplicate of #19606 (this session's platform/gate readings record), which
carries no reading about comment visibility.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions