Build1 distinct publisher3 min readPublished
A per-case catch block filed every exception as a failed test, so an unpaid API bill printed as 24 dead tools across 96 cases. The repair is a third outcome that withholds the score instead of scoring zero.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Here is the sequence inside the per-case runner. It awaits `evalCase`, the API returns 400 with "your credit balance is too low", the promise rejects, the catch block runs, and the case is pushed onto the results array as `{ pass: false, raw: "ERROR: ..." }` [4]. Downstream, that row looks identical to a skill that answered and answered wrong. The aggregator divides passes by cases and gets 0 over 96 [1].
The reporting layer then does what reporting layers do with a rate: it thresholds it. Everything under 50 percent was listed for review, which was all 24 skills [7]. A threshold that fires on every row just echoes the input back at you; it tells you the count was low, not that anything was actually wrong.
The arithmetic that should have halted the report was already in the run. The bank is four cases per skill, 96 in total [11]. Every one of the 96 raw outputs was the same 400 [2]. So 24 times 4 gives 96 rows, and the count of rows that reached the model was zero, which means the denominator behind "0%" was never filled [16]. The same run printed total spend of US$0.0000 [3]. That figure sat a few hundred lines below the table [2].
What the runner needs is three counters instead of two. Classify at the boundary: transport failures, expired keys, rate limits and quota rejections are "could not measure"; a model response that fails its assertion is "failed". When the could-not-measure counter is non-zero, do not print a rate at all, and exit with a code distinct from the one a real failure uses. The vocabulary already existed in this developer's audit system: green means looked and clean, red means looked and found something, and blind means unable to look, where blind says this round's green light does not count rather than saying there is a problem [6]. The convention lived in the report layer, not in the catch block.
Two details make this worse than a one-off. The 0/96 line had printed in the audit round before the 24 descriptions were edited, and because the check is advisory and does not block the push, every round printed it and moved on [5]. And the report did offer advice, which was to review the 24 skills scoring under 50 percent.
Treat any pass rate as a claim about one account's credentials at one moment. For the number to transfer to your machine, the run has to report how many calls actually succeeded next to the score, because a 0 percent from a rejected key and a 0 percent from a broken prompt are the same string.
The finding that did survive came from a state change, not a score: a check flipped from pass to blind and took 100 seconds, and chasing it turned up the question bank [13]. A handoff doc had said most of those 24 skills had no test cases, but all 24 had cases [12].
Ranked by verification strength, evidence, and original report placement.
The Skill Eval Report, marked advisory, listed all 24 skills at 0/4 (0%) and a TOTAL of 0/96 (0%).
Scrolling a few hundred lines below the table, every single case's raw output was the same string: ERROR: Anthropic API error 400, invalid_request_error, "Your credit balance is too low to access the Anthropic API".
The run recorded zero successful API calls and a total spend of US$0.0000.
The root cause was one line in the per-case runner: the catch block pushed { pass: false, raw: `ERROR: ${err.message}` }, so any exception (network down, expired key, empty account, or a bug in the author's own code) was recorded as the skill not passing.
The 0/96 pass line was already printing in the audit round before the author's 24 description changes; because the check is advisory and does not block the push, every round printed the line and skipped past it.
The author's system already used a three-state convention for a check result: looked and clean, looked and found something, and unable to look (blind); blind means this round's green light does not count, not that there is a problem.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 30, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
When the changelog reaches for your README's word: MCP memory and the price of filling a gap1 distinct publisher
build
Claude's outage matters less than the fallback nobody declared1 distinct publisher
build
The prompt never arrived: a Windows batch shim was worth 15 of 24 runs in an agent eval1 distinct publisher
build
A 50% boost lapsing is a 33% cut: what Claude Code teams lose around 19 August1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Receipts pasted in, nobody else's copy
The load of proof falls on four printed lines of a catch block, and they carry it: a runner that records pass: false on any exception genuinely cannot distinguish an unpaid bill from a skill that stopped firing, and a reader can verify that from the snippet alone. Everything around the snippet — the table, the error string, the 90/96 rerun — is quoted by the only person who saw it, with no repository or run log to check against.
One laptop, one wallet
Count what is actually deployed and you get a single developer's Claude Code setup: 89 skills, a homemade 96-case bank, six sentinel scripts, one account that ran dry. The opening question — what does your script print when the infrastructure dies? — implies a wide installed base of similarly broken scorers, but no other team's harness appears anywhere in this reporting.
Diagnosis paid for, the sermon extrapolated
The specific finding is fully funded by its own evidence, and the piece is harder on its author than on anyone else. The framing outruns it slightly: 'structurally guaranteed' false-red-light generators and a rule that state changes beat green lights are drawn from two scripts on one machine. Small overreach in the generalisation, nothing inflated in the facts.
Costs the teller something
The failing API belongs to Anthropic and no vendor is defended or attacked; the embarrassing facts are the author's own — a handoff sentence that was simply false, and a 0/96 line he printed and ignored for rounds before this one. The one visible interest is a pointer back to his earlier post on halving skill descriptions, which is attention-seeking of a mild kind and does not touch the diagnosis.
Cheap to test, impossible to audit
Two things hold this up. The failure mode is reproducible by any reader in their own repository within minutes, and the most damaging detail — that the zero had been printing for rounds, unread, because the check blocks nothing — is not the sort of thing anyone invents about themselves. What stays unverifiable is everything numeric outside the quoted output: the day lost, the eight restored trigger words, the eleven self-tests.