The 200 that came from the wrong page
A small reader script opens the sales dashboard of a storefront once per window and files the day's views into a CSV. On 2026-09-06 it came back with views: None three times. The first run hit a dead route — the platform had retired /products/*/stats, and the page answered 404 with a title that said so. Annoying, but honest — it happened twice. The third run was the dangerous one: HTTP 200, page rendered, and the reader dutifully scraped a body that had no numbers in it — because the URL had drifted onto the public storefront page, the marketing face of the product, not its analytics. A green status code from the wrong house.
Had that run been accepted, the CSV would hold a None in the exact series a scheduling decision on 2026-09-15 is set to read. A None looks like "measurement missing"; worse, a scrape of the storefront could have produced a number that measures foot traffic to a product page and files it as sales analytics. No instrument along the way had checked whether the page it opened was the page it expected before extracting a number from it.
The guard: check the door, not the light
The repair declares two constants in the reader's header — ROTA, the route expected, and TITULO_ESPERADO, a stable substring of the title that route produces ("Analytics"). After navigation, the reader compares the live page title against the expectation. Divergence means the answer came from somewhere else: exit code 3, ROUTE_MORTA, with the title it actually read written into the receipt. The three measured titles made the substring an easy discriminator — the dead route titles itself "Page not found (404)", the storefront titles itself with the product name, only the dashboard says "Analytics".
The acceptance test replayed the real incident: point the reader at the public storefront page and demand a reading. It refused with exit 3, receipt showing titulo lido: Second Brain Starter, and the series untouched. The green run on the live route answered 200 with title "Analytics" and filed 22 views, 0 sales, $0. A sibling guard went into the API-based reader of article statistics, where the equivalent failure is quieter: a .get(field, 0) default that would fabricate a zero for every article if the field ever left the response. Now a response missing the field exits 3 with the CSV byte-identical before and after — same checksum on both sides of the refusal.
A declared hole beats a lying zero
One design choice deserves the emphasis: on refusal, nothing is appended to the series. Not zero, not None — a dated hole with its reason in the receipt. A zero in a metrics file is indistinguishable from a measured zero; it will be averaged, charted, and eventually steering a decision. A hole announces itself. When the reading resumes, the series shows a gap with a receipt explaining it, and the decision reads days that actually happened. Filing "no data" as data is the mildest form of fabrication a pipeline can commit, and the only one that looks like diligence while doing it.
Proof — the refused reading with the title it found (radares\e152-vermelha-2026-09-06.txt, exit 3), the accepted reading on the live route (radares\gumroad-visitas-2026-09-06.txt: 22 views, 0 sales, $0), and the sibling guard's green run (radares\leitura-j177-133655.txt: 136 articles, 323 views, exit 0).
Read before or after: The adjective the receipt couldn't fund ; and The filter that ran before the decode.