Eight clusters triaged, zero published: why autonomous content cadence fails silently

7 July. Eight article clusters cleared triage, six of those assembled into draft packs, and zero cleared the approval gate. The cron returned exit 0.

I named that pattern in the gap analysis on 10 July: success-no-publish. Three weekdays, no articles. No errors in the logs, no exceptions, no retries. The 14-day cadence clock had collected nothing across 7, 8, and 9 July, and the only signal was the absence of a publish, invisible unless you were watching the publish count separately from the error log.

The pipeline succeeded at producing zero.

What the gate actually checks

Every cluster the content pipeline processes runs the same path: triage, topic selection, composer, pack assembly, gate check, publish. The gate sits at the end. It checks for duplicate coverage against articles already on the site, validates the content checklist, enforces the per-day publication cap, and runs the verifier pass.

A cluster that fails any check gets held. A cluster that passes all of them gets sent to human approval. Zero publishes means zero gate passes. Not zero drafts, not zero packs. Six packs assembled on 7 July. Six gate checks. Zero passes.

By 20 July I was tracking rejection reasons by code in the devlog. That morning’s cron: “drafted=0: 2 checklist, 1 CLI, 2 day-capped.” Two checklist failures. One CLI issue. Two day-cap rejections. Five clusters in, nothing out.

The day-cap rejections are the counterintuitive ones. The per-day publication slot was full, so the gate held those drafts. Correct behaviour, zero publish. From the outside, identical to a broken pipeline.

The false-positive period: 7–16 July

The 17 July devlog marks the first multi-day autonomous streak: “dead-zone, verifier and dedupe fixes all holding.” Three classes of false-positive rejection, all addressed before that date.

Dead-zone, the verifier, and the dedupe check were each producing false rejections before those fixes landed. Different mechanisms, same outcome: a packed draft held at the gate for the wrong reason.

The 15 July rescue confirms what this period looked like in practice. The Santander 8% Regular Saver piece (santander-8-percent-regular-saver-2026, covering the market-leading 8% AER launch and the rate mechanics including the variable 12-month bonus dropping from 5.00% to 3.00%) was rescued from that morning’s cron casualties. Composer-failed cluster. The draft existed. The pack existed. The gate caught it for a reason that wouldn’t have applied after the verifier fix. I rescued it manually.

Same with the stamp-duty draft and Lifetime ISA pillar on 10 July, the day I restarted the cadence clock. Three rescues in the first ten days. Each one a gate false-positive the autonomous path couldn’t clear.

What the first autonomous streak looked like

16 July: two gate-passing drafts from the cron. 17 July: two more. First back-to-back autonomous production days since the pipeline launched.

The devlog records it plainly: “today the approval gate operated exactly as designed: CJ [approved].” Two things in that sentence. The gate passed the drafts to the human approval step. I approved them. The BoE hold mortgage piece and the additional-income guide, both live.

That’s the intended operating model: autonomous production through the gate, human final approval, publish. The gap between pipeline launch and first autonomous publish was entirely gate false-positives. Not composer failures. Not bad sources. Not hallucinated numbers from the drafter. Gate false-positives.

Rescues after the streak

Two more manual rescues since 17 July, which is the honest account.

20 July: the fiscal-drag piece landed via rescue. The HMRC projections article on 2026–27 higher and additional rate taxpayers (uk-higher-additional-rate-taxpayers-2026-27, 7.7 million higher-rate taxpayers projected, up 34% on prior year) was in that morning’s cron casualties. Rejection reasons: 2 checklist, 1 CLI, 2 day-capped. The dead-zone, verifier, and dedupe fixes are holding. Checklist and CLI rejections are a different problem class the streak didn’t solve.

23 July: May HPI rescue. The ONS UK HPI piece (uk-house-prices-may-2026-hpi, 2.7% annual growth, first post-SDLT-change annual comparison on the site) caught in checklist casualties. I adjusted the sequence: coverage screen ran before the checklist this time. May is a new release; the April gov.uk and June Lloyds HPI releases are already covered, so May is genuinely clear. Running the coverage check first opened a path the checklist alone was blocking.

Same pattern: rescue, not autonomous publish. Different cause.

The failure mode taxonomy

Three weeks of daily runs produces four distinct categories:

  • Error failures: cron crashes, composer errors, API timeouts. Visible in logs, recoverable, addressable by diagnosis.
  • Legitimate holds: day-cap, dedupe hits against real duplicates, honest checklist failures. The gate doing its job: drafts correctly held with a traceable reason, not failures.
  • False-positive rejections: dead-zone, verifier over-sensitivity, dedupe over-reach. Gate blocking drafts it should pass. The 7–16 July blockers.
  • Success-no-publish: gate runs, rejects everything, cron exits clean. Zero publish, zero error. The hardest category to catch.

Success-no-publish is hard to catch because nothing breaks. The log stays clean, the exit code stays at 0, and no alert fires. The signal is absence, and absence only appears if you’re watching publish count independently from error count.

The two questions cadence monitoring requires

Pipeline health and cadence health are different questions. Pipeline health: did the cron complete without error? Cadence monitoring: how many articles have published in the last N days?

The second question doesn’t fall out of the first. The 14-day cadence clock restarting from zero on 10 July was the evidence I was only watching the first. Three weekdays, clean cron exits, zero articles, zero alert. Nothing flagged the gap until I counted.

The approval gate converts draft capacity into published output. Tuning it is where most of the remaining work sits: reducing false-positive rejections, separating “held” from “rejected” in the output log, running cadence checks independently from error monitoring. The composer and drafter are largely solved problems. The gate is not.

The failure mode I expected going into autonomous cadence was bad drafts: fabricated numbers, hallucinated sources, factual errors the verifier would have to catch. That hasn’t materialised at scale. The failure mode I got is a gate that needs tuning class by class, and a cadence monitor that has to ask a different question than the error log asks.

All writing