# S1_repub_socialism / EP01 — Production Worksheet

**THE RECEIPT-FIRST COLD OPEN: The Claim vs The Cut**

> Generated by `worksheet.py` from `smm_mcp_server.py`. Do not hand-edit —
> re-run it. The tool table and stage order come from the server's own
> declarations, so this page cannot claim a capability the pipeline lacks.

## 1. Where this episode actually is

| | |
|---|---|
| shots planned | 188 |
| of those, real captured source pages | 4 |
| buildable | True |
| blockers | none |
| warnings | T2_no_flash_frames |
| narration | True (1106.3s) |
| visual manifest | True |
| **mixed audio (score)** | True |
| master | True (1106.2s) |
| staged files | EP01.srt, EP01_WORKSHEET.md, EP01_callsheet.md, EP01_clip_1x1.mp4, EP01_master.mp4, EP01_master_qc.mp4, EP01_short_9x16.mp4, receipt.json |
| **published** | **False** |

> This pipeline has no publisher. Staged on the shelf is NOT published -- there is no URL and no audience.

## 2. Every program this episode is built with

| Program | Role | Present | Path |
|---|---|---|---|
| ffmpeg | every encode, conform, mix and master | yes | `C:\Users\donbr\AppData\Local\Microsoft\WinGet\Packages\Gyan.FFmpeg_Microsoft.Winget.Source_8wekyb3d8bbwe\ffmpeg-8.0.1-full_build\bin\ffmpeg.exe` |
| ffprobe | duration/stream/loudness measurement | yes | `C:\Users\donbr\AppData\Local\Microsoft\WinGet\Packages\Gyan.FFmpeg_Microsoft.Winget.Source_8wekyb3d8bbwe\ffmpeg-8.0.1-full_build\bin\ffprobe.exe` |
| Blender 5.2 | branded lower-third cards (blender_gfx.py) | yes | `C:\Program Files\Blender Foundation\Blender 5.2\blender.exe` |
| DaVinci Resolve | finishing environment (resolve_driver.py) | yes | `C:\Program Files\Blackmagic Design\DaVinci Resolve\Resolve.exe` |
| yt-dlp | Creative-Commons b-roll fetch (vst_broll --video) | yes | `C:\Users\donbr\ai_env\Scripts\yt-dlp.exe` |
| OmniVoice TTS | Kirk narration (voice_01), driver _smm_tts_omnivoice.py | yes | `C:\DandyDon\outputs\_tools\_smm_tts_omnivoice.py` |
| voice venv python | interpreter the TTS driver runs under | yes | `C:\DandyDon\spock\voice\Scripts\python.exe` |
| Playwright Chromium | source-page screenshots inside vst_smm | yes | `(python package, via vst_smm / media_sourcer)` |
| APEX router | model-first fanout for shot planning | yes | `C:\DandyDon\apex_router.py` |
| Ollama | local models; embedder pinned at :11434 | yes | `http://127.0.0.1:11434` |
| Pillow (PIL) | all card drawing in receipt_visuals.py | yes | `(python package)` |

### Our own scripts, in the order they run

| # | MCP tool | Script | What it does |
|---|---|---|---|
| 1 | `smm_plan` | `episode_spec.py` | script + factbase -> build spec, shot list, call sheet, SRT |
| 2 | `smm_capture` | `vst_broll.py` | photograph the real source page behind each receipt |
| 3 | `smm_plan` | `episode_spec.py` | re-plan so captures become b-roll shots (2nd pass) |
| 4 | `smm_beds` | `audio_beds.py` | synthesise the four score cues (once per machine) |
| 5 | `smm_build` | `smm_orchestrator.py` | Kirk VO via OmniVoice, fingerprinted against the script (narration is a stage INSIDE smm_build, not a separate tool) |
| 6 | `smm_render` | `spec_render.py` | cards -> clips -> visual manifest |
| 7 | `smm_mix` | `audio_mix.py` | beds + stings ducked under the voice, mastered to -14 LUFS |
| 8 | `smm_build` | `smm_orchestrator.py` | composite picture + audio, cut 9:16 and 1:1, land on the shelf |
| 9 | `smm_gate` | `receipts_gate.py` | fabrication gate: every claim traces to the factbase |
| 10 | `smm_shelf_check` | `(this server)` | the six ready_to_publish entry requirements |

**Ordering rule that has bitten this project twice:** the build spec OWNS
the timeline. Any change to the factbase, to captures, or to the narration
length obliges a re-PLAN before rendering — `spec_render` will happily
render a 552s plan against a 1182s voice track, report success, and leave
ten minutes of the episode with no picture.

## 3. The `smm` MCP server

Registered in `~/.claude/mcp.json` as:

```json
"smm": {"command": "python", "args": ["C:\\DandyDon\\smm\\smm_mcp_server.py"]}
```

Verify it independently at any time:

```bash
python C:/DandyDon/smm/smm_mcp_server.py --selftest
```

| Tool | Purpose |
|---|---|
| `smm_status` | What state is an episode actually in: spec, gates, narration, manifest, mixed audio, master, staged files. Explicitly reports published=false — staged is not published. Start here. |
| `smm_toolchain` | Every external program the pipeline uses, whether each is present on this machine, and the correct stage order. Use to verify the box can build before starting. |
| `smm_plan` | PLAN stage (episode_spec.py): master script + factbase -> build spec, shot list, call sheet, SRT. Re-run after ANY factbase or capture change. Owns the timeline. |
| `smm_capture` | Photograph the real source page behind each cited receipt (vst_broll.py): Wayback snapshot first, then live, then AMP; bot-walled and raw-data URLs refused. Network, best-effort, never fails a build. |
| `smm_render` | RENDER stage (spec_render.py): draw cards, conform captures, animate to clips, write the visual manifest. Cards carry a content stamp, so a factbase edit redraws exactly the affected cards. |
| `smm_beds` | Synthesise the four score cues (audio_beds.py): under_low, narrative_muffled, receipt_drive, receipt_hit. Offline, deterministic, zero licensing exposure. Run once per machine. |
| `smm_mix` | SCORE stage (audio_mix.py): lay the planned bed under each treatment span, sting each receipt landing, sidechain-duck under the voice, master to -14 LUFS / -1.0 dBTP. Use dry_run to see the score before rendering it. |
| `smm_build` | FULL BUILD (smm_orchestrator.py): narrate -> re-plan if the VO length moved -> render -> composite -> cut 9:16 and 1:1 -> land on the shelf. Long-running (tens of minutes). |
| `smm_gate` | Fabrication gate (receipts_gate.py): every on-air claim must trace to the factbase. Blocking. This is the check that exists because the series once shipped invented sources. |
| `smm_shelf_check` | Run the six ready_to_publish entry requirements for real instead of assuming them. Returns a per-requirement pass/fail. Requirement 6 (look at frames) cannot be automated and is reported as such. |
| `smm_frames` | Extract frames from any video so they can be LOOKED AT. Every quality bug that mattered here was invisible in logs and obvious in a frame. Returns file paths to read as images. |
| `smm_probe` | Duration, streams and optional loudness for any media artifact. |

There is deliberately **no publish tool**. The pipeline has no publisher,
and the one prior distribution incident here was an OnlySocial *Repeat*
toggle that fired ~350 duplicate posts through Election Day. When a
publisher exists it will be separate, single-shot and explicitly confirmed
— not something an agent reaches by walking a tool list.

## 4. Sound design (doctrine #6, sonic contrast)

The plan assigns every shot a treatment from what the card IS. Spin is
muffled; evidence is dry and driving.

| Treatment | Bed cue | Meaning |
|---|---|---|
| `narrative` | `narrative_muffled` | the official version of events |
| `receipt` | `receipt_drive` | the evidence |
| `neutral` | `under_low` | everything else |
| (landing) | `receipt_hit` | a receipt arrives |

- beds planned: narrative_muffled, receipt_drive, under_low
- stings planned: receipt_hit
- master target: -14.0 LUFS / -1.0 dBTP
- treatment map covers 188 shots

Cues are synthesised offline from oscillators and filtered noise — zero
licensing exposure, deterministic, free. A Content-ID claim on a library
track would be a takedown on a show whose whole argument is that it plays
by the rules.

## 5. Open items

| Item | State |
|---|---|
| Score mixed into the master | yes |
| Captions shipped | yes |
| Publisher | **none exists** |
| Thumbnail / title / description | not produced by this pipeline |

Run `smm_shelf_check` for the six entry requirements, and `smm_frames`
plus your own eyes for the sixth — it cannot be automated, and every
quality bug that mattered on this episode was invisible in logs and
obvious in a frame.
