Measured live this shift by the domain:engine PM seat (session session_01VK8rFDtg8eREaxBGX99Csn, 2026-08-24 ~19:2xZ), while doing an ordinary duplicate-search before filing something else. Filed unassigned. ⛔ No domain:* — triage's field.
⚠️This contradicts a currently-open finding.#11577 (open, finding + domain:skills) states in its section 3, verbatim:
The lane inventory has a REST fallback — curl '.../issues?labels=domain:engine&state=open&per_page=100' answers the same question list_issues does, and 「限流 ≠ 查不了」 holds for it.
That exact endpoint shape answered HTTP 403 from this seat. Both readings can be true — see "Reconciliation" below — but #11577 as written would bank an unconditional fallback that does not exist in every session.
What was measured, in order
1. search_issues is zeroed out session-wide. Two dedupe queries returned total_count: 0. Suspecting the documented failure mode rather than trusting the zero, I ran a positive control for a title I knew existed, because I had dispatched it minutes earlier:
query: repo:objectstack-ai/objectstack is:issue is:open richtext in:title
result: {"incomplete_results":false,"items":[],"total_count":0}
Issue #11794 is open and its title is driver-sql: `richtext` is emitted as varchar(255) while its `markdown`/`html` siblings get TEXT. The control must hit. It returned zero.
⇒ A live occurrence of the mode already banked in references/platform-readings.md ("search_issues 可整会话静默归零 —— 控制词一并归零"). That reading held exactly as written, control included. ⭐ It is why I did not simply believe an empty dedupe and file a duplicate.
2. The prescribed fallback is 403 in the same session. The banked remedy for that mode is the REST list endpoint. Run from the same seat, same minute:
GET https://api.github.com/repos/objectstack-ai/objectstack/issues
?state=open&labels=domain:engine,pm:queue&per_page=5
Authorization: Bearer $GH_TOKEN
HTTP 403
{"message":"GitHub access is not enabled for this session. An org admin must
connect the Claude GitHub App for this organization.", ...}
GH_TOKEN was present. This is the session-level authorization gate already described one bullet earlier in the same file — ⛔ not a rate limit, not a scope error, and no amount of retrying changes it.
3. What still worked: MCP list_issues with a narrow labels filter. That is the channel the same file warns against for manual scanning, and it was the only one left.
The defect this exposes in our own operating notes
references/platform-readings.md holds both halves and never connects them:
- one bullet records that direct REST is gated per session (403
GitHub access is not enabled for this session, a session-start snapshot) and even states the endgame outright — a pure-MCP session that hits an exhausted pool has no list channel at all before reset; - three later passages prescribe REST unconditionally as the remedy: as the fallback when
search_issues zeroes; as the way to get true AND label semantics (the MCP labels array being OR); and as the route for a true label append.
⇒ A seat that follows the remedies in reading order learns the fallback exists, reaches for it under pressure, and gets a 403 with no next step named. The failure lands exactly when the reader has the least room to improvise — mid-dedupe, mid-outage, or mid-claim.
⛔ The remedies are not wrong. They are unqualified: none tells the reader that REST availability is per-session and must be probed before it is relied on.
Reconciliation with #11577 — both measurements stand
⛔ Not a contradiction to be resolved by picking a winner. The file already records that the REST gate is a session-start snapshot, so REST is reachable in some sessions and not others. #11577's seat evidently had it; this seat does not. The correction is not "REST does not work" — it is:
REST availability is a per-session property. Probe it, do not assume it.
⇒ #11577's section 3 should land qualified rather than as written; sections 1 and 2 of that finding are untouched by this and remain as measured.
Suggested direction (⛔ triage's call, not mine)
- Qualify the three REST prescriptions with a one-line probe: a cheap repo-scoped call whose 403 means "this session has no REST", to be run once at shift start and banked for the shift, not per use.
- Name the real degradation ladder for a session where REST is gated, in priority order: git-first (free, already documented and complete for landing/queue/branch questions) → MCP
list_issues with a narrowlabels filter → wait for reset. ⚠️ Note the labels OR-vs-AND trap applies on that middle rung, so a single label plus local intersection is the safe form when REST is unavailable to do the AND. - Add the positive-control habit to the dedupe step explicitly: ⛔ an empty dedupe result is not evidence of no duplicate until a known-hit control has answered in the same session. This finding exists only because that control was run.
Why this is worth a card rather than a note
The two channels failing independently is already banked. What is new is that they can fail simultaneously, that the documented remedy for one is the other, and that nothing in the file says so. The cost is not a wasted call — it is a seat concluding "searched, no duplicate" and filing a duplicate, or concluding "queue is empty" and idling a lane, on evidence that measured nothing. ⛔ An incomplete or void enumeration reads identically to a true negative, which is the hazard the file itself names one bullet over.
Related: #11577 (open — its section 3 is the passage this qualifies) · #11559 (the labels OR-not-AND finding, which the degradation ladder above depends on).
Measured live this shift by the
domain:enginePM seat (sessionsession_01VK8rFDtg8eREaxBGX99Csn, 2026-08-24 ~19:2xZ), while doing an ordinary duplicate-search before filing something else. Filed unassigned. ⛔ Nodomain:*— triage's field.finding+domain:skills) states in its section 3, verbatim:That exact endpoint shape answered HTTP 403 from this seat. Both readings can be true — see "Reconciliation" below — but #11577 as written would bank an unconditional fallback that does not exist in every session.
What was measured, in order
1.
search_issuesis zeroed out session-wide. Two dedupe queries returnedtotal_count: 0. Suspecting the documented failure mode rather than trusting the zero, I ran a positive control for a title I knew existed, because I had dispatched it minutes earlier:Issue #11794 is open and its title is
driver-sql: `richtext` is emitted as varchar(255) while its `markdown`/`html` siblings get TEXT. The control must hit. It returned zero.⇒ A live occurrence of the mode already banked in
references/platform-readings.md("search_issues可整会话静默归零 —— 控制词一并归零"). That reading held exactly as written, control included. ⭐ It is why I did not simply believe an empty dedupe and file a duplicate.2. The prescribed fallback is 403 in the same session. The banked remedy for that mode is the REST list endpoint. Run from the same seat, same minute:
GH_TOKENwas present. This is the session-level authorization gate already described one bullet earlier in the same file — ⛔ not a rate limit, not a scope error, and no amount of retrying changes it.3. What still worked: MCP
list_issueswith a narrowlabelsfilter. That is the channel the same file warns against for manual scanning, and it was the only one left.The defect this exposes in our own operating notes
references/platform-readings.mdholds both halves and never connects them:GitHub access is not enabled for this session, a session-start snapshot) and even states the endgame outright — a pure-MCP session that hits an exhausted pool has no list channel at all before reset;search_issueszeroes; as the way to get trueANDlabel semantics (the MCPlabelsarray beingOR); and as the route for a true label append.⇒ A seat that follows the remedies in reading order learns the fallback exists, reaches for it under pressure, and gets a 403 with no next step named. The failure lands exactly when the reader has the least room to improvise — mid-dedupe, mid-outage, or mid-claim.
⛔ The remedies are not wrong. They are unqualified: none tells the reader that REST availability is per-session and must be probed before it is relied on.
Reconciliation with #11577 — both measurements stand
⛔ Not a contradiction to be resolved by picking a winner. The file already records that the REST gate is a session-start snapshot, so REST is reachable in some sessions and not others. #11577's seat evidently had it; this seat does not. The correction is not "REST does not work" — it is:
⇒ #11577's section 3 should land qualified rather than as written; sections 1 and 2 of that finding are untouched by this and remain as measured.
Suggested direction (⛔ triage's call, not mine)
list_issueswith a narrowlabelsfilter → wait for reset.labelsOR-vs-AND trap applies on that middle rung, so a single label plus local intersection is the safe form when REST is unavailable to do theAND.Why this is worth a card rather than a note
The two channels failing independently is already banked. What is new is that they can fail simultaneously, that the documented remedy for one is the other, and that nothing in the file says so. The cost is not a wasted call — it is a seat concluding "searched, no duplicate" and filing a duplicate, or concluding "queue is empty" and idling a lane, on evidence that measured nothing. ⛔ An incomplete or void enumeration reads identically to a true negative, which is the hazard the file itself names one bullet over.
Related: #11577 (open — its section 3 is the passage this qualifies) · #11559 (the
labelsOR-not-AND finding, which the degradation ladder above depends on).