Contents

M4 Director AI

M4 turns a screenplay into a directed, voiced episode:

reelwright direct episodes/salvage_claim/salvage_claim.fountain → approve → reelwright render → a watchable MP4 with voices, blocking, coverage and cuts that pass film grammar.

The director writes an EpisodeIR (ADR-0006) as a proposed change set (M3), with storyboard stills. Read with ARCHITECTURE §7–§8, ADRs 0002, 0006 and 0009, docs/design/m1-compiler.md and docs/design/m3-showrunner.md.

What the model does and doesn't do

The single most important decision in this milestone: the model never retypes dialogue and never invents structure the screenplay already fixes.

Decided by code (deterministic) Decided by the director (model or heuristic)
Scenes, their order and headings Starting blocking: marks, facing, posture
Which character speaks each line, and its exact text Emotion, intensity and delivery per line
Line ids and their source line numbers Looks, gestures, expressions, postures and moves between marks
The set each scene uses, and the cast SFX, FX and music cues drawn from the action text
Timing (the compiler) Beats and pauses
Camera placement (the framing solver) Coverage: cuts, purposes, setups or framing intents, moves, transitions

So dialogue can't drift, a scene can't lose a line, and everything the model writes points back at ids the code created. The existing validator (core/src/validate/fountain.ts) already checks that line text matches the screenplay. After M4 that check should never fire on a directed episode.

Pipeline (core/src/director/)

screenplay.fountain
  → parse                    Fountain → Screenplay model (with 1-based source lines)
  → resolve                  cue names → character ids; headings → set ids; unresolved → diagnostics
  → skeleton                 per scene: line cues (ids, text, speaker, source), action paragraphs (ids)
  → perform (per scene)      director stage A: blocking + non-line cues + line delivery
  → cover (per scene)        director stage B: shots over that performance
  → provisional compile      estimated take lengths → Timeline → schema + semantic + grammar
  → repair                   diagnostics (pointer + hint) back to the stage that owns them
  → propose                  EpisodeIR as a change set, with storyboard stills
voices (on approve or render) → takes → real compile → render

1. Parser (core/src/screenplay/)

  • Coverage. A complete Fountain 1.1 parser:
    • title page and scene headings (including forced . headings and #n# scene numbers);
    • action, forced action (!), character cues with extensions ((V.O.), (O.S.), (CONT'D)) and dual dialogue (^);
    • parentheticals, dialogue, lyrics, transitions (and forced >) and centered text;
    • notes [[ ]], boneyard /* */, sections # and synopses =, page breaks and emphasis.
  • Output. Every element carries its 1-based source line range. The model is internal (TypeScript types), not a schema. The director's inputs are schema'd; the parser's output needn't be.
  • Tests. A corpus that covers the spec's examples, edge cases (a lower-case forced cue, a parenthetical mid-dialogue, dual dialogue) and round-trips.
  • (implementation) Boneyard and notes are cut out before parsing; a line they cover entirely is dropped, so a note between two lines of dialogue does not end the block. A scene heading needs a blank line before it but not after. printFountain writes the model back as canonical Fountain, forcing (!, @, .) where the plain form would read back differently. The validator's screenplay check (validate/fountain.ts) uses this parser. The standard transitions written without Fountain's TO: are transitions too, on a line of their own in capitals: FADE IN:, FADE OUT., FADE TO BLACK., CUT TO BLACK., IRIS OUT. and the … CUT TO forms. Read as action, the first audit's FADE OUT. became a sound ("Make the OUT sound").

2. Resolution

  • Characters. A cue name matches a cast member's name, shortName or first name, case-folded; CHIEF → char.culpepper through his shortName.
  • Sets. A heading's location (MARIGOLD - BRIDGE) matches a set's name, id slug or aliases.
  • Overrides. An optional episode.castMap and sceneSets handle ambiguity. These are additive schema fields.
  • Unresolved. A name or location that doesn't resolve becomes a diagnostic (director.unknown_character, director.unknown_set) with a did-you-mean. M5's missing-asset pass turns these into proposals. M4 reports them and stops before directing that scene.
  • (implementation) Names tier: castMap, then name or shortName, then first name or id slug; two matches in one tier are director.ambiguous_character. A heading is read as screenwriters mean it (screenplay/slug.ts): its place is the location part alone, and the rest is time of day, or time or kind, never a place. INT. DELIVERY VAN - MOVING - NIGHT plays in the delivery van; MOVING, CONTINUOUS, LATER, SAME, INTERCUT, PRESENT DAY, a year and (FLASHBACK - 1985) fall away wherever they stand, in parentheses or not, and DAY/NIGHT is a time of day. The second product audit's script made places of "DELIVERY VAN - MOVING" and "NOODLE SHOP - NIGHT (FLASHBACK". CONTINUOUS, LATER and SAME with no time of day go on at the scene before's. A flashback, a flash forward or a dream stays in the cut on its set, marked (Scene.timeShift, EpisodeIR 1.54, with when as written); the reading says so ("On Noodle Shop · a flashback to 1985") and the timeline's ruler too ("sc05 · Flashback 1985"). The place is tried whole, then with trailing sub-locations dropped; what was dropped picks the lighting preset: the one that names its time of day, else the same part of the day (dawn and morning, day and afternoon, evening and dusk, night), else the same side of it, light or dark. A heading whose time the set has no preset for is lit with the set's first and warned of (director.no_lighting): "SHIP MORNING" once took ship_night for the "ship" they share, and nothing said so. Sets gain optional aliases. The validator's speaker check accepts any name that resolves to the cue's character.
  • (implementation) When nothing is called so at any length, a heading finds the set named with its words, as a person reads it: the same kind of place (the last word of each name, a gloss in brackets and generate set's ", seed 1" aside, plurals singular, no "the"), and the words of one hold the other's. EXT. HARBOUR is the "Harbour, seed 1" generate set drew, which no alias named, and INT. BRIDGE the show's one bridge; EXT. HARBOUR is no "Harbour Bridge", and INT. LIVING ROOM no "Room (interiors)". The set sharing the most words is it, and of those one with no other words; two alike (two ships' bridges, two seeds of a beach) are director.ambiguous_set. An alias said outright comes first, and INT. and EXT. hold as for names. The corpus is core/test/fixtures/heading-sets/cases.json. Still nothing, an INT. or EXT. heading plays on the show's one plain set on that side, in every reading of the script but what the show still needs (standIn: false): drawn from Reelwright's plain room or open air (PLAIN_SET_PATTERNS) and named by nobody, for a place built from its words on the plain pattern is that place. A director.set_stand_in warning says so ("no set is called "HARBOUR", so it plays on Outdoors (open air), seed 3, the show's one plain open air"), and the reading offers "Make a set for HARBOUR". Two plain sets on that side are director.ambiguous_set; a heading with no INT. or EXT. has none.

3. Skeleton

  • Line cues. One line cue per dialogue block. Its fields are:
    • id (l01… in screenplay order, stable across re-directs of an unchanged screenplay);
    • character and text (emphasis stripped, exactly what the validator expects);
    • source.line;
    • mode: off_screen for (O.S.) and (V.O.), else on_screen.
  • Parentheticals. A parenthetical becomes a delivery hint the director sees, not text.
  • Action paragraphs. Each gets an id (a01…) and its text, so a director's SFX, FX or gesture cue can cite the action it realises (from: "a03").
  • Headings. They become scene ids and headings.
  • (implementation) Ids are per scene (sc01; l01, a01 restart in each scene). Each line of dialogue text is its own line cue, as the validator has always counted them; a parenthetical therefore splits a block, and applies to the line under it. (V.O.), (O.S.) and (O.C.) are off_screen. Cues the director makes from an action cite it by id prefix (a04s1, a04p1), and the action's beat has the action's own id.
  • (implementation) Screenplay directions (screenplay/directions.ts). A paragraph that says how the film is cut, not what anyone does, is no action: the action reader never sees it, so it is never a sound, a prop or a character (the first audit's reading offered "Make the MONTAGE sound" and "Make the ON sound"). Each becomes part of the timeline:
    • Transitions are edits. One before a heading is how the next scene's first shot comes in (DISSOLVE TO: a dissolve, FADE IN: a fade up from black, SMASH CUT TO: a smash cut, a cut where the style has none of its own). FADE OUT., FADE TO BLACK. and IRIS OUT. end the scene before them (Scene.out, EpisodeIR 1.44): its last shot fades to black over the style's transition length and black holds half a second, or with a style that never fades through black, it cuts to black; CUT TO BLACK. cuts and holds a second. A scene after one fades up out of the black.
    • Words on screen are title cues (TitleCue, EpisodeIR 1.44), drawn in the style's title colors and fonts (docs/design/m7-titles.md). Centered text (> THREE HOURS LATER <) and a time card written alone (THREE DAYS LATER, THE NEXT MORNING, THE END) are a card in the picture's place when they stand between scenes, at the next scene's head (or at the end, after the last line), and words over the picture inside a scene. SUPER:, TITLE: and TITLE OVER: are words over the picture where they stand; TITLE CARD:, CARD: and TITLE OVER BLACK: a card. A SUPER: that names one of the cast (SUPER: MAYA OKAFOR, NIGHT SHIFT), and every CHYRON: and LOWER THIRD:, is a lower third: the name to the first comma, dash or slash, the line after it, over the first shot that shows whom it names (docs/design/lower-thirds.md). A card holds the scene for its length, as a beat does; words over the picture start with the cue after them and delay nothing. Each shows long enough to read (2.5 s for a card, 3 s over the picture, a second and a third of one a word, at most 8). A jump of moments (MOMENTS LATER, LATER, CONTINUOUS) is a cut, not words.
    • (implementation) An insert of words is a card of the thing they are on, filling the frame (TitleCue.insert, EpisodeIR 1.58). INSERT - MEI'S PHONE, CLOSE ON THE NOTE or ON THE SIGN on a thing words are read on (a phone, a text; a screen, a laptop; a note, a letter, a page; a sign, a poster) followed by its words is one: quoted, after It reads:, after whom they are from (A text from Grandpa:, GRANDPA:), in capitals, centered, or on the line under the shot line. The compiler draws Reelwright's graphic of the thing with the words on it (engine/addons/reelwright/library/inserts/): a phone's message in a bubble under its sender, a computer's screen, a sheet of ruled paper, a painted sign, on the style's title background, cut in and out (Timeline 1.33 TitleCard.graphic). The second product audit's INSERT - MEI'S PHONE staged nothing. Anything else after the shot line leaves it the written shot it was.
    • (implementation) A conversation on a phone is one insert (EpisodeIR 1.61): lines under a phone's insert each led by who sent it (GRANDPA: Where are you?, with its time as GRANDPA (9:41 PM): or [9:41], or on a line of its own over it), on the lines under the shot line, in the paragraph after it, or one paragraph a message. The cue's words are the last message; insert.earlier holds the ones before it, insert.time when the last came, and insert.owner whose phone it is (MEI'S PHONE) when they sent any (a sender ME is them too). The compiler lays it out as a messaging app does: the last messages that fit between the header and the input line, oldest at the top, the owner's on the right in the accent color, the others' on the left, each with its time in its corner, whom it is from over it when more than one person writes, and the header naming them. They used to run together into one bubble from the first sender.
    • (implementation) Every message, however it is written (product audit 5, #12; no schema change). A line wholly in quotes is a message of its own, from whoever sent the one before; a lead alone on its line (Three texts from Grandpa:, GRANDPA:) is the sender of the lines under it, each its own message when the lead counts more than one, else one message over its lines (chatMessages). A cue marked (TEXT), (TEXTING), (SMS), (TYPING) and the like (textCue) is a message from its name, never a line: on the phone's insert just written or under way, else a phone's insert of its own; its name needs no one in the cast, and the script's needs (screenplayNeeds) skip it, as they skip an insert written as a cue. Words on the shot line itself, after a colon or a dash (INSERT - MEI'S PHONE: "Come home.", INSERT - MEI'S PHONE - A TEXT FROM GRANDPA: COME HOME.), are its first (insertLineWords); a shot line alone stays one. And a phone the action says shows words (phoneShows: It shows a text from Grandpa: "Come home.", The screen reads: STORM WARNING., Mei reads the text from Grandpa: …) is a phone's insert of them after the action, which is staged as written, so the phone in hand shows them from then on (docs/design/m6-props.md, "Phones"). Only words in quotes or capitals count, or any words after whom a text is from; a call (holds the phone to her ear: "Hello?"), a picture told in prose, or a screen that is not the phone's shows none. Before and after, on the insert and on the phone's glass: docs/design/phone-inserts.md.
    • MONTAGE (MONTAGE - TITLE, BEGIN MONTAGE, SERIES OF SHOTS, QUICK CUTS) to END MONTAGE, BACK TO SCENE or the next heading: each of its lines (- , • , A) , 1. , else each paragraph) is an action of its own, montage: {index, of}, and a short shot of its own (see Montage, under the heuristic director).
    • INTERCUT (INTERCUT - A / B, INTERCUT WITH:, INTERCUT BETWEEN A AND B) joins the scene to the places of whoever speaks after it and was not in the scene before it: each where they were last seen (an earlier scene's heading), else a place the INTERCUT names, else the scene before's. Each line then plays where its speaker is (item.place), each paragraph where whoever it names first is, and the rest on the scene's own set. One with nowhere else to cut to is director.intercut_nowhere. See Intercut, under the heuristic director.
    • An editor's term the director does not stage (FREEZE FRAME, FLASHBACK, SLOW MOTION, SPLIT SCREEN, PRE-LAP) is read as one, and the reading says it is not staged.
    • Lyrics with no cue over them are sung by nobody, and the reading says to put them under a character's cue.

4. Director stages

The director works scene by scene, in two stages that mirror ADR-0006: perform (stage A) and cover (stage B). Keeping them separate means a re-cut never re-performs, and a small model can re-cover cheaply.

  • Output schemas live in a new definitions-only schemas/v1/director.schema.json:
    • ScenePerformanceDraft: blocking, plus cues other than lines, plus per-line {line, emotion, intensity, delivery, lookAt}, keyed by line id and never carrying text;
    • SceneCoverageDraft: shots.
    • Both reuse episode.schema.json's cue and shot $defs.
    • They are too large for strict tools (the strict budget in m3-showrunner.md), so they go out non-strict and rely on validation and repair.
  • Context (cached prefix, in this order):
    • the style's camera language: camera.cutting, framingBias, lensMm, moves, transitions;
    • the gesture library, the expression list and the show's sounds (audio/sfx/);
    • the set: marks, elements, named setups and their framings;
    • cast digests: persona, speech and voice;
    • the bible's tone rules;
    • the whole screenplay.
    • After the prefix, per call: the scene skeleton, and for stage B the stage-A result plus provisional timing (each line's estimated start and length).
  • Model. show.json providers.llm.stages[director] sets the model and effort. The default is claude-opus-5-5 with adaptive thinking, the same provider, budgets, CostMeter and record/replay as M3.
  • Repair. Diagnostics are routed to the stage that owns the pointer:
    • /scenes/i/cues/… and /scenes/i/blocking/… go back to stage A;
    • /scenes/i/shots/… go back to stage B.
    • At most 3 rounds per stage per scene. Then the scene falls back to the heuristic director, and the proposal carries a warning that says so.
  • (implementation) Code: core/src/director/model/ (direct.ts the loop, assemble.ts, check.ts, context.ts, prompts.ts the brief and the requests, call.ts, plan.ts the dry run, scenarios.ts recorded directions). Beyond the rules above:
    • Drafts. A performance is {blocking, axis?, mood?, lines, cues}; lines holds {line, emotion, intensity, delivery, lookAt} and nothing else, so a draft that writes words fails its schema. Non-line cues gained an optional from (an action id, episode.schema.json ActionRef), kept in the IR as provenance. Prop cues were left out of drafts until the engine drew props (M6); now a draft can hold them, the show context lists the show's props and their states, and the perform prompt says how to pick up, put down, hand over and switch them. The prompt also carries what the watch-its taught the heuristic director: whom a line is to, a muffled voice that stays down, a sound that goes on, and faces kept whole in the picture.
    • Crowds. A draft holds crowd cues too (product audit 5, item 12: a crowd scene Claude directed stood still). The brief reads a crowd sentence as the heuristic does: rush past, gather, cheer or turn to look, how many, at whom (else what the action holds up, else whoever it named last), timed with a thing just held up. The draft checks say a target not in the scene (director.not_in_scene), and the validator a target or area the episode or set lacks, for either director's crowd. The provisional compile and the gesture check draw the crowd's people from the show's people pattern, as the heuristic's compile does, so a model's crowd is seen and judged as a heuristic's is.
    • Written shots. A paragraph that is only a shot in capitals ("CLOSE ON THE SCANNER", see Written shots under the heuristic director) is marked [a written shot] in the perform request. The brief says to give it only a beat of its own (durationSec 0, from it), no sound, business or entrance, so the cover can cut on it; and in the cover pass, to honour it as written over what follows, to the next shot line, BACK TO SCENE or the end of its beat, taking the nearest framing that keeps film grammar's rules when the asked one breaks them, and saying so in the shot's note. Nothing checks the model's coverage against the written shot; the request and the brief only ask.
    • Assembly. Lines stay in screenplay order, copied from the skeleton. Each draft cue goes after the cue its at names (with or after), else at the action its from cites, else (atSec) at the scene's head; a cue with none is director.unplaced_cue.
    • Checks. Draft checks first (lines missing or twice, ids, placement, sounds, gestures, effects, who is in the scene), then the validator's schema and semantic checks and the provisional compile, each on the episode directed so far. Stage A compiles under the set's establishing setup (else a WS of everyone) and stage B reads that compile: every cue's estimated start and end, and at the scene's start and each line where everyone stands and faces and which setups see their face.
    • Repair. Errors route by pointer; warnings of the same stage go along with them but never block. Pointers are translated back into the draft (/scenes/i/cues/j → the line delivery or cue it came from). A performance problem found while covering reopens stage A, and stage B then gets the new timing. A reply that calls no submit tool is asked once more. A refusal, a cut-off reply or a failed call falls back the scene; a budget stop or an API failure also stops the model for the rest of the run.
    • Calls. Both submit tools go out on every call (tools render first, so all calls of a direction share one cached prefix: tools, the brief, the show context). The context holds every set the screenplay uses, so it does not change between scenes. A direction is one "request" for the budget: its cap is the tighter of maxUsdPerRequest and maxUsdPerEpisode.
    • Re-cut. recut keeps the scene's blocking and cues as they are (byte for byte) and runs stage B alone, with either director: the heuristic's re-cut keeps a scene whose lines still match the screenplay (its blocking, cues, axis, props and lighting) and covers it afresh, and directs any other anew with director.recut_stale. The fifteenth watch-it's showrunner, with no model, could not re-cut, and directing again threw its edits away; scenes picks which scenes the model directs, and the others keep the episode's direction while their lines still match, else take the heuristic's.
    • Fixtures. Director scenarios are in core/test/fixtures/llm/direct-scenarios.json; reelwright fixtures record direct-salvage-claim records the watch-it direction. A scenario with hand-written replies (direct-salvage-claim-handwritten) records without a key.

5. Heuristic director (Tier 1, core/src/director/heuristic.ts)

A deterministic director that always produces a valid, watchable IR. It is:

  • the offline path: no key, no budget, --heuristic;
  • the fallback for a scene the model can't get clean;
  • the CI end-to-end path: CI directs, voices and renders the new screenplay with it on every push.

Rules

  • Blocking: characters start on the set's marks nearest their first action (unless it walks them there: they start elsewhere, so the walk happens), else where they were when an earlier scene on the same set ended; they face the speaker, or their element (a mark that already faces it keeps its own facing, and so does one of its own seats: Octavius sat on the sofa faced as its seat does, not round into the sofa's middle). (implementation) Where their first action has them kneel, sit or crouch is where they start, facing it: "Otto kneels by the nest, peering behind the crates" starts her at the nest, where the twenty-third watch-it's director put her at the crate stack and walked her over. Someone whose first action brings them on starts off stage; a scene everyone in it walks on to has no blocking at all (EpisodeIR 1.9). (implementation) The tenth watch-it's engine room, whose only character climbed in through the hatch, was dropped as having nobody in it.

  • Moves: an entrance ("climbs in through the hatch", "enters", "comes in") walks on through the entrance it names to the mark beside whoever the scene has them work with, else where the same sentence sends them after the way in ("climbs down through the hatch and creeps over to the core" goes to the core, not the hatch), else to a place named after the way in with no verb ("creeps in through the hatch to the aisle"), else up beside whoever they come in after or over to ("comes in behind her", "and over to the Captain"; "her" is the woman the sentence before was about, when that fits), else the nearest mark to the way in that they can stand on (nobody walks on and sits in the pilot's chair unasked). (implementation) The eleventh watch-it's Otto stopped at the foot of the ladder, and its Chief sat at the helm. An exit ("trudges to the aft hatch", "heads for", "leaves") walks off through the entrance it names, else the nearest. A walk to a place ("to the workbench", "beside the core", "down the aisle") ends on the free mark nearest it; a phrase names the mark or the element it names more words of ("the lighthouse crate" is the crate, not a mark called "crates"). (implementation) Someone already on stage whose sentence reads as coming in ("creeps down the aisle") walks there. "Holds out her hand" holds hand_out. Someone asked to take something ("Hold this"), or handed it, comes to the free mark beside the one asking. (implementation) "Sweeps", "glides", "breezes", "swans", "sails", "waltzes" and "barrels" go in, off and over; "leaves it on" or "leaves the radio running" is no exit (the twenty-second watch-it's Chief walked out on "He leaves it on"). A crossing to someone ("crosses to the Chief", "walks over to him") does too, but not to a mark past them on the way (the twenty-first watch-it's Chief crossed to Otto by way of the door behind her, and back). With no free mark near them, the walker walks up to them instead: a move to the character (EpisodeIR 1.8). Walks follow the set's walkways; action that needs a walker waits for them to arrive. (implementation) "Hops" goes at gait hop: the hiccups watch-it's Chief walked about after the wrench landed on his foot. A walk to a thing ("sneaks up to the cupboard", "walks to the bucket") goes, at its gait, to within reach of where the thing stands, on the floor or on a piece: the thirty-ninth watch-it's Otto stayed at the helm. A sentence that opens on where it happens round someone ("Behind her, Otto sneaks to the pilot seat") is about the one it names next: the thirty-ninth watch-it's Captain sneaked off for Otto. A sentence that walks somewhere and then somewhere else ("sneaks to the bucket, picks it up and sneaks back behind the engineering console") is read as two, the second by the same one; so is one that opens or shuts "it" between other business ("She opens it, stuffs the laundry inside and shoves it shut"), each in its turn. "Sneaks back behind the console" goes to the mark the set describes as behind it, and "sneaks over and crouches beside him" goes over to him, down beside him. A walk on from a place waits for what they do there first (the Chief stood up with the bucket before he set off back). "Walks up to the main screen" goes to the prop the phrase names more words of than any piece of the set (the helm's screen); "faces the main screen" turns them to it. Looking "into the camera" or "straight at the camera", and a line "(to camera)", look down the lens: the thirty-ninth watch-it's Inspector, on a video call. A face that falls ("their faces fall", "his jaw drops") is a face, not gravity: sad, or surprised, never a landing; "pulls faces at" someone is amused, and looks at them. A sentence opening on "Their" is about everyone in sight, as one on "They" is. Business set behind the talk ("Behind her, the Chief sneaks to the bucket…", "Meanwhile, …") plays under the next line rather than holding it: the line follows the paragraph's own reading, unless its speaker is among those doing it. A prop named for a piece of the set's furniture (a galley table, where the set has a table mount and no table of its own) stands on that piece from the first time the action names it, and a thing put on that piece goes on the prop. A thing named alongside another ("The deck of cards and the chocolate bar sit in the middle of the table") stands where they both do; a prop is not placed by words another names more fully ("the deck of cards" is not Otto's cards), nor by a mark's description that names a piece of the set ("the card table"). "Each holding a hand of cards" gives each their own, held from the paragraph's start. A thing that comes "out of her sleeve" (or his pocket) is in it until then. "Goes nose to nose with" or "squares up to" someone walks right up to them, however near they stood. An accusation ("Cheat!", "Liar!") is angry, and a bite or a mouthful ("takes a big bite", "munches") leaves a thing in its bitten or eaten state, when it has one. A thing stood "on a crate" goes on one of the set's crates that nobody sits on: the forty-first watch-it's projector stood on the crate the Captain sat on. A prop someone puts up ("pins the sheet up", "pegs", "tacks", "tapes", "smooths it out") is a hand on it, from where the set says it goes (a mark whose description names it, the screen spot for the sheet), walked up to first; Otto pinned the sheet from across the hold, and it hung on a crate. "Points at" or "holds her hand out to" a prop gestures at it, "covers her face" covers her eyes, "raises her hands" and "throws his hands up" turn the palms up, and "leans back" (against nothing) leans back as a gesture; leaning forward while sitting stays sitting. "It hangs" (hung) is the hung state.

  • Delivery: emotion comes from a parenthetical keyword table, else neutral; pace and volume come from the parenthetical and punctuation (! louder, ... slower). Calm, serene and composed read as deadpan, said a little slower, which is how an unflappable captain is played; gruff reads as annoyed; quietly, small and timid make it soft. (implementation) A line whose parenthetical and words name no feeling takes the one the action last showed on its speaker since they last spoke ("June backs away, wide-eyed. … JUNE: GRANDPA!" is afraid); a bare exclamation is excited only when nothing else says how they feel, and a line that only calls a name is neither. The third product audit's terrified "GRANDPA!" got a thumbs-up. The director's own beat gestures never cheer (thumbs up, fist pump, clap, cheer) someone the scene last showed afraid, worried, angry, annoyed, sad, disgusted or contemptuous.

  • Staging the corpus (implementation, the third product audit's finding 3): backing off ("backs away", "takes a step back", "steps back from the table", "edges away from him", "backs into the corner", "runs away from Ben") goes to the nearest free mark at least 0.8 m farther from what it names, else whoever is nearest, else up against a piece of furniture farther off, and turns back to face it; it is no exit. "Walks past her to the window" walks to the window; "walks past her" with nowhere named goes on to a mark beyond her. "Heads for the door, then stops" and "walks toward the door" stop on the mark nearest the way out; "runs back toward the wheelhouse" or "heads to the kitchen", rooms the set does not have, go to the way out they came in by, out through it when no mark stands by it. "Stops halfway to the door" stops on the mark nearest halfway; "paces" walks to the nearest mark and back. Out of doors (an EXT heading), someone not yet seen who "walks out" comes on. A he or she opening a sentence is whoever the sentence before was about, when no line came between, unless it handed the other something ("Maya hands Rosa the box. She opens it."); "her" in "Otto and the Chief stare at her" is someone besides them; "them" in a look is the others. A plural subject ("Dev and Ben come in", "They run out") moves each of them; "Maya nods at Dev, and he nods back" is two sentences. A look or gesture given ("gives him a thumbs-up", "gives her a long look", "exchange a look") is no hand-off. Looks and gestures aim only at someone on stage, or leaving in the same paragraph. A name in capitals after "a" with what they look like ("A TALL STRANGER") is the character brought in, and a role's capitals run through "A" ("A tall MAN IN A BLUE SUIT"); "the" is nobody's first name. A paragraph mid-scene that stages nothing, brings nobody in, writes no beat and follows no walk passes in 0.3 s. Out of doors the sampler gives each open side a way on and off (way_left, way_right, past the edge of the ground), so "walks off down the street", "comes up the path", "strolls in from the left", "disappears into the trees", "stumbles out of the woods" and "heads home" come on and go off; "runs after her" after she has gone goes off the way she went; and "slips back inside" goes off through the nearest door. Someone who has gone off and "comes back in", "comes up the street" or "steps out of the trees" comes on again, the way they went unless the text names another way. Getting into a car ("gets in", "climbs into the car") comes on into a seat, the one named ("on the passenger side") else the nearest; "gets out", "gets off the bus" and "climbs out of the car" go off, and "gets on the bus" or "climbs aboard" comes on. In or out through a building's door ("goes inside", "heads back in", "goes into the house"; "comes out of the house") takes the nearest door, off from the street or on into a room, and out of the building from inside it ("hurries out of the diner") is off. Out of doors, anyone else comes on and goes off at the edge of the ground, a way with no door, not the house's front door; coming on there with nowhere named, they walk on up to whoever is nearest the way, since the way's own mark is at the very edge. "Comes up from the cabin" and "comes through the doors" come on through that way; "comes to the counter" walks there; "gets up and stands in front of the TV" stands by it. Nobody sits or lies on nothing: with no seat under them and no floor in the sentence ("sits on the floor", "lies down on the grass"), they go to a free one first, facing whoever they sit across from, the one "across the aisle", beside whoever they sit next to, else the nearest; lying, a seat when no bed is free; with none free, they walk up to that person and stay standing. Getting into a bed or a bunk lies in it, not on its edge. Someone named only as what another looks at is not on stage before they come in ("Maya looks up at Rosa. Rosa walks in."). Wide eyes with a retreat ("backs away, wide-eyed", "recoils, eyes wide") are fear, not surprise; wide eyes alone, a gasp or a freeze stay surprised. The corpus judge no longer takes a surprised face for an afraid one. A seat "by" something ("drops into the chair by the radio") is the kind of seat the words name nearest that thing, a piece with seats of its own is sat in on one of them, and with no such seat nobody walks to the thing or sits on air. Whoever comes in through a door in a deep wall (the hatch inside a boat's wheelhouse, a ladder in the engine room's hull) appears in its doorway, where the wall clears their head, and whoever goes out vanishes where it would take their head; the corpus judge counts a head in a wall as against the text. A seat or a bed is taken only by someone whose head fits above it there, sitting or lying as it has them (compile's head check, with their own body), wherever the director picks one: the opening blocking and every mark after; a grown-up who "sits on the end of the bunk" takes the bench at its foot, not the bottom bunk. A seat too low to sit up in, where a crouching head clears it, is taken crouching: in the opening blocking, on arriving there and when the text sits them there, so the thirty-first watch-it's Chief scoots into the tent's low end bent over, out of the drip. Where the director picks among seats (a seat by what the text names, the one beside someone, the nearest when a seat is taken, a scoot), it takes one where they sit up first, and one they would crouch in only when none of those will do; a seat the text names is taken all the same, as "sits on the bottom bunk" crouches on its end. The opening checks head room for the posture someone takes there, so sitting in the bottom bunk is not lying in it. A walk passes a mark on the way only where one stands upright there, with nothing over it at a standing person's chest and head (the top bunk is; a chair or a sofa is not). The corpus judge counts a head in any piece as against the text. core/test/staging-corpus.test.ts measures each change.

  • Every gesture seen (implementation, the third product audit's findings 6 and 3; director/gesture-framing.ts): once the cut is made and its worst framings reframed (director/reframe.ts), the director looks for every gesture of the compiled episode in the shot playing at its stroke. Where the hands are comes from the gesture's library keys at its stroke, played at the cue's strength, as the engine's pose solver places them (the arm laid out as the joint layout lays it, round a wide body; limb rotations on it, carried by the chest's carriage and the gesture's own chest turn; an aim at a target; a hand on its own face or chest; compile/gesture-sight.ts), drawn where the engine draws a body, on a flat card at its floor point turned to the camera; a nod shows on the face. The hand model's error is measured and bounded: engine/tests/character/rw_gesture_hands_test.gd holds every hand of the demo's cast, and of a new show's father, teenager and child of three heads (core/test/fixtures/fresh-show), within handErrorHeads of where the rig draws it (0.4 head heights for an ordinary build and carriage, 0.6 for a heavy or hunched one; worst measured 0.28, 0.09 on average: a hand on the face, the eyes or the chest goes where the gesture has turned the chest and bowed the head, as the engine steers it there), and a gesture counts as seen only when its hands are inside the frame by more than that. A gesture whose hands (or face) are not inside the frame so, or are behind a piece of the set from the camera (with the same room for the model's error: a hand inside a piece's footprint is behind it, but for a hand pressing or patting it), or that plays while the cut is on someone else or another place, is not seen; a held one (folded arms) is seen as its stroke is, however long the cut stays on them after, and not when the cut is away as it lands (Night Ferry's June folded hers out of the wide she sat down in, and held them through her own medium shot); and: a gesture that carries the beat (one the script writes, an intense line's own, every one the model director cues) widens its shot a size at a time, a medium shot for a close-up, when the shot is framed on whoever makes it and the frame's edge, not a piece of the set, cuts it off, and when one a piece of the set hides is on a line whose feeling already allows a big gesture (excited or angry at 0.6 or more, or said loud or shouted; never a sad, tender, tired, bored or deadpan one), it is played bigger, a tenth at a time up to full strength, the least that brings its hands up over the piece (Otto's fist pump for the shouted "Told you! Optimism!", on "Told", behind the workbench in the bench's setup: 0.8 to 0.9), as is one on no line at all, the action's own, which no line's feeling holds down; else that shot, a framing or a setup with them in it, is framed again on the same people, from higher, a size or two wider, or from another side, the first that shows it, adds nothing against the cut's grammar and scores no worse (director/framing-scores.ts; the same pump on a sad line: the bench's medium long shot of her becomes a long shot of the Chief and her from higher); and where neither alone shows it, the hands outside the frame as well as behind the piece, it is played at full strength, up over the piece, and the shot framed again so (Lunch Rush's Pip, sat at the cafeteria table, beckons Jada over in a setup that cut her hands off: each tried alone, a bigger beckon cleared the table but not the frame, and every framing had the table in front of it; now a long shot of the two shows it at full strength); and when the cut away from it comes just before its stroke and the shot before shows it, the cut waits (up to 1.5 s, to 0.3 s past the stroke, leaving the next shot at least 0.75 s: Otto's touch on the cracked porthole had the cut go to the Chief as her hand came up); else it moves up to 1.5 s, to the nearest shot that does show it, never onto another gesture of the same arms (a listener's nod played on the cut to them); else it is not cued, but for one the script writes, which is never dropped: the director warns that no shot shows it (director.gesture_unseen: "Rosa Ortiz's point plays behind the counter where no shot shows it"), for the writer to cut it another way. A widening is tried alone, a size at a time, and taken only when the gesture is then seen and the compile finds nothing new against the cut's grammar or framing (no jump cut, no face on the frame's edge, no camera behind a wall or past the set's open front, as the reframing holds itself to); a wave in Otto's close-up goes out to a long shot when the sizes between make a jump cut. A speaker's small hand beat belongs on its word: where no shot shows the hands it is played with the body instead (beat_lean: the shoulders, the chest and the head), and dropped, never moved, when not even that is seen; it never pushes a close-up out to a medium shot (the coverage's "a hand beat plays in a single no closer than MS" is for the gestures that carry the beat). A crowd's reaction is one sighting, under its crowd cue: its extras placed as the compile draws them, seen when three of them are; a framed shot that misses it widens, a size at a time, and else the director says no shot shows it. A widening the compile refuses (a crossing, a hidden face) is undone and the gesture moves or goes. Each try is compiled judging its own scene's film grammar alone (compile.ts grammarOf: no rule looks across a scene's edge, and every shot's size still counts toward the episode's framing bias), on stages kept for all the director's compiles, each of which plans a walk once (Stage.planWalk); and in that scene a shot is judged again only where what its judging reads changed (compile/judged.ts: its own facts and, frame by frame, the camera, everyone's state, look and cover, and the props standing), the shot the try reframes and one beside it whose look turns at the cut. A try costs a shot's judging or two, however long the episode and however big its crowd (core/test/director-cost.test.ts; a random three-scene script took 41 s to direct and takes 12 s, Lunch Rush 43 s and 14 s). Each change is a note (director.gesture_seen), but for a beat that goes, which the script never asked for: "Ottoline Brisk's palms up played outside the frame of a medium shot: the shot is widened to a medium long shot to show it." core/test/gesture-framing.test.ts counts the gestures out of frame in the cold open (as it ships, and directed) and The Salvage Claim (by both directors): 0 of 1, 1 of 1, 4 of 5 and 0 of 1 before, and none after (of 1, 2, 4 and 1, the beats included). The engine, reading each hand off the card it draws through the shot's camera, agreed: 3 of 8 out of the frame before, none of 8 after. The cold open as it ships, directed by hand, pointed on "kid" at half strength behind the engineering console the Chief stands at, out of sight from every camera; it now points at full strength, and the engine draws the hand 18 px above the console's top edge at the stroke (the model, with the Chief's error room, cannot prove it, and the test records it as the engine's).

  • Looks: the speaker looks at who they address and the listener at the speaker. Who a line addresses: the one a parenthetical names ((to the Chief), (turning to Otto)), else one the line calls by name on its own (a sentence or the edge of one that is only a name, "Chief?", "Happy birthday, Chief!", or a title and a last name, "Ms. Brisk."), else whoever spoke before or speaks next. (implementation) The first answer used only the last: in a three-handed scene the sixth watch-it's showrunner wrote "(to the Chief)" on five lines and every look went to the one who spoke before. A look further round than head and eyes reach (95°: the head's 60° and the eyes' 35°) turns the body; someone seated swivels. (implementation) Someone reading ("She reads it", a parenthetical "(not looking up)" or "(still reading)", "without looking up") keeps their eyes down and turns to no one, speaking or listening, until they look up: the twenty-first watch-it's Captain, at her star chart, turned to every speaker.

  • Sound cues: SFX come from capitalised sound words in the action (PINGS, CLANKS), matched against the show's sounds (audio/sfx/<slug>.flac is sfx.<slug>). A tie between sounds goes to the one the sentence names, then the one the scene names (the set's id, name, aliases and type, the action so far): The core HUMS in the engine room is sfx.engine_hum; then to the one with the fewest words the sentence leaves out: The Chief HICCUPS is sfx.hiccup, not sfx.hiccup_squeak. An unmatched sound is a missing-asset diagnostic, and a tie nothing breaks is director.ambiguous_sound: never a guess. (implementation) A sound comes from the piece of the set its sentence names, else the prop the sentence is about ("The wrench CLANKS"; a sentence that is the sound alone, "BONK.", from the prop the one before was about; EpisodeIR 1.23), else whoever it is about, else whoever the sentence before was about ("…elbow-deep in the vent's wiring. A wrench CLANKS." is the Chief's), else whoever the paragraph is about. A sound that goes on, because the sentence says so ("over and over", "keeps beeping", "won't stop") or by its nature (the core HUMS, a fan WHIRS, a clock TICKS), repeats until later action says it stops ("the pinging stops", "falls silent"), else to the scene's end. (implementation) A sound word that matches one of the show's music tracks (audio/music/<slug>, music.<slug>: "a scratchy old WALTZ crackles out") starts it on a loop (EpisodeIR 1.28), and a later sentence that says it stops and names it, or says "the music", "the song", "the tune" or "the record", stops it with that sentence's last sound ("The waltz stops dead as the needle SKIPS"), with no fade when it stops dead, abruptly or cuts out. A prop whose state changes in the paragraph that starts a track plays it: set back in that state ("the record player is playing again") it starts the track again, and set to another state while it plays, it stops it. The twenty-sixth watch-it's waltz was a sound effect that played its bars once.

  • Crowds and extras (EpisodeIR 1.59, Timeline 1.34): a sentence about a crowd ("Crowds rush past", "Passers-by stop and stare at Mei", "A crowd gathers round the busker", "A cheer from the crowd", and "Faces turn" or "Heads turn") is a crowd cue: rush past, gather, cheer or turn to look, how many when it says ("two passers-by", "a dozen", "crowds" are 20, else 12, at most 24), at whom it names, else at what the action holds up and has not put down, else whoever it named last. "The crowd slows. Faces turn." is one turn, and a cue after business in its paragraph waits for it; at a thing held up overhead just before, with no line or other paragraph since, it reacts as the thing goes up, while it is up there ("Mei holds the red lantern up high. The crowd slows. Faces turn.", "He holds it up. A cheer from the crowd."), and their eyes follow it after. A crowd that opens a sentence is what it is about: "The crowd turns to Mei" is no turn of Mei's. Someone the action brings on with "a" or "an" in capitals whose words name a role ("A STALL OWNER pulls down a shutter", "an OLD WOMAN") and nobody of the cast answers to is an extra of the episode (extras), acted, voiced and named as the cast is, with no cast file to make: the reading offers to make the others only. Both are drawn from the show's people pattern (the one most of its cast came from, else its People), each from a seed of its id or of its scene and number, a crowd at ages from children to the elderly; loading the episode draws them again, the same. The compiler plays a crowd after the cast and the shots, in lanes across the set's floor and never past its walls (those that pass in front of the cast as the scene's first camera sees it least, first): off at one end and on again at the other where no camera sees either end, else turning round at an end and going back; with no lane, each on clear floor of their own. It stands round the focus with its front to the camera open, slows and turns one after another, and cheers with arms up. It keeps off the cast, the set's pieces and the props, and anyone of it who would stand in front of the cast in a shot is not seen from coming into the picture until leaving it or the cut. Its people never speak or blink, make no foley, and the engine draws them on twos at a lower level of detail, each drawing kept while it holds.

  • Coverage:

    • an establishing setup at each new set;
    • the set's named setups first: a setup centered on the speaker that shows their face is their single, one that shows both sides of an exchange the two-shot, and a sound from an element with its own setup (core_up for the core) cuts to it as an insert; (implementation) not when someone stands between that camera and the element, as the solver's inserts never do (the twenty-third watch-it's set insert on the helm showed the back of the seated Captain's chair, not the egg hatching on it);
    • (implementation) a sound from an element whose set has no camera showing it close (the element under a fifth of the frame's height in it) cuts to an insert the solver frames on it (camera type insert, EpisodeIR 1.10), turned 0°, ±30°, ±60° or ±90° until it stands inside the set's camera region, came in no closer than three quarters of its distance to stay there (else it is crammed against a wall), has nobody standing in the line of sight or around the camera, no furniture across it, and cuts no face. The tenth watch-it's kettle whistled small in the bridge's wide; it now fills the frame, seen square from the room; (implementation) a thing with a face (a screen, monitor, console, panel, sign, clock, gauge, picture, map: FACED in its piece, id or name) is only ever shot from within 60° of its front (its yaw, 0 facing +Z), by the set's own camera or the solver's, and gets no insert rather than its back (the thirty-ninth watch-it's main screen could only be shot from behind);
    • blocking goes wide: an entrance cuts to a setup that sees the way in, an exit or a walk to a wide shot that holds the walker;
    • (implementation) a walker stays in the picture, and a walker who talks keeps their face to it. The tenth watch-it's engine room lost Otto, talking, as she crossed to the core: the crossing's shot framed where she started, and a close-up split in after it framed her before she set off. Holding is checked at a quarter, half, three quarters and the end of the walk. A crossing needs no cut when the shot already up holds them. Its shot shows everyone on stage, unless they stand too far apart for one picture or one of them is behind something from every angle (the twenty-seventh watch-it's Captain walked to count in a three-shot with Otto behind the rack all along): then the walker. Otherwise it gets a shot that holds them, still or panning with them, before one that does not; when no shot of everyone or of the walker does, an MLS, LS or WS on the walker alone from each of the single's angles, still or panning. The engine room's Otto, talking to her fern on the straight way round the core to it, had her back to every one of the set's cameras: a WS ahead of her pans with her as she comes towards it and past. When the style allows pan, the pan turns from their bearing at the start to the one at the end, linear as they walk, between 6° and 90°. A split never puts a close shot on someone who walks while it is up; it offers an MLS, LS or WS on them, still or panning, instead, for the walk on from a door too once they are through it (the twentieth watch-it's Otto sneaked from the hatch to the stove for 11 s on the shot of the hatch). Nor does a split of a shot of one walker cut away to someone else's reaction while they walk on: the twenty-first watch-it cut from the Chief crossing to Otto's tray to the Captain reading, for the six seconds he took to get there and take his mug. Last, any still shot one of its subjects walks out of pans with them; failing that a framed one widens a size at a time up to an LS. Failing both, it goes when the shot before holds them all the while.
    • otherwise shot/reverse-shot singles on the speaker, framed on the side their face turns to and clear of anyone in front of them; (implementation) a single turns up to 60° round from the side of whoever its subject talks to, and when none of those angles sees the face, out to 150° (90°, then 120° and 150°; EpisodeIR 1.24 past 90°): the twenty-first watch-it's Captain read on facing where the Chief had stood, and every angle from where he had walked to saw the back of her head;
    • (implementation) last, the eyelines film grammar checks: where consecutive singles show two people looking at each other and both looks run the same way across the screen (a pair off the scene's axis can), the second shot turns to an angle whose look opposes, else the first (to none that crosses the look of the shot before it: turned against the hide-and-seek Captain's crossing, the Chief's single then ran his look the same way as hers before it), else the second becomes a two-shot of the pair. The thirteenth watch-it's Otto and Captain, beside a Captain/Chief axis, cut that way. Each shot's camera is solved where the compiler solves it, on the shot's first frame, and its side of the axis read there too: solved where the look is read, the fourteenth watch-it's close-up on Otto, turning to the Chief during it, stood somewhere else, and its repair missed. Whom a look is at is read as grammar reads it, from the compile's held looks (CompileReport.looks), not from how near its point is to the other's eyes: the seventeenth watch-it's Otto looked where the Captain had been as she walked in, and the repair took it for a look at no one;
    • (implementation) then screen direction: whoever walks out through a side of one shot comes into the next from the other side, or square on, or the next shot turns to an angle that brings them in so (legal, every face whole, seen and in the picture, no jump cut, no eyeline undone), else the shot before turns. The seventeenth watch-it's Captain walked in through Otto's single, out of it frame-right, and into the group after it from frame-right (grammar.screen_direction), and the episode could not be shown;
    • (implementation) a framed camera with room: of the angles that show the face, one that stands where its size wants it before one the walls bring in (to under three quarters of its distance), and a group's wide shot takes an angle that keeps half its distance before one that shows every face. Last, a framed shot still crammed (under half its distance) or standing inside someone while it plays turns to another angle or the next size in or out that has room, keeps clear of everyone, cuts no face at any point of it (the thirty-eighth watch-it's Otto, turned to, had the Chief's face at the edge from halfway through) and is no jump cut from the shots beside it (when every such angle would be, the shot beside it plays on instead; one that then plays too long is split again, with shots that have room, keep their subjects in the picture and unhidden, else with the establishing setup when that shows them and a speaker's face: the twentieth watch-it's Otto held 12.8 s in one close-up at the stove), else gives way to the set's establishing setup when that shows its subjects, a speaker's face, and (unless the camera stood inside someone) no face cut by its edge. The eleventh watch-it's galley, all three drifted into the bridge's back corner, cut between singles on lenses widened to 8 mm and one from inside Otto. A camera standing past an interior's open edge, where the fourth wall is not drawn, is as bad when a corner of its picture sees out of the set (under the deck, past a side wall's end, over the ceiling), and a turned group's angle hides none of it behind another nor sees one of it from further behind than their profile: Hat Day's wides had stars below the deck, then stood at the wall behind the Chief, his back a third of the picture;
    • sizes follow the style's framingBias: quiet, emotional and short lines, reactions and the scene's last line go closer (MCU or CU), establishing and blocking wider;
    • a reaction shot where a line ends in ? or ! and the listener is on screen;
    • a two-shot every averageShotSec × 4;
    • every cut on the line start with snap: silence;
    • shot lengths kept inside minShotSec…maxShotSec by merging or splitting, and the scene's pace inside the style's. A speaker's single too short to stand takes the time of a lesser shot before it (a reaction, a wide for action), unless, framed from that earlier start, it would lose them (the thirty-eighth watch-it's "BOO!", close on Otto still crouched behind the console, lost her as she sprang up), but not of one that plays on through lines of its own subject: Hat Day's reaction on the Captain went on through her "Splendid. Very navigational." and "Chief?", and gave them to the Chief's console for his one muffled "No.".
  • Written shots (implementation): a paragraph that is only a shot, in capitals, is a camera direction, never a sound, business or an entrance. Night Shift, a Final Draft script whose Shot paragraph "close on the scanner" comes in as CLOSE ON THE SCANNER, gave the action's "CLOSE ON" has no sound in the show, and nothing cut to the scanner.

    • What is a shot line (shotLine in action.ts): the whole paragraph in capitals, at most ten words, one phrase (no comma, !, ? or full stop inside), opening with a shot term: CLOSE ON, CLOSE-UP, CLOSE SHOT, CLOSER, TIGHT ON, CU; EXTREME CLOSE-UP, ECU, XCU; MEDIUM CLOSE-UP, MCU; MEDIUM SHOT, MS; ANGLE ON, NEW ANGLE, REVERSE ANGLE; INSERT; WIDE (SHOT, ANGLE), WIDER, LONG SHOT, FULL SHOT, ESTABLISHING (SHOT), MASTER (SHOT), WS, EWS; TWO SHOT, THREE SHOT, GROUP SHOT; ON ; 'S POV (or P.O.V., POINT OF VIEW, with what they see after a dash or ON); BACK TO SCENE, RESUME SCENE. A term run straight into words with no ON, OF, dash or colon between is action ("MASTER CHIEF ENTERS"), and so is a bare ON before more than four words ("ON THE COUNT OF THREE EVERYONE JUMPS").
    • What it is on: a character by name or pronoun (a part of them too: "HER EYES" is their face, "THE CHIEF'S HANDS" their hands, framed at MS, feet at LS), a prop, a piece of the set by its words or by the graphic it shows ("THE SCANNER" is the helm screen showing gfx.scanner_screen), or the set itself ("ON THE BRIDGE"). A shot line that names nothing ("CLOSE-UP", "INSERT", "OTTO'S POV") is on what the paragraph right after it is about: whoever it names first, else the prop or the piece of the set it names; a POV with nothing there looks at what its viewer looks at. Words that name nothing the scene has are director.written_shot_unknown, and a shot whose words name nothing at all is not played (the director's own coverage plays there). Whoever a shot names is in the scene, on stage from the start.
    • What it frames: CLOSE ON, CLOSE-UP or TIGHT on a character is their CU (EXTREME an ECU, from the angle that sees the face squarest and centred on the face itself, halfway between the eyes and the mouth, as the framing solver centres every ECU; MEDIUM an MCU), ANGLE ON, ON or MEDIUM on them their single (MS); on two of them a two-shot, on more a group. CLOSE ON, INSERT or ON a prop or a piece of the set is an insert on it, by the set's own camera when that shows it close, from in front and with nobody in the way, else the solver's insert (camera type insert, its size CU, MCU for ON, ECU for EXTREME), on the inserts' own rules. A prop in someone's hand is framed there, in the hand, as the engine draws it (heldScale times its size about the grip): by an insert that keeps it well inside the picture all the shot, with nothing before it (the holder's own body, someone else, the furniture) and the camera in no one ("INSERT - OTTO'S MUG" with the mug in her hand had been a CU on her face, the mug out of the picture). WIDE, ESTABLISHING or MASTER is the set's establishing setup, else a WS of everyone in sight. TWO SHOT is a two-shot of the two it names (else the two the scene then plays between), framed close on them or by a set camera that holds them before the set's wide. A POV is through the viewer's eyes: a set camera standing within 0.6 m of them that sees what they look at, else a single (MCU) or an insert on it, said plainly. BACK TO SCENE is the director's own coverage again from its line: a group of those in sight, else the set's wide. A shot line takes no time unless it opens the scene or nothing after it is its to hold (another shot line follows, or the scene ends): then it holds 1.5 s.
    • How long it holds: from its line to the next shot line, BACK TO SCENE or the scene's end, and no further than its beat. The paragraph or line right after it is always its. On someone (a single, two-shot, group or a POV on a character) it holds what they do and say, and ends at a line said on screen by someone it does not frame, or action about others alone; on a thing (an insert, a POV on a thing) it holds action that names no one and ends at the first line said on screen or action about someone; a wide holds all the action and ends at the first line said on screen by someone it does not name. Within it the director makes no cuts of its own (no reactions, two-shots or splits, but a long single may cut to its own subject two sizes away); where it ends, the director's coverage resumes, with a cut back when its own coverage made none there.
    • Too short to read: a written shot ends where the next one starts. One shorter than the style's minShotSec (with a 0.1 s margin for the cut's snap to silence) never plays on into the shot after it, and the director's own shot just after one never gives its time to it: an insert over a blink, in a style that cuts no faster than 1.2 s, had played on through the Chief's line after it, and Otto's extreme close-up through his "What?". The scene waits instead, before the cut that ends the short shot, as long as it lacks (waitBefore in heuristic-perform.ts: that cue's gap after the one it follows grows, and everything timed after it moves with it), and the episode is covered again on the new timing; the written shot's note says held 0.15 s longer so it reads. Where the scene cannot wait (a re-cut keeps its timing, the cut is inside a line or on a cue placed with another, or the scene ends there), the written shot plays as long as it is and director.written_shot_short (warning, on its line) says so and why, with a hint: give it more to hold (action after it, or "A beat."), or direct the scene afresh.
    • When the rules forbid it: the nearest framing that keeps them, said in the shot's note and as director.written_shot_bent (info, on the shot line's line). A new set opens on its establishing shot, so a scene's first shot line comes after it; a prop in someone's hand that no camera sees there all the shot (the furniture hides it: the Chief holding Otto's mug at his waist behind the engineering console; they turn away, or move it about) gets their single at MS, the hands and what is in them in the picture, and one lifted in a hand (a sip, a close look) a CU on whoever holds it; a thing no camera inside the set sees close, clear and from in front is shown by the set camera that shows it best, else by an MCU on whoever stands within 1.5 m of it; a insert every turn of which at its size would jump from the shot up (whoever stands at the thing is in both, at much the same size) goes in to an ECU; a framing every angle of which would still jump lets the shot up play on; the axis, the eyelines, the screen direction, a face cut by the frame, a subject hidden or walking out of the picture and a camera crammed against a wall turn or resize it as they turn any shot (a written shot keeps its framing where the shot before can turn instead); a shot that cannot stand at all is director.written_shot_unplayed, with why. A shot played as asked is director.written_shot (info), and so is BACK TO SCENE. The read-along stages what each shot line asks under its paragraph; reelwright direct and try_action print what each became.
  • Property it must hold: the lighthouse and salvage claim screenplays directed heuristically compile with zero grammar errors and no grammar warnings. The test checks this, and checks zero errors and no cutting, pace, framing or face warnings on randomised small screenplays over the demo cast and set.

  • (implementation) Code: core/src/director/heuristic.ts (the pipeline), heuristic-perform.ts, heuristic-cover.ts, snapshot.ts, setups.ts, action.ts (who a sentence is about, pronouns, sound, posture, look and movement verbs, the places they name), delivery.ts and sounds.ts. A negated clause in the action ("does not look up", "without looking round") is not done, so it makes no cue; the rest of its sentence still is. Beyond the rules above: each action paragraph is a beat long enough to read (and to hold an insert); a sound word the engine can also show becomes its effect: the show's own first (SPARKS → fx.console_sparks in the Marigold), else the engine's (sparks.v1); a spray ("the kettle sprays steam in Otto's face", "puffs smoke", "blows glitter") plays the show's effect for what is sprayed, found by its words as a sound is, on what sprays it (an element, the element standing in for a prop nobody handles, or the prop itself, in a hand or where the scene stands it, prop.<name>, EpisodeIR 1.21: the seventeenth watch-it's confetti burst from the Chief's chest, not the cannon in his arms) and aimed at whom (a face or eyes wins over anyone named first; FX cue toward, EpisodeIR 1.17), and a spray the show has no effect for is reported once (director.missing_fx); (implementation) the effect of a sound that goes on plays as long as the sound (FX cue until, EpisodeIR 1.27), and what stops a sound going on ("A loud CLANG. The rain stops.") stops it at the paragraph's last sound before, not as the paragraph starts; the lights going out ("Every light on the Marigold dies", "the power fails") change to a preset of the set's for the dark (its id or description says blackout or dark), and coming back on ("The lights come on with a THUNK") change back to the heading's, a scene whose lights come on opening dark (a lighting cue, EpisodeIR 1.18; director.no_dark_lighting when the set has no preset for it); a red alert, the lights going a color or the emergency lights coming on ("Red alert!", "the lights turn red", "bathed in amber") change to the preset whose id or description names it, and the alert's end ("the red alert cuts out", "the lights go back to normal") back to the heading's; FLASH, FLICKER, BLINK and GLOW in capitals are seen, not heard; a stumble ("everyone staggers", "the Captain and the Chief stagger", "…, and everyone staggers") is the ship throwing them: everyone it names who can be seen stumbles, whatever pose they held, which it breaks; everything shaking ("the whole ship shakes", "the bridge lurches violently", "an explosion rocks the station", "the deck trembles slightly") shakes whatever shot plays for 1.5 s, 3 s when it keeps on, harder or softer as the words say, with the sentence's sound when it has one (a shake cue, EpisodeIR 1.33; the thirty-fifth watch-it's meteor storm shook nothing); a character down behind cover with an on-screen line stands to say it, unless its parenthetical says the voice comes from there ((muffled), (unseen), (from under the console)), and an off-screen line from behind cover is covered from where the voice comes; dual dialogue gets a two-shot; no cut lands in someone else's words; a cut that would jump is dropped, or bridged by a single on who the two shots share, whoever the action then is about first (the Captain as a gust lifts her tricorn, not Otto at the helm). A beat with an element's moment that no camera shows close (the bridge's whole aft door, under its vent) is covered as any other action; the establishing wide, on nothing in particular, is no insert on an element with no parent. The performance is compiled provisionally (under one wide shot, without film grammar: the wide is a placeholder, and its grammar says nothing of the episode; a set with no establishing setup whose first setup rolled the camera stopped every scene with a dutch-angle error) and read back as a snapshot of who is where, facing which way and how high they float, frame by frame (the floats were left out until the eleventh watch-it, so floating heads were framed on the floor and the axis read as if nobody floated): arrivals and body turns are decided from it, and coverage judges every camera against it with the compiler's own framing solver and face check. Sizes are balanced over the episode so far, scene by scene. A two-shot on a line shows the speaker's face or is not cut to (the single stays), turning round them to find one. A single, or a set's camera used as one, never puts the picture's edge through someone else's face when an angle avoids it (grammar.face_cut), and a size change that would is not made. (implementation) Nor one with the subject's face hidden behind the set or someone else (grammar.subject_hidden): a single turns to an angle that sees it, then one that cuts no face, and with neither at its size tries one size in; hidden behind someone from every angle, it becomes a two-shot of them and whoever hides them that shows the subject's face. A group's set camera, two-shot or wide does the same, checked at its start and a second in. The thirteenth watch-it's showrunner found the Chief hidden behind the Captain's scorecards in three singles only by rendering stills. (implementation) Nor, after those, one whose picture buries its subject in the set (grammar.subject_buried: the camera in a piece, a piece hiding half their body or more, or the pieces before them a third of the picture), nor a single with someone else's head across the middle of its picture before its subject: those rank after a clear angle and before a hidden face. With none clear at its size, a single tries the angles between (±45°), then one size in, then from above looking down past what is before them, then further off, each taken only if it is clear and cuts no face. A group's angles rank the same way. The eyeline match and an off-screen look turn a single to a clear angle first: one whose look opposes the other's, else one looking near the lens, else a clear two-shot of the pair that cuts in and out without a jump, else the single as before. The hide-and-seek Chief, leaning in the aisle between the crates, kept the crates in front of him from the only angles that matched the Captain's look; the Marigold engine core's round body, read as a box, had buried people beside it who were in plain view. (implementation) A two-shot or wide whose camera, brought in from a wall, leaves one of its subjects out of the picture (grammar.subject_out_of_frame) is the last choice of the angles turned round them, and one that keeps no one out is preferred in the fallback too: the fourteenth watch-it's three-shot of the Captain leaving stood half a metre from the Chief. (implementation) Nor does a group's: a set camera for a two-shot or a group cuts no face at its start or half a second in. A two-shot on a line takes only an angle that cuts none. A hand-off or a float wide that would cut someone's face turns, framing them too if that shows more of the pair's faces, to the angle with room that shows the most of them. The thirteenth watch-it's hand-off cut Otto's face at the helm in half; now all three are side on. A size change after planning (the balance, a beat's hands, a split) is checked again, since a wider size stands the camera further back and perhaps across the axis; a single with no angle that is legal and shows the face takes the legal angle that turns it least away. The M5 watch-it's sixth show (Many Happy Returns, a third character mid-bridge and a toast across the room) is directed clean in core/test/heuristic.test.ts.

  • (implementation) The twenty-fourth watch-it (The Meteor Shower, a new observation dome), directed again in core/test/heuristic.test.ts:

    • Towing. Whoever an entrance tows along ("OTTO bounds in, towing the CAPTAIN by the sleeve") comes in too, just behind; past them, into the room, when they stop in the doorway (Motion.towed). The Captain stood at the window from the start.
    • Sitting together. "They squeeze onto the bench under the window: Otto, the Captain, the Chief" seats each of them on a seat mark of the bench, in the order the colon lists them, left to right as the establishing camera sees it, and the next line waits until the last is down (Sentence.together). Squeeze, cram, pile, plonk, plop, flop and settle onto a thing are sitting on it.
    • Pouring. "Pours cocoa from the thermos into the Captain's mug" uses the thermos and fills the mug (its full or filled state), which its owner takes up to hold out when it stands nowhere yet. Of props named alike ("her cocoa": the cocoa mug, the thermos of cocoa), the one in the subject's hand.
    • Effects with nowhere to come from. The show's own effect for a sound with no source ("A meteor STREAKS across the window") plays at the set's window (an element whose role or id says window or porthole, else a wall with a porthole), else where it played last, for as long as the show made it. "Then another." repeats the sentence before's sounds.
    • Sounds in order. A prop's word in capitals is heard when the show has a sound for it ("A sharp CRACK." is sfx.crack, not the dome's crack). A sound comes after the business its sentence names before it, and after the sound before it: the tape's RIP once it is out of his pocket, then the SLAP. What the sentence changes changes with its last sound, and a state the prop is in already is no change.
  • (implementation) The twenty-sixth watch-it (The Stuck Waltz: a record player, a waltz, a skipping needle), directed again in core/test/heuristic.test.ts:

    • Whom "they" means. "They", "both" and "all three" are those the scene has met so far, by name or by a line, not someone who has yet to walk on: the Captain "waltzed" with the dancers before she strolled in, and so stood on the bridge from the start. "They waltz into the middle of the bridge" walks everyone the subject names there, the first to the place and the rest up beside them (waltz, dance, twirl and whirl go places too).
    • Taken up, not changed. A state its verb names is no change when that verb takes the prop up: "She lifts a dusty record player out of the straw" did not lift its needle. A part of a prop the show has no prop for ("lifts the needle") changes the one prop whose state the verb names, with no missing-prop warning.
    • Worked where it stands. A use of what the same sentence set down ("sets the record player on the console and cranks it") is a hand on it there, not a pick-up. With nobody named, a state change is by whoever the paragraph was about before ("The record player is playing" is Otto's doing, not the Chief's across the room).
    • Hands full, no beat. A line's beat gesture with the arms waits while the speaker holds something; a nod or a shake still plays. A cry of pain ("Ow!", "Ouch!") is annoyed, not excited; a warning or a danger ("Duck!", "Hold on!", "Right on top of us!") is afraid, and a loss ("My bishop!", "Oh no!") worried, as is a theft ("It's got your compass!"); being taken aback ("Hey! That's the Captain's compass!", "Chief! You dove!") is surprised, and an order to stop ("Come back here!") determined. The thirty-seventh watch-it's Otto gave a thumbs-up to the robot running off. "Offers Otto her hand" holds a hand out.
  • (implementation) A hand on something. "Presses the button", "taps the gauge", "jams her thumb over the leak" and "plugs the leak with her thumb" are a press gesture aimed at what they touch; "pats the Chief on the shoulder", "rests a hand on the console", "clings to the helm" and "grips the console" a touch. What is touched is a character, else a piece of the set the words name, else, for a part the set does not have (a button, a leak, a gauge), the piece the scene named last; never a prop, which business handles, nor oneself. Out of reach, they walk there first; a posture in the same sentence comes first ("jumps up and jams her thumb over the leak").

  • (implementation) A sound someone makes. A capitalised word for a sound a character makes (GIGGLES, LAUGHS, SNEEZES, GASPS, SIGHS, SCREAMS, YELPS, GROANS, HICCUPS, YAWNS, SNORES, COUGHS, SOBS, CHEERS, SNORTS…) that the show has no sound for is a line in their own voice: vocal the sound ("sneezes"), text how it is voiced ("Ah... ah... ACHOO!"), an emotion to go with it, timed as the sound would be; the paragraph holds while it is said. Only someone the sentence names: "The gravity HICCUPS" is nobody's. A show's own recording of the word still plays instead.

  • (implementation) Hide and seek. "Buries her face in her hands", "covers her eyes" is a held cover_eyes (a palm over each eye), after the walk the sentence takes her on, until she next moves. A door word alone ("the loading door") means the set's way out only when the phrase names nothing else; a mark whose description names more of the phrase than any id does wins ("in front of the loading door, facing it: where the seeker counts"). "Turns to face it" after a walk to a mark leaves her facing as the mark does, and "it" is never the one who turns. ", facing the helm screen" after where someone goes or stands turns them bodily to it; it is not where they go (the thirty-ninth watch-it's Captain walked in to the screen she was to stand facing). Nobody heard but never seen (V.O.) holds a mark: the Inspector on the call kept the middle of the bridge from the Captain. "Gives a thumbs-up" (a wave, a nod, a wink, a salute, a shrug) is no prop handed over. A look at a prop ("turns to the tarp") looks at whoever holds it, else where it stands. "Tumbles out after it to the Captain" walks to her. A state's word is matched with its doubled consonant undone ("tips over" is a state called tipped), and what is done with a prop names its state ("covers himself with the tarp": covering). Waiting for walkers settles over up to three passes, and a beat that waited for a walk that now ends before what it follows goes back in line: "The Captain turns to the tarp" had played the giggle and the barrel before the SNEEZE.

  • (implementation) Dancing. Two named dancing together ("They waltz into the middle of the bridge", "dances with the Chief") walk there together, then, once the one with the longer way arrives, turn to face each other and take a held dance_hold aimed at each other: the first named leads with the right hand on the other's shoulder, the other with the left, and their free hands meet. What the paragraph goes on to do waits for the hold ("One, two... he STOMPS on her foot"). A hand on someone lets go as either of them moves on (the Chief sinking behind the console). A twirl on the floor ("Otto twirls", "he twirls her under his arm": she turns; "spins round twice") is a drift with only spin, which turns them on the spot; "freeze mid-twirl" and "spins round to face her" turn nobody.

  • (implementation) Hands together. "They grip hands", "clasp hands", "takes the Captain's hand" is a held shake_hands aimed at each other with the right hands; "shakes the Chief's hand" one that is not held. Of more than two, the two the sentences before were about, with a hand free (the Captain holding her tea referees). A pose that keeps one hand leaves the other for a gesture one hand makes ("With her free hand, she pokes it": the left). The grip brought down on something ("Otto SLAMS his arm flat to the table") is the arm-wrestle won: pin for the doer and pinned for the other, aimed at each other, and the grip, held until then, hands its arm straight over to them.

  • (implementation) Several at once. A gesture or a face the subject has ("Otto and the Chief reach for the pie at once, and glare at each other") is everyone the subject names; "reaches for", "grabs for", "lunges at" a thing is a touch where it is (a prop where it stands, or on whoever holds it), walked within reach first; "at each other" turns the two to each other.

  • (implementation) Where things are, and where sounds come from. "On the table, a plate holds the last slice of plum pie": a place, then a clause that names the thing by its last word, stands it there. Of two elements a phrase names as well, the one whose own name it ends with ("the galley clock" is the wall clock, not the galley table). A sound comes from the element its own clause names, unless the clause says "it": "topples off his stool and sprawls on the deck with a THUD" thuds from him. A sound already going on over and over ("The galley clock TICKS", later "The clock TICKS") is not started again, and a clock's tick goes on once a second. Falling off a seat or to the floor ("topples off his stool", "keels over") lies down where they are.

  • (implementation) A pillow fight (the twenty-ninth watch-it, "the twenty-ninth watch-it, directed again" in core/test/heuristic.test.ts). Out of a bed, a bunk or a chair ("rolls out of his bunk", "hops down from the bunk", "gets out of bed") is to the nearest standing mark on the floor, not off the set; into one ("dives back into his bunk", "climbs into the hammock") is to a lying or sitting mark inside it, theirs first, in its posture; "lies down in the bottom bunk" lies there. Dropped on someone ("drops her pillow on the Chief") lands on them. A swing at someone with a thing ("wallops the Chief with her pillow", "wallops her back") turns to them, within reach, and uses it at them; its sound comes from them as the swing lands, 0.5 s in. A sound right after a throw comes from whoever it is thrown at. "WHUMP! WHUMP!" is two, one after the other: a paragraph's sounds wait for its sounds before them. "The lights CLUNK on" (any sound or "go", "flick", "blaze" … on) switches with its sound, and a scene whose heading's preset is the dark one comes on to one that is not. Of props named alike that nobody of theirs holds, "the pillow" is the one handled last. Someone who walks on with no line is in the episode's cast.

  • (implementation) Cutting in on the action. Cutting into a long shot with nobody talking, the camera goes to whoever the action going on is about, its business running on past its own beat (the Chief reaching for the pie), not whoever stands first in the cast. Walking, it follows them, still or panning, if that holds them well inside the picture to the end of the shot and cuts nobody's face at its edge, checked framed on the cut and panned as the walkers' pass plans it. It cuts away to someone else only for as long as a shot may last; else the shot stays on them, long. The twenty-seventh watch-it held Otto, hidden in her barrel, for 12 s as the Captain tiptoed round the hold. A split keeps both ends of a hand-off or a throw in the picture. A walk's arrival is a place to cut too: one paragraph's walks can run on long after its beat, and the hide-and-seek Captain tiptoed to the aisle, the rack and back in one 14 s wide. Every shot a split brings in has its subjects in the picture and unhidden for most of it, panning or not, and no cut leaves the shot it splits only the part where they are hidden (the Captain's pan, cut short, kept only the second she was behind the rack). A jump cut is judged on the cut's own frame, as film grammar judges it: a framed camera on a walker turns as they go.

  • (implementation) A treasure hunt on a desert moon (the thirty-second watch-it, The Sand Box; "the thirty-second watch-it, directed again" in core/test/heuristic.test.ts). The same sound again ("The detector BEEPS. And BEEPS.") comes from where it came before, and "It CREAKS" after a thing is handled from that thing. "Faster", "faster and faster" or "speeds up" with no one moving makes the paragraph's last sound a quick run (seven times, every 0.3 s) and the same sound before it a steady beat (every 0.75 s) until then, 2 s apart. A prop with a buried state ("under the sand") taken up where the action has dug ("digs", "unearths") is buried there from the start and back as it is taken. "Holds it up high", "raises it over her head", "aloft" lift it overhead. Dig, shovel, rake, sweep, scrape, stir, scrub, mop, hammer and saw use what is in hand, and "-ing" as they come in ("marches down the ramp, sweeping a metal detector") it is held from the start, not taken up at the door. A thing that "sits", "stands", "lies" or "rests" on a place stands there, by its own noun ("The Chief stands at the galley" is no word of the Chief's mug). A spray told in a later clause that says where it comes from or goes ("It GUSTS, and a stream of sand whips out of the rusty box, straight into the Chief's face") is the show's effect out of that thing at them; sand, dirt, grit, ash, leaves, petals and feathers are sprayed too. The weather's own clause, or "It" after a breeze, sounds from nowhere in particular (or what it drums on), unless it comes out of something. "Walks out onto the dunes" and "hurries on to the dig spot" are walks, not exits. Spitting, spluttering, gagging and grimacing are disgusted. A panel's openings are holes to the sight and headroom checks: a head in an open hatch is in no wall.

  • (implementation) Marks on the set: "A crack spreads across the porthole", "the porthole cracks", "the meteor cracks the porthole", "a dent in the locker", "kicks the door and dents it", "sparks scorch the wall black", "a scorch mark on the wall", "coffee splashes all over the helm console" and "green paint splatters across the wall" leave a crack, a scorch, a dent or a stain (in the paint's or the food's color; coffee's is the stain's own) on the piece named, walls included. Any word for glass names the set's windows, and "it" the piece named before it. Of the pieces a phrase names equally well ("the wall"), it is on the one nearest whoever the sentence is about, and never a wild wall; a floor's lies on top. "Wipes the coffee off the console", "scrubs the wall clean" and "patches the crack" take it away again, when it is there. "Touches the crack" or "stares at the scorch mark" is about the piece it is on. "Cracks his knuckles" and "cracks a joke" mark nothing. The twenty-fourth watch-it's crack in the dome was a prop lying on the floor.

  • (implementation) What ends up on a face (the thirty-third watch-it, Snowball): a snowball, a pie or mud thrown at someone hits them in the face (place face) and leaves snow, cream or mud on it after the throw (a mess cue, 0.8 of the face); thrown to them, it is caught. "It bursts on his wall" lands the throw on that piece instead, the one nearest whoever it was thrown at, and on no face. Sand, dust, soot, snow or mud sprayed in someone's face stays there 0.4 s after the spray starts. "His face black with soot" covers it; "covered in flour" is white dust. "Wipes the snow from her eyes" or "wipes his face" wipes off what is there, and is no business with a prop. A thrower who does not hold what they throw picks it up first. "A snowball" is the snowball, not the giant snowball: of props named equally well, the one with no words the phrase leaves out. An effect named inside a piece's or a prop's own name ("the snow walls") is not told: it snowed from the first shot. A hat named in a character's introduction ("CAPTAIN FAIRWEATHER (50s, upright, a splendid peaked hat)") is on their head from the scene's start, and one "knocked clean off her head" flies to her feet. "Puts the whistle to her lips" and "blows her whistle" lift it to the mouth (it was put down). "Otto and the Captain look down at him" turns both, "stares at the sky" looks up, and "The giant snowball lands beside him" lands it at his feet.

  • (implementation) Weather, and the show's effects by name (the thirty-first watch-it, One Dry Corner, a leaky tent on a jungle moon in a thunderstorm; "the thirty-first watch-it, directed again" in core/test/heuristic.test.ts). One of the show's effects named by the last word of its id, as a noun or a verb ("Rain DRUMS on the tent", "A drip lands on the Chief's head", "the whole roof drips: on Otto, on the Captain", "Lightning flashes") plays on whoever is named after the word, once each, as long as the show made it, on top of their head when it lands on them ("on the Chief's head", "on Otto": part head, EpisodeIR 1.31). Weather (an effect made to start or spread more than 2 m around where it plays: rain from 6 m up, lightning on the horizon) plays on the set's ground, whatever it drums on, or at the window the sentence names ("Meteors streak past the porthole"); an effect the name of a piece of the set holds is told by it when the effect is that piece's own ("The red alert lamp flashes" plays the show's red alert lamp, where "the snow wall" snows nothing); one that loops plays on to the scene's end, or until a later paragraph says it stops by name ("The rain stops"), and so does the sound its word is the subject of. Lightning comes with the set's lighting preset whose id or description says lightning or flash, for 0.2 s, then back. Not when the clause says it is not so ("Nothing drips on him"), stops or is over ("the smoke clears"), while it is still falling, or with nowhere to be ("the feathers fly"). Thunder is nobody's, and does not go on as an engine's rumble does. "He scoots over", "budges up" and "makes room" move to the nearest free mark within 1.2 m where one sits or stands as they do, and so does scooting along the seat they are on to its end ("scoots over to the end of his bedroll", "slides down to the far end of the bench", "shifts along his bedroll"), which staged nothing; "squeezes in beside him", "crawls over next to Otto" go to the free mark nearest that one where one sits or crouches as they do. A side alone ("left", "front") names no element: "the left bedroll" is not the tree_left; nor do "the" and "she" stand for a word they start ("there", "shelf").

  • (implementation) The twenty-fifth watch-it (Fair Weather, a burst pipe at dinner in the galley), directed again in core/test/heuristic.test.ts:

    • Under things. "He crawls under the table" lies down at a lie mark by the table (crawl, wriggle, squirm, slide, scoot, burrow, roll or dive under, underneath or beneath). Nobody lies down on a bench: from a seat, they get up and go to the mark. A pronoun is never a thing that flies: "He crawls" had moved a prop called "he".
    • Back to one's seat. "The Chief climbs back onto the bench" sits him down again on the mark he began the scene on (climbs, clambers, scrambles, hops, slides, gets or drops back onto or into a place; Sentence.back), when it is free and a seat.
    • Eating. Eats, eating, sipping, drinking, munching, chewing and nibbling are uses lifted to the mouth; so is a spoonful, a forkful or a mouthful ("considers the question over a spoonful of soup"), with the spoon or fork. Eating what is no prop ("her soup") eats with what is in hand, a spoon, fork, cup or bowl first.
    • Heaving on a tool. Heaves, tugs, pulls, yanks, hauls, wrenches or strains on or at a thing, and twists, are uses of it, not picking it up again.
    • Undoing a state. Closing, shutting, folding or furling what is open, switching off what is on, putting out what is lit, lowering, retracting or deflating puts the prop back as it began (state default): "The Captain closes her umbrella", open since the FWUMP.
  • (implementation) The thirty-sixth watch-it (The Soufflé: smoke, a fire alarm, an extinguisher, slipping in the foam), directed again in core/test/heuristic.test.ts:

    • Spraying what is in hand. Someone spraying sprays out of what they hold, and the sound of it comes from it too ("He sprays foam at the oven with a WHOOSH": out of the extinguisher). A spray is aimed at a prop or piece of the set it names when it names no one ("at the oven", "at the counter"; a prop aim is EpisodeIR 1.35). So with any sound said with what someone does to a thing: "Otto tips the barrel over with a hollow CLONK" clonks from the barrel.
    • Stopping. Foam or water sprayed at what smokes puts its smoke out there. A looping effect sprayed out ("Smoke puffs out of the oven") plays until a later paragraph says it stops or is over by name ("The smoke clears"). A sound a later paragraph says stops by its name or its source's ("The alarm stops") repeats until then.
    • Sounds, not flights. A flight verb in capitals going nowhere is heard, not flown ("The extinguisher WHOOSHES."); "The pieces CLATTER across the deck" still go. A word that qualifies a piece of the set names neither a prop nor an effect: "The fire alarm BLARES" is the alarm's, not the fire extinguisher's, and "the smoke alarm" makes no smoke. Of a sound said again in one paragraph, the sentence's own subject makes it ("The Chief SLIPS" after Otto's slip).
    • A room's colour. A room goes a colour as the lights do ("The galley goes red"); of two presets that name it as well, the one not lit now. "The red light fades" goes back to the heading's.
    • Sliding. Slides, skids, slithers, skates and glides are the slide gait. Across the floor, the room or the place with nowhere named goes to the farthest free mark; "the other way" goes to the farthest on the other side from where the last one across went. The floor crossed on the way somewhere is not where they go: "crawls across the deck to the barrel" goes to the barrel, "rolls out across the deck to the Captain" to her, and "crosses the street to the phone booth" to the phone booth. A crawl creeps (gait sneak), the lowest the gaits go. Scooting, scooching, shifting, edging, inching and budging to a place walk there, edging and inching at 0.6 of a walk. Where someone starts reads the text before any mark: "Otto stands beside him" starts on the free mark nearest the Chief; "sits at the back" on the seat farthest behind of those facing the way most of the set's seats face (a classroom's back row, a bus's back seat); "stands in the middle of the kitchen", with no mark that says middle, on the standing mark nearest the room's middle, not one at a way in; by a piece no mark of its own stands by ("Maya stands by the fridge", "the Chief bangs on a pipe with a wrench"), at the piece itself (EpisodeIR 1.64, element:<id>) when one of its sides is clear to stand at, not on another piece's mark near it; a door or the cupboards hung over a counter have none, and they start on the mark. A walk to a place someone already has goes there anyway: with nothing free of its kind beside it, up to the piece it is at ("strides to the helm" with Otto in the pilot seat walks up to the helm console), else beside whoever has it ("strolls back to the middle of the hold" with the Chief lying in it). A walk to a piece stops on a mark within reach only when the mark is not another piece's (going to the engine core is not to the workbench's end beside it), else walks up to the piece. Walked up to a seat with no seat on it free, they stand by it rather than sit on the air in front of it. "Walks down the aisle toward Dev" goes to Dev. Working a piece of the set ("opens the fridge", "wipes down the counter") walks up to it first, within reach (within), and puts a hand on it (a touch at element:<id>); doing something at a place ("washes his mug at the sink", "pours a coffee at the counter") goes there, unless it is a look, a word or a throw at it, or a way out. An entrance's shot is judged from once the walker is through the door, as the shot starts there: a parrot that flew in and over to Otto lost its long shot, judged from the doorway no camera of the bridge sees.
    • Fresh shows. Measured on the fresh-shows corpus (core/test/fresh-shows.test.ts). Coming on as they are introduced: slouching in (not "slouches in his chair"), coming out of a tent, a hut or a cave, pushing or elbowing through a crowd, and, out of doors, getting out ("Mom gets out and stretches"). What someone comes or goes with ("steps out of the trees with a lantern") is held from the start, and with someone, a smile or a bang is not. A title in capitals before a name in capitals ("GRANDPA WALT") is part of the name. A prop held as a scene ends is carried into the next only if that scene's action names it. A thing brought on in hand, or handed over, is a prop even where the set has a piece of that name, so the reading offers to make it; "one piece", "half" or "a slice" of a thing is the thing. Turning a thing over, examining or inspecting it is a look at it. A room named for a thing ("wheelhouse", "bedroom") never names the thing. A walk to a place past someone the paragraph moves first ("walks past her onto the deck") sets off once they have. Body verbs: slapping one's forehead is a facepalm; a head put down on something is tired; a high-five, singing or humming along is happy; stopping dead or short is a start; hiding behind or beside someone walks up to them; grabbing someone's hood, hair or jacket is a hand on them; sinking back into one's own seat is sitting where they are; looking up from something is a look at whoever was there last; marching down an aisle or a hall, or walking ahead, walks across the place (out of doors, not to a way off it), and those who follow go after the one ahead; "waves her over" beckons at her, and one gesture is read from the same words, never two. Back toward a room one goes back into (a kitchen, a cabin, a wheelhouse) is by the way back, though a piece here shares its name. Staying in or at a place the set does not have ("stays in the car") starts them unseen. Someone introduced in capitals partway into the scene, climbing up onto something, comes on and climbs up. A titled name ("Mr. Kowalski") answers to the surname alone. Saluting plays the library's salute, the flat hand at the brow; every other body plays its own bow for it (a blob nods). A creature named in capitals after "a" or "an" ("A RACCOON waddles out onto the trail") is someone introduced, whom the reading offers to make of its kind; out of doors, not yet seen, walking or waddling out onto the place comes on. Waving or calling from a table starts them sat at one of its seats, the one by what the text names ("from a table by the window"). Each holding one of their own ("each holding a taco") holds the one named for them, else one named for nobody else that nobody holds; with none left, theirs is missing ("Pip's taco"), for the reading to make. A word two props share ("her taco", of Jada's and Pip's) is the one whoever handles it has. Walking against the flow walks across the place, and the others named go with the first. An object ends at "without" ("takes it without looking up"). Someone the show has nobody for bumping into a cast member gives that one a start and a surprised face. A walk to a way that the sentence carries on at ("marches to the hatch, turns to face it and …") stops in its doorway, and a doorway stop with someone standing in the doorway and no free mark by it goes up beside them. A thing set down before someone goes on the piece nearest them that nobody sits in, and stays there; a thing looked at that stands nowhere stands on the piece nearest the looker, however far. Someone going off in the paragraph still makes its gestures as they set off. Walking ahead out of doors takes a far mark by a way off only when no other far mark is free. Leaning in a seat ("leans on the table", "leans across the aisle", "leans forward") is the library's lean_in, held: the body bends forward from the hips toward what it leans on, else whoever the sentence names, else whoever they were looking at, and RwPoseSolver turns the bend round toward that target, never behind them; with no target it leans straight ahead. On their feet a lean is a posture, as before, and "leans back" is lean_back. Other bodies hold their own still pose for it, an object tips toward it.
    • Foam. Foam, suds, lather and froth lie on a face as cream does; dripping, drenched or soaked with it covers the subject. Sprayed at someone, not in the face, some of it lands. Said again of a face already as covered, nothing new.
    • Words a mark has. A thing the set names only in its marks' descriptions ("the serving counter", the island) is that mark, not the piece the last word names: "ducks down behind the serving counter" goes to the mark behind the island, and "stands at the serving counter" starts there. Not "the bench under the window": that is the bench.
    • Out of a prop. Taken out of the prop it was put in ("takes the soufflé out of the oven"), it is picked up from that prop. Accents do not count: "soufflé" is the souffle. Past forms no ending makes count as the verb ("rises" is the state risen; fell, broken, blown, thrown and the like).
    • Down full length. Falls, lands or ends up flat (or face first, or in a heap), flat on one's face or back, face first, and going sprawling lie down: "slides the other way, face first through the foam" slides, then lies there. A trip that ends so is the fall, with no stagger from the floor. A clause sharing a person's subject ("He slips and lands flat on his back") flies no prop.
    • Off the floor. Picking up what lies on the floor (fallen there, or set down at a mark), someone standing bends for it, a crouch before the hand goes and up again with it, and walks up first when they stand farther than arm's length from where it came down: just out from what it fell off, not the furniture's edge.
    • Facing the spray. "Spins round and sprays foam at the Captain" turns to her, quickly, not a full turn on the spot; someone spraying at a person or a piece of the set turns to it when not already facing it.
    • Reaching onto a piece. A thing on a piece of the set stands a quarter metre in from its edge (on a small one, its middle), and someone farther than arm's length from there walks up first: the Chief steps up to the extinguisher's bracket.
    • Seeing the face. A face something happens to (cream lands on it, it is wiped) counts as a line does for coverage: a group shot that sees it from behind turns round, else a set's setup, else a medium single on that person from an angle that sees it, keeping the axis ("Captain's face, for the action").
    • The reveal. A prop that changes of itself, said of it with no hands on it ("The soufflé has risen perfectly"), gets an insert on the prop (camera insert with prop, EpisodeIR 1.36), solved where it stands as the shot starts and in the state it is in then (the risen soufflé, whole, in the oven); someone's business with a prop ("Otto opens the oven") gets none. edit_episode's set_camera and split_shot make an insert on a set element or a prop (insert).
    • Out of the way. A camera is judged where everyone will be all through its shot, not only as it starts: none stands where someone walks up to (Otto said her first line on her way to the counter, framed from the counter's end, and walked up to a hand's breadth of the lens). Turned round to see a speaker's face, a shot tries each angle still, then panning with whoever it frames walks in it (a walk-and-talk: Otto's line now plays in a close shot that turns with her to the counter), then wider sizes, out to LS; it takes none they walk out of the side of, their face cut, for most of it.
    • No farther than the set. A camera standing out past an interior's open front sees no farther than the set does: neither the floor's front edge nor what lies past the end of a side wall (seesPastSet). The soufflé's last wide stood back in front of the galley and showed the deck stop and the stars past it; it is now a side wide that looks along the room. Compiling warns of such a shot (framing.past_the_set).
  • (implementation) The thirty-seventh watch-it (The Runaway Robot: a cleaning robot runs off with the Captain's compass, from the galley to the bridge), directed again in core/test/heuristic.test.ts:

    • Where a thing is. Under a piece of the set is on the floor there: "Under the counter, the cleaning robot waits in its bay" stands it at a floor mark said to be under the counter, else the floor mark nearest it. A thing that bubbles, simmers, glows, hums or ticks somewhere is there as one that sits there is ("A stew pot bubbles on the stove"). Both stood on the counter top.
    • Out from under, away across. Out from under (behind, inside) something is out into the room, to the floor nearest it, not off the set; away across the room with nowhere named goes to its far side. The robot that "zooms out from under the counter" flew off through the hatch, and the direct failed.
    • Past. Something quick ("zips", "whizzes", "darts") past a piece of the set goes by it, onto the floor beside it; a drift still settles there.
    • Round someone. "Zips round her in a circle", "spins in circles around the Captain", "circles the Captain" and "runs rings round him" send a prop round them in a circle (EpisodeIR 1.37 around; circles, twice, three times, the turns), taking a turn's own time however quick the verb. "Spins", "whirls" and "circles" are a flight only round someone: a pot that spins on the stove stays there.
    • At the thing itself. A look or a hand on a prop names the prop (EpisodeIR 1.38), which the eyes follow wherever it is: "Otto turns and stares at the compass" turns her to the compass in the robot's arm, "watches the robot come round" (watching takes no "at") follows it, and "the Captain pats it on the head" lays her hand on the robot. A look went only to where a prop stood or who held it, so one at a prop in flight or riding another went nowhere. A prop named in full beats a piece of the set named by one of its words ("eyes the stew pot" is the pot, not the pot rack); a hand that takes hold ("grips") is business, not a touch. "The lucky compass clamped in its arm" rides the robot: held, clamped, tucked in its (their) thing is in what the sentence named before.
    • Up to a thing on the floor. Reaching for something on the floor at a mark (the compass in the robot's arm, the robot on the deck) walks to another standing mark within reach, not that one, else up to the prop itself (EpisodeIR 1.38 to: prop.<name>). The Captain stood on the robot to take the compass from it.
    • Tackles and grabs. "He dives and tackles it flat", "pounces on the Chief", "throws himself on" someone: a run at them (up to the prop, or the person) and down flat there, and someone tackled goes down too; the Chief only thudded where he stood. A chase ("Otto chases it", "dashes after the Chief") is the run alone. "Grabs at it" reaches for the thing named last, and a hand goes out to a prop in flight though it has no place to walk to (the robot circling the Captain).
    • Inside a prop. "Crouches down inside it", "hides in the barrel", "climbs into the crate" take the posture inside the prop (EpisodeIR 1.39), up to it first when the sentence walks them nowhere; they are hidden from then (no gestures, no framing) until "climbs out of the barrel" (or "pops out") stands them up where it is, not off across the room. The hide-and-seek watch-it's Otto crouched beside the barrel in plain view. "Covers himself with the tarp" is under it as in it, lying unless they are down already, until they sit up or move: a tuft of the Chief's hair showed past its edge. A wide for the action that hides one of those it shows behind something from every angle gives way to whoever the action is about, as one too far apart for one picture does.
    • Where they start. Nobody starts on a mark the opening paragraphs stand a prop on (the robot in the middle of the bridge) unless the action puts them there, and "by the hatch" (door, doorway, airlock) is the standing mark nearest the set's way in, whatever the set calls it. Otto began on top of the robot. "The middle" of the room, whatever the sentence calls the room ("in the middle of it", "the centre of the room", "the middle of the bridge", "in the middle"), is the mark whose id or description says it is the middle (roomMiddle), to stand on or walk to, before any other mark the sentence's words fit; the middle of a piece of the set ("the galley table") is the piece's, and of anything else ("a yawn") no place. On the Boxwood's bridge "stands in the middle of it" gave the middle mark one word, no more than the lectern's "where the officer of the watch stands", and the Inspector took the first standing mark, behind the lectern.
    • Riding into the next scene. What rides a thing that leaves in a hand or flies off (the compass in the robot's arm, out through the galley hatch) is on it as the next scene starts: the bridge had no compass at all, and the Captain took it from nowhere.
    • Hands busy let go of a pose. Taking something lets go of a held pose (hands behind the back), as the compiler has it, so the next gesture plays: the Captain took the compass and then could not pat the robot.
    • Knocked off. Knocked off a piece of the set ("knocks the stew pot off the stove") comes down on the floor beside it, and a sound said after, alone ("CLANG!"), comes from it. A thing that has flown somewhere is gone for there, not where it stood at the start.
    • Dropped from above. A thing that drops, falls, plops, flops, tumbles or flutters down onto someone or something, nowhere yet and with nowhere on stage named to fall from ("A sock drops onto the Captain's head"; "from above", "from the ceiling", "the vent overhead" when the set has none), drops in from straight above where it lands (fromAbove, EpisodeIR 1.43), out of the top of the picture. The thirty-ninth watch-it's sock flew in through the aft door, so its showrunner laid it on a pipe across the bridge to drop it off that. Off a piece the set has ("drops off the pipe") it still comes off that.

6. Provisional timing

Before any voice exists, each line gets an estimated take:

  • length: words ÷ (the voice's words per second × delivery.pace), plus the punctuation pauses;
  • word timings: proportional to syllables.

compileEpisode accepts an estimateTakes mode, so grammar runs on the draft. When real takes arrive, cuts anchored to cues move with them. A second grammar pass then runs on the real timing, and any new finding goes back through repair or is shown on the proposal.

(implementation) core/src/compile/estimate.ts. The base rate is 3.1 words per second at pace 1 (within a fifth of every demo take), with 0.1 s of edges and pauses of 0.15 s (comma), 0.3 s (stop), 0.4 s (ellipsis) and 0.2 s (dash). An estimated take also carries word timings and a rough mouth track, so drafts lip-sync in storyboards, and it has no file: the Timeline gets no dialogue clip for it and an info take.estimated. reelwright compile and stills take --estimate-takes; render never does.

7. Voices (pulled in from M6)

  • VoiceService (core/src/voices/) produces a take for every line:
    • a line's take in the IR is an approved recording, used as is;
    • else a cache hit by hash(text, voice binding, delivery.pace, delivery.volume, provider id + version + model checksum);
    • else it generates one.
  • The local provider is Kokoro, through tools/tts-kokoro/takes.py under uv. It produces 48 kHz mono FLAC, word timings and a per-take provenance sidecar (the same fields as audio/PROVENANCE.md).
  • Where takes live. Takes are derived and content-addressed. They are stored under <show>/.reelwright/takes/ and never go in change sets, because change sets carry JSON and text only. reelwright voice --episode <id> --keep copies approved takes into audio/takes/ and writes their take refs into the IR as a change set.
  • Actors. (implementation) Takes an actor records in Studio's booth are kept in audio/takes/ the same way (<sha256>.flac and a provenance sidecar saying who read it and when, provider recorded), and choosing one pins it in the line's take: see docs/design/m6-recording.md.
  • Emotion. Kokoro has no emotion control. Delivery maps only pace to speed and volume to gain. Emotion drives the face (expressions), not the voice, until M6's cloud providers.
  • Lip sync stays Rhubarb (existing adapter), cached by audio hash.
  • Toolchain. uv is pinned in tools/toolchain.json, and tools/doctor.sh checks it. The Kokoro model files are fetched by tools/tts-kokoro/ and verified by checksum.

8. Film grammar and the style's camera language

These join the compiler's validators. Each finding carries a pointer and a fix hint the director can act on:

  • eyeline match in shot/reverse-shot: the looks' screen directions oppose;
  • screen direction is kept across a cut on exits and entrances;
  • pacing against camera.cutting.averageShotSec: scene-level mean within ±50%;
  • framing bias: the size distribution across an episode, as a warning only;
  • allowed moves and transitions: camera.moves.allowed and camera.transitions.allowed are errors when violated;
  • dutch angles follow camera.dutchAngles;
  • faces: a character saying an on-screen line in a shot that frames them turns their face to the camera (grammar.face_hidden), so nothing shows the back of a speaker's head.

These fields are reserved in style.schema.json today, and M4 makes them real. (implementation) The codes, rules, severities and pointers are in m1-compiler.md, "Film-grammar validation". A framed shot asks for a dutch angle with framing.rollDeg. camera.moves.smoothness and snapZooms stay reserved.

(implementation) Never a cut the compiler refuses (director/mend.ts). The second product audit's heuristic director handed back an episode its own compiler refused: a single of the cat, standing across the girl and her grandfather's line, was grammar.axis_crossed, and that one shot emptied the whole timeline. Every grammar error a shot can have now has mends, gentlest first, each an edit_episode edit: axis_crossed and eyeline_mismatch frame the shot's subject with the pair, as a group from the scene's side of the line, then cut to the scene's wide (the setup that set the side of the line), then cut the shot (the one before plays on), then keep it as a deliberate cross (crossesAxis with a note); screen_direction the wide, then the cut; face_hidden turns the camera round to their face, then the wide, then the cut; move_not_allowed holds the camera still; transition_not_allowed comes in on the style's default; dutch_not_allowed frames it again, level. The heuristic director takes them in turn after its last compile (mendCut), a round at a time, until the episode compiles; a scene still in error after ten rounds plays on its wide alone. The model director repairs its own scenes against film grammar, and a scene it cannot get clean falls back to the heuristic director's, mended. Each change is a warning in words (director.shot_mended, director.scene_on_wide). A provisional compile that refuses a cue (a walk to a spot nobody can reach) leaves that cue out, said (director.cue_left_out), instead of leaving the whole episode undirected, and a reaction dropped where a cut lands on it leaves what was timed from it timed from what it followed (the audit's long script failed on a gesture anchored to a dropped reaction). core/test/director-mend.test.ts makes each error on the Lighthouse and mends it, and directs random scripts for three people who walk and talk across each other, every one to a cut that compiles.

(0.12) The worst framings reframed (director/reframe.ts). The third product audit's finding 7: the camera hid its subjects and repeated itself. Every compiled shot is scored for its framing (compile/framing-score.ts, the compiler's grammar.mouth_hidden, subject_crossed, body_cut, headroom and setup_repeated): the mouth of whoever speaks in it, someone or something across whom it is of, a head or body cut by the frame's edge or at a joint by its bottom, the room over a head with its hat and hair, and a setup cut back to with nothing new between. After either director's cut (the heuristic's after mendCut, the model's after its last model call, so what the model was asked stays as it was), each shot with a fault a camera may mend tries other cameras, gentlest first: a step round (15° or 30° each way), a size in or out, the framing as its size frames it (a headroom, lead room, lens or height let go), whoever is across them or at the edge framed with them, closer and round, from above, the set's other setups, further round (45° and 60°), a group's one it shows on their own (the rest lost behind a parked car), wider and round (to a wide shot), and two sizes wider for a head that rises out of the top (someone standing up); a setup's shot tries a framing of whoever speaks, square on and round to either side. Each try is solved by the compile's own camera solver for that shot (cameraSolver), so nothing is compiled to try it, and scored with the shots round it; a try that does not keep the shot's speakers speaking in it and whom it showed in it, that makes a jump cut with the shot either side, or whose camera stands past the set's open front or behind its wall at any time of the shot, or a group's framing that sees someone from behind whom the shot saw from the front (Hat Day's two-shot turned round behind the Chief at his console), is not kept; with a piece of the set before whom it shows, a shot also tries a step aside (8° round), a longer or a wider lens (85 or 32 mm), and the camera lower or higher, and the best try that still has a piece before its subject tries those ways past it before it is taken (the street's bin before Maya, which the camera raised over); nor is a camera the set's walls pull in to under half the distance its size wants (the solver offers none). The best of every shot are compiled together; one that brings a film grammar or framing finding on itself or the shot after (a jump cut, an eyeline, the line crossed) gives way to its next best, as do a shot and the one before it when an error new to the cut falls on the shot (a walk out of one into the next the same way), and every change that moved a shot's size when the whole cut has a finding it did not (its sizes off the style's bias); an error new on no shot takes back every change in its scene, and only a cut compiled clean is handed back. Neither the shot the scene's side of the line is drawn from nor an intercut's shots are reframed. Each change is said (director.shot_reframed). What no camera mends stays as a warning on its shot, listed on the timeline. core/test/framing-score.test.ts scores every shot of the demo, The Salvage Claim by both directors, and Hat Day and Night Watch as they ship and cut again (its counts only go down; core/test/fixtures/framing-score/report.md lists each faulted shot), and core/test/framing-cases.test.ts fails if a mended case comes back.

(implementation) Studio shows what compiles. The daemon's episode.timeline compiles with grammarStops: false: a shot that breaks film grammar stays in the cut, its error kept. A scene that does not compile at all is left out and the rest compiled. The answer's problems (CutProblem) say each in words, errors only, with the shot's mends as buttons (ReadingFix with an edit_episode call); the timeline outlines the shot in red with a "!", and lists the problems over the tracks with "Show it" and the mends. Stills and storyboards draw such a cut too; a render still compiles strictly and refuses it. An edit is refused only for an error the episode did not have, so each shot can be mended in turn.

9. Storyboards

  • Stills. Each proposal renders a still per shot at its middle frame through the M3 PreviewService (still), plus a contact sheet: one row per scene, with shot ids and sizes as captions.
  • Where they appear. Studio shows them in the proposal view; MCP returns the contact sheet as an image.

Montage, intercut and new names (implementation)

  • Montage (director/montage.ts). Each montage line is its own beat and its own written shot (MONTAGE SHOT 2 OF 3), so the coverage cuts to it where its beat starts and holds it to the next line, with no cuts of its own between. What the line's first sentence shows decides the shot: whoever it names (a single on one, a two-shot on two, a group on more), else the prop it opens on or the piece of the set it names (an insert), else the set's wide; a montage that opens the scene opens on the set's wide. One person seen again and again is seen at MS, CU, LS, MCU, MLS, CU in turn, two or more sizes apart each cut, so no cut of the run jumps; the written-shot rules turn or resize a framing the rules forbid.

  • Intercut (director/intercut.ts, EpisodeIR 1.45). An intercut scene keeps its own set and gains places: each another set, its lighting (as the last scene there had it), and the blocking of whoever is there; Shot.set says which set a shot shows. The heuristic director stages each place on its own set as a scene of its own, carrying on from the last scene there (who stood where, what was left lying about, what is in whose hand), and covers each place on its own; then the cues are one chain in screenplay order, so a line in one place follows the line before it in the other, and the cut shows each run of lines and paragraphs where it happens: the place's own shot up at that moment, cut in where the run's first line starts, then its own cuts within the run. A cut to another place is no jump cut and matches no eyeline (ShotFacts.fromElsewhere).

  • Intercut eye-lines (lookAcross, director/intercut.ts). Talking across the cut, each side looks off past the lens toward the other, the same way across the screen all scene: a line with nobody to say it to where its speaker is gets lookAt: offscreen_right in the scene's own place and offscreen_left in the next (LOOK_SIDES, in turn), as a shot and its reverse would; a line to someone beside them, off screen or in voice-over keeps its look. The coverage turns a single on someone looking off screen so their facing runs that way too, at most 60 degrees off the lens so the face shows (OFF_SCREEN_YAWS, the single's own angle first, then mirrored past their eyeline), and the compiler turns the look at each cut to the new camera (below, m1-compiler.md).

  • Who directs it. The model director leaves an intercut or a montage to the heuristic director (director.structured_scene, info), and adds a scene's words on screen and its ending to the scenes it directs itself, from the skeleton.

  • The compiler splits an intercut scene into a scene of the Timeline per place (placeViews, compile/places.ts; Timeline 1.22): the place's set, its blocking and props, the cues of whoever is there (every cue that is no one's plays on the scene's own set), and the shots that show it, all over the same frames, with of naming the scene. Walks are planned on each place's own floor and the scene is timed as one. A line is judged by the shot that plays as it is said, whichever place that shows. The engine needs nothing new: a shot names its Timeline scene, and the player builds that scene's stage.

  • New names (studio/makers.ts, studio/fixes.ts). A cue the cast lacks (director.unknown_character), a name in capitals the action introduces (director.new_character: "CORA, a seahorse waitress, …", "OCTAVIUS (60s) …", which made sounds before) and a heading's place the sets lack (director.unknown_set) each get one-click fixes in the reading, with no model:

    • What they are comes from their introduction's subject, not from any noun in it: an age ("MEI, 11,", "GRANDPA HUO (70s)"), clothes or a person's role make a person, and a creature only when the introduction says so ("MOCHI, a fat orange cat,", "A three-eyed slug named GLORP", "the robot BOLT") or the cue is one ("LANTERN"). The second product audit's reading made "MEI, 11, sneakers on the counter, folds a red paper lantern." a lantern, and offered nothing else. Each new name's buttons say the kind before they make it, the likeliest first, and always offer a person and a prop: a speaker a talking prop (create_character of kind object), a name the action introduces a prop (create_props from the template New prop starts from) or a place (build_set).
    • "OCTAVIUS is new: make a person": generate_characters with the name as the script gives it ("Octavius"), from the theme's default character pattern, the role the archetype whose words the description shares (else one the cast has none of yet), and a persona from the script: the appositive or parenthetical that introduces them as who they are, their pronouns from the action after their name, and how they sound from their own lines (their parentheticals, "eager" when half of them exclaim, "sings" for lyrics, their first line), which the voice is cast by. Several new speakers in one script get "Make all 3 new characters", one ensemble in one call (director.new_characters).
    • "OCTAVIUS is CHIEF": revise_character gives the character the alias (CharacterInstance aliases, which cue resolution reads with the name and shortName).
    • "Make a set for KELP FOREST": build_set from the set pattern (kit) whose name, description and set types share the heading's words, indoors or out as INT. or EXT. says, named as the heading names it ("Kelp Forest", set.kelp_forest), so it resolves.
    • "KELP FOREST is Marigold - Bridge": revise_set gives that set the alias.
    • "Make all 2 new sets" (director.new_sets): every new place's own build_set, called in turn (ReadingFix.tools), each a set and a change of its own, so one can be undone alone, as fill_needs proposes them.

    In Studio a fix runs as the person's own change; the reading reads again and Direct proceeds. A typo offers only the name it nearly is ("Use CHIEF"), on every line it is on. Each new name's or place's other fixes come once, on its first note; a later note on the same name, with nothing of its own line to offer, goes. The notes say what to do in Studio's words ("make them, or have one of the cast answer to the name"), not the episode file's (castMap, sceneSets), which the director's own hints keep for the CLI. A name a scene on a new set introduces is found too (the scene cannot be staged until its set is made, so the reading reads its action alone).

  • The reading explains what each line became: who says it, to whom, how (off screen, in voice-over, in a whisper, angry, sung, over the line beside it in dual dialogue) and, in an intercut, where and which way they look ("Otto says it, in Marigold - Bridge, looking off to the right"); and each direction is a card of its own (ReadingItem kind direction): "a dissolve into sc02", "a card in the picture's place: …", "a montage: its 3 lines are short shots of their own", "an intercut between … and …", "sc03 fades out to black".

  • Generic words. A float needs someone floating: gravity going, or a person, a pronoun or everyone before its verb in its clause, or no subject at all; "Bubbles drift up through a shaft of moonlight" floated everyone in the first audit's club, and "Otto's hat floats away", "her hair floats up", "drifts off to sleep" and "floats an idea" float no one. A posture verb needs someone too ("her heart sinks", "the music rises" seat and stand no one), and idioms keep their own sense ("stands her ground", "stands corrected", "rises to the occasion"; "takes a seat" sits). Letters said as letters (DJ, FBI, CEO, ID) and screenplay terms (MONTAGE, INTERCUT, SUPER, FADE) are never sounds, nor are idioms props ("drops the subject", "puts two and two together"). "Otto looks up" reads as a look up, not "looks at up".

Surfaces

  • Tool. direct_episode (propose), with input {screenplay: RelPath, episode?: EpisodeId, scenes?: int[], heuristic?: bool, rationale}.
    • It proposes the EpisodeIR, plus the Fountain file if it isn't in the show yet.
    • It is non-strict: small inputs, but the output is large. It streams progress per scene as chat.event tool activity.
  • CLI. reelwright direct <screenplay> --show <dir> [--episode id] [--scene n] [--heuristic] [--with-key] [--dry-run] [--json]. The model is the Claude Code here on the person's plan first, then their key (docs/design/director-over-mcp.md, "From the command line").
    • It proposes through the ChangeStore and prints the change id, per-scene grammar counts, the storyboard path and the cost.
    • --dry-run prints the plan and the estimate and calls no model.
  • (implementation) Both take recut (--recut: redo only the coverage; watch-it #3) and a director's note (--note). Until the ChangeStore is on main the CLI writes the IR to --out and the tool hands it to a propose seam (core/src/studio/tools/direct.ts); per-scene progress reaches the CLI, not yet chat.event.
  • CLI. reelwright voice --show <dir> --episode <id> [--keep] generates takes.
  • reelwright render voices any missing takes first, and says so.
  • MCP / Studio. Both get the tool through the same registry, with no new UI in M4. The proposal view already renders stills and diffs.

Tests

  • Parser: the Fountain corpus and source-line accuracy.
  • Resolution: exact, shortName, first-name and ambiguous matches; unknown names with a suggestion.
  • Skeleton: stable line ids across re-parse; text equals the validator's expectation for every line of both demo screenplays.
  • Heuristic director:
    • zero grammar errors on the lighthouse screenplay and on 50 generated screenplays;
    • determinism: the same screenplay and show give the same bytes;
    • a snapshot of the lighthouse coverage, so changes are deliberate;
    • the staging corpus (core/test/staging-corpus.test.ts, the third product audit's finding 3): 389 action paragraphs and lines in core/test/fixtures/staging-corpus/, each with what it should stage, directed on a library set and judged staged, staged against the text, or not staged, with the score by kind of paragraph printed and held in score.json so it only goes up.
  • Director stages:
    • replayed fixtures for the watch-it screenplay;
    • the repair loop, from a fixture whose first coverage crosses the axis;
    • fallback to the heuristic after 3 failed rounds;
    • the budget stop.
  • Voices:
    • cache hits across runs;
    • a changed pace makes a new take;
    • provenance sidecars;
    • Kokoro invoked only when missing. The real Kokoro run is a local, non-CI test gated on uv being present.
  • Grammar additions: a positive and a negative case each, with pointers.
  • End-to-end in CI: heuristic direct → voice (Kokoro on CI, cached by key) → render of the new episode at 640×360 → ffprobe checks. The renders' key frames become goldens once they're stable on lavapipe.

Watch it (M4 done when)

  1. A hand-written screenplay becomes a directed, voiced video. examples/shows/marigold/episodes/salvage_claim/salvage_claim.fountain is an original ~75-second, two-scene episode on the bridge and a second set (the engine room, generated from its own M2 set pattern, pattern.set.marigold_engine).
    • It is directed with the model and approved as one change set.
    • It is voiced by Kokoro and rendered to a watchable 1080p MP4.
    • It has zero grammar errors, and every line matches the screenplay.
  2. The same screenplay also works without a key. --heuristic directs it, and CI renders that version on every push.
  3. Re-cutting doesn't re-perform. "Re-cut scene 2 tighter" re-runs only stage B, and the performance cues in the change set are byte-identical.

Agents

  1. Screenplay and heuristic (core): parser, resolution, skeleton, provisional timing and the heuristic director, with the lighthouse property test.
  2. Director stages (core): director.schema.json, prompts, both stages, repair routing, fallback, direct_episode, the CLI and fixtures. It depends on 1's skeleton types, so it starts from a stub of them.
  3. Voices (core + tools): VoiceService, the Kokoro adapter via uv, the cache, provenance, reelwright voice, render integration, and the uv pin in toolchain and doctor.
  4. Grammar and storyboards (core): the grammar additions and the style camera fields, plus the contact-sheet preview.

Then integration: the second set, the new screenplay, the watch-it run, the CI end-to-end job, goldens and docs.