What changed this cycle
No new features. Everything this time was about getting existing measurements right.
Density: we were measuring it wrong
Our ad density calculation had a bug that's been in there for a while. When two ad placements overlapped on the page, we merged those areas and counted only the combined space. That consistently made density look lower than it was.
The spec is clear: count each placement by where it physically sits, independently. A leaderboard at the top and a sidebar strip on the right are two separate contributions. We've fixed it.
Numbers will be higher now. A site that was passing might not be anymore. That's not the site getting worse — that's us finally measuring it right.
Side rail ads were also being skipped entirely. Those are the wide branding strips that frame a desktop page on the left and right edges. Paid placements, real space, not counted. Now they are.
The regression alarm was silently doing nothing
We have a check that fires after each test run and compares compliance against the previous run. If it drops enough, it raises an alarm.
It never did. The bug: it ran too early, before the output file existed, and quietly exited every time.
It's fixed. The check now runs after everything is written to disk, using the rate captured before the run started as its baseline. If compliance drops, you'll hear about it.
One less file to maintain
We had separate instruction files for Claude and Codex (our AI coding agents). Codex now just defers to the Claude file. Nothing exciting, just less to keep in sync.