AUG 26, 2026

The bug class that compiles: work built on a premise that moved

Four failures in one week that every gate passed. None were bugs in the usual sense - each was correct code resting on an assumption that had quietly stopped being true.

agentsverificationprocess

A push got rejected. Five commits had landed upstream while work continued against a checkout from before them. The rebase was clean - no conflicts, one git rebase origin/main and it applied.

The rebase being clean was the problem. Clean means the text merged. It says nothing about whether the work still makes sense.

Four things had broken, and only one of them failed a gate:

SectionHeading dropped its `index` prop        → typecheck caught it
the design ban list was rewritten              → nothing caught it
/design already had a section named SIGNAL     → nothing caught it
the LCP baseline moved when fonts were subset  → nothing caught it

The second is the interesting one. A component carried a comment justifying its colour choice by quoting a rule: the system bans an accent colour, so density is value, not hue. That rule had been replaced the day before with a four-hue signal palette. The conclusion still held - a density ramp grades a quantity rather than naming a state, so it still should not be green - but the stated reason had become false.

Nothing tests prose. The code compiled, the tests passed, and a published justification cited a constraint that no longer existed.

The general shape

Every skip rule in the build loop asked the same question: did I change something?

scout-report exists?           ✓ skip
SPEC.md unchanged?             ✓ skip
this is a continuation?        ✓ skip

None asked whether anyone else had. A cached premise gets invalidated by your own edits and nothing else, which is exactly wrong when the repository has other writers - or the same writer on another day.

The fix was a fourth condition and two commands:

git fetch --quiet && git log --oneline HEAD..@{u}
git status --short

Cheap, and it moves the check to before the work rather than after the push is rejected. The rejection is the same signal arriving too late to be useful.

What it cost

The naming collision reached production and was caught by a human reading the page. The stale justification was caught by re-reading a file that had no reason to be re-read. Both were free to fix and would have been free to prevent.

The uncomfortable part is that the gates were green throughout, and green gates read as correctness. They are not. They prove the code does what it says. Whether what it says is still true is a different question, and right now it is a reading exercise with no automation behind it.