The cron said zero twice and ten-of-thirteen once. Every answer was correct.

The mortgage-abandoned-about-above slug arrived with 10 of 13 sentences passing the verifier. The title-mangling step was mid-fix, so the pipeline had anchored the slug on three words that happened to be adjacent in the draft. The slug didn’t matter. The sentence score did.

Three sentences hadn’t cleared. The system logged them and moved on. The 10 that passed shipped.

That was Day 2 of 14. The outcome was correct.

Five days, three shapes

The July cadence-clock started 2026-06-29. By Day 5, the cron had fired five mornings. The results sorted into three patterns.

Zero drafts, underfire cause. Day 1 (2026-06-29): cron on-schedule at 07:00 UTC, one cluster surviving the ground stage, Haiku claim-extraction underfire on that cluster. B-076 still unfixed. Zero drafts produced. The publish stage ran from the operator path instead. T-006 (60% tax trap) and T-029 (Mortgage Guarantee Scheme 2025) both went live before 09:00, both pre-prepared.

Partial-pass draft. Day 2 (2026-06-30): cron at 07:00 UTC, one draft produced. The mortgage rate-spike cluster: BBC, Zoopla, Moneyfacts, Bank of England ground, US-Iran framing, £232 and £66 regional figures. Draft came back with 10 of 13 sentences at verifier pass. The 10 shipped; the 3 that failed are not in the corpus.

Cron proposing already-published material. Day 3 (2026-07-01): cron at 08:21 BST, one draft on the same mortgage rate-spike cluster. Same ground sources, same figures. The cron had no way to know we’d published that piece 24 hours earlier. The draft didn’t ship. The operator path published Personal Savings Allowance and HICBC instead: two fresh gov.uk single-source pieces.

Zero drafts again, same cause. Day 4 (2026-07-02), cron at 08:22 BST. 150 clusters ranked; mortgage topped calculator score at 20. Candidates fetched and ground stage complete, but Haiku claim-extraction fired underfire on the winning cluster. First zero-draft firing of the current streak. Same root cause as Day 1. Operator path: CGT annual exemption and Dividend Allowance.

Operator publish, pre-cron. Day 5 (2026-07-03): ISA allowance published before the morning cron fired. 754 words, 15 hand-curated claim blocks across three gov.uk pages, drafted overnight. Student loan repayment thresholds followed.

Five days. Six operator-path publishes. One cron-drafted piece at 10-of-13. Two zero-draft cron firings. No corpus contamination.

What zero drafts means

The default read of “zero drafts” in a content pipeline is failure. The cron ran and produced nothing. Something is broken.

That reading is wrong.

Haiku claim-extraction sometimes fires underfire: the step produces output that doesn’t meet the minimum threshold for draft assembly. The correct behaviour is to produce nothing. The verifier doesn’t get called. No draft assembles. The cron exits clean. B-076 means this fires more often than it should on the current cluster mix, but the failure mode itself is designed correctly.

The alternative is to let a low-confidence claim set through, assemble a draft anyway, and let the verifier catch what it can downstream. That shifts the problem without solving it. The verifier is calibrated for sentence-level claims in a formed draft. It isn’t designed to flag wholesale claim poverty at the assembly stage. A degraded claim set reaching the drafter would produce a draft with random coverage gaps, not a clean rejection.

Zero drafts is the right answer when the inputs don’t warrant a draft.

What 10-of-13 means

A verifier returning 13-of-13 on every draft would be suspicious. Either the claims were weak enough that nothing triggered a flag, or the thresholds were too loose. A verifier returning 0-of-13 on a cluster with solid Bank of England and BBC ground would be discarding usable material.

10-of-13 on the mortgage rate-spike cluster is discriminating behaviour. The ground was specific: Bank of England rate data, Moneyfacts figures, Zoopla regional breakdowns, BBC framing. The £232 and £66 regional figures gave the verifier something concrete to check claims against. The 10 sentences that cleared were traceable to that ground. The 3 that didn’t weren’t close calls. They failed the check and stayed out.

The draft that shipped carries 10 sentences. The 3-sentence gap isn’t annotated inline. The corpus doesn’t carry a record of the rejections. The reject is implicit in what’s absent.

That asymmetry is correct. The corpus should contain what the verifier passed, not what it considered.

Neither outcome corrupts the corpus

Zero-draft cron firings on Days 1 and 4 left the corpus unchanged. The operator-path publishes that ran in their place (T-006, T-029, PSA, HICBC, CGT annual exemption, Dividend Allowance, ISA allowance, student loan repayment thresholds) came through the hand-curation path. Each had explicit claim blocks, gov.uk sourcing, verified figures. None passed through the cron’s claim-extraction stack.

The 10-of-13 draft from Day 2 did pass through the cron stack, with 3 sentences blocked. The 10 that shipped are in the corpus. If the verifier thresholds were calibrated correctly, those are the sentences that should be there.

Eight pieces published at Day 5 of 14. Every piece either came from the operator path or passed the verifier. Nothing got through on a degraded signal.

What this design gets right

The verifier’s job isn’t to produce drafts. It’s to determine whether a draft warrants publishing.

That distinction is easy to lose when the implicit pressure on any automated pipeline is throughput. A day with zero cron drafts looks like a pipeline failure on a dashboard. A partial-pass day looks like a pipeline with problems. The reflex is to tune the thresholds until every firing produces a draft.

The July data argues against that reflex. Zero-draft days carry signal: claim extraction is underperforming on the current cluster mix, B-076 is still unfixed, and the operator path is carrying the cadence. That signal is more useful than a low-confidence draft sitting in the corpus.

The 10-of-13 carries signal too: the claim set warranted 10 sentences, not 13. The corpus got 10 sentences. The 3-sentence gap is an accurate representation of what the ground material supported.

Both outcomes are the verifier working.

What B-076 means for the next sprint

Two zero-draft firings in five days, same root cause, means B-076 is the current blocker on cron throughput.

The operator path is functional. Eight publishes in five days, none of them cron-dependent. The 14-day cadence clock is running.

B-076 doesn’t need to be fixed before the run completes — the operator path covers the gap. It becomes urgent when the operator-path backlog of hand-curated pillars runs dry, at which point zero-draft cron firings stop being “working as designed” and start being “nothing published today.” That’s when the failure stops being loud and starts being silent.

Until then: the corpus is clean, the verifier is calibrated, and the failures are exactly as loud as they should be.

All writing