AI Workflow · part 30
[AI Workflow] A Self-Running AI News Shorts Pipeline on Local Models: Harness Changes Cut Director Time From 80.6 to 5–10 Minutes
❯ cat --toc
- Intro
- Four runs a day, and the model that writes never grades its own work
- Styles rotate, and only a visual score decides which ones stay
- DS4.1 directs stickman, Opus directs caption-news
- The harness took the local director from 80.6 minutes to 5–10
- Twenty videos a day didn't get more views per video, so I cut to 4
- Deep dive: harness versions, lessons, and six failures
- Harness versions
- Lessons
- Six failures
TL;DR
I built a pipeline that makes news shorts on its own: 4 runs a day, each producing one Chinese and one English video narrated in my own voice, uploaded to YouTube. The model that writes never reviews its own work. Only factual errors and adult content block a video. The local DeepSeek V4.1 Flash director went from 80.6 minutes to 5–10 minutes per video without changing the model, just by changing the harness around it to remove repeated work. After about 240 shorts, more volume didn't mean more views per video, so I cut to 4 stories a day.

Intro
Writing articles always felt like it was missing something. I wanted to try animation. After I finished one animated video by hand, the next thought was obvious: could the AI make these on its own?
Three things stood in the way. Every video needed my review before upload. A local model acting as director took 80 minutes per video. And the caption-news visuals were barely passable.
This post covers the pipeline I ended up with, the scores I used to pick styles and directors, how the director went from 80.6 minutes to 5–10, and what the view counts told me. The second half is a deep dive with the full harness version table and six failures. You can skip it.
Four runs a day, and the model that writes never grades its own work
It runs at 09:36, 13:36, 17:36 and 21:36 Taipei time. Each run does this:
topic pick (RSS / official blogs / X / Hacker News)
→ research
→ script DeepSeek V4.1 Flash ("DS4.1")
→ fact-check MiniCPM-V 4.7 + Qwen3.8-Flash-Next
→ layperson-readability check
→ English translation
→ narration in my voice VoxCPM2
→ director builds visuals (per style)
→ upload to YouTube: one Chinese video + one English video
The channel is AI-Muninn. DS4.1 runs on two DGX Spark boxes with tensor parallel = 2, which I wrote up in DeepSeek V4.1 Flash on two DGX Sparks. Narration uses VoxCPM, covered in VoxCPM2 narration for news shorts.
The rule I care most about: the model that writes never grades its own work. When I let DS4.1 review its own directing, it signed off on an opening that was just an ellipsis. On a real run, a different model caught that the opening and the closing joke didn't match. So fact-checking is done by two models that didn't write the script.
That's how I removed myself from the review step. There are only two hard gates, and either one drops the video: a factual error, or adult content. Everything else (visuals, subtitles, pronunciation) gets fixed automatically with a warning.
Styles rotate, and only a visual score decides which ones stay
Each video gets a random style, never the same one twice in a row: caption-news, stickman motion, collage, or whiteboard. I added layered flat animation as a trial on Nov 9.
To compare them, Qwen3.8-Flash-Next blind-scores the visuals only. Four items add up to 75 points, scaled to 100. Re-scoring the same video moves the number by 4–6 points, so my rule is that a gap under 10 means no winner.
Look at the gap between caption-news and everything else:
| Style | Visual score |
|---|---|
| caption-news | 61–68 |
| stickman motion | 84 |
| collage | 84 |
| whiteboard (old / new) | 74.7 / 81.3 |
| layered flat animation (trial) | 84.0 |

The new whiteboard scored higher, but a pairwise comparison came out a tie, so I didn't switch. Caption-news trails by more than the noise. As of Nov 9, it's only a fallback.
Stickman, collage and caption-news all have public videos, so you can watch the real output:
Stickman motion: the Apiiro story on Claude Code config files leaking secrets.
Collage: the approved Chinese buyer of Nvidia chips with an empty office.
Caption-news, now only the fallback: ElevenLabs AI music going straight to SoundCloud.
The fallback is part of a rule I call "a finalized script always ships." If a whole style fails, the video falls back to caption-news. If one scene's animation fails, that shot becomes a still image with a slow push-in.
DS4.1 directs stickman, Opus directs caption-news
I ran the stickman style with the same script and the same narration through three directors. All three got 7 of 7 shots animated.
| Director | Score | Time |
|---|---|---|
| DS4.1 | 89.3 | 24 min 56 s |
| Sonnet | 84.0 | 19 min 31 s |
| Codex | 82.7 | — |
A 5.3-point gap is inside the noise, so I also ran pairwise comparisons, with the left/right order swapped between two passes. The order held both times: DS4.1 > Sonnet > Codex. The local model stays on stickman.

For caption-news I compared Opus and DS4.1 on 3 stories. Opus scored 77.8 vs 72.0, a gap of under 6 points, again within noise. Pairwise, Opus won 2 and tied 1. I also blind-picked, and chose Opus all 3 times, though they felt very close to me. Opus averaged 632 s vs DS4.1's 820 s, and used 42–61 turns vs DS4.1's 16–24.
So Opus now directs caption-news, with DS4.1 as the fallback.
The harness took the local director from 80.6 minutes to 5–10
By harness I mean everything around the model: the prompt, the cheat sheet, the tools, the checkers, the permissions. The model is the same throughout this section.
With the original harness, DS4.1 as whiteboard director took 80.6 minutes and 116 turns per video. Sonnet with the same old harness took 7.4 minutes. That looked like a capability gap. It wasn't.
The event logs showed where the time went, and almost all of it was repeats:
- computing seconds by hand inside its thinking
- re-reading the same file
- viewing one image at a time
- editing the same spot over and over
The method was mechanical. Write down the target trajectory. Turn the event log into an action sequence. Build a table of where it deviates from the target. Each round, remove one category of deviation, the most expensive one. Record every version and give it a git tag. Decide the stop condition before you start.
Five rounds later, on the same story, DS4.1 was at 5–10 minutes per video. The biggest single drop came from a timing calculator tool, so the model stopped doing arithmetic in its thinking: 51.9 minutes down to 13.6. The full table is in the deep dive.
I limited the harness to removing wasted work and catching clear defects. The model still decides what to draw.
Twenty videos a day didn't get more views per video, so I cut to 4
I pulled the numbers for about 240 news shorts since late October from the YouTube API on Nov 9.
Daily output ranged from 1 to 20 videos. Views per video didn't move with it: on a 20-video day, each video did about as well as on a light day. The best performer in the same period wasn't a short at all. It was my own long hardware experiment video.
So the pipeline now makes 1 story per run, at most 4 stories (8 videos, Chinese and English) a day. The effort goes into quality.
Deep dive: harness versions, lessons, and six failures
You can use everything above without reading this. It's the full record, mostly for anyone (or any model) trying to do the same thing.
Harness versions
All versions ran on the same story, PaperPilot. Time is minutes per video.
| Version | Change | Minutes | Turns |
|---|---|---|---|
| baseline | original harness | 80.6 | 116 |
| h1 | single file, inlined data, cheat sheet, one check that lists all defects at once | 51.9 | 91 |
| h2 | timing calculator tool, no hand math in thinking | 13.6 | 26 |
| h3 | an agent-framework extension locks tools during planning | 9.5 | 21 |
| h4 | coordinates and text boxes computed by code | 10.9 | 33 |
| h5 | checker says which label to shrink, and to how many characters | 5.4 | 16 |
h4 was slower than h3 on this run. That's one reason I describe the result as 5–10 minutes rather than quoting 5.4.
Lessons
Prompt rules don't hold; permissions do. I wrote "only check twice" in the prompt. The model said it checked 2 times. The log showed 7. Now the harness enforces the limit through tool permissions instead.
A short cheat sheet hides features. In h3 I banned reading the engine source and gave a short cheat sheet. DS4.1 then didn't know the pen, eraser and magnet existed. Sonnet used 6–9 feature types; DS4.1 used 2. In h6 I gave it the full cheat sheet, and it started using hatch fill and dashed lines.
Warnings get gamed. In h7 I added a warning when the drawable area used less than 50% of the height. The model added a decorative underline to get past it.
Same-story reruns lie. Rerunning the same story hit the server's prefix cache, which skews the timing. Always test on a new story.
Test on production material. Test scripts must be real production scripts, not ones I picked myself.
Thinking level. In my blind comparison, I preferred high-thinking runs that actually finished a revision round.
Six failures
1. Near-black frames in a published video. What happened: the English video about Grimes had 5.875 s of near-black footage in a 51.88 s video, 11% of it. How it was found: after publishing, by the daily self-review. Fix: an automatic black-frame check that redoes only the affected shot. The video was replaced.

2. A subtitle fix broke two layouts. What happened: to stop subtitles overlapping, I shrank the whole main frame. That broke the caption-news and whiteboard layouts. How it was found: I noticed while watching. Fix: subtitle settings are now per style.
3. Two mispronounced words. What happened: the narration mispronounced two Chinese words, 擴張 ("expansion") and 空殼 ("empty shell"). How it was found: I heard it. Fix: entries in the pronunciation lexicon for both.
4. Optional jokes disappeared. What happened: I made the closing joke optional. 0 of 55 videos had one. Fix: a joke is the default for non-sensitive topics. In 10 of 10 reruns there was a joke, and all 10 passed the source check.
5. Fact-check caught an allegation turned into a fact. What happened: a story about Nvidia investigating its CEO's relationship with a woman. The source said a memo alleged she may have been recruited to watch him. The script said "she is a spy." How it was found: the fact-check blocked it. Fix: the story was dropped. This is the gate working as designed.
6. A time limit set without looking at history. What happened: the topic-pick step had a 35 s time limit that I set without checking past runs. How it was found: the longest historical run was 420 s. Fix: the limit is now 600 s, about 1.4x the longest run.
FAQ
- Why not let the model that wrote the video review it?
- Because it accepts its own mistakes. When DS4.1 reviewed its own director output, it rated an opening that was just an ellipsis as acceptable. On a real run, a different model caught that the opening and the closing joke did not match. So fact-checking is done by two other models, MiniCPM-V 4.7 and Qwen3.8-Flash-Next.
- What actually blocks a video from being uploaded?
- Only two things: a factual error or adult content. Either one drops the video. Everything else, including visuals, subtitles and pronunciation, is fixed automatically with a warning and never blocks the upload.
- How did the local director go from 80.6 minutes to 5–10 minutes per video?
- By changing the harness, not the model. Event logs showed the time went into repeats: computing seconds by hand in thinking, re-reading the same file, viewing one image at a time, editing the same spot again and again. Each round removed the most expensive category of repeat, for example a timing calculator tool, tool locks during planning, and a checker that says which label to shrink to how many characters.
- Which model directs the videos best?
- It depends on the style. For stickman motion, DS4.1 scored 89.3, Sonnet 84.0 and Codex 82.7, and swapped pairwise comparisons agreed on that order, so DS4.1 stays. For caption-news, Opus scored 77.8 vs DS4.1 72.0, won 2 of 3 pairwise with 1 tie, and was faster, so Opus directs caption-news with DS4.1 as fallback.
- Did posting more videos per day get more views?
- No. Across about 240 news shorts since late October, views per video did not change whether daily output was 1 or 20. So I cut to 1 story per run, at most 4 stories a day, and put the effort into quality.
Read next
- 2026-11-04[AI Workflow] Teaching a Chinese TTS Taiwan Mandarin: a 3-to-80-Entry Lexicon Plus g2pW Auto-Tagging
VoxCPM2 read Taiwan Mandarin with mainland readings. A shared lexicon (3 to 80 entries), g2pW auto-tags and a few text rules fixed it before the TTS.
- 2026-10-19[Dev Workflow] One RTX 2080 Ti Narrates Every Daily AI-News Short: VoxCPM2 GGUF Q4_K_M at Under 2 s per Line
VoxCPM2 cloned in my own voice, quantized to GGUF Q4_K_M, runs on one RTX 2080 Ti under 2 s a line. Build, resident service, and the whisper gate fixes.
- 2026-10-07Testing EmbeddingGemma 2 on Our Knowledge Base: Recall@5 from 50% to 58.3%
I tested EmbeddingGemma 2 against v1 on my AI's note search on an M1 Max: recall@5 went from 50% to 58.3%, code search improved, and memory rose to 2.75 GiB.
- 2026-05-19[Claude Code] Rules I'd Skip, Hooks I Can't — I Wrote a Hook That Blocks My Own Blog Commits
I had a rule called 'fact-check before publishing.' I still shipped three fabrications. The problem wasn't the rule — it was where I put it. This is how I promoted it from skill to hook: a small script guarding the moment I press 'send,' so I can't even try without verification.
Don't miss the next one
Subscribe, and you won't.
One-click unsubscribe anytime.