Software Testing
The skip that isn’t there: auditing the claims your suite makes when it declines to run
Sep 6, 2026A skipped test is a claim about the world, not a shrug, and it lies in three ways that survive code review and the type checker: a gate that never fires, a reason that blames the wrong cause, and a park that records no reason at all. Replacing boolean misses with typed ones makes the honest shape structural.
Four AST convention guards grew to twenty-eight, and that changed the design problem, not just the count. A policy layer other people's code must pass through needs a ratchet baseline, a mandatory escape hatch, and corpus calibration before a new rule can block anything.
A green test that executed zero assertions is a real failure mode, an early return or a swallowed catch skipping every oracle on the path it took. A runtime counter at the one seam every assertion passes through finds it on every ordinary run, cheaper than inverting every assertion to prove the same thing.
Static quality gates check that a test looks right, not whether it can actually turn red. Running a folder twice, once clean and once with every assertion inverted through the runner's own negation, answers that directly, and finds oracle gaps a code review would never catch.
5,000 lines of armour I never needed: retiring the infrastructure you built for a storm
Sep 2, 2026A discovery hot path got a deadline, a circuit breaker and a run broker after a 502 storm. Once a cheaper query made the load profile disappear, the armour was proven unused with a live-storm gate run, not a hunch, then deleted along with the seams a fifth domain would have copied.
A generator asks what should exist and regenerates everything, silently overwriting human edits and breaking downstream links. A reconciler asks what already exists, what changed, and what is the minimum mutation to stay current, using a stable ID hashed from meaning, not a counter or a content hash.
Prompt A/B testing for an agent task: engineering the minimal instruction set
Aug 31, 2026How treating an agent's driving prompt as an experiment (held-out cases, measured turn count, version-controlled losers) took a browser-validation task from 34 turns per case down to 9, on the strength of three explicit anti-pattern bans.
“Not deployed” is a first-class verdict: giving your test suite a richer vocabulary than green and red
Aug 29, 2026Why a binary pass/fail suite has no honest way to describe a spec that correctly documents a feature that has not shipped yet, and how a deployment-guarded skip (NOT-DEPLOYED) becomes queued work instead of red noise.
31 browser agents, hundreds of manual tests, one run: scaling live verification without losing trust
Aug 28, 2026How 31 parallel, isolated Playwright agents reconciled 316 legacy manual test cases against a live app in a single run, and the pre-assignment discipline (case slice, output directory, session name) that kept it trustworthy, not just fast.
Don’t trust “Done”: AI agents that validate tickets against the live app
Aug 27, 2026A ticket marked 'Done', a test case marked 'Pass', and a clause the app simply does not satisfy: the failure mode I kept hitting. Neither the ticket nor the OpenAPI spec is ground truth; the running app is. So every acceptance-criteria clause gets grounded in a live probe: a typed API call and a headless-browser render, classified from observed evidence into MATCHES, DEFECT-API, DEFECT-UI, NOT-DEPLOYED, or DEFECT-Spec. A verdict with a receipt, not a probability.