v0.4.2
run_query now takes queries: list[Query] rather than a single sql. Every question that does not need a value from another's answer goes in the same call, at one round trip instead of one each.
A statement SQLite refuses comes back as that question's section rather than as a failed call: a query's verdict is content, and isError is the call refusing. One bad statement beside three good answers no longer discards them; only a condition with no per-question answer to give — no database for the channel — raises.
The tool's description and schema also stopped paying for what they already said. run_query is the only always-loaded tool, so its text is the roster's whole per-turn cost: ~645 tokens down to ~470.
A patch release: nothing downstream pins the tool's argument, an agent reads the schema fresh each session, and the skill's files are unchanged.
Rationale, rejected alternatives and the measurements — including the ones that do not support the change at small context — are in adr/0007.