Audit tool responses for caveat-last ordering: a truncating consumer destroys trailing coverage fields first, so a bounded result arrives looking complete #22
Labels
No labels
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
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-flight-deck/node-stats-mcp#22
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.
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:
Measured in the sirens-echo consumer against the eco surface. Inferred for this server, which is why the first task below is an audit rather than a fix: nobody has checked whether node-stats responses carry trailing coverage fields or overrun a consumer cap. A server cannot assume its trailing fields survive, and a server that stays under the cap never depends on which consumer read it.
Why this repo is a live candidate rather than a formality
This is a diagnostics server, and diagnostics responses are exactly the shape that overruns a byte cap: process tables, pod lists, volume and filesystem inventories, log-usage breakdowns. Several of its tools return collections whose size is a property of the host rather than of the request, which is the definition of an unbounded array. A truncated
get_top_processesorget_k3s_podsthat loses its "showing N of M" tail reads as a complete inventory of the host, and an agent acting on "there is no such process" is the same wrong-shaped claim as the one above.The repo describes itself as offering bounded host introspection, so this may already be handled. The audit establishes which.
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./procentry reported as0is a false all-clear.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.