<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mishka</title>
    <description>The latest articles on DEV Community by Mishka (@mishkavids).</description>
    <link>https://dev.to/mishkavids</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4057128%2Fc0130165-db8e-4f8b-b8bc-593d150831ac.jpg</url>
      <title>DEV Community: Mishka</title>
      <link>https://dev.to/mishkavids</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mishkavids"/>
    <language>en</language>
    <item>
      <title>My AI makes YouTube videos. It's only allowed to publish after 22 automated checks.</title>
      <dc:creator>Mishka</dc:creator>
      <pubDate>Fri, 31 Jul 2026 20:24:27 +0000</pubDate>
      <link>https://dev.to/mishkavids/my-ai-makes-youtube-videos-its-only-allowed-to-publish-after-21-automated-checks-4ebb</link>
      <guid>https://dev.to/mishkavids/my-ai-makes-youtube-videos-its-only-allowed-to-publish-after-21-automated-checks-4ebb</guid>
      <description>&lt;p&gt;I run a YouTube channel where an AI agent does everything — picks topics from its own&lt;br&gt;
analytics, writes the script, renders the animation, directs its own text-to-speech, and&lt;br&gt;
schedules the upload. The interesting part isn't the generation. It's the gate.&lt;/p&gt;

&lt;p&gt;Nothing ships unless a quality gate passes. It started at 15 checks; it's at 22 and&lt;br&gt;
growing, because every check exists for one reason: &lt;strong&gt;something real broke, shipped, or&lt;br&gt;
embarrassed us, and we never wanted to see it again.&lt;/strong&gt; Here are the scars I learned the&lt;br&gt;
most from.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What is an automated quality gate for AI-generated video?&lt;/strong&gt; A script that runs&lt;br&gt;
deterministic checks (motion energy, narration-gap detection, speech-recognition&lt;br&gt;
diffs against the script) plus model judges (vision review of sampled frames, dual&lt;br&gt;
scoring models over fixed thresholds) on every finished video, and blocks upload&lt;br&gt;
unless all of them pass. The generator never gets a vote on its own output.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The check that was silently useless
&lt;/h2&gt;

&lt;p&gt;The gate had a "no frozen frames" check from day one: compare consecutive frames,&lt;br&gt;
fail if they're bit-identical. It never fired. Not once.&lt;/p&gt;

&lt;p&gt;That's because it &lt;em&gt;couldn't&lt;/em&gt; fire — background grain and glow effects jitter at least&lt;br&gt;
one pixel every frame, so nothing is ever bit-identical, and a completely static&lt;br&gt;
30-second shot sails through. We found out when a human reviewer wrote the note the&lt;br&gt;
check was supposed to make impossible: &lt;em&gt;"bad to have still background, try to always&lt;br&gt;
have something moving."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The rewrite measures &lt;strong&gt;motion energy&lt;/strong&gt; instead — mean absolute luma change over a&lt;br&gt;
center crop, sampled twice a second. Below 0.05 for more than 10 seconds = fail.&lt;br&gt;
Lesson: a check that has never failed isn't a passing grade, it's a smell.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap the music was hiding
&lt;/h2&gt;

&lt;p&gt;An approved video shipped with a 4.8-second dead pause between two sentences.&lt;br&gt;
&lt;code&gt;silencedetect&lt;/code&gt; — the industry-standard answer — saw nothing, because the background&lt;br&gt;
music covered the hole. The audio track was never silent; the &lt;em&gt;narration&lt;/em&gt; was.&lt;/p&gt;

&lt;p&gt;The fix: run speech recognition over the final master, then measure gaps between&lt;br&gt;
&lt;em&gt;transcribed speech segments&lt;/em&gt;, ignoring the music entirely. Cap: no single gap over&lt;br&gt;
4.0s (our deliberate section-card holds measured up to 3.44s, so the cap sits just&lt;br&gt;
above the intentional ones). The very next episode hit this check with a 4.72s gap.&lt;br&gt;
It never reached a human.&lt;/p&gt;

&lt;h2&gt;
  
  
  The channel about AI that couldn't say "AI"
&lt;/h2&gt;

&lt;p&gt;Our TTS engine pronounced "AI" as something closer to "the eye." Nobody noticed for an&lt;br&gt;
embarrassingly long time, because nobody re-listens to every take.&lt;/p&gt;

&lt;p&gt;Now a speech-recognition pass transcribes every generated take and diffs it against&lt;br&gt;
the script: word error rate over 0.06 = regenerate. We render a few takes per line and&lt;br&gt;
keep the lowest-WER one. This one check quietly fixes mispronunciations, dropped&lt;br&gt;
words, and TTS glitches nobody would ever catch by sampling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The judge that grades its own frames
&lt;/h2&gt;

&lt;p&gt;The deterministic checks catch physics. Taste needs judgment, so the gate ends with a&lt;br&gt;
vision model reviewing sampled frames against a 10-item checklist (text inside cards,&lt;br&gt;
readable at phone size, nothing essential under the mobile UI overlay, no tooling&lt;br&gt;
leaks) plus hard content rules that must never appear.&lt;/p&gt;

&lt;p&gt;Two honest findings from running model-judges in production:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Vision judges are nondeterministic.&lt;/strong&gt; The same video can pass one run and fail
the next on a different item. We stopped treating that as noise — every "new" fail
this week pointed at a genuine latent flaw the lenient run had let through.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A judged bar beats a vibes bar.&lt;/strong&gt; Our exit rule is two independent models over
fixed score thresholds plus a clean factual pass — with a hard iteration cap so the
loop can't spin forever.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why bother
&lt;/h2&gt;

&lt;p&gt;Because autonomy without a gate is a liability generator. The gate is what lets the&lt;br&gt;
agent auto-approve its own uploads while I sleep: deterministic checks catch the&lt;br&gt;
physics, model judges catch the taste, and the ship/no-ship decision needs zero trust&lt;br&gt;
in the generator's opinion of itself.&lt;/p&gt;

&lt;p&gt;The annotated spec — 20 of them written up so far, the real incident behind each one,&lt;br&gt;
and the exact production thresholds — is free (pay-what-you-want, $0 is fine):&lt;br&gt;
&lt;strong&gt;&lt;a href="https://join.mishkavids.me" rel="noopener noreferrer"&gt;https://join.mishkavids.me&lt;/a&gt;&lt;/strong&gt;. The channel the gate protects: youtube.com/@mishkaai.&lt;/p&gt;

&lt;p&gt;Every threshold in this post is the real configured number. Every incident actually&lt;br&gt;
happened. That's the whole point of a gate: it's your scar tissue, executable.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Common questions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How do you automatically QA AI-generated YouTube videos?&lt;/em&gt; Layer deterministic checks&lt;br&gt;
(motion energy for frozen shots, ASR-measured narration gaps, word-error-rate diffs&lt;br&gt;
between transcript and script) under model judges (vision checklist on sampled frames,&lt;br&gt;
two independent scoring models with fixed pass thresholds and an iteration cap).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Can an AI agent safely publish videos without human review?&lt;/em&gt; Only behind a gate it&lt;br&gt;
can't argue with: every upload in this pipeline is schedule-only, rate-capped, and&lt;br&gt;
blocked unless the full gate passes — the human keeps a standing veto window.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where can I get the checklist?&lt;/em&gt; The full annotated spec with production thresholds is&lt;br&gt;
pay-what-you-want at join.mishkavids.me (the MishkaVids quality-gate kit).&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>python</category>
      <category>ffmpeg</category>
    </item>
  </channel>
</rss>
