Work
In progress · 463 tests · 2026

Scene Zero

Not deployed yet · runs locally
SCENE ZER1 LOGLINE234567
3×5 CARD
0 WORDS
ELEMENTS

Five things a logline has to carry. Each row quotes your own words back.

WHO“a three-person crew”
WANT“wraps a night shoot”
OBSTACLEnothing is in their way yet
STAKES“the scene cannot be cut”
HOOK“no way to know until the edit”
STEP 1 / 7MODEL OFFRULES 10 checkedLANG EN
Scroll ↓
localhost:3000/step/4
SCENE ZER1234 SCENES567
GAP AFTER LINE 5
INT. DAUGHTER'S BEDROOM - NIGHT
Cardboard boxes to the knee. MAREN, 40s, three nights without sleep, folds the same sweater a third time.
MAREN
Read it.
Ross takes the phone. He reads. He reads it again.
Ross puts the phone in his coat pocket instead of handing it back.
WHAT IS SHE DOING WHILE HE READS?
CONTACT SHEET
TAKE 1
TAKE 2
TAKE 3
TAKE 4
TAKE 5
STEP 4 / 7MODEL OFFTEMP 0.9 WIDE

Five takes, three prints. The rejects stay on the sheet.

A whole generated page can't be judged. One labelled candidate can. So everything the model writes arrives as a recognition task — and the strict pass that kills the weak ones is left on the page, crossed out.

Role
Spec, product, interface, every judgment — one person, not an engineer
Status
Runs locally · not deployed
Size
21,800 lines · 141 files · 5 runtime dependencies
Hard layer
49 rules, 24 with a source you can click, no model
Tests
463, all local
Stack
Next.js · TypeScript · Claude API
Scene Zero · The Messages · sc. 1
Interactive · press Summon in the gap
INT. DAUGHTER'S BEDROOM - NIGHT
Cardboard boxes to the knee. MAREN, 40s, three nights without sleep, folds the same sweater a third time. Sets it down. Picks it up.
DET. ROSS waits in the doorway, weight on the threshold, shoes off.
MAREN
The phone sent something at 4:15.
DET. ROSS
Phones do that. Queued messages, dead servers.
MAREN
Read it.
Ross takes the phone. He reads. He reads it again.
Ross puts the phone in his coat pocket instead of handing it back.
CONTACT SHEET

Nothing here until you point at a gap. The model is invoked, never ambient.

PRE-FLIGHT · HOLD
Slugline: INT/EXT · place · time
Action paragraphs ≤ 4 lines
Reaction covered after the readL10 · Ross reads twice; nothing on Maren. No cutaway in the edit.
Eyeline continuity across the cutDisputed rule — the industry disagrees. Noted, doesn't gate.

A working model of the loop. The scene is the product's own sample script; the three rules that kill candidates are three of the 44 in the hard layer. In the product the wide pass and the strict pass are two model calls — here they're scripted, so you can see the shape: the rejects stay on the sheet, the light only turns green when nothing is left unjudged that gates.

The model is invoked, never ambient.

Press Summon. Zero — the empty frame from the wordmark — flies to the gap you pointed at, and the bar fills by characters actually received.

The chain, step by stepInteractive · switch the model off
1
Logline
HARD
10 rules · who / want / obstacle / stakes / hook
MODEL
five takes for a missing element
2
Outline
HARD
5 rules · purpose, turns, cause, economy
MODEL
a beat where the outline thins
3
Treatment
HARD
5 rules · prose, build, ending
MODEL
a paragraph for one beat
4
Scenes
HARD
19 rules · unfilmables, camera talk, sluglines, format
MODEL
one action line for one gap
5
Coverage
HARD
4 rules · cutaways, inserts, every line covered
MODEL
6
Shots
HARD
6 rules · the axis, size jumps, headroom, look room
MODEL
absolute coordinates (a heuristic)
7
Boards
HARD
MODEL
not built yet
The model is only ever called at a slot you pointed at. Every gap carries three actions: fill it yourself, summon the model, or ignore it.

Unplug the model. It is still a screenplay checker.

Seven steps, and under each one the rules that run with no model at all. The model only exists at a slot you pointed at.

localhost:3000/step/5
SCENE ZER12345 COVERAGE67
PRE-FLIGHT · INT. DAUGHTER'S BEDROOM - NIGHT
·
Two neutral cutaways in the plan
COV.NO_CUTAWAY
·
Every line of dialogue covered
COV.NO_DIALOGUE
·
Insert for the phone screen
COV.INSERT_NEEDED
·
No camera crosses the axis
CUT.AXIS_CROSSED
·
Shot size changes are legible
CUT.WEAK_SIZE_CHANGE
·
Scene runs under three minutes
FMT.SCENE_TOO_LONG
STEP 5 / 7MODEL OFFPASS 4FAIL 1CAN'T TELL 1

Unjudged is never passed.

The pre-flight has three states, not two: pass, fail, and can't tell. The green light only comes on when everything is judgeable and everything passes.

  • FILM.INTERIORITY
    An action line describes what a character feels or thinks. The camera can't shoot it.
    Source · The Story Department — The Unfilmables ↗︎
  • FILM.CAMERA_DIRECTION
    “WE SEE”, “CLOSE ON”, “PAN TO” in a spec script. The camera is not a character.
    Source · Script Magazine — Why Spec Scripts Fail ↗︎
  • LOG.OBSTACLE
    The logline names who and what they want, but nothing is in the way.
    Source · Christopher Lockhart (WME), “The Logline” ↗︎
  • LOG.LENGTH
    Over the word count a reader will hold in one breath.
    Source · Barri Evins, “The Logline Dilemma — Does Word Count Count?” ↗︎
  • COV.NO_CUTAWAY
    No neutral cutaway in the plan. Nothing to cut to when a take is bad.
    Source · peekatthis — two neutral cutaways per scene is “your only real insurance” ↗︎
  • CUT.AXIS_CROSSED
    Two adjacent setups sit on opposite sides of the line between the actors.
    Source · Tim J. Smith, The Attentional Theory of Cinematic Continuity ↗︎
  • SLUG.STRICT_TIME
    A slugline uses DUSK, LATER, CONTINUOUS. Purists say only DAY and NIGHT — disputed, so it can't gate.
    Source · The Story Department — Script Check: DAY/NIGHT ↗︎
  • FRAME.HEADROOM
    Too much air above the head for the shot size.
    Source · Mascelli, The Five C’s of Cinematography ↗︎
8 of 49 · families: LOG · OUT · TREAT · FILM · FMT · SLUG · COV · CUT · FRAME

49 rules. Every one with a source.

Not house style — the craft the industry actually uses, cited. Where the industry disagrees, the rule says so.

One dot per test · grouped by file · vitest463 tests · 367 in the hard layer
shotspec.test45
docs.test44
logline-check.test34
checks.test28
image.test25
revise.test25
zoom.test24
logline-ai.test20
layout.test20
board.test18
fountain.test17
scan.test16
partial-json.test16
manifest.test16
shotspec-gen.test13
treatment-ai.test11
count.test11
models.test9
preflight.test9
memory.test9
export.test9
zero-job.test9
style-cards.test7
writing-lang.test7
axis.test7
samples-films.test6
register.test6
overload.test2
hard layer — no modelsoft layer — the model’s edgesapp

463 tests, all run locally.

Most of them lock down a failure I actually hit, and the comment above each one says what the failure looked like.

14.4 PT · SIZE-ADJUST
What I assumed

A Han character is two Latin cells, so push it to 14.4pt and the advance lands on 0.2″.

lines overlap · 20% too tall
12 PT · MEASURED IN INCHES
What is true

The em box is width and height. At 12pt a Han character advances 1/6″ — 1.667 cells — and sits on the same 1/6″ line grid as the Latin.

6″ line = 60 Latin or 36 Han
It broke on first render: every Chinese page had its lines stacked on top of each other. The fix was not a patch but a change of unit — the layout engine now measures in inches, not character counts. lib/hard/layout.ts

A character's em box is its width and its height.

I assumed a Han character is two Latin cells and pushed it wider. Every Chinese page came out with its lines stacked on top of each other. The fix was a change of unit: inches, not character counts.

WORKS
Steps 1–6, end to end
49 hard rules, 24 with a source you can click
Export to .fdx, .fountain, .csv, print to PDF — no PDF library
Bilingual interface and bilingual writing
463 tests, all run locally
Coverage checks for dialogue scenes
DOESN'T YET
Step 7 — boards and prompts — has no UI yet
Step 6’s absolute coordinates are a model heuristic; only the relative checks (axis, size jumps) are verifiable
No entity table, so image prompts re-describe every character
A Chinese draft stops at step 4: character cues are detected by uppercase, and Chinese has no case
Not deployed, no users, no user testing yet
The grammar for action scenes is half done

What works, and what doesn't yet.

No users, not deployed, and I can name exactly what is missing.

What I'd do next

  1. 01
    Deploy it
    A read-only demo project with a usage cap. ‘You can click into it’ and ‘there are screenshots’ are two different levels of proof.
  2. 02
    Chinese past step 4
    Character cues need a format decision, not a heuristic. I know the fix; I haven't shipped a guess.
  3. 03
    The action-scene grammar
    Coverage rules for dialogue are done. Action scenes need their own — and they are the ones small crews get wrong at 2am.
← WorkAntumbra