Software Testing
A pathspec bounds files, not hunks, and it does not bound the commit at all
Sep 16, 2026File 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.
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.
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.
Sure enough to file a bug: the evidence ladder before you blame the product
Sep 13, 2026A 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.
Five outages that were not outages: get one known-good 200 before you call it down
Sep 12, 2026Five 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.
Retiring a tolerated lie: removing a schema-drift exception the right way
Sep 11, 2026Deleting 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.
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.
Never bless the as-built: what a defect pin should assert, and how a pin lies
Sep 9, 2026A 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.
The fixture that stopped meaning what it said: a finder trait is not the capability
Sep 8, 2026A 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.
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.