Audit tool responses for caveat-last ordering: a truncating consumer destroys trailing coverage fields first, so a bounded result arrives looking complete #18
Labels
No labels
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/steam-ops#18
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Filed by Darren (director seat) at Kai's direction, 2026-08-15. Cross-cutting finding from coilyco-gaming/sirens-echo#449, filed on every MCP server in the portfolio because the exposure is structural rather than specific to the server that surfaced it. Kai's words: this is an issue across all her MCPs because she was not aware of it being a problem.
First, a scoping check. I routed this here because a live
steamMCP surface exists in the fleet (get_owned_games,get_recently_played,get_store_search_results,get_pics_product_info,get_account_licenses) and this repo's history carriesfix: wait for Steam tool-specific readiness. I did not read the tree to confirm the server lives here — this repo has no description or topics, so the routing is inference. If the Steam MCP lives elsewhere, close this and say where, and I will refile.The failure, concretely
A community agent told a member:
The tool result it built that from carried its own caveat:
The surface said it searched 528 of 22,933 rows. The reply said none exists. Those are different claims and only the first is true. It cost a day of investigation into a query path that was fine.
The mechanism that generalizes
This is arithmetic, not model behaviour, which is why it reaches this repo.
A consuming harness bounds tool results at a byte cap. The consumer measured in #449 does it as a head slice — keep the front, discard the tail, append a byte-count notice:
The server that surfaced this serializes
warningsas its last JSON key. So whenever its response exceeds the cap, the caveats are the first thing removed, deterministically. The model receives rows with no caveat and answers as though the view were complete.Two properties make this nastier than an ordinary truncation bug:
Why this surface is a live candidate rather than a formality
A Steam library is one of the largest arrays in the portfolio, and the failure lands in the same domain as the originating bug — an agent answering a gaming question with false completeness.
get_owned_gamesis unbounded by account size. A large library truncated mid-array, with the count trailing, reads as a complete library. An agent then says "you do not own that game", which is the exact wrong-shaped claim above.get_pics_product_inforeturns deeply nested product metadata, which is the shape that blows a byte cap on a single item rather than on a long list.The four invariants
Two are already written up from the other direction in coilyco-gaming/eco-app#266 and #267, worth reading before implementing.
limitbounds every unbounded array, not one of them. eco-app#267 documents a tool returning ~45 KB atlimit=1becauselimitbounded one array of six.What to do here
Acceptance
Source: coilyco-gaming/sirens-echo#449 and its seven-comment thread, which establishes the head-slice mechanism, the per-profile cap difference, and why a consumer-side check is hard. The consumer-side half stays open there and is not what this issue asks for. Sibling issues filed on the other portfolio MCPs; coilyco-flight-deck/mcp-beaver#68 carries the generator-level version.