150 clusters ranked, zero drafted: ground attrition is the load-bearing constraint

The cron fired at 08:22 BST on the second of July. 150 clusters ranked. Top candidate by calculator score: mortgage, position 20. Candidates fetched. The ground stage ran. Nothing came through. Zero drafts. The second zero-draft morning that week.

That’s the data point that made the pattern visible. Not an isolated bug. A constraint sitting upstream of everything the build effort had been focused on.

Five mornings

Over five days starting 29 June, the autonomous publish pipeline ran on-schedule every morning. Cron timing was fine. Triage was fine. It ranked candidates, fetched sources, produced a shortlist. The failure was at ground.

Day-by-day record:

  • 29 June: One cluster survived ground stage. Haiku claim-extraction failed on it. B-076, open bug. Zero usable drafts. Published two articles via operator path.
  • 30 June: One partially-complete draft produced. Slug: mortgage-abandoned-about-above (title-mangling step mid-fix). Ten of thirteen sentences passed the quality gate. Rescued and published. One operator publish alongside.
  • 1 July: One draft produced. Same cluster as day two. Same BBC, Zoopla, Moneyfacts, BoE ground, same US–Iran framing, same £232/£66 regional figures. A duplicate. Not publishable. Two fresh gov.uk single-source articles shipped via operator path.
  • 2 July: 150 clusters ranked. Top by calculator score: mortgage at 20. Candidates fetched. Ground failed. Zero drafts. Two fresh operator publishes.
  • 3 July: Published before the morning cron fired. ISA allowance and student loan repayment thresholds, drafted in the overnight session. Operator path.

Cron contribution across five days: one usable draft. Total articles published: ten. The operator path produced nine of them.

What ground is

The pipeline runs in four stages: triage → ground → draft → quality gate.

Triage ranks clusters of news sources by affinity to the calculator portfolio. The score weights recency, source authority, and topical match. Ground is verification. Each source in the top-ranked cluster gets fetched, claims extracted by Haiku, the output checked for enough structure to pass to the drafter. If ground fails at any step (source unreachable, Haiku can’t extract structured claims, the source set already exhausted by a previous draft), the cluster is dropped.

When a cluster is dropped at ground, nothing downstream runs. Drafter, quality gate, scrubber: none of them fire. The pipeline produces no output.

That’s an invisible failure. The cron fires. Logs record that it ran. No error is raised. The absence of a draft is the signal. If you’re not counting zero-draft mornings explicitly, the constraint doesn’t register.

Why the operator path doesn’t have this problem

The ten articles that shipped from the operator path came from a structurally different route. T-series pillars are pre-specified content: 60% tax trap, Marriage Allowance, Mortgage Guarantee Scheme 2025, CGT annual exemption, Dividend Allowance, Personal Savings Allowance, HICBC, student loan repayment thresholds. Tax legislation is stable. HMRC and gov.uk are authoritative. The claim set is determined before the drafter is invoked.

ISA allowance: 754 words, 15 hand-curated claim blocks drawn from three gov.uk pages. That’s the operator’s ground work done manually. Reliable every time because the input is controlled before anything automated touches it.

The operator path has no ground problem because the operator does the grounding. Source selection is manual, claims are hand-structured, the drafter receives clean input. What comes out is draftable.

That’s not an argument for manual operation. It’s a description of what the automated ground stage hasn’t yet replicated.

The optimisation trap

The pipeline has a quality gate, a voice scrubber, and a drafter tuned against a defined voice profile. That work compounds across every draft that reaches it. It doesn’t compound on drafts that never exist.

If ground fails, the quality gate doesn’t run. The scrubber doesn’t run. The drafter doesn’t run. All optimisation work on those components has a ceiling imposed by ground’s pass rate. Fix the drafter’s output quality; it doesn’t matter if ground produces nothing for the drafter to work with.

Visibility is what makes the trap work. The gate catches specific sentences and the scrubber rewrites specific phrases: there’s output, a before-and-after, progress to measure. Ground failure is an absence. You can’t diff an absence. You can only count zero-draft mornings and notice the number.

Five mornings of logs make the constraint legible. The drafter is not the bottleneck.

Three failure modes in the logs

The ground failures fall into three distinct categories.

Claim-extraction failure. B-076, open. Day one: one cluster survived triage, Haiku failed to extract structured claims from it, nothing reached the drafter. Fix options: a stricter extraction prompt with an explicit schema, a Sonnet fallback when Haiku fails, or an earlier discard path that marks a cluster undraftable before wasting fetch time on it.

Source exhaustion. Day three: the mortgage rate-spike cluster re-scored high in triage because its affinity signal hadn’t updated. The source material was identical to day two. Same BBC article, same Zoopla data, same Moneyfacts rates, same BoE figures. Ground passed, the drafter ran, the draft was a duplicate. The fix is a freshness gate: if source URLs and extraction hashes match a previous draft, mark the cluster stale and skip it.

Structural zero-pass rate. Day four: 150 clusters, zero passing ground. Not a single-cluster failure. The full ranked set failed to produce anything draftable. Either the ground criteria are too strict for the current news cycle, or the cycle itself is thin for this coverage area. Day four’s published articles (CGT annual exemption, Dividend Allowance) came from gov.uk, not from news clusters. The cron’s input set and the operator’s input set don’t overlap on that day.

What’s next

The operator path continues. There are enough stable gov.uk-grounded topics across tax, benefits, and savings to sustain weekly output from that track through the remainder of the current 14-day window. Ground attrition doesn’t touch it.

The cron path needs ground fixed before anything else. B-076 first. The freshness gate second. A pass-rate audit third: if 150 clusters routinely produce zero survivors, the triage criteria or the source-fetch scope needs adjusting, not the drafter.

Out of scope for now: quality gate tuning, scrubber rule additions, drafter prompt changes. Those are downstream of a working ground stage. Fixing them while ground fails at 0–20% is optimising the wrong constraint.

The zero-draft morning count is the number to watch over the next week. Not article count from the operator path, not draft quality scores. Ground pass rate. That’s the measure that unlocks everything downstream.

All writing