Government feeds in one end, a finished vertical short out the other. Nineteen Python modules, one database, two paid APIs, and a rule about who is allowed to decide anything.
14 live sources2,271 lines1 model call for tasterenders on Nami
01 / THE SPINE
Seven stages, three clocks
Nothing here is one script. Each stage runs on its own schedule and fails in its own way, so a break in one never corrupts another.
The fence is the load-bearing idea. An edition opens the instant the last one publishes; every story arriving while it is open belongs to it. It moves only on a successful publish, so a render that dies at 2 AM leaves the edition open with its stories still claimed. The retry finishes it. Nothing is lost and nothing goes out twice.
02 / WHO IS ALLOWED TO DECIDE
Six questions. A model answers one.
Question
Answered by
Why not a model
Have we used this story?
UNIQUE(source, event_key)
the agency already assigned a permanent id
Is it the same story from two agencies?
normalised title hash
50 collapsed on the first run
Is it breaking?
numeric thresholds
a number is auditable; a prompt is not
Land, sea or sky?
keyword routing on the subject
the feed's own label lies — see below
Can we put it on screen?
coordinates → satellite, else the article
a lookup, not taste
Which story is best, and how is it written?
GPT-4o — the one real call
genuine editorial judgment
Roughly four model calls a week for selection and writing. Everything else is arithmetic, which is cheaper, faster and can be argued with.
03 / THE FUNNEL
195 in, 3 on screen
195collected
57duplicate stories
83unmakeable
3aired
The pillars, before and after the noise rule
Ray killed the routine weather alerts. Dropping those plus the quakes nobody felt did not just clean the pool — it balanced it.
LAND before
1,853
SKY before
173
SEA before
165
LAND after
197
SKY after
173
SEA after
166
Eleven-to-one became almost even thirds. The imbalance was never the world — it was two firehoses.
04 / WHERE PICTURES COME FROM
Three sources, in order
SATELLITE
NASA GIBS
Any coordinate on Earth, one day behind. Today returns an empty frame, so it walks back to T-1 and keeps going until the pixels are real. Rendered at three zooms for wide-to-tight without motion.
ARTICLE
The story's own images
A penguin study and a telescope release have no coordinates, but they ship with pictures — and for the telescope the picture is the story. Scoped to the article body only.
RELATED
Neighbouring stories
Same place, species or mission, pulled from the pool for their imagery. Same-story syndications are excluded by title hash so a segment cannot illustrate itself twice.
The guard that matters. Harvesting whole pages surfaced a White House photograph from NASA's homepage carousel, queued to illustrate the emperor penguin segment. Two defences now: extraction is scoped inside <article>, and any image found on two different pages is banned permanently by content hash.
05 / STANDING DECISIONS
Settled, and why
One voice. Never two.
A two-anchor desk was built and rejected — alternating speakers read as two half-shows spliced together. Variety comes from tags inside one voice. Currently Liam, ElevenLabs v3.
No motion on any still — except space.
The standing guardrail is absolute and carries one carve-out: Ray asking by name, which he did on 2026-08-27 for space imagery only. Earth frames never move. The zoom is 8.5% across a shot, down from a 62% lunge.
Segments are never announced.
No "first up", no pillar names. Three labelled blocks bleed viewers at every boundary. Turns are a dip to black and a named destination.
The fact checker judges facts, not taste.
Asked which story should lead, it answered differently every run. An unreliable signal mixed into a reliable one poisons both. It now checks claims and voice only; an invented fact fails, a wording quibble does not.
Renders never run on this box.
ffmpeg lives on Nami. Cerberus authors, the sibling renders, and only media crosses — never code.
06 / WHAT IT COSTS TO RUN
Per episode
~1,500ElevenLabs credits
1 credit per character, measured. Free tier is 10,000/month — about 6 episodes.
4model calls
Pick, write, fact-check, revise. Pennies.
$0imagery
All US government public domain. Credited on screen regardless.
Three videos a week at three minutes needs about 27,900 credits a month against the $6 tier's 30,000. It fits, with roughly one retry spare. The free tier does not.
07 / WHERE IT STANDS
Working, and not
Working end to end
Hourly collection · dedupe by key and by story · subject routing · whole-earth imagery · the edition fence · ranked candidates with runners-up kept · scripting · adversarial fact check · revise loop · ElevenLabs voice with inline tags · 60fps render on Nami · destination cards · Iris registered as a Head with her own memory
Still wrong
The voice lurches — a tag every 7.7 words is a seizure, not a performance · stability pinned at 0.0, the most volatile setting · transition cards hold black up to 5.7s · no music · the volcano has only three frames · no review surface for approving or swapping a pick · no GitHub repo pair, so all of this lives only on this box
The next fix is the voice, and it is my error. I told the writer to place tags mid-line because that is what ElevenLabs can do and OpenAI cannot. It obeyed — two tags per twelve-word line, fifteen lines running. One tag every three or four lines, stability off the floor, and the punctuation carries the rest.