The 2026-07-23 devlog note for uk-house-prices-may-2026-hpi includes a parenthetical that hadn’t appeared on earlier rescue runs: “screened against our own coverage FIRST this time.” The qualifier “first” is doing the work. Before the draft ran, not after it returned something unpublishable.
That note is the whole story in five words. It took three weeks and a three-day publish gap to earn it.
The cadence target
The UK Calculators content pipeline runs a daily cron. The target is one published article every two days: the 14-day cadence clock. Through June and into early July, the clock was being kept alive by a mix of autonomous cron gate-passes and manual rescues: identifying viable topics from the day’s casualties and pushing them through by hand.
On 7, 8, and 9 July, even that pattern produced nothing. Three weekdays, zero publishes. The cadence clock stopped.
Gap anatomy
The 2026-07-10 devlog entry includes a post-mortem drawn from the cycle-run data. On 7 July: eight clusters triaged to draft, six progressed to the pack stage, and none published. The cron logged a successful run internally, with no crashes and no surfaced errors. It triaged, drafted, and ran verification passes. Output: zero articles.
Eight and nine July repeated the pattern.
The success-no-publish failure mode costs more than a visible failure. The pipeline reports internally that the day’s run completed cleanly. No alert fires. No recovery mechanism kicks in. From the outside, the day looks fine. The cadence clock advances one more day without a publish, with nothing surfaced to explain why.
The root cause, identified in the 2026-07-10 analysis: the pipeline was spending draft cycles on topics already covered by recently-published articles. The coverage check existed. It was running at the wrong point. It fired after the draft cycle completed, not before it started. By the time overlap was detected, the Sonnet call had run, the checklist had run, the verification pass had run. The output was unpublishable not because it was badly drafted, but because the territory was already held. The cost was sunk.
What the fix was
Coverage screening applied before the draft entry point.
The mechanism: before committing a candidate topic to a draft cycle, check whether it overlaps an already-published article. Drop it if it does. Proceed if it doesn’t.
The 2026-07-10 restart closed the gap with two publishes in one day (stamp-duty cron draft and Lifetime ISA pillar), but it was still operating under the old placement. The dedupe and verifier rework that landed between 10 and 17 July moved the check forward.
The 2026-07-23 entry makes the pre-screening explicit in natural language: “we hold April gov.uk + June Lloyds.” For the May HPI article (ONS UK HPI, 2.7% annual), those two sentences are the coverage pre-check. April is held, June is held, May is a new release. The screen confirmed new territory before the Sonnet call ran. uk-house-prices-may-2026-hpi published.
First evidence
On 16 and 17 July, the cron produced two fully-gate-passing ready drafts each day. The BoE hold mortgage piece and the additional-income guide both went through the approval gate on the 17th as designed. The 2026-07-17 devlog note records it as the first multi-day autonomous streak and confirms the dead-zone fixes, verifier fixes, and dedupe fixes were all holding.
Two consecutive days of autonomous output hadn’t happened before. The pipeline had produced one-off autonomous publishes, but the next day it would drop back to needing a rescue. The 16–17 streak is the first time it held across a day boundary without manual intervention.
Improving on the-cron-fires-daily-july-s-14-day-cadence-clock-ran-on-manual-rescues: the 16–17 July autonomous streak is the first exception to the July pattern of every publish requiring manual support. “Dedupe fixes all holding” is the pipeline internals reference to pre-screening. Candidates that would previously have entered the draft stage as coverage duplicates were being dropped at triage instead.
What it didn’t close
The 2026-07-20 devlog records the fiscal-drag article (uk-higher-additional-rate-taxpayers-2026-27) as a manual rescue from “this morning’s cron casualties (drafted=0: 2 checklist, 1 CLI, 2 day-capped).” The cron failed before any drafts ran. Checklist validation failures, a CLI failure, and two day-cap limits all fired. Pre-screening had nothing to prevent there. The rescue itself was on confirmed new territory (HMRC projections of 7.7 million higher-rate taxpayers by 2026–27, up 34% on the prior year), but the autonomous path had already failed for reasons unrelated to coverage overlap.
The 2026-07-23 May HPI article was also a manual rescue, from checklist casualties. The pre-screening note confirmed new territory before the draft ran, but the checklist failures had already ended the autonomous attempt.
Pre-screening closed one failure mode: wasted draft cycles on already-covered territory. Checklist validation failures, CLI failures, and day-cap limits are unresolved. Out of scope for this fix.
Five publishes, fourteen days
10 July: two manual rescues closing the gap, stamp-duty and Lifetime ISA. 15 July: Santander 8% Regular Saver (santander-8-percent-regular-saver-2026), rescued from a composer-failed cluster. 16–17 July: four autonomous gate-passes across two consecutive days. 20 July: fiscal-drag rescue, drafted=0 morning. 23 July: May HPI rescue, pre-screened, confirmed new territory.
The mix is still partly manual. The 14-day clock is running. The benchmark for the next sprint is reducing the rescue rate without losing the autonomous streak the pre-screening fix made possible.
The sequencing problem
The coverage check was right. It was placed wrong.
Applied after the draft cycle, it prevents publishing a duplicate but not generating one. Every candidate that enters the draft stage as a coverage duplicate consumes a full cycle: Sonnet call, checklist, verification pass. The post-draft check catches it on exit. The cost is already sunk.
Applied before the draft cycle, it prevents the generation entirely. The duplicate candidate gets dropped at triage, and the cycle runs on the next candidate.
The 7–9 July gap was three days of the first placement. Every candidate that entered the draft stage as a coverage duplicate was a full cycle spent on unpublishable output. Moving the check forward recovered those cycles. The 16–17 July streak ran on candidates that had already passed the pre-screen. The clock restarted because the pipeline was directing its cycles differently, not because it was running more of them.
The success-no-publish failure mode, the coverage-duplicate failure mode, the sequencing problem — that’s the full chain. The 2026-07-23 parenthetical closes it.



