Software Testing

File ownership stops two agent sessions editing the same file, but nothing stops them at commit time. A pathspec on git add is not a pathspec on git commit, a pathspec bounds files rather than hunks, and stash sweeps the whole repository. Six sessions on one shared tree kept shipping each other's work until every one of these was proven by hand.

15 min read

A comment gets written once and almost nobody revisits it while the code keeps moving. A slimming pass cut 5,880 comment lines to 3,820 across fourteen spec files, proved with a grep filter that zero non-comment lines changed, fixed five confidently wrong rationales, and shipped a ratchet guard so the density cannot regrow.

15 min read
Software Testing

Your suite has too many tests

Sep 14, 2026

A consolidation campaign folded 246 near-duplicate tests out of a 4,911-test Playwright suite without losing a single traceability tag. A token similarity report finds mechanical duplicates in seconds; everything else needs a full reading pass, and every estimate needs adversarial verification before it is trusted.

14 min read

A red assertion proves the app disagrees with the test, not with the intended behaviour. Of six defect candidates in one batch, four turned out to be the test's own wrong assumptions. This is the six-rung evidence ladder, cheapest rung first, that separates a real defect from a confident mistake.

13 min read

Five separate incidents against a shared test environment looked exactly like an outage. None were: a missing Bearer prefix, an unmatched gateway route, a dropped DNS resolver, a schema-valid empty response, and a zero-byte compiled test cache. One known-good 200 through the same client would have settled each one before the ticket was filed.

14 min read

Deleting a schema-drift toleration looks like a one-line diff: remove an array entry, done. Five traps say otherwise, from a runtime discovery check that silently orphans an emptied array to a freshness guard that diffs the working tree against the git index.

15 min read

Generated TypeScript types plus a runtime schema validator feel like full contract coverage. Over sixteen days, four distinct kinds of API drift passed both layers green, including a create-invoice dialog that double-charged tax because a field changed meaning without changing name or type.

15 min read

A spec written against the running build looks identical to a correct spec until the bug is fixed, and then the fix arrives as a red run instead of announcing itself. Assert the criterion, not the observation, and put a control request in front of every defect pin, because a pin can hold for a reason that has nothing to do with the bug it names.

16 min read

A finder predicate is a proxy for a capability, not the capability itself, and a redesign elsewhere can sever that link without falsifying a word of it. Four Create Invoice cases turned red on a locator that never attached because the finder kept vouching for data the dialog no longer read.

14 min read
Software Testing

Non-vacuity is harder than a row count

Sep 7, 2026

A row-count non-vacuity check passes on a grid whose only row is the empty-state placeholder. Ordering, filtering and deduplication claims each need a floor sized to what they actually assert, not to how many rows came back, and every oracle deserves an inversion test before it is trusted.

14 min read