{"slug": "eight-shorts-same-timeslot-the-engine-found-them", "title": "Eight Shorts, Same Timeslot. The Engine Found Them.", "summary": "A developer built RFD_YT_Engine, an 8-domain Python system that manages the full lifecycle of a YouTube channel, including collision detection that found eight videos scheduled at the same timestamp. The system exposes a 24-tool MCP server to Claude Desktop and includes a custom YouTube Data API v3 and Analytics API v2 surface built from scratch. The engine resolved the conflicts with a single API call, eliminating the need to open YouTube Studio.", "body_md": "At 11:40 PM I asked my AI what was on my YouTube calendar for August.\n\nIt told me I had eight videos scheduled to publish at the exact same timestamp on the same dates. Two Shorts, one slot. Eight times over.\n\nIt also told me the fix, proposed the moves, and waited for my confirmation before touching anything.\n\nI didn't open YouTube Studio once.\n\nThat's the short version of what RFD_YT_Engine is. The longer version starts about two months earlier, when I was running a pipeline called ContentEngine that was supposed to generate YouTube Shorts from AI-written game reviews. It had nine stages, a script generator, a brief generator, a voice synthesis layer, and a Pollinations.ai fallback for when nothing else produced a usable image. It was elaborate.\n\nIt also produced videos nobody watched, including me.\n\nThe pivot was simple: stop scripting. Use real gameplay footage. Film what actually happens when you play a game for the first time, cut out the moment that made you react, and put it online. No narration. No brief. No AI-written hook. Just the moment.\n\nThe pipeline that came with ContentEngine didn't fit that model. So I built a new one from scratch.\n\n**What RFD_YT_Engine actually is**\n\nAn 8-domain Python system that manages the full lifecycle of a YouTube channel — from raw session recording through to published video — with a 24-tool MCP server that exposes the entire thing to Claude Desktop.\n\nThe eight domains:\n\nThe architecture rule that held through every phase: one-directional dependency. No domain imports another's modules. Everything flows through shared infrastructure or the Interface layer. Eleven phases of development, zero ADR violations.\n\n**The YouTube API surface**\n\nI built the full YouTube Data API v3 and Analytics API v2 surface from scratch because the existing libraries were either too thin or too opinionated about what you could do with them.\n\nWhat that means concretely:\n\nThe first sync attempt using search().list() returned 64 videos. The correct number was 167. The difference: search only returns public videos. Private, scheduled, and unlisted are invisible to it. Switching to the uploads playlist fixed it. 167 videos, all detail columns hydrated, in 4 API calls.\n\nupdate_video_metadata() had a silent data corruption bug. YouTube replaces the entire snippet object on update. Sending only the fields you want to change wipes the rest — tags gone, category reset. The fix: fetch the current snippet first, merge the changes, send the complete object.\n\nTraffic sources and audience retention are now queryable from conversation. How viewers found each video. Where they stopped watching. Direct tool calls, no dashboard.\n\n**Collision detection**\n\nThe channel has 89 videos scheduled for future publication. The same-timestamp conflicts weren't obvious in YouTube Studio — it shows dates, not exact times, and two videos at 2026-08-29T02:00:00Z look identical until one of them fails to publish.\n\nTwo detection functions:\n\ndetect_collisions() finds same-game streaks exceeding a threshold across consecutive days. The Hotline Miami run that stretched six days without interruption — that's the target. The fix was interweaving 8 displaced Shorts into the streak window while filling the empty September calendar.\n\ndetect_same_day_collisions() classifies each date with multiple videos as either true_conflict (same exact timestamp, real problem) or multi_slot (different times, intentional). A Short at 2AM and a long-form session at 10PM on the same Sunday is the correct pattern. Two Shorts both at 2AM is a conflict. The function names the videos in both directions, and flags the content type — short, highlights, or long_form — derived from duration and title signal.\n\nThe eight true conflicts were resolved with one apply_batch_reschedule call after reviewing the preview. Ten video dates changed. No YouTube Studio.\n\n**What it took**\n\n190+ certified tests. Phase-gated development with verified floors — no phase starts until the previous one passes at exactly the stated count. Every architectural decision locked in an ADR. The Director → Pipeline → Agent methodology throughout: I wrote the directives, the agent implemented, I verified against raw pytest output. No agent summary counts as proof.\n\nThe most expensive bugs were the ones that looked like success. 64 videos that were actually 167. A metadata update that silently wiped tags. A calendar that showed empty because scheduled_at was never being written even though the API returned the data. Each one found by querying what the system actually knew versus what it should have known.\n\n**The outcome**\n\n167 videos in a local SQLite database. All detail columns hydrated. All scheduled dates correct. Collision detection live. Calendar management, metadata updates, batch reschedules — from conversation.\n\nThe infrastructure layer for a channel that produces 1–2 Shorts per day and a long-form session every Sunday. Everything above the infrastructure — recording, playing, picking the moment — is still manual. That's the part that should be.\n\nStack: Python · SQLite · YouTube Data API v3 · YouTube Analytics API v2 · FFmpeg · OBS WebSocket · MCP\n\nMethodology: Spec-Driven Development · Director → Pipeline → Agent · phase-gated test floors · ADR-documented decisions", "url": "https://wpnews.pro/news/eight-shorts-same-timeslot-the-engine-found-them", "canonical_source": "https://dev.to/robert_floyddugger_6f9a4/eight-shorts-same-timeslot-the-engine-found-them-2813", "published_at": "2026-06-30 23:50:28+00:00", "updated_at": "2026-07-01 00:18:49.736579+00:00", "lang": "en", "topics": ["developer-tools", "artificial-intelligence", "ai-agents"], "entities": ["RFD_YT_Engine", "Claude Desktop", "YouTube Data API v3", "YouTube Analytics API v2", "ContentEngine", "Pollinations.ai"], "alternates": {"html": "https://wpnews.pro/news/eight-shorts-same-timeslot-the-engine-found-them", "markdown": "https://wpnews.pro/news/eight-shorts-same-timeslot-the-engine-found-them.md", "text": "https://wpnews.pro/news/eight-shorts-same-timeslot-the-engine-found-them.txt", "jsonld": "https://wpnews.pro/news/eight-shorts-same-timeslot-the-engine-found-them.jsonld"}}