Filed unassigned by the triage seat (session session_019kDRpB7D2XzVzkaLp57T5D, R+131). Grading and any pm:* are the domain:skills seat's — that lane self-triages its own findings, so this card is deliberately left ungraded.
Measured 2026-09-04T00:52Z against objectstack-ai/objectui.
The defect
mcp__github__list_issues takes labels as an array. It reads as a conjunction — "issues carrying all of these" — and this seat has been reading it that way. It is a disjunction. The returned totalCount is the size of the union.
How it surfaced
Counting the objectui straggler class (cards carrying finding and a pm:* state):
| query |
returned |
whole finding box |
["finding","pm:queue"] |
117 |
77 |
["finding","pm:blocked"] |
120 |
77 |
["finding","needs-user-decision"] |
92 |
77 |
["finding","pm:dispatched"] |
83 |
77 |
⇒ Every "intersection" outnumbered its own superset, and three of the four returned the same first issue. A subset cannot exceed its superset; that is what made it visible at all.
The decisive control
Inclusion–exclusion fits, but a fit is not a proof — so: pm:dispatched and needs-user-decision are both members of the six-state pm:* ONE-OF, so their true intersection is ~0 by design. The two hypotheses therefore predict opposite answers:
- AND ⇒ ~0
- OR ⇒ 6 + 18 − 0 = 24
Measured: 24. ⇒ Union, settled.
Consistency across all six pairs
With the union model, |A ∪ B| = |A| + |B| − |A ∩ B| recovers a small non-negative integer every time — six for six, which an incorrect model would not do:
| pair |
union |
singles |
implied ∩ |
| finding, pm:queue |
117 |
77 + 40 |
0 |
| finding, pm:blocked |
120 |
77 + 45 |
2 |
| finding, needs-user-decision |
92 |
77 + 18 |
3 |
| finding, pm:dispatched |
83 |
77 + 6 |
0 |
| finding, pm:on-hold |
143 |
77 + 66 |
0 |
| finding, pm:retriage |
78 |
77 + 1 |
0 |
Independent corroboration: those implied intersections total 5, and R+123 measured the same straggler class at 5 by a completely different route (enumerating cards). Two instruments, one answer.
Why this one is dangerous rather than merely wrong
A union is always ≥ each single, so a wrong answer here never looks absurd — it looks like a bigger, healthier-seeming board. It fails loudly only in the rare case that caught it: querying an intersection against a label whose own box you already know. Every other multi-label reading returns a plausible number that no sanity check rejects.
This is the same family as the search_issues readings in #15012 — an instrument that answers a different question than the one asked, with no error surface. ⛔ It is not a flake and ⛔ not intermittent: it reproduced on all seven calls.
Suggested shape
- Record it in
.claude/skills/pm-dispatch/references/platform-readings.md — labels is a union; ⛔ never read a multi-label totalCount as an intersection.
- Canonical workaround, which this card demonstrates: measure each label singly, then derive the intersection by inclusion–exclusion. It costs one extra call per pair and its output is checkable (a negative or implausible result means the model broke).
- ⚠️ Worth a sweep of whether any other seat's standing readings rest on a multi-label
list_issues. This seat cannot see other lanes' scratch work, so the blast radius is NOT MEASURED here.
⛔ Not measured: whether list_issues intends this (it may be GitHub's documented labels semantics surfacing unchanged), and whether the same holds for the labels filter on any other MCP tool. This card records the behaviour, not its cause.
Filed unassigned by the triage seat (session
session_019kDRpB7D2XzVzkaLp57T5D, R+131). Grading and anypm:*are thedomain:skillsseat's — that lane self-triages its own findings, so this card is deliberately left ungraded.Measured 2026-09-04T00:52Z against
objectstack-ai/objectui.The defect
mcp__github__list_issuestakeslabelsas an array. It reads as a conjunction — "issues carrying all of these" — and this seat has been reading it that way. It is a disjunction. The returnedtotalCountis the size of the union.How it surfaced
Counting the objectui straggler class (cards carrying
findingand apm:*state):findingbox["finding","pm:queue"]["finding","pm:blocked"]["finding","needs-user-decision"]["finding","pm:dispatched"]⇒ Every "intersection" outnumbered its own superset, and three of the four returned the same first issue. A subset cannot exceed its superset; that is what made it visible at all.
The decisive control
Inclusion–exclusion fits, but a fit is not a proof — so:
pm:dispatchedandneeds-user-decisionare both members of the six-statepm:*ONE-OF, so their true intersection is ~0 by design. The two hypotheses therefore predict opposite answers:Measured: 24. ⇒ Union, settled.
Consistency across all six pairs
With the union model,
|A ∪ B| = |A| + |B| − |A ∩ B|recovers a small non-negative integer every time — six for six, which an incorrect model would not do:Independent corroboration: those implied intersections total 5, and R+123 measured the same straggler class at 5 by a completely different route (enumerating cards). Two instruments, one answer.
Why this one is dangerous rather than merely wrong
A union is always ≥ each single, so a wrong answer here never looks absurd — it looks like a bigger, healthier-seeming board. It fails loudly only in the rare case that caught it: querying an intersection against a label whose own box you already know. Every other multi-label reading returns a plausible number that no sanity check rejects.
This is the same family as the
search_issuesreadings in #15012 — an instrument that answers a different question than the one asked, with no error surface. ⛔ It is not a flake and ⛔ not intermittent: it reproduced on all seven calls.Suggested shape
.claude/skills/pm-dispatch/references/platform-readings.md—labelsis a union; ⛔ never read a multi-labeltotalCountas an intersection.list_issues. This seat cannot see other lanes' scratch work, so the blast radius is NOT MEASURED here.⛔ Not measured: whether
list_issuesintends this (it may be GitHub's documentedlabelssemantics surfacing unchanged), and whether the same holds for thelabelsfilter on any other MCP tool. This card records the behaviour, not its cause.