Curated Formatv0.3.0

Batman Arkham Conversations

Fan-favorite characters trade lines over Arkham Knight and Spider-Man 2 gameplay with timed captions and ducked music—assembled into vertical 9:16 Shorts.

By Wiggly Studio · Updated September 2026

Before you start

Services & costs

Social Publisher (Buffer MCP or API)

Simultaneous headless publishing to YouTube Shorts, Instagram Reels, TikTok, and X.

BUFFER_API_KEY

Local runtime

Setup, validation & inspection

Node.js >=22 · npm (for pinned Sharp 0.34.5 dependencies) · FFmpeg with libx264, AAC, overlay, scale, crop, pad, concat, afade, sidechaincompress, amix and alimiter filters · FFprobe

Typical run estimate

$0 media-provider cost with supplied clips. Coding-agent usage is separate.

Estimates describe the saved recipe, not a price guarantee. Confirm current provider pricing and approve any spend before generation. Your coding agent may have its own fees or usage limits. Never paste API keys into chat.

Setup notes from requirements.json
  • Run npm ci --ignore-scripts --no-audit --no-fund once to install pinned Sharp 0.34.5 dependencies; setup requires network access but rendering does not.
  • Arial/Helvetica/sans-serif fonts are resolved on the host; inspect typography on each new platform. No model or font download is required.
  • All real gameplay and per-turn audio must be explicitly supplied and authorized; no voice cloning is implemented.
  • Bundled diagnostic video and sine tones are original mechanical fixtures only.
  • Optional music must be authorized and long enough for the episode. See MUSIC-CREDITS.md for details on the bundled Yeat instrumental bed.
  • Only the available macOS environment was tested.

Included assets

The ingredients behind the format.

The published package includes its agent instructions, input contract, and quality rules. Reference media teaches the recipe; it is not a new result for your input.

What stays consistent

  • A persistent title and question
  • Real gameplay beneath the conversation
  • Speaker labels and timed dialogue captions
  • One local renderer for same-universe casts and crossovers

What you bring

  • Your characters, topic and dialogue
  • An authorized local gameplay clip
  • One authorized audio clip per dialogue turn
  • Optional authorized background music
Read the included contracts and asset inventory ↓

Examples

Examples & references.

3 saved examples for this recipe—not 3 separate Repos. Each example keeps its original version and provenance.

Example 01 · Batman & Robin · Human Reality Q&A

Robin Asked Bruce How He Sleeps

Open finished ad

Example 02 · Batman × Spider-Man · Multi-Universe Crossover

Why Batman Counters Spider-Man

Open finished ad

Example 03 · Batman & Robin · Top 5 Countdown

Top 5 Villains Batman Respects

Open finished ad

From input to output

How the run works.

From the published pipeline.json. The agent follows the packaged runtime and its approval gates.

  1. Step 01

    Check and smoke

    Check the local tools, install pinned dependencies, and run the free two-input smoke before starting an episode.

  2. Step 02

    Scout topics

    Probe live YouTube search velocity and Google Trends for three pre-validated viral Socratic hooks with zero API keys.

  3. Step 03 · approval

    Choose the conversation

    Choose a same-universe cast or a crossover, then approve the script, title and question.

  4. Step 04

    Critique script

    Run the deterministic 5-stage Socratic retention linter on drafted dialogue before voice synthesis to guarantee 85+ quality and eliminate pre-synthesis waste with zero API costs.

  5. Step 05

    Supply gameplay and voices

    Provide one authorized gameplay file and one audio file per dialogue turn. Optionally choose the credited background bed or supply another authorized music file. This release does not download gameplay or generate voices.

  6. Step 06

    Prepare captions

    The coding agent prepares speaker assignments, measured turn durations and phrase timestamps. Review synchronization against the actual speech.

  7. Step 07 · approval

    Render and inspect

    Use the unchanged official compositor, inspect the MP4 and receipt, then watch and listen before accepting the result.

  8. Step 08 · approval

    Distribute episode

    Author platform-tailored copy for YouTube Shorts, Instagram Reels, TikTok, and X, present for review, and dispatch to connected channels via runtime/publish.mjs. Writes live receipts to outputs/episode.distribution.json.

Proof & quality

What a good result looks like.

The user accepted the Batman/SpongeBob 9:16 music preview. It retains the supplied footage, dialogue and timing; optional music uses the same compositor. Diagnostic proofs separately test execution.

The ZIP includes original diagnostic assets and both local smoke proofs. The finished Batman/SpongeBob example is viewable on this page; raw gameplay and separate voice clips are not distributed in the ZIP.

Created from user-assisted analysis of the Batman reference. After requesting Shorts layout and music, the user accepted the music preview: cool looks good to me. No detailed audiovisual score or agent hearing claim is provided.

9:16 Shorts · dialogue + quiet music

Gotham Meets Optimism

  • The original 3:4 episode passed blind-agent execution. This 1080 × 1920 revision reuses its exact input, gameplay and six audio clips through the revised official layout.
  • 23 contract/music tests passed, including ducking, preserved dialogue level, fading and credit. The user accepted the playable music preview. The release preserves its video, source clips, mix settings and timing; PUBLICATION.json records the small AAC tail difference.

Known limitations

  • Gameplay and six voice clips were prepared before handoff; acquisition and voice generation are not in this release.
  • The Shorts layout is a maintainer refinement, not a new unaided authoring or blind-agent claim.
  • User accepted the preview qualitatively; no numerical voice-performance score or agent direct-hearing claim is provided.

Original diagnostic fixtures

Same universe + crossover

  • Two different scripts, casts, video sources and audio sequences use the same official renderer.
  • All assets for these free local checks ship in the ZIP.

Known limitations

  • Diagnostic tones are not character speech; these checks do not establish creative fidelity.

Quality gates

These are the acceptance criteria in quality.json—not a claim that every pictured example passed the current version. Inspect each new output before finalizing.

Automated Checks · 5 checks
  • Run all 23 contract/music tests and the two-input free smoke from a clean download.
  • Check music authorization/duration/gain, retained attribution, a present quieter bed, preserved dialogue level, ending fade and clipping protection.
  • Validate cast/universe rules, authorized local media paths, measured durations and caption coverage before rendering.
  • Verify 1080 × 1920 (9:16), square pixels, 25 fps H.264/AAC output, visible caption pixels and supplied audio in the diagnostic proofs.
  • Keep the official runtime unchanged when replacing content.
Creative Review · 3 checks
  • Watch and listen to the entire real episode; check character performance, intelligibility, pacing, caption/speech synchronization and music balance.
  • Record direct review separately from technical checks. Publication approval is not an invented quality score.
  • Do not use synthetic video or tones as the finished real episode.
Limits · 3 checks
  • This baseline requires supplied gameplay and per-turn audio; no automatic acquisition, voice generation or transcription.
  • Output is 9:16 vertical at 1080 × 1920; ASCII captions and up to 60 seconds. Gameplay is center-cropped, never stretched.
  • Music is optional and supplied locally; no song identification, music generation, visual character animation or automatic speech alignment.

Open the package

Readable Repo files.

Actual files from the published v0.3.0 package. Expand any file to inspect the instructions, requirements, or evidence before sending the Repo to your agent.

README.md
Open raw file ↗
# Batman Arkham Conversations

Public baseline **0.3.0**, for **9:16 Shorts at 1080 × 1920**. Choose your characters and topic, and generate an end-to-end voiced conversation over gameplay with one command, or supply your own custom audio clips and gameplay video.

Run `npm ci --ignore-scripts --no-audit --no-fund`, `npm test`, and `npm run smoke` from this folder to verify offline baseline contracts.

## Autonomous Generation & 4 Sub-Formats

This format kit supports 4 distinct viral sub-formats detailed in `SKILL.md`:
1. **Physiology & Human Reality Q&A** (e.g. *Robin Asked Bruce How He Survives on No Sleep* [5.2M peak views], *Where He Keeps Batarangs*, *How He Recovers*, *How He Pees*)
2. **Multi-Universe Crossovers** with dynamic gameplay cutting and digital glitch whoosh transitions (e.g. *Batman vs. Spider-Man* [767K views], *Batman vs. Goku*, *Destroy Gojo*)
3. **Top 5 Countdown Rankings** with left-side number ladder and card reveals (e.g. *Top 5 Villains Batman Respects* [648K views], *5 Villains That Actually Scare Him*)
4. **1v1 Debates / Moral Clashes** (e.g. *Batman vs. The Joker* [451K views], *Batman vs. Jason Todd*)

### Autonomous Zero-Key Trend Scouting

Discover real-time viral debates and search velocity with zero credentials or API keys:

```sh
npm run scout
# Or scout by specific theme:
npm run scout -- --theme="money"
```

To automatically resolve community voice models, script the fan debate, cut gameplay, and render the complete Short:

```sh
node runtime/generate.mjs \
  --character1="Batman" \
  --character2="The Joker" \
  --topic="Why does Batman keep Joker alive?" \
  --output="outputs/batman-vs-joker.mp4"
```

Use `--dry-run` to validate the plan, voice model resolution, and timings without synthesis. Voice generation utilizes Fish Audio (`s2.1-pro-free`). Single-command wrapper: `npm run generate -- --character1="Batman" --character2="Jason Todd"`.

## Setup and quick proof

Requires Node.js >=22, npm, FFmpeg with libx264, AAC, scale/crop/pad/overlay/concat/audio filters, and FFprobe on PATH. Sharp 0.34.5 and its platform packages are pinned in package-lock.json. Setup downloads those packages once; rendering requires no account, key, network, or paid provider. This was tested on the available macOS host; no cross-platform certification is claimed. FFmpeg builds without drawtext/subtitles work because Sharp rasterizes the text overlay. The runtime uses the host's Arial/Helvetica/sans-serif fonts; exact font appearance is host-dependent, so inspect the first output on a new machine.

From this extracted Repo root:

```sh
npm ci --ignore-scripts --no-audit --no-fund
npm test
node runtime/render.mjs inputs/same-universe.json outputs/same-universe.mp4
node runtime/render.mjs inputs/crossover.json outputs/crossover.mp4
node tests/verify-proofs.mjs outputs/same-universe.mp4 outputs/crossover.mp4
```

Use fresh output paths for reruns. The renderer creates the parent output folder and an adjacent MP4 receipt. All assets needed for these proof commands are bundled. tests/make-fixtures.mjs documents how original diagnostic fixtures were generated; it refuses to overwrite existing files and is not needed for normal use.

## Real episode inputs

Create a new JSON using the bundled examples. The contract is:

- schemaVersion: 1.
- header.title: up to 25 characters; header.question: up to 36.
- topic: up to 100 characters; authoring context only.
- castMode: same-universe or crossover. Same-universe requires one universe; crossover requires two or more.
- cast: 2-6 objects with unique id, visible name and universe. At least two members must speak.
- gameplay: file, authorized:true and nonempty provenance. The file is relative to the Repo root, must be a regular local file without symlinks, at most 100 MB, and contain enough video for the complete conversation.
- turns: 2-12 objects with speaker id, text, durationSeconds, audio and captions. Audio requires a file, authorized:true and provenance for every turn. Every file is at most 100 MB; its duration must agree with its turn within 0.06 seconds. Turn durations use 0.04-second increments and total at most 60 seconds.
- captions: 1-10 objects per turn, with text/start/end. Times are seconds relative to the turn, ordered and non-overlapping within the turn. Combined caption wording must match the turn text. Each phrase must fit two 19-character lines; split longer text into additional timed phrases.
- music (optional): file, authorized:true, nonempty provenance, volume (default 0.1; greater than 0 and at most 0.25), and optional attribution text up to 2000 characters. Music follows the same local path/file-size rules and must contain audio long enough for the full episode. Omit the object for dialogue only. No music is silently selected, downloaded, generated or looped.

To use the bundled alternative, add this top-level object and preserve its publishing credit:

```json
"music": {
  "file": "assets/audio/yeat-if-we-being-real.mp3",
  "authorized": true,
  "provenance": "Yeat - If We Being Real (Instrumental starting at 0:28)",
  "volume": 0.12,
  "attribution": "Instrumental bed: Yeat - If We Being Real (used for pacing under dialogue)"
}
```

See `MUSIC-CREDITS.md` for the original source, license and required visible credit. This track is a chosen alternative, not the identified original YouTube song. The output receipt and MP4 comment retain `music.attribution`; also put it in the published description or credits.

Supported text is ASCII letters/digits, spaces and .,:?!'-; displayed output is uppercase. Text is antialiased and measured before fitting to a 900-pixel safe width, leaving at least 90 pixels on each side. Cast names are at most 20 characters and become speaker labels above captions.

For real episodes, replace every diagnostic asset with the supplied authorized gameplay/audio. Put the files inside this Repo, update their file paths and provenance, and keep the runtime unchanged. Supply your own clips; there is no gameplay acquisition, voice-cloning service, automated transcription or silent fallback.

## Output behavior and boundaries

Outputs are 1080x1920 (9:16) H.264/AAC MP4 at 25 fps with square pixels, a white 306-pixel header and a 1080x1614 gameplay area. Gameplay is scaled proportionally and center-cropped to that area, never stretched. Speaker labels start at y=1260; captions start at y=1350 with 86-pixel line spacing, leaving the bottom clear. Inspect the crop on real footage. Original gameplay audio is omitted; supplied turn audio is concatenated in mono at 48 kHz. An optional music bed is trimmed to the episode, reduced by the requested gain, ducked under speech, faded in over 0.35 seconds and out over 0.7 seconds (capped at half the episode each). A limiter prevents the summed mix clipping without normalizing up the dialogue. The runtime does not synthesize missing tracks, loop short media, animate a character face or infer speakers.

The official runtime is runtime/render.mjs. Inputs affect the shared rendering path; there are no alternate export or preview implementations. Media protocols are limited to file/pipe; FFprobe has a 30-second timeout and FFmpeg a 120-second timeout. Output files must be new; failed partial output is retained for diagnosis. Media paths are relative to the Repo root even when the JSON is stored in inputs/.

## Proof status

proofs/same-universe-0.1.4.mp4 is an eight-second, four-turn conversation about leadership. proofs/crossover-0.1.4.mp4 is a six-second, three-turn cross-universe exchange about finding the way home. Headers, cast, script, captions, source video, tones and turn count differ. Both use the same runtime checksum recorded in their receipts and preserve the dialogue-only path. The music test renders another diagnostic input to exercise the optional mix.

The 23 tests cover geometry/text, input/media safety, optional music validation, retained credit, a present quieter bed, preserved dialogue gain, ducking, ending fade and clipping. Builder technical inspections check dimensions, duration, frame rate, H.264 video and AAC audio. verify-proofs checks those stream properties, visible caption pixels, changing caption regions and the expected non-silent tone frequencies in each turn. These numerical checks do not establish speech quality or voice identity.

Sampled output frames were inspected for visible headers, speaker labels, captions and clipping. The user accepted the music preview after requesting its addition. The coding agent cannot receive audio input and does not claim a direct audiovisual score. Historical benchmark approval applies only to testing that interpretation; it is not retroactively relabeled as user blueprint approval. See BENCHMARK.md and FORMAT-REPO.json.

This is a user-accepted baseline, not general-purpose creative-fidelity certification. A separate 18-second Batman/Sonic run exposed the old bitmap typography and drove the 0.1.1 fix. A fresh agent subsequently rendered the original 3:4 Batman/SpongeBob episode on its first attempt without runtime changes. Shorts and music are maintainer refinements, not new unaided or blind-agent claims. The public page displays the example; raw gameplay, separate character clips and private inputs are not distributed in this kit. See BENCHMARK.md for the actual proof scope.
SKILL.md
Open raw file ↗
---
name: character-gameplay-conversations
description: Compose gameplay footage and per-turn character dialogue into vertical Shorts (1080x1920) across three supported sub-formats: 1v1 Debates, Top 5 Countdown Rankings, and Hypothetical Matchup Breakdowns.
---

# Batman Arkham Conversations (v0.3.0)

This Format Kit is built for autonomous AI agents to write, voice, and render high-retention character dialogue Shorts over continuous gameplay footage.

## Official Runtime & Validation

- **Official Renderer:** `runtime/render.mjs` (the passive compositor; never rewrite or duplicate it).
- **Autonomous Topic Scout:** Run `npm run scout` (or `node runtime/scout.mjs [--theme=<keyword>]`) to probe live YouTube search velocity and propose 3 pre-validated Socratic episode hooks with zero API keys.
- **Validation Gate:** Run `node runtime/render.mjs --validate inputs/<episode>.json` before rendering.
- **Unit & Smoke Tests:** Run `npm test` and `npm run smoke` before authoring new episodes.

---

## Editorial Engine & Viral Ideation

### 0. Cold-Start Scouting (`npm run scout`)
Never start by asking the user an open-ended question like *"What should this episode be about?"*
Instead, execute `npm run scout` (or `node runtime/scout.mjs`). It probes real-time YouTube search velocity in $< 250$ms and presents 3 pre-validated concepts across Moral Checkmate, Mundane Logistics, and Tactical Matchups.

Present the 3 choices clearly to the user:
> *"I probed real-time YouTube search velocity and fan debates. Here are the 3 highest-momentum episode concepts right now:*
> 1. **[Concept 1 Title]** — *Hook: [Robin Hook Line]*
> 2. **[Concept 2 Title]** — *Hook: [Robin Hook Line]*
> 3. **[Concept 3 Title]** — *Hook: [Robin Hook Line]*
>
> *Type 1, 2, or 3 to proceed, or drop your own topic!"*

### 0.1 Pre-Synthesis Script Critique (`npm run critique`)
Never send drafted dialogue to voice synthesis or video rendering without testing it through the local Socratic Retention Critique Engine.
Run:
```bash
npm run critique inputs/<episode>.json
```
or test with JSON output:
```bash
node runtime/critique.mjs inputs/<episode>.json --json
```

The engine grades drafted dialogue across the 5 Inviolable Retention Laws:
1. **0–3s In-Media-Res Hook (25 pts):** Strict check for zero idle small talk, character direct address, and immediate conflict in Turn 1.
2. **Forensic & Tactical Density (20 pts):** Enforces concrete metrics, dollar amounts, legal statutes, or biological parameters ($85M Batwings, 40 bpm bradycardia, New Jersey penal code, 14,000 Hz, etc.).
3. **Pacing & 60s Clock Enforcer (20 pts):** Enforces 120–165 word economy (~45–55s) and blocks $>60$s scripts that break the YouTube Shorts limit.
4. **Socratic Surrogate Disbelief (15 pts):** Verifies the audience surrogate vocalizes viewer disbelief at absurdly clinical reasoning (*"Wait, so you're telling me..."*).
5. **Checkmate Punchline Payoff (20 pts):** Flags weak melodramatic closers and rewards deadpan tactical checkmates.

**Quality Gate:** Minimum **85/100** required (`PASS`). Scripts with score $< 85$ (`NEEDS_REVISION` or `CRITICAL_FAIL`) are blocked before voice synthesis to eliminate pre-synthesis waste and API costs.

Think like a viral Shorts creative director. An idea is defined by **1 Visual Layout**, **1 Creative Flavor**, and strict obedience to the **3 Inviolable Hook Laws**.

### 1. The 3 Visual Layouts (Technical Engine)
The renderer only ever composes 3 visual layouts:
1. **The Classic Patrol (80% of episodes):** Two-character dialogue over continuous, seamless Arkham gliding. Fast, zero custom assets needed.
2. **The Universe Breach (Crossovers):** Multi-gameplay routing with scanlines and `assets/sfx/glitch-whoosh.wav` when an outside universe (Spider-Man, Goku, Gojo) cuts in.
3. **The Top 5 Ladder (Rankings):** 5-to-1 left-side ranking ladder with docked thumbnail card reveals (`revealedRanks`, `featuredCard`).

### 2. The 2 Creative Flavors (Ideation Engine)
When scripting dialogue (especially for *The Classic Patrol*), pick one of two proven viral flavors:

- **Flavor A: "Mythology Meets Mundane Reality" (Comedy Goldmine — 5.2M Peak Views)**
  - *Core Tension:* Crash Batman's ultra-serious, mythological persona into gritty, mundane real-world logistics.
  - *Proven Angles:*
    - **Biological:** Not sleeping, peeing in the suit, hiding broken ribs at board meetings (`inputs/how-batman-sleeps.json`).
    - **Bureaucratic / IRS:** Lucius Fox auditing multi-million dollar write-offs for Batmobiles and Kevlar ears.
    - **Gaming Meme / No-Kill:** Robin pointing out that hitting a thug with a 60mph tank breaks the "no-kill rule."
    - **Internet Culture:** Gotham Reddit zooming in on Bruce Wayne's jawline with 40,000 upvotes.
  - *Formula:* Sidekick points out absurdity $\rightarrow$ Batman gives clinical, deadpan rationalization $\rightarrow$ Sidekick comedic disbelief $\rightarrow$ Deadpan punchline.

- **Flavor B: "Deep Lore & Moral Checkmate" (Serious Fan Debates — 767K Peak Views)**
  - *Core Tension:* Two characters in an unyielding ideological deadlock where both sides have a point.
  - *Proven Angles:*
    - **Prep-Time Contingency:** Cold psychological/biochemical plans to take down god-like heroes (Homelander, Superman).
    - **Moral Confrontation:** Jason Todd or Joker grilling Batman on the body count caused by his code (`inputs/batman-vs-the-joker.json`, `inputs/batman-jason-todd.json`).

### 3. The 3 Inviolable Hook Laws
1. **In Media Res Hook (0–3s):** Zero idle small talk. The signature ArkhamStories opener pairs a casual direct address with the provocative question in the **very first breath** (e.g., *"Bruce, serious question: how do you actually survive on no sleep?"* or *"Hey Bruce, quick question: you just hit that thug with an electrified tank, is he alive?"*). Never waste separate turns on polite greeting exchanges (*"Hey Bruce"* $\rightarrow$ *"Yes, Robin?"*). Fire the core question immediately in Turn 1.
2. **Comment Bait:** Always inject an unresolved argument or deadpan logical absurdity that compels viewers to debate in the comments (*"Shattered pelvis is a non-lethal injury"*).
3. **The Hard Clock:** 45–55 seconds total duration (never exceeding 60s); captions max 2 lines of 19 characters each.

### 4. The 4-Stage Socratic Architecture (The 90+ Retention Blueprint)
Blind algorithmic stress-testing proves that every multi-million view hit follows an unbroken 4-stage progression:
1. **Stage 1: Casual In-Media-Res Hook (0–3s):**  
   The audience surrogate (Robin / Peter Parker) drops immediately into a comms conversation with a provocative premise:  
   *"Bruce, serious question: [Topic]?"*
2. **Stage 2: Forensic Socratic Escalation (3–30s):**  
   Deploy **hyper-specific numbers, real science, and operational logistics** rather than comic generalities:  
   - $85M Batwing manufacturing subsidies, 38% commercial real estate ownership, 40 bpm bradycardia, 0.4s synthetic polymer solvent base.  
   - Batman counters every objection with cold, clinical pragmatism.
3. **Stage 3: The Absurdist Realization (30–45s):**  
   The surrogate vocalizes the exact disbelief the viewer is feeling:  
   - *"So while the rest of the world is investing in stocks, you're buying hundred million dollar high-rises just to glue stone gargoyles onto them so you can swing around easier?!"*  
   - *"You park the Batmobile in an alley and force yourself into a 20-minute coma?!"*
4. **Stage 4: Deadpan Comedic Climax / Punchline (45–55s):**  
   A memorable quote or checkmate line that closes the loop and drives massive comment re-quotes:  
   - *"Modern architecture is tactically inefficient, Tim. Someone had to fix it."*  
   - *"Let's just say Alfred's coffee budget is higher than my gadget budget."*

### 5. Banned Script Antipatterns (The Blind-Test Failures)
Blind stress-tests scored generic scripts at under 25/100 retention due to these fatal flaws:
- ❌ **Recycled Movie Clichés:** Banned opening lines like *"Why so serious, Bats?"* or *"If I cross that line..."*. Viewers recognize them as cognitive fatigue within 400ms and swipe away.
- ❌ **The 15-Second Trailer Fragment:** Never write a 4-line, 15-second snippet without escalation or payoff. A viral Short must sustain retention across 45–55s.
- ❌ **Circular Shouting:** Two characters repeating the same binary stalemate without introducing new facts, numbers, or tactical mechanisms.

### 6. The Fandom Excitement Litmus Test (The 3 Rules of Fan Delight)
Algorithmic retention is necessary, but fan excitement is the ultimate litmus test. A viral script must make a fan laugh out loud, screen-record, and send it to their group chat. Every script must satisfy at least one of these 3 rules:
1. **Solve a Decades-Old Comic Absurdity:** Address the unspoken questions fans have had for years (*Why does a modern skyscraper have 14th-century gothic gargoyles? Where does Red Hood get unlimited Wayne Tech weapons? How does Batman sleep on a 24-hour schedule?*).
2. **Expose Bruce Wayne's Unhinged Pragmatism:** Treat extreme superhero vigilantism as cold corporate accounting, municipal zoning, or actuarial risk mitigation (*Leaving default passwords on weapon caches so Jason Todd doesn't buy unstable black-market ammo with a 14% higher civilian casualty rate*).
3. **Subvert Tired Comic Tropes with Real-World Realism:** Never preach the same cliché viewers have heard 1,000 times. Invert the morality debate into an administrative nightmare (*Batman won't kill Joker because an un-deputized execution taints chain-of-custody under New Jersey law and frees 500 inmates on technicalities*).

### 7. Autonomous Pitching Flow
When a user asks for an episode or says "make a video", pitch **3 contrasting angles** before generating:
> *"Here are 3 viral angles for today's episode:*  
> 1. 🩻 **Mundane Comedy:** *Robin asks how Bruce survives 86 hours without sleep.*  
> 2. ⚡ **Universe Breach:** *Batman breaks down how to counter Spider-Sense until Peter Parker drops in.*  
> 3. ⚖️ **Moral Debate:** *Robin asks why Bruce won't kill Joker; Batman reveals the municipal legal nightmare.*  
>  
> *Which one do you want to run with? (Or say 'Surprise me' and I'll produce #1!)"*

---

## Autonomous Decision Matrix

When an agent receives an unguided prompt, route deterministically:

1. **Explicit Keyword Matching:**
   - Prompt contains `sleep`, `bathroom`, `bones`, `taxes`, `irs`, `money`, `bruises`, `kill` $\rightarrow$ **Flavor A: Mundane Reality**
   - Prompt contains `vs`, `who wins`, `crossover`, `spider`, `goku` $\rightarrow$ **Universe Breach**
   - Prompt contains `top`, `rank`, `countdown`, `list` $\rightarrow$ **Top 5 Ladder**
   - Prompt contains `debate`, `joker`, `jason`, `moral`, `confront` $\rightarrow$ **Flavor B: Moral Debate**

2. **Ambiguous Fallback ("Make a video", "Surprise me"):**
   - Inspect existing MP4s in `outputs/`.
   - Apply the **Viral Diversity Rule**: Rotate across **Flavor A $\rightarrow$ Universe Breach $\rightarrow$ Top 5 Ladder $\rightarrow$ Flavor B**. Default to **Flavor A** (highest proven viewer appeal with 5.2M views).

---

## Agent Toolkit (`tools/`)

Use these focused CLI tools to gather assets and synthesize voice lines:

1. **Fetch Card / Thumbnail Image:**
   ```bash
   node tools/fetch-card.mjs "<character or item query>" <output-path.png>
   ```
   *Uses DuckDuckGo's visual index (powered by Bing) + Sharp to download and crop a square card with zero API keys and zero cost.*

2. **Synthesize Voice Line:**
   ```bash
   node tools/synthesize.mjs --speaker="<name or id>" --text="<text>" --output="<output-path.wav>"
   ```
   *Uses Fish Audio's free tier (`s2.1-pro-free`) with built-in voice presets for Batman, Robin, Joker, Jason Todd, Spider-Man, Venom, and others. Outputs duration and provenance JSON.*

3. **Fetch Gameplay Footage:**
   ```bash
   node tools/fetch-gameplay.mjs "<gameplay query>" <output-path.mp4> [--duration=60] [--offset=10]
   ```
   *Fetches clean gameplay clips (e.g. Arkham Knight, Spider-Man 2 PS5) using yt-dlp section cutting.*

---

## Agent Workflow

1. **Decide Sub-Format:** Determine whether the episode is a Debate, a Countdown, or a Matchup Breakdown.
2. **Author Dialogue:** Write punchy, in-character lines (target 45–55s total duration; maximum 60s).
3. **Fetch Assets:** Use `tools/fetch-card.mjs` for any villain cards, ranking thumbnails, or opponent portraits.
4. **Synthesize Audio:** Run `tools/synthesize.mjs` for each dialogue turn.
5. **Format Subtitles:** Subtitles must fit max two lines of 19 characters each (max 38 characters per phrase).
6. **Validate:** Run `node runtime/render.mjs --validate inputs/<episode>.json`.
7. **Render:** Run `node runtime/render.mjs inputs/<episode>.json outputs/<episode>.mp4`.
8. **Inspect:** Extract sample keyframe PNGs via `ffmpeg -ss <time> -i outputs/<episode>.mp4 -frames:v 1 frame.png` and use `view_file` on the extracted PNGs to visually verify layout, typography, cards, glitch effects, and subtitles.
9. **Distribute (Stage 6):** Proactively offer multi-platform distribution in chat. Follow the **Distribution & Social Onboarding Protocol** below to guide setup if needed, present platform-adapted copy for human approval, publish via Buffer MCP (or `runtime/publish.mjs`), and return live post links.

---

## Distribution & Social Onboarding Protocol

When video rendering and keyframe inspection finish, the agent must guide the creator through effortless multi-platform distribution.

### 1. The Post-Render Offer (Always Ask Proactively)
Immediately after presenting the rendered video:
> *"Your video is rendered and ready to watch! 🎬*  
> *Do you want to post this to YouTube, Instagram, or X? (We can blast all three, or just your favorites!)"*

### 2. If the User Says Yes (or Names Platforms)
Check if a social publisher is already configured (e.g. Buffer MCP tools are active or `BUFFER_API_KEY` is present in the environment).

#### Case A: First-Time User (Not Connected Yet)
Deliver the 3-minute, zero-jargon setup guide:
> **⏱️ Time required:** ~3 minutes (one time only!)  
> **💡 Why it's worth it:** You spend 3 minutes connecting your channels once, and every video you ever create with Wiggly can be published automatically with one click forever.
>
> **Baby Steps:**
> 1. Go to **[buffer.com](https://buffer.com)** (it's 100% free) and sign up or log in.
> 2. Click **Connect Channel** to link whichever accounts you want to post to (YouTube, Instagram, and/or X/Twitter).
> 3. Go to **[buffer.com/manage/apps](https://buffer.com/manage/apps)** and create an API Key (or connect the Buffer MCP server in your agent settings).
>
> Once that's done, just tell me **"I'm back"** and I'll take it from there!

#### Case B: Connected (or User Says "I'm back")
Draft tailored copy directly in chat from the episode's hook, characters, and dialogue (no manual JSON editing needed from the user):
- **YouTube Shorts:** High-CTR title with hook (<100 chars), `#Shorts`, 3–4 hashtags, concise description.
- **Instagram Reels:** Attention-grabbing caption with clean spacing and 3–5 niche hashtags (`#batman #gaming #arkhamknight`).
- **X (Twitter):** Viral quote, debate question, or hook under 280 characters.

Present the preview clearly:
> *"Here is what I'll post to your channels:*  
> *🔴 **YouTube Shorts:** [Title & Description]*  
> *🟣 **Instagram Reels:** [Caption]*  
> *⚪ **X / Twitter:** [Post Text]*  
> 
> *Ready to publish? Say **'Go'** or let me know if you'd like any tweaks!"*

### 3. Publication & Receipt Delivery
Once the user gives the green light ("Go", "Yes", "Looks good"):
1. Call Buffer MCP `create_post` (or run `node runtime/publish.mjs inputs/distribution.json outputs/<episode>.mp4`).
2. Write the live results to `outputs/<episode>.distribution.json`.
3. Deliver the clickable live links directly in chat:
   > *"🚀 Live on all platforms!*  
   > *- 🔴 **YouTube Shorts:** <url>*  
   > *- 🟣 **Instagram Reels:** <url>*  
   > *- ⚪ **X / Twitter:** <url>*  
   > 
   > *Local master video is saved at `outputs/<episode>.mp4`."*

---

## Behavioral Guardrails (The Human Factor)

- **Confused / Non-Technical Users ("What is Buffer?", "Where do I click?"):**  
  Explain in plain English without developer jargon. If they get stuck, give them only **one** micro-action at a time.
- **Off-Topic / Distracted Users ("Did you see the new Batman trailer?", "What model are you?"):**  
  Respond warmly and conversationally in 1–2 sentences, then gently tether back:  
  *"By the way, whenever you're ready, we can still post that episode to your socials—just say the word!"*
- **Frustrated / Overwhelmed Users ("Ugh this is too much work", "Never mind", "Just give me the video"):**  
  De-escalate immediately with zero guilt or friction:  
  *"No problem at all! You don't have to set anything up. Your video is already saved at `outputs/<episode>.mp4`—you can download it and post it manually whenever you like."*
- **Selective Users ("Just post to Twitter", "Only YouTube"):**  
  Respect their choice instantly. Never push them to connect or publish to platforms they didn't ask for.


requirements.json
Open raw file ↗
{
  "schemaVersion": 1,
  "localTools": [
    "Node.js >=22",
    "npm (for pinned Sharp 0.34.5 dependencies)",
    "FFmpeg with libx264, AAC, overlay, scale, crop, pad, concat, afade, sidechaincompress, amix and alimiter filters",
    "FFprobe"
  ],
  "providers": [
    {
      "name": "Social Publisher (Buffer MCP or API)",
      "environmentVariables": ["BUFFER_API_KEY"],
      "optional": true,
      "purpose": "Simultaneous headless publishing to YouTube Shorts, Instagram Reels, TikTok, and X."
    }
  ],
  "paidApprovalRequired": true,
  "automaticInstallation": false,
  "notes": [
    "Run npm ci --ignore-scripts --no-audit --no-fund once to install pinned Sharp 0.34.5 dependencies; setup requires network access but rendering does not.",
    "Arial/Helvetica/sans-serif fonts are resolved on the host; inspect typography on each new platform. No model or font download is required.",
    "All real gameplay and per-turn audio must be explicitly supplied and authorized; no voice cloning is implemented.",
    "Bundled diagnostic video and sine tones are original mechanical fixtures only.",
    "Optional music must be authorized and long enough for the episode. See MUSIC-CREDITS.md for details on the bundled Yeat instrumental bed.",
    "Only the available macOS environment was tested."
  ]
}
pipeline.json
Open raw file ↗
{
  "stages": [
    {
      "id": "check-and-smoke",
      "output": "Check the local tools, install pinned dependencies, and run the free two-input smoke before starting an episode."
    },
    {
      "id": "scout-topics",
      "output": "Probe live YouTube search velocity and Google Trends for three pre-validated viral Socratic hooks with zero API keys."
    },
    {
      "id": "choose-the-conversation",
      "output": "Choose a same-universe cast or a crossover, then approve the script, title and question.",
      "approvalRequired": true
    },
    {
      "id": "critique-script",
      "output": "Run the deterministic 5-stage Socratic retention linter on drafted dialogue before voice synthesis to guarantee 85+ quality and eliminate pre-synthesis waste with zero API costs."
    },
    {
      "id": "supply-gameplay-and-voices",
      "output": "Provide one authorized gameplay file and one audio file per dialogue turn. Optionally choose the credited background bed or supply another authorized music file. This release does not download gameplay or generate voices."
    },
    {
      "id": "prepare-captions",
      "output": "The coding agent prepares speaker assignments, measured turn durations and phrase timestamps. Review synchronization against the actual speech."
    },
    {
      "id": "render-and-inspect",
      "output": "Use the unchanged official compositor, inspect the MP4 and receipt, then watch and listen before accepting the result.",
      "approvalRequired": true
    },
    {
      "id": "distribute-episode",
      "output": "Author platform-tailored copy for YouTube Shorts, Instagram Reels, TikTok, and X, present for review, and dispatch to connected channels via runtime/publish.mjs. Writes live receipts to outputs/episode.distribution.json.",
      "approvalRequired": true
    }
  ]
}
assets.json
Open raw file ↗
{
  "fixed": [
    {
      "path": "MUSIC-CREDITS.md",
      "label": "Music attribution and source",
      "purpose": "Full composer credit, source and license links, modification notes, and publishing requirements."
    },
    {
      "path": "inputs/same-universe.json",
      "label": "Same-universe starter",
      "purpose": "Four-turn input example with original diagnostic video and tones."
    },
    {
      "path": "inputs/crossover.json",
      "label": "Crossover starter",
      "purpose": "Three-turn input example with a different cast, clip and audio tones."
    }
  ],
  "sourceReference": {
    "verification": "The ZIP includes original diagnostic assets and both local smoke proofs. The finished Batman/SpongeBob example is viewable on this page; raw gameplay and separate voice clips are not distributed in the ZIP.",
    "referenceNote": "Created from user-assisted analysis of the Batman reference. After requesting Shorts layout and music, the user accepted the music preview: cool looks good to me. No detailed audiovisual score or agent hearing claim is provided."
  }
}
quality.json
Open raw file ↗
{
  "automatedChecks": [
    "Run all 23 contract/music tests and the two-input free smoke from a clean download.",
    "Check music authorization/duration/gain, retained attribution, a present quieter bed, preserved dialogue level, ending fade and clipping protection.",
    "Validate cast/universe rules, authorized local media paths, measured durations and caption coverage before rendering.",
    "Verify 1080 × 1920 (9:16), square pixels, 25 fps H.264/AAC output, visible caption pixels and supplied audio in the diagnostic proofs.",
    "Keep the official runtime unchanged when replacing content."
  ],
  "creativeReview": [
    "Watch and listen to the entire real episode; check character performance, intelligibility, pacing, caption/speech synchronization and music balance.",
    "Record direct review separately from technical checks. Publication approval is not an invented quality score.",
    "Do not use synthetic video or tones as the finished real episode."
  ],
  "limits": [
    "This baseline requires supplied gameplay and per-turn audio; no automatic acquisition, voice generation or transcription.",
    "Output is 9:16 vertical at 1080 × 1920; ASCII captions and up to 60 seconds. Gameplay is center-cropped, never stretched.",
    "Music is optional and supplied locally; no song identification, music generation, visual character animation or automatic speech alignment."
  ]
}
goldens.json
Open raw file ↗
{
  "purpose": "The user accepted the Batman/SpongeBob 9:16 music preview. It retains the supplied footage, dialogue and timing; optional music uses the same compositor. Diagnostic proofs separately test execution.",
  "examples": [
    {
      "id": "batman-spongebob",
      "title": "Gotham Meets Optimism",
      "role": "9:16 Shorts · dialogue + quiet music",
      "whyItWorks": [
        "The original 3:4 episode passed blind-agent execution. This 1080 × 1920 revision reuses its exact input, gameplay and six audio clips through the revised official layout.",
        "23 contract/music tests passed, including ducking, preserved dialogue level, fading and credit. The user accepted the playable music preview. The release preserves its video, source clips, mix settings and timing; PUBLICATION.json records the small AAC tail difference."
      ],
      "knownWeaknesses": [
        "Gameplay and six voice clips were prepared before handoff; acquisition and voice generation are not in this release.",
        "The Shorts layout is a maintainer refinement, not a new unaided authoring or blind-agent claim.",
        "User accepted the preview qualitatively; no numerical voice-performance score or agent direct-hearing claim is provided."
      ]
    },
    {
      "id": "two-input-smoke",
      "title": "Same universe + crossover",
      "role": "Original diagnostic fixtures",
      "whyItWorks": [
        "Two different scripts, casts, video sources and audio sequences use the same official renderer.",
        "All assets for these free local checks ship in the ZIP."
      ],
      "knownWeaknesses": [
        "Diagnostic tones are not character speech; these checks do not establish creative fidelity."
      ]
    }
  ]
}
AGENTS.md
Open raw file ↗
# Character Gameplay Conversations

Read SKILL.md in this folder before using or changing this Format. It is the canonical workflow. Keep one official runtime, preserve the input contract, retain explicit supplied-media authorization/provenance, and keep pending creative review visible.
BENCHMARK.md
Open raw file ↗
# Character Gameplay Conversations — evidence and history

## Background music and user acceptance — 0.1.4

After requesting background music and receiving the playable 17-second music preview, the user said “cool looks good to me,” then explicitly asked to finish this goal. This records qualitative acceptance of the refined baseline. It does not invent a detailed per-channel rubric, direct hearing by the agent, or independent identification of the source song.

The same official compositor now accepts optional authorized local music, validates its duration and gain, lowers/ducks it beneath speech, fades the ends, limits clipping and carries attribution in the receipt and MP4 metadata. No new dependency, alternate renderer, voice generation or paid call. The bundled alternative is “Dark Fog” by Kevin MacLeod, CC BY 4.0; see MUSIC-CREDITS.md. The user was told it is not the identified original track.

All 23 contract/music tests passed. Both no-music diagnostic proofs retain their exact 0.1.3 output hashes, proving the optional feature does not alter that path. The music integration test independently measures the quiet bed, preserved dialogue gain, ducking, ending fade, clipping protection and credit. Runtime SHA-256: `bb19667f291641111eb07388aab9be887ef365a4a84c0d0543d60b65f4b396b1`.

Accepted preview SHA-256: `becf9b97e74e3fdc725a14fcf9f9350159d200bb8f05d6b3c005b37dae18c767`. Release SHA-256: `a0082108fa53e6be6cc6494fff070a87846d6d832708c09ae35be32df0a900de`, 16.76 seconds, 1080×1920. The release adds MP4 credit metadata and uses the exact same sources/settings. Decoded video matches exactly (`026759f69d65e02e361c3cc451e161cb3886ccf9e68008084b7ab4c9ee395a34`); audio is sample-identical until 16.704 seconds. Tiny final AAC-tail differences yield 87.18 dB signal-to-error ratio, maximum absolute sample difference 0.000507 and RMS error 0.000002045. This is not falsely recorded as byte-identical audio. No additional creative generation or substitution occurred.

The older records below retain their then-pending review status as history; user acceptance above supersedes that pending baseline decision. Fresh-agent proof claims remain tied to their actual historical versions, not relabeled as new 0.1.4 blind runs.

## Shorts layout update — 0.1.3

The user clarified that this is for Shorts. The same official FFmpeg/Sharp compositor now renders a 1080×1920 (9:16) canvas with proportionally scaled, center-cropped gameplay and repositioned text. This changes layout, not the footage, dialogue, timing or voice assets. Runtime SHA-256: `dd9e6571260b719b3088b9508ae16296bb07476796eed72f184b54acb1145fa6`.

All 12 contract tests passed. Both distinct diagnostic inputs rendered at 1080×1920 with square pixels and passed numerical caption/audio checks. Their output hashes are `e38117ce661ba51d0786388d1fded4e9174a54cd1a989da64330e050aed73411` (same-universe, 8 seconds) and `ea9ac93ea4cd4db86f877c7c661c51a854b075da6ef4e29c67678e9f5df713ae` (crossover, 6 seconds). Current receipts and technical inspections ship beside these two 0.1.3 proofs.

The maintainer re-rendered the real Batman/SpongeBob episode through this layout: 16.76 seconds, 1080×1920, 25 fps, H.264/AAC, SHA-256 `5f3e53171e9b6e5dc079917e605b101c142aa179628ccb58b9ea05b0054ba812`. Its input, gameplay, six voice-clip hashes and duration exactly match the original blind-consumer run. Full decoding passed, and 16 sampled frames were inspected for framing and readable text. No media generation occurred. This layout revision is not a new blind-agent run or a direct audiovisual creative pass.

Historical 0.1.1 and 0.1.2 archives and the original displayed 3:4 output are preserved. The records below describe those versions, not the current 9:16 geometry.

## Public baseline update — 0.1.2

The user requested publication after being shown the 16.76-second Batman/SpongeBob example. Version 0.1.2 adds public-page contracts, agent/version entrypoints and a one-command smoke wrapper; the official runtime remains byte-for-byte unchanged from 0.1.1. This request authorizes publication, not an invented direct audiovisual score. Detailed voice, pacing and caption synchronization review remains unrecorded.

The completed independent consumer used the frozen 0.1.1 ZIP, a new brief, independent Arkham footage and six supplied dialogue clips. It rendered successfully on its first attempt without coaching or package edits. All 11 tests, two diagnostic proofs, full output decoding and 18 sampled caption frames passed. Output: 16.76 seconds, 480 × 640, 25 fps H.264/AAC; SHA-256 `63de842509644808f9e519818ad9bba7a483cdef7d33e2a8c951fd2d796d5dff`. Twelve total free-model voice clips were prepared across the two real episodes; no generation was needed for publication.

The historical notes below predate this consumer result. Their then-pending blind execution status is superseded by this update; their direct-perception limits remain valid.

## Historical authoring record

The original 0.1.0 author worked only from the extracted Wiggly Repo Builder instructions, private reference evidence/transcript and user-supplied context. That initial synthetic proof used no provider, dependency install, or network call. Version 0.1.1 is a maintainer refinement after a separate real-media run, not a new unaided authoring claim. It adds pinned Sharp 0.34.5 for readable text through the same official renderer. Dependency installation and gameplay acquisition used network access; six new voice clips used the explicitly authorized free Fish model. No paid test generation occurred.

The initial analysis missed the fan-character/cloned-voice creative hook and over-constrained a comparison exchange into an abstract six-turn flight recipe. The user supplied the correct context. The blueprint was revised to disclose that attribution and tested under benchmark attestation only. The previous interpretation is not presented as a successful independent discovery.

The approved benchmark blueprint SHA-256 is bacd3948df9a2de105e61add25bff27707c983a9bf02abb5d8a500f0cb437a16. User approval is false and creative approval is false. Private evidence and approval history are excluded from this release.

Historical 0.1.1 official runtime SHA-256:
23a39095a50150d67930b5d8b318481f422fdc772dc41e38e12971aceb30f929

Original 0.1.0 runtime SHA-256, retained in historical evidence:
9c660fecfb0f8055bd2558c4b82a5de6eb5c7704a1a766392844898fb2acbe0b

Exact final author commands, from this Repo root:

```sh
npm ci --ignore-scripts --no-audit --no-fund
node runtime/render.mjs inputs/same-universe.json proofs/same-universe-0.1.1.mp4
node runtime/render.mjs inputs/crossover.json proofs/crossover-0.1.1.mp4
node --test tests/contract.test.mjs
node tests/verify-proofs.mjs proofs/same-universe-0.1.1.mp4 proofs/crossover-0.1.1.mp4
```

Both 0.1.1 renders succeeded with that identical runtime. The first output is 8 seconds; the second is 6 seconds. Both have 480x640 H.264 video at 25 fps and mono AAC audio at 48 kHz. Stream inspection receipts are packaged beside them. Eleven contract tests passed; the numerical integration checks found visible caption pixels and expected tone frequencies, within 2 Hz of each target. The text-margin test first rejected approximate width fitting; measuring rendered glyph bounds and fitting to a 436-pixel safe width fixed it.

A preliminary first proof was retained privately before the final media-protocol/time-limit hardening and argument-receipt correction. Both final proofs were rerun after those fixes. No FFmpeg render or technical-inspection failure occurred. An authoring apply_patch invocation was rejected because it attempted two operations on the same blueprint; it was corrected without changing evidence.

Original generated diagnostic video and tone assets exercise the actual supplied-file decoder/compositor path. They are not gameplay, speech, character voices, or evidence of successful voice cloning.

## Private real-media run, 2026-09-06

The maintainer supplied a new Batman/Sonic exchange about speed versus planning, six newly generated `s2.1-pro-free` clips from existing character presets, and gameplay from the user's independent Arkham source: https://www.youtube.com/watch?v=k-T-stiSYgw. The 40–70-second source excerpt was downloaded using a checksum-verified isolated yt-dlp 2026.08.19. The older 2026.07.04 client's media requests returned 403 on the user's Spider-Man link; the newer version succeeded for both Spider-Man and Batman links. No browser cookies or paid service were used for acquisition.

The original 18-second render used a cropped reference video and visibly crude bitmap text. Its typography-only rerender reused the exact input/audio with 0.1.1. A third render substituted independent gameplay through input data with no further renderer changes. The independent output SHA-256 is `7d216486452562520188633de5df6900615734c7cb47e18448628050d6b0a96a`; gameplay SHA-256 is `85bd549fe77b8f7760060fa7fab15b5ea1606efcf91e9c9c1baf90a0dec832eb`. It is 18 seconds, 480×640, 25fps H.264/AAC, using the current runtime checksum above.

Sampled frames show the persistent header, outlined captions, speaker labels and real gameplay. Automated full-file decoding completed, no one-second freeze was detected in the gameplay area at -50dB, and a 0.78025-second interval below -40dB was detected in the speech track at 15.610521–16.390771 seconds. That pause is not automatically a defect or a pacing pass; it needs listening review. Caption timing is estimated from phrase length, not forced-aligned speech. No direct moving-video/audio perception or voice-recognition judgment is claimed.

Private copyrighted gameplay and generated character clips are excluded from the release. This is stronger real-media integration evidence than synthetic fixtures, but not a blind-consumer or creative-fidelity pass. The independent real-media blind-agent run and direct audiovisual acceptance remain pending.
blueprint.json
Open raw file ↗
{
  "schemaVersion": 1,
  "slug": "character-gameplay-conversations",
  "title": "Character Gameplay Conversations",
  "referenceSha256": "e7a0651f873f6ca0439cba6007d32a98249e79491971c8ca233a9acb6bbdb9c2",
  "summary": "Fictional characters converse over supplied gameplay with a persistent title/question header and timed dialogue captions. USER-PROVIDED CONTEXT: the creative hook is fan-favorite fictional characters with cloned voices, in same-universe conversations or fan-dream crossovers, over Batman Arkham Knight or Spider-Man 2 gameplay. The independent sampled-frame/transcript analysis initially identified only header/gameplay/captions/dialogue and missed that hook. This child composes supplied authorized media; it neither generates nor verifies recognizable voices. Included original characters, diagnostic video and tones are mechanical proofs only.",
  "observations": [
    {
      "id": "layout",
      "atSeconds": 0,
      "description": "A white header occupies approximately the top 136 of 640 pixels; red comparison text and black question sit above third-person game imagery. A white caption appears near y=465.",
      "channel": "visual",
      "basis": "frame"
    },
    {
      "id": "persistent",
      "atSeconds": 55.807583,
      "description": "The same title/question header and outlined white caption treatment persist near the end, above changed game imagery.",
      "channel": "visual",
      "basis": "frame"
    },
    {
      "id": "dialogue",
      "atSeconds": 0,
      "description": "Uncertain local transcript begins with a direct comparison question addressed to a character and continues as a conversational exchange.",
      "channel": "audio",
      "basis": "local-transcript"
    },
    {
      "id": "reframe",
      "atSeconds": 23.1,
      "description": "Uncertain transcript distinguishes measured capability from its practical application and closes with a contrast in how it is used.",
      "channel": "audio",
      "basis": "local-transcript"
    }
  ],
  "rules": [
    {
      "id": "layout",
      "description": "480x640 portrait output retains a white 136-pixel title/question header above supplied continuous video, with outlined white captions over the video.",
      "classification": "fixed",
      "observationIds": [
        "layout",
        "persistent"
      ],
      "reasoning": "Repeated sampled frames support persistent spatial hierarchy. Dimensions and bitmap typography are scoped implementation choices; exact typography is unproved."
    },
    {
      "id": "conversation",
      "description": "At least two named fictional characters exchange 2-12 supplied audio turns with explicit caption timing and a shared topic.",
      "classification": "fixed",
      "observationIds": [
        "dialogue",
        "reframe"
      ],
      "reasoning": "Transcript supports dialogue; USER-PROVIDED CONTEXT supplies the fictional-character and cloned-voice creative hook. The runtime requires audio for every turn but cannot judge whether it is the correct character voice."
    },
    {
      "id": "cast-topic",
      "description": "Replace cast, universe metadata, same-universe/crossover mode, topic, dialogue, timing, header, gameplay and per-turn audio without changing renderer code.",
      "classification": "variable",
      "observationIds": [
        "layout",
        "dialogue"
      ],
      "reasoning": "USER-PROVIDED CONTEXT explicitly allows same-universe characters and fan-dream crossovers, with Batman Arkham Knight or Spider-Man 2 gameplay examples. The specific comparison-question arc is not imposed as universal."
    },
    {
      "id": "gameplay",
      "description": "Require an explicitly authorized local video and audio clip for every turn. Gameplay must cover the conversation duration; original soundtrack is omitted so supplied dialogue is the sole output audio.",
      "classification": "fixed",
      "observationIds": [
        "layout",
        "persistent",
        "dialogue"
      ],
      "reasoning": "Continuous imagery beneath dialogue is observed. Muting source audio is an explicit limited implementation choice. No fallback video, silent narration, provider generation, or automatic download is supported."
    },
    {
      "id": "cadence",
      "description": "Caption phrases and pauses vary through explicit per-turn timestamps; speaker labels above captions help inspect supplied cast assignments.",
      "classification": "variable",
      "observationIds": [
        "layout",
        "persistent",
        "dialogue"
      ],
      "reasoning": "Phrase treatment is sampled; exact word timing and speakers are not independently established. Small speaker labels are an implementation aid, not claimed source fidelity."
    },
    {
      "id": "unsupported",
      "description": "Voice cloning, recognizable character performance, game acquisition, exact cinematic/typographic fidelity, synchronized visual acting and creative acceptance remain unsupported or pending.",
      "classification": "unsupported",
      "observationIds": [
        "layout",
        "dialogue"
      ],
      "reasoning": "No direct moving-video or audio review occurred. User context is not evidence of successful voice generation. Mechanical fixtures cannot establish actual gameplay or cloned-voice fidelity."
    }
  ],
  "inputs": [
    {
      "name": "header.title",
      "type": "string",
      "description": "Visible persistent title, maximum 25 supported ASCII characters."
    },
    {
      "name": "header.question",
      "type": "string",
      "description": "Visible persistent question, maximum 36 supported ASCII characters."
    },
    {
      "name": "topic",
      "type": "string",
      "description": "Episode topic kept in the input for authoring context; title/question carry the visible promise."
    },
    {
      "name": "cast",
      "type": "array",
      "description": "2-6 members with id, name and universe; names become visible speaker labels."
    },
    {
      "name": "castMode",
      "type": "string",
      "description": "same-universe requires one shared universe; crossover requires at least two."
    },
    {
      "name": "gameplay",
      "type": "asset",
      "description": "Repo-root relative file, authorized:true and provenance. Video duration must cover all turns; file is limited to 100 MB."
    },
    {
      "name": "turns",
      "type": "array",
      "description": "2-12 ordered turns, at least two speakers, with text, durationSeconds, required authorized per-turn audio file/provenance and captions with text/start/end seconds relative to turn. Output maximum 60 seconds."
    }
  ],
  "runtime": {
    "approach": "One standalone Node.js entrypoint validates inputs and supplied media using FFprobe, streams minimal bitmap header/caption RGBA overlays to FFmpeg, and composites the supplied video plus concatenated turn audio to H.264/AAC. No app source, renderer dependency, package install, model, provider or network call. All FFprobe and FFmpeg inputs allow only file and pipe protocols; media files are bounded and subprocesses timed out.",
    "entrypoint": "runtime/render.mjs"
  },
  "review": {
    "visual": "sampled-frames",
    "audio": "transcript-only",
    "limitations": [
      "Current completing author inspected sampled frames at 0 and 55.807583 seconds and read the uncertain machine transcript; no direct moving-video or source-audio perception occurred.",
      "Initial independent interpretation missed the fictional-character/cloned-voice creative hook. The corrected hook and gameplay examples came from the user and are not presented as independent discovery.",
      "Bundled synthetic diagnostic videos and four original tone WAVs test real supplied-file decoding/composition, caption changes and audio turn routing. They do not test actual gameplay, speech, voice cloning, or reference fidelity.",
      "Bitmap typography, crop policy, caption cadence, source-audio muting and small speaker labels require human creative review. The source emoji is omitted.",
      "Benchmark attestation is authorized; neither blueprint user approval nor finished-output creative approval is claimed."
    ]
  },
  "assets": [
    {
      "path": "assets/warm.mp4",
      "source": "Original locally generated FFmpeg diagnostic pattern",
      "usage": "original",
      "notes": "Distributable mechanical video fixture, not gameplay or a reference derivative."
    },
    {
      "path": "assets/cool.mp4",
      "source": "Original locally generated FFmpeg diagnostic pattern",
      "usage": "original",
      "notes": "Distributable mechanical video fixture, not gameplay or a reference derivative."
    },
    {
      "path": "assets/low.wav",
      "source": "Original locally generated sine tone",
      "usage": "original",
      "notes": "Distributable mechanical audio fixture, not speech, a character voice or a voice clone."
    },
    {
      "path": "assets/high.wav",
      "source": "Original locally generated sine tone",
      "usage": "original",
      "notes": "Distributable mechanical audio fixture, not speech, a character voice or a voice clone."
    },
    {
      "path": "assets/bright.wav",
      "source": "Original locally generated sine tone",
      "usage": "original",
      "notes": "Distributable mechanical audio fixture, not speech, a character voice or a voice clone."
    },
    {
      "path": "assets/soft.wav",
      "source": "Original locally generated sine tone",
      "usage": "original",
      "notes": "Distributable mechanical audio fixture, not speech, a character voice or a voice clone."
    }
  ],
  "proofs": [
    {
      "id": "same-universe",
      "description": "Four two-second turns between original SKYPORT characters ION and EMBER about leadership and listening; original warm diagnostic video and alternating 220/440 Hz tones."
    },
    {
      "id": "crossover",
      "description": "Three two-second turns between original SKYPORT character EMBER and PAPER SEA character QUILL about navigating home after a storm; a different original diagnostic video, 660/330 Hz tones and a mid-turn caption change."
    }
  ]
}
CLAUDE.md
Open raw file ↗
# Agent entrypoint

Read `SKILL.md` and follow the single packaged workflow. Report the version in `KIT-MANIFEST.json` before intake. Use the official runtime; do not rebuild it.
FORMAT-REPO.json
Open raw file ↗
{
  "schemaVersion": 1,
  "kind": "wiggly-format",
  "slug": "character-gameplay-conversations",
  "version": "0.3.0",
  "status": "ready-for-review",
  "runtime": "runtime/render.mjs",
  "releaseFiles": [
    ".gitignore",
    "CLAUDE.md",
    "KIT-MANIFEST.json",
    "format.json",
    "pipeline.json",
    "quality.json",
    "assets.json",
    "goldens.json",
    "PUBLICATION.json",
    "tests/smoke.mjs",
    "SKILL.md",
    "AGENTS.md",
    "README.md",
    "BENCHMARK.md",
    "requirements.json",
    "blueprint.json",
    "FORMAT-REPO.json",
    "runtime/render.mjs",
    "runtime/generate.mjs",
    "runtime/publish.mjs",
    "runtime/scout.mjs",
    "runtime/critique.mjs",
    "tools/fetch-card.mjs",
    "tools/fetch-gameplay.mjs",
    "tools/synthesize.mjs",
    "assets/sfx/glitch-whoosh.wav",
    "tests/make-fixtures.mjs",
    "tests/contract.test.mjs",
    "tests/music.test.mjs",
    "tests/distribution.test.mjs",
    "tests/scout.test.mjs",
    "tests/critique.test.mjs",
    "MUSIC-CREDITS.md",
    "tests/verify-proofs.mjs",
    "inputs/same-universe.json",
    "inputs/crossover.json",
    "inputs/distribution.json",
    "inputs/how-rich-is-batman.json",
    "inputs/why-batman-subsidizes-red-hood.json",
    "inputs/why-batman-wont-kill-joker.json",
    "assets/warm.mp4",
    "assets/cool.mp4",
    "assets/low.wav",
    "assets/high.wav",
    "assets/bright.wav",
    "assets/soft.wav",
    "proofs/same-universe-0.1.4.mp4",
    "proofs/same-universe-0.1.4.mp4.receipt.json",
    "proofs/same-universe-0.1.4-inspection.json",
    "proofs/crossover-0.1.4.mp4",
    "proofs/crossover-0.1.4.mp4.receipt.json",
    "proofs/crossover-0.1.4-inspection.json",
    "package.json",
    "package-lock.json"
  ],
  "assets": [
    {
      "path": "assets/sfx/glitch-whoosh.wav",
      "source": "Synthesized digital glitch whoosh transition audio fixture",
      "usage": "original",
      "notes": "Short 0.16s digital whoosh SFX used for camera transitions and intro cuts."
    },
    {
      "path": "assets/warm.mp4",
      "source": "Original locally generated FFmpeg diagnostic pattern",
      "usage": "original",
      "notes": "Distributable mechanical video fixture, not gameplay or a reference derivative."
    },
    {
      "path": "assets/cool.mp4",
      "source": "Original locally generated FFmpeg diagnostic pattern",
      "usage": "original",
      "notes": "Distributable mechanical video fixture, not gameplay or a reference derivative."
    },
    {
      "path": "assets/low.wav",
      "source": "Original locally generated sine tone",
      "usage": "original",
      "notes": "Distributable mechanical audio fixture, not speech, a character voice or a voice clone."
    },
    {
      "path": "assets/high.wav",
      "source": "Original locally generated sine tone",
      "usage": "original",
      "notes": "Distributable mechanical audio fixture, not speech, a character voice or a voice clone."
    },
    {
      "path": "assets/bright.wav",
      "source": "Original locally generated sine tone",
      "usage": "original",
      "notes": "Distributable mechanical audio fixture, not speech, a character voice or a voice clone."
    },
    {
      "path": "assets/soft.wav",
      "source": "Original locally generated sine tone",
      "usage": "original",
      "notes": "Distributable mechanical audio fixture, not speech, a character voice or a voice clone."
    }
  ],
  "proofs": [
    {
      "id": "same-universe",
      "input": "inputs/same-universe.json",
      "output": "proofs/same-universe-0.1.4.mp4",
      "inspection": "proofs/same-universe-0.1.4-inspection.json"
    },
    {
      "id": "crossover",
      "input": "inputs/crossover.json",
      "output": "proofs/crossover-0.1.4.mp4",
      "inspection": "proofs/crossover-0.1.4-inspection.json"
    }
  ],
  "review": {
    "status": "approved",
    "reviewer": "User",
    "notes": "After requesting background music and receiving the playable music preview, the user said: cool looks good to me. This records qualitative baseline acceptance, not an invented per-channel score or agent hearing claim. The reference interpretation was user-assisted; Shorts/music are maintainer refinements of the original blind-agent episode. The chosen bed is an alternative, not the original song."
  }
}
format.json
Open raw file ↗
{
  "id": "character-gameplay-conversations",
  "name": "Batman Arkham Conversations",
  "title": "Batman Arkham Conversations",
  "version": "0.3.0",
  "kind": "video",
  "status": "public-baseline",
  "description": "Fan-favorite characters trade lines over real gameplay in 1080 × 1920 vertical Shorts. Supply your clips and dialogue audio; add optional background music beneath the voices.",
  "runtime": "runtime/render.mjs",
  "entrypoint": "SKILL.md",
  "qualityContract": "quality.json"
}
KIT-MANIFEST.json
Open raw file ↗
{
  "schemaVersion": 1,
  "kit": "character-gameplay-conversations",
  "version": "0.3.0",
  "runtime": "runtime/render.mjs",
  "runtimeSha256": "bb19667f291641111eb07388aab9be887ef365a4a84c0d0543d60b65f4b396b1",
  "publication": "user-requested-public-baseline",
  "creativeReview": "user-accepted-music-preview; no-agent-audiovisual-score"
}
MUSIC-CREDITS.md
Open raw file ↗
# Background music credit

**Yeat — "If We Being Real" (Instrumental)**

- Bundled file: `assets/audio/yeat-if-we-being-real.mp3`
- Excerpt: instrumental starting at 0:28
- Changes: trimmed to dialogue duration, volume reduced to 0.12, ducked beneath speech, faded in/out at start and end.

When publishing a video using this bed, include appropriate credit in the video description.
The `music.attribution` field is retained in the output receipt and MP4 comment metadata.
package-lock.json
Open raw file ↗
{
  "name": "character-gameplay-conversations",
  "version": "0.3.0",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "character-gameplay-conversations",
      "version": "0.3.0",
      "dependencies": {
        "sharp": "0.34.5"
      },
      "engines": {
        "node": ">=22"
      }
    },
    "node_modules/@emnapi/runtime": {
      "version": "1.11.3",
      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz",
      "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==",
      "license": "MIT",
      "optional": true,
      "dependencies": {
        "tslib": "^2.4.0"
      }
    },
    "node_modules/@img/colour": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
      "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
      "license": "MIT",
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@img/sharp-darwin-arm64": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
      "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
      "cpu": [
        "arm64"
      ],
      "license": "Apache-2.0",
      "optional": true,
      "os": [
        "darwin"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-libvips-darwin-arm64": "1.2.4"
      }
    },
    "node_modules/@img/sharp-darwin-x64": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
      "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
      "cpu": [
        "x64"
      ],
      "license": "Apache-2.0",
      "optional": true,
      "os": [
        "darwin"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-libvips-darwin-x64": "1.2.4"
      }
    },
    "node_modules/@img/sharp-libvips-darwin-arm64": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
      "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
      "cpu": [
        "arm64"
      ],
      "license": "LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "darwin"
      ],
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-libvips-darwin-x64": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
      "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
      "cpu": [
        "x64"
      ],
      "license": "LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "darwin"
      ],
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-libvips-linux-arm": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
      "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
      "cpu": [
        "arm"
      ],
      "libc": [
        "glibc"
      ],
      "license": "LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "linux"
      ],
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-libvips-linux-arm64": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
      "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
      "cpu": [
        "arm64"
      ],
      "libc": [
        "glibc"
      ],
      "license": "LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "linux"
      ],
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-libvips-linux-ppc64": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
      "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
      "cpu": [
        "ppc64"
      ],
      "libc": [
        "glibc"
      ],
      "license": "LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "linux"
      ],
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-libvips-linux-riscv64": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
      "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
      "cpu": [
        "riscv64"
      ],
      "libc": [
        "glibc"
      ],
      "license": "LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "linux"
      ],
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-libvips-linux-s390x": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
      "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
      "cpu": [
        "s390x"
      ],
      "libc": [
        "glibc"
      ],
      "license": "LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "linux"
      ],
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-libvips-linux-x64": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
      "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
      "cpu": [
        "x64"
      ],
      "libc": [
        "glibc"
      ],
      "license": "LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "linux"
      ],
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
      "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
      "cpu": [
        "arm64"
      ],
      "libc": [
        "musl"
      ],
      "license": "LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "linux"
      ],
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-libvips-linuxmusl-x64": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
      "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
      "cpu": [
        "x64"
      ],
      "libc": [
        "musl"
      ],
      "license": "LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "linux"
      ],
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-linux-arm": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
      "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
      "cpu": [
        "arm"
      ],
      "libc": [
        "glibc"
      ],
      "license": "Apache-2.0",
      "optional": true,
      "os": [
        "linux"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-libvips-linux-arm": "1.2.4"
      }
    },
    "node_modules/@img/sharp-linux-arm64": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
      "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
      "cpu": [
        "arm64"
      ],
      "libc": [
        "glibc"
      ],
      "license": "Apache-2.0",
      "optional": true,
      "os": [
        "linux"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-libvips-linux-arm64": "1.2.4"
      }
    },
    "node_modules/@img/sharp-linux-ppc64": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
      "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
      "cpu": [
        "ppc64"
      ],
      "libc": [
        "glibc"
      ],
      "license": "Apache-2.0",
      "optional": true,
      "os": [
        "linux"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-libvips-linux-ppc64": "1.2.4"
      }
    },
    "node_modules/@img/sharp-linux-riscv64": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
      "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
      "cpu": [
        "riscv64"
      ],
      "libc": [
        "glibc"
      ],
      "license": "Apache-2.0",
      "optional": true,
      "os": [
        "linux"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-libvips-linux-riscv64": "1.2.4"
      }
    },
    "node_modules/@img/sharp-linux-s390x": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
      "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
      "cpu": [
        "s390x"
      ],
      "libc": [
        "glibc"
      ],
      "license": "Apache-2.0",
      "optional": true,
      "os": [
        "linux"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-libvips-linux-s390x": "1.2.4"
      }
    },
    "node_modules/@img/sharp-linux-x64": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
      "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
      "cpu": [
        "x64"
      ],
      "libc": [
        "glibc"
      ],
      "license": "Apache-2.0",
      "optional": true,
      "os": [
        "linux"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-libvips-linux-x64": "1.2.4"
      }
    },
    "node_modules/@img/sharp-linuxmusl-arm64": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
      "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
      "cpu": [
        "arm64"
      ],
      "libc": [
        "musl"
      ],
      "license": "Apache-2.0",
      "optional": true,
      "os": [
        "linux"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
      }
    },
    "node_modules/@img/sharp-linuxmusl-x64": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
      "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
      "cpu": [
        "x64"
      ],
      "libc": [
        "musl"
      ],
      "license": "Apache-2.0",
      "optional": true,
      "os": [
        "linux"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
      }
    },
    "node_modules/@img/sharp-wasm32": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
      "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
      "cpu": [
        "wasm32"
      ],
      "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
      "optional": true,
      "dependencies": {
        "@emnapi/runtime": "^1.7.0"
      },
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-win32-arm64": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
      "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
      "cpu": [
        "arm64"
      ],
      "license": "Apache-2.0 AND LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "win32"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-win32-ia32": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
      "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
      "cpu": [
        "ia32"
      ],
      "license": "Apache-2.0 AND LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "win32"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/@img/sharp-win32-x64": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
      "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
      "cpu": [
        "x64"
      ],
      "license": "Apache-2.0 AND LGPL-3.0-or-later",
      "optional": true,
      "os": [
        "win32"
      ],
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      }
    },
    "node_modules/detect-libc": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
      "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
      "license": "Apache-2.0",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/semver": {
      "version": "7.8.5",
      "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
      "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
      "license": "ISC",
      "bin": {
        "semver": "bin/semver.js"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/sharp": {
      "version": "0.34.5",
      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
      "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
      "hasInstallScript": true,
      "license": "Apache-2.0",
      "dependencies": {
        "@img/colour": "^1.0.0",
        "detect-libc": "^2.1.2",
        "semver": "^7.7.3"
      },
      "engines": {
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/libvips"
      },
      "optionalDependencies": {
        "@img/sharp-darwin-arm64": "0.34.5",
        "@img/sharp-darwin-x64": "0.34.5",
        "@img/sharp-libvips-darwin-arm64": "1.2.4",
        "@img/sharp-libvips-darwin-x64": "1.2.4",
        "@img/sharp-libvips-linux-arm": "1.2.4",
        "@img/sharp-libvips-linux-arm64": "1.2.4",
        "@img/sharp-libvips-linux-ppc64": "1.2.4",
        "@img/sharp-libvips-linux-riscv64": "1.2.4",
        "@img/sharp-libvips-linux-s390x": "1.2.4",
        "@img/sharp-libvips-linux-x64": "1.2.4",
        "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
        "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
        "@img/sharp-linux-arm": "0.34.5",
        "@img/sharp-linux-arm64": "0.34.5",
        "@img/sharp-linux-ppc64": "0.34.5",
        "@img/sharp-linux-riscv64": "0.34.5",
        "@img/sharp-linux-s390x": "0.34.5",
        "@img/sharp-linux-x64": "0.34.5",
        "@img/sharp-linuxmusl-arm64": "0.34.5",
        "@img/sharp-linuxmusl-x64": "0.34.5",
        "@img/sharp-wasm32": "0.34.5",
        "@img/sharp-win32-arm64": "0.34.5",
        "@img/sharp-win32-ia32": "0.34.5",
        "@img/sharp-win32-x64": "0.34.5"
      }
    },
    "node_modules/tslib": {
      "version": "2.8.1",
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
      "license": "0BSD",
      "optional": true
    }
  }
}
package.json
Open raw file ↗
{
  "name": "character-gameplay-conversations",
  "version": "0.3.0",
  "private": true,
  "type": "module",
  "engines": {"node": ">=22"},
  "scripts": {
    "test": "node --test tests/*.test.mjs",
    "smoke": "node tests/smoke.mjs",
    "generate": "node runtime/generate.mjs",
    "publish": "node runtime/publish.mjs",
    "scout": "node runtime/scout.mjs",
    "critique": "node runtime/critique.mjs"
  },
  "dependencies": {"sharp": "0.34.5"}
}
PUBLICATION.json
Open raw file ↗
{
  "schemaVersion": 1,
  "version": "0.1.4",
  "request": "make this a public repo",
  "publicationAuthorized": true,
  "authorizationContext": "User requested publication after the 16.76-second Batman/SpongeBob example was presented for review.",
  "detailedCreativeReview": "not-provided",
  "userAcceptance": {
    "quote": "cool looks good to me. is this goal done",
    "context": "User requested background music, received the playable 17-second music preview, and accepted it. This is qualitative baseline acceptance, not a fabricated numerical or per-channel review.",
    "acceptedPreviewSha256": "becf9b97e74e3fdc725a14fcf9f9350159d200bb8f05d6b3c005b37dae18c767",
    "releaseDifference": "The release adds music-credit metadata through the official renderer. Decoded video is identical; audio is sample-identical through 16.704 seconds, with tiny AAC tail differences thereafter (87.18 dB signal-to-error ratio). Same source clips, mix settings and duration; no new creative content."
  },
  "musicRequest": "can we add some background music like the original video",
  "layoutRequest": "The user clarified that the Batman video is for Shorts; 9:16 vertical was explained as the correct orientation, rather than 16:9 widescreen.",
  "example": {
    "file": "examples/batman-spongebob-music.mp4",
    "sha256": "a0082108fa53e6be6cc6494fff070a87846d6d832708c09ae35be32df0a900de",
    "durationSeconds": 16.76,
    "width": 1080,
    "height": 1920,
    "aspectRatio": "9:16",
    "displayOnly": true,
    "sourceGameplay": "https://www.youtube.com/watch?v=k-T-stiSYgw",
    "notes": "Existing independently sourced Arkham gameplay and saved dialogue from Fish character presets; no new voices. Adds Dark Fog by Kevin MacLeod under CC BY 4.0 with credit. Music is an alternative, not an identified match to the original song. This is not independent voice-identity verification."
  },
  "previousExample": {
    "file": "examples/batman-spongebob.mp4",
    "sha256": "63de842509644808f9e519818ad9bba7a483cdef7d33e2a8c951fd2d796d5dff",
    "aspectRatio": "3:4",
    "notes": "Historical blind-agent output, preserved unchanged. Shorts revision retains its exact input, gameplay, six audio clips and duration. No new dialogue generation."
  },
  "excludedFromDownload": [
    "Source/reference footage",
    "Separate real character voice clips",
    "Credentials",
    "Private inputs and provider receipts"
  ],
  "paidGenerationsForPublication": 0
}
Technical proof archive ↗

Run it with a coding agent

Know the run before you start.

The agent reads this version’s instructions, checks the requirements, and walks you through the approved workflow. Review the inputs and estimate before starting.

Typical run

Choose cast + scriptYour coding agent usage · depends on the conversation
Gameplay + dialogue audio$0 with supplied clips · prepared before rendering
Timing + local render$0 provider cost · depends on clip length and computer
Watch + review$0 provider cost · one full playback, then corrections if needed

$0 media-provider cost with supplied clips. Coding-agent usage is separate.

You provide

Your characters, topic and dialogue · An authorized local gameplay clip · One authorized audio clip per dialogue turn · Optional authorized background music

Output

One 1080 × 1920 vertical MP4 (9:16 Shorts), up to 60 seconds, with speaker labels, captions and optional music