SKILL · AI SHORT-DRAMA SCREENPLAY PIPELINE

Runtime over or under, discovered only after the script is done?
Turn it into verifiable data, first

Feed it an outline.json: the skeleton is pre-filled deterministically, the drama is written as alternating action and dialogue beats, 10 code-enforced quality gates check every rule, and you get script.json, a Markdown dialogue book, and a single-page HTML review report.

10code quality gates
±15%hard runtime bound
3deliverable formats
10/10gates passed in the real run
REVIEW REPORT · REAL OUTPUT
Documented workflow example
TIMELINE · ESTIMATED 339.2s / TARGET 360s
01 · BEFORE / AFTER

From “estimate after writing” to “constrained before writing”

01 · RUNTIME

BEFORE · GUT FEEL

Two minutes per episode, timed entirely by feel. Finish a draft, guess, set it aside, and only when the voiceover comes back discover it runs 90 seconds or drags to 150. The quickest fix is padding with small talk: the drama doesn't improve, but the runtime gets filled.

AFTER · COMPUTED ON THE SPOT

Dialogue seconds = non-whitespace characters ÷ 4.5; action seconds = action beats × 2.5. Each episode's estimate is computed immediately, and anything outside ±15% of target raises an error, naming the exact gap in seconds.

Real run: the three episodes land at 105.5s / 114.1s / 119.6s, all within ±15% of the 120s target.
validate --outline --art passing: a one-line summary on the command line; per-episode detail lives in the report's runtime gauges.
validate --outline --art passing: a one-line summary on the command line; per-episode detail lives in the report's runtime gauges.
02 · HOOK PLACEMENT

BEFORE · NOBODY CHECKS

The outline defines the opening hook and the script includes it, but which beat it lands on, nobody checks. The first two beats typically go to atmosphere and introductions, so the hook surfaces at beat five or six. The cold open stays a nice idea, not a rule.

AFTER · ON THE RECORD

The hook is the first beat of the beat flow, not a sticker applied afterwards. hookBeat claims a concrete position, and a gate verifies it falls within the episode's first three beats. No claim, no pass.

Real run: hookBeat = [1,1] / [1,1] / [1,2] across three episodes, all within the first three beats of Scene 1.
hookBeat doesn't appear in command-line output; it is verified directly from script.json, all three episodes pass.
hookBeat doesn't appear in command-line output; it is verified directly from script.json, all three episodes pass.
03 · UPSTREAM RECONCILIATION

BEFORE · SURFACES TOO LATE

The outline carries a character roster; the art bible carries scenes, lighting states and props. Writing along, the script casually drops in “lamplight in the night”, a lighting state art never registered. The problem surfaces at image generation, when the artwork changes, not the script.

AFTER · BOOKS CLOSED ON DELIVERY

--outline reconciles characters and payoffs; --art reconciles scenes, lighting states and props. All four reference types are checked item by item; anything written but never registered is flagged on the spot. Missing files are reported as “skipped”, never a silent pass.

Real run: without --art the three gates honestly show “skipped”; with it, all three start working.
Two consecutive validation runs compared: skips are announced, never silent.
Two consecutive validation runs compared: skips are announced, never silent.
02 · WORKFLOW

Input an outline. Receive a script that programs can verify.

You provide outline.json; pass in art.json and cast.json as well if they exist, for reconciliation and name display. Missing upstream files are fine.

STEP 01 · SEED

Pre-fill the skeleton

Target seconds, hook, suspense, payoff claims, candidate scenes and characters, all pre-filled deterministically from the outline. The model's only job is to write the drama, not to decide what it should be.

STEP 02 · BEATS

Write beat by beat

An action beat is one visual, in narrative prose; a dialogue beat carries a speaker and a delivery. One beat, one thing, never action and quoted dialogue mixed. Dialogue feeds TTS as-is.

STEP 03 · VALIDATE

Check every gate

All 10 gates are code-enforced: runtime ±15%, hookBeat within the first 3 beats, character/scene/lighting/prop reconciliation, narrative action, line length… none left to the model to “feel”.

STEP 04 · RENDER

Produce the three outputs

script.json for downstream storyboard and TTS; a Markdown dialogue book for humans; a single-page HTML review report for briefings and retros.

03 · REAL RUNS

Three real runs, every figure from real outputs

All numbers and screenshots below come from one actual production run of the public-domain novel “Du Shiniang Sinks the Jewel Box in Anger”, end to end. This is not a demo.

Case 01 · From outline to script

INPUT
“Du Shiniang Sinks the Jewel Box in Anger” (public domain), adaptation method “core extraction”, 6 episodes × 2 minutes; outline.json provides 6 characters, art.json provides 3 scenes, 2 props, realistic art style. This run covers episodes 1-3, total target 360 seconds.
OUTPUT
3 episodes / 3 scenes / 128 beats (60 action, 68 dialogue lines) / estimated 339.2s / deviation −5.8% / gates 10/10 passed. Episodes land at 105.5s, 114.1s, 119.6s, all within ±15% of target; dialogue share 56%.
WHY
Runtime was constrained before the first line of dialogue was written, not discovered to be off after the final cut.
The single-page review report produced by this run: KPI band, runtime gauges, per-episode scripts and the scene table, all on one page. Inline CSS and SVG only, no external links, no CDN; it opens offline with a double-click.
The single-page review report produced by this run: KPI band, runtime gauges, per-episode scripts and the scene table, all on one page. Inline CSS and SVG only, no external links, no CDN; it opens offline with a double-click.

Case 02 · Three errors the gates caught

INPUT
The actual errors raised in the first validation round.
OUTPUT
Three catches: a line for C01 in episode 2 S03 while C01 is not in that scene's roster (the error pinpoints episode, scene and character); episodes short by 29.2s / 35.4s / 30.4s, fixed with substantive conflict beats (+14 / +17 / +18) converging at 339.2s; quoted dialogue inside an action description, blocked by the “narrative action” gate and split into a standalone dialogue beat.
WHY
All three slipped past the writer during drafting. The gates are not decoration, they genuinely stop things.
Intercept 1 · speaker not in the scene
Intercept 1 · speaker not in the scene
Intercept 2 · episode short on runtime
Intercept 2 · episode short on runtime
Intercept 3 · quoted dialogue in an action beat
Intercept 3 · quoted dialogue in an action beat
Intercept 4 · single line over 35 characters
Intercept 4 · single line over 35 characters

Figure: four intercept types from the first round (deliberate fault reproductions, not real product defects; each image is labeled with how the fault was injected). 1: C01 removed from the S03 roster with the line kept, the gate names “C01 in episode 2 S03 is not in the scene's character list”. 2: episode 1 cut to 5 action beats, the gate reports “short by 89.5 seconds (estimated 12.5s / target 120s)”. 3: “he said, don't touch this chest” appended to an action, blocked. 4: one line inflated to 51 characters, the gate reports the count and the line.

Case 03 · Honest skips when upstream files are missing

INPUT
One validation run without --art.
OUTPUT
The three reconciliation gates, lighting, props, scenes, report “skipped” honestly; once --art is supplied, all three start working.
WHY
A silent pass is one step away from a lie. Saying “skipped” when files are missing matters more than passing itself.
Two validation runs compared: the first shows a “skipped” line, the second does not, same output as section 01. Missing files are announced as skips, never disguised as passes.
Two validation runs compared: the first shows a “skipped” line, the second does not, same output as section 01. Missing files are announced as skips, never disguised as passes.
04 · CORE FEATURES

Five capabilities, never compromised

01

Runtime is computed, not guessed

Dialogue at 4.5 chars/second, action at 2.5 seconds/beat; every episode within ±15% of target. Not “about two minutes”, an auditable number that names the gap to the second.

02

The hook's beat is on the record

hookBeat claims a concrete position and a gate forces it into the first three beats. The cold open goes from discipline to rule; lose the hook in a revision and the gate stops you.

03

Dialogue is born for the voice pipeline

Every line carries a speaker and a delivery; the book is grouped by character and copyable as a whole. With cast.json, each group header carries a voice-prompt button, lines and voice on one page.

04

Unregistered references surface now

Characters reconcile against outline.json; scenes, lighting states and props against art.json. Write an unregistered lighting state and validation flags it, resolved at the script layer, not at image generation.

05

Judgment and checking are separated

All 10 gates are code-enforced. Facts fixed by the outline are pre-filled by seed, never re-imagined; the model only writes the drama. Missing files are reported as skips, never silent passes.

06

A report that just opens

The review report is fully inline CSS and SVG: no external links, no CDN, no build step. It opens offline with a double-click, ready for briefings, review and retros.

05 · USE CASES

Use cases

SCENE 01

Novel-to-short-drama adaptation

Public-domain or original novels → core extraction → episode outline → verifiable script. One fixed pipeline; runtime, hook and paypoints all on the record, so the adaptation never drifts off course.

SCENE 02

Studio-scale production

Several titles in parallel, episodes in batches. What slows production down is rediscovering the same error in every episode and every revision, the gates take that over.

SCENE 03

Team-wide reconciliation

Writers, art and voice share one set of structured facts: characters against outline.json, scenes/lighting/props against art.json, dialogue grouped by character straight into TTS, every decision traceable to its beat.

06 · GET STARTED

Take one novel. Run it end to end.

Type $novel-script in a Codex or Claude Code session (or explicitly ask to “use the novel-script skill”), attach your story materials, episode count and target duration. Missing upstream files are fine, the gates will honestly say “skipped”.

$novel-scriptoutline.json±15% runtime gatehookBeat ≤ 310/10 gates passed

Deliverables: script.json (storyboard / TTS) · Markdown dialogue book (human reading) · HTML review report (briefings & retros)