Context
During the 2026-07-20 same-identity herd (two parallel Iris sessions), both sessions ran the ticket-create Content Sweep (i) honestly and still filed duplicates (#15596 / #15597). The collision itself fit inside the irreducible create-gap (the #12856 two-phase claim→recheck→execute anchor), and the tiebreak resolved it cleanly. But the post-incident V-B-A surfaced a second, independent safeguard degradation: the MCP list_issues call — explicitly sanctioned by ticket-create-workflow.md §1a(i) as an equivalent to gh issue list — returned a first page that did not surface issues filed hours earlier, on two independent calls.
The Problem
Verified observations (2026-07-20, Iris seat):
- 11:02Z sweep (
list_issues, limit 20, projection summary): first result #15592 (updated 2026-07-19T21:37Z). #15596 was filed 11:04:53Z — genuinely absent because it did not exist yet. Sweep honest; gap window.
- 12:51Z check (
list_issues, limit 6, projection title_only): first page STILL starts at #15592 (updated Jul 19 21:37Z) and contains nothing newer — while #15599 (11:48Z), #15598 (11:48Z), #15596 (11:04Z) all exist and carry same-day update activity. A live UPDATED_AT DESC page cannot look like this; the served page is materially stale.
- gh CLI contrast (
gh issue list --state open --limit 8 --json number,createdAt, same minute): correctly returns #15599, #15598, #15596 on top — created-descending, live.
- KB lineage: the tool's default sort is documented as
UPDATED_AT DESC via IssueService.listIssues → GraphqlService.query(FETCH_ISSUES_LIST); a prior first-page defect (assignee filter searching only page one) was already called a "collision generator" and fixed server-side (#15220 / #14434 line). The staleness observed here is a distinct, unfixed behavior of the same surface — root cause (cache, memoized first page, or query construction) is part of the work.
Net: an agent using the sanctioned "equivalent MCP call" for the freshness sweep can receive a page missing hours of fresh filings — exactly the thundering-herd window the gate exists to catch. The gh path in the skill text is correct; the "equivalent MCP tool or GitHub API call" clause is not currently trustworthy for this gate.
The Architectural Reality
.agents/skills/ticket-create/references/ticket-create-workflow.md §1a(i) — the live freshness sweep mandate + the equivalence clause.
ai/mcp/server/github-workflow/ — IssueService.listIssues / GraphqlService FETCH_ISSUES_LIST (sort + paging + any response caching; the staleness root cause lives here).
- Prior fix lineage for the same tool surface:
#15220, #14434 (assignee-filter first-page defect, fixed server-side with truncation reporting).
The Fix
Two independent deliverables, one ticket:
- Skill text (substrate, small): amend §1a(i) so the equivalence clause requires live, created-descending evidence — the
gh issue list command already satisfies it; the MCP list_issues call is only acceptable once deliverable 2 lands. Add one sentence naming the observed failure mode (stale first page across the herd window).
- Tool investigation + fix (github-workflow MCP): root-cause why the default
list_issues page served hours-old results twice (cache? memoization? query shape) and fix or document-with-warning. Server-side per the #15220 / #14434 precedent.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
ticket-create-workflow.md §1a(i) |
skill payload (current text) |
Equivalence clause requires live created-desc evidence; gh path named as the reference |
MCP path allowed only after deliverable 2 |
skill text itself |
this incident |
list_issues MCP tool |
github-workflow server code + KB-documented UPDATED_AT DESC default |
First page surfaces fresh filings (live ordering), or carries an explicit staleness/truncation signal |
warning documented in tool description if unfixed |
tool handbook |
two observations above + gh contrast |
Decision Record impact
none — sweep-discipline text + tool behavior fix; no ADR conflict.
Acceptance Criteria
Out of Scope
- Redesigning the two-phase claim→recheck→execute discipline (the create-gap mitigation already exists and worked as designed via the tiebreak).
list_pull_requests or other list tools' paging audits (separate tickets if the same root cause surfaces there).
Avoided Traps
- Treating the herd collision as proof the sweep text is broken — the sweeps were honest; the collision fit the designed create-gap. This ticket is scoped to the independent staleness degradation only.
- Silently swapping the skill to gh-only without fixing the tool — hides a server-side defect other consumers may hit.
Related
#12856 (thundering-herd anchor: two-phase claim→recheck→execute)
#15220 / #14434 (list_issues first-page defect lineage)
#15596 / #15597 (the incident pair; #15597 closed as duplicate)
Origin Session ID: fdb40bf0-24ea-4622-a2a2-1b94a4f3dae5
Retrieval Hint: query_raw_memories: "list_issues stale first page content sweep herd" · anchors .agents/skills/ticket-create/references/ticket-create-workflow.md, ai/mcp/server/github-workflow/
Live latest-open sweep: gh issue list (created-desc, live) 20 open issues checked at 2026-07-20T12:56Z; no equivalent found. A2A in-flight sweep: list_messages all/30 same minute; no competing claim on this scope. KB semantic sweep: prior first-page lineage #15220/#14434 confirmed adjacent-not-duplicate.
Context
During the 2026-07-20 same-identity herd (two parallel Iris sessions), both sessions ran the
ticket-createContent Sweep (i) honestly and still filed duplicates (#15596 / #15597). The collision itself fit inside the irreducible create-gap (the#12856two-phase claim→recheck→execute anchor), and the tiebreak resolved it cleanly. But the post-incident V-B-A surfaced a second, independent safeguard degradation: the MCPlist_issuescall — explicitly sanctioned byticket-create-workflow.md§1a(i) as an equivalent togh issue list— returned a first page that did not surface issues filed hours earlier, on two independent calls.The Problem
Verified observations (2026-07-20, Iris seat):
list_issues, limit 20, projection summary): first result #15592 (updated 2026-07-19T21:37Z). #15596 was filed 11:04:53Z — genuinely absent because it did not exist yet. Sweep honest; gap window.list_issues, limit 6, projection title_only): first page STILL starts at #15592 (updated Jul 19 21:37Z) and contains nothing newer — while #15599 (11:48Z), #15598 (11:48Z), #15596 (11:04Z) all exist and carry same-day update activity. A liveUPDATED_AT DESCpage cannot look like this; the served page is materially stale.gh issue list --state open --limit 8 --json number,createdAt, same minute): correctly returns #15599, #15598, #15596 on top — created-descending, live.UPDATED_AT DESCviaIssueService.listIssues→GraphqlService.query(FETCH_ISSUES_LIST); a prior first-page defect (assignee filter searching only page one) was already called a "collision generator" and fixed server-side (#15220/#14434line). The staleness observed here is a distinct, unfixed behavior of the same surface — root cause (cache, memoized first page, or query construction) is part of the work.Net: an agent using the sanctioned "equivalent MCP call" for the freshness sweep can receive a page missing hours of fresh filings — exactly the thundering-herd window the gate exists to catch. The
ghpath in the skill text is correct; the "equivalent MCP tool or GitHub API call" clause is not currently trustworthy for this gate.The Architectural Reality
.agents/skills/ticket-create/references/ticket-create-workflow.md§1a(i) — the live freshness sweep mandate + the equivalence clause.ai/mcp/server/github-workflow/—IssueService.listIssues/GraphqlServiceFETCH_ISSUES_LIST(sort + paging + any response caching; the staleness root cause lives here).#15220,#14434(assignee-filter first-page defect, fixed server-side with truncation reporting).The Fix
Two independent deliverables, one ticket:
gh issue listcommand already satisfies it; the MCPlist_issuescall is only acceptable once deliverable 2 lands. Add one sentence naming the observed failure mode (stale first page across the herd window).list_issuespage served hours-old results twice (cache? memoization? query shape) and fix or document-with-warning. Server-side per the#15220/#14434precedent.Contract Ledger Matrix
ticket-create-workflow.md§1a(i)list_issuesMCP toolUPDATED_AT DESCdefaultDecision Record impact
none— sweep-discipline text + tool behavior fix; no ADR conflict.Acceptance Criteria
list_issuesstaleness root-caused and fixed, or an explicit staleness/truncation signal added to the responseOut of Scope
list_pull_requestsor other list tools' paging audits (separate tickets if the same root cause surfaces there).Avoided Traps
Related
#12856(thundering-herd anchor: two-phase claim→recheck→execute)#15220/#14434(list_issues first-page defect lineage)#15596/#15597(the incident pair; #15597 closed as duplicate)Origin Session ID: fdb40bf0-24ea-4622-a2a2-1b94a4f3dae5
Retrieval Hint:
query_raw_memories: "list_issues stale first page content sweep herd"· anchors.agents/skills/ticket-create/references/ticket-create-workflow.md,ai/mcp/server/github-workflow/Live latest-open sweep: gh issue list (created-desc, live) 20 open issues checked at 2026-07-20T12:56Z; no equivalent found. A2A in-flight sweep: list_messages all/30 same minute; no competing claim on this scope. KB semantic sweep: prior first-page lineage
#15220/#14434confirmed adjacent-not-duplicate.