0.31.6 — a dead skill, a phantom endpoint, and a live price gate
Two of these were live the whole time and invisible to every prior audit round: a skill that never loaded and an endpoint that never existed. Both were found by asking the gateway instead of re-reading our own files.
prediction-markets has never once loaded
Its description read ...you CANNOT get from a public API: historical price.... A plain YAML scalar may not contain ": ", so the frontmatter failed to parse, the loader got no name, and the skill was never registered. It built, it published, the prose read perfectly — the only symptom was that Claude never used a capability we shipped.
blockrun_surf advertised an endpoint that does not exist
chat/completions ("Surf-1.5 chat with citations", $0.02 flat) returns 404 Unknown Surf endpoint — the gateway replies with its own catalog of 83. That phantom was the off-by-one: surf.ts claimed 84 where the skill and the gateway both say 83.
Correctness
withTxFeerounded where the gateway ceils.usdToMicroUsdcis an unconditionalMath.ceil; rounding goes one micro short wherever the ×1.05 margin drifts in float. modal's CPU hour charges 102001 micro, not 102000 —.toFixed(4)had been hiding it.- A prototype key killed every budget cap. modal's GPU tables were object literals, so
TABLE["toString"]returned a function, reaching the gate as NaN —cost > 0is false (call allowed) andspent += NaNsticks for the life of the process. A $1-capped agent was cleared for a $500 call. NowMaps, andbudget.tsfails closed on any non-finite estimate.
Prices — all understating, all corrected against live quotes
| claimed | charged | |
|---|---|---|
| image-prompting nano-banana | ~$0.01 | $0.0545 (5.45×) |
| image-prompting gpt-image-2 poster | ~$0.04 | $0.128 (3.2×) |
| surf worked example | $0.001 | $0.0095 (9.5×) |
| modal A100 example | no price, "auto-evicts when idle" | $1.3413, upfront, never refunded |
| rpc | $0.002 | $0.0040 |
| exa | $0.01 | $0.0120 |
search max_results:20 |
$0.50 | $0.527 |
Plus crypto-data, which documented blockrun_rpc({ chain: ... }) when the param is network — the call as written could not have run.
New: npm run verify:prices
Probes all 20 paid routes and compares each live 402 quote to what the estimator reserves. Under-reserving exits non-zero; over-reserving warns. Free to run (no payment attached). This drift is invisible to CI by construction — the gateway reprices without an MCP release — and had already shipped three times.
0 under-reserving, 0 over-reserving, 0 unreachable, 20 exact
169 tests, typecheck, build green.