# AFTERLIGHT keyframe module contract Write ONE file: /home/claude/afterlight/storyboard/filmN.js (N = your film number). Plain browser JS, no imports, no network. It must call: window.AFTERLIGHT_FILMS.push({ id: 'F1', // F1..F8 n: 1, title: 'The Stone That Remembered', role: 'The introduction', // from the treatment's slate table understand: '...', // what the viewer should understand (treatment) medium: 'one line naming the drawn medium you chose and why it fits this film', archivePlan: '2-4 sentences: how archive and animation combine in this film, following CRASH LAB / PAELEO conventions (label every layer PHOTOGRAPHED or INVENTED; composed scenes are labelled "COMPOSED SCENE · archive fragments re-performed · not a recorded event"; drawn figures may be matted over archive plates; captions as paper slips).', basis: [ {title, url, note, verified:true|false} ], // the factual/research basis the treatment cites, checked keyframes: [ { n: 1, t: 0.0, // seconds into a ~60 s film title: 'short name', shot: 'framing, e.g. MCU on hands, low angle', action: '1-2 plain sentences of what happens', mechanism: 'typed relation: → physical, ⇝ meaning, ⊣ control, e.g. "sun → stone (absorbs) ; patch ⇝ child (thinks it is warmth)"', layers: [ {name:'background plate', source:'PHOTOGRAPHED'|'INVENTED', ref: 2} ], // ref = index into this keyframe's refs, or null prompt: 'image-generation prompt for this keyframe, 40-90 words, concrete: subject, framing, light, material, palette, medium; ends with "no text, no logos"', draw: (ctx, w, h) => { ... }, // draws the keyframe into a w x h canvas (16:9). Deterministic. Canvas 2D only. refs: [ { kind:'archive footage'|'still image'|'source text'|'research paper'|'museum object', title, creator, date, url, rights:'public domain'|'CC BY 4.0'|... |'unknown — not granted', use:'how it is used in this shot: background plate / rotoscope reference / texture / matte source / lighting reference / costume reference / citation', verified: true|false } ] }, ... ] }); Rules - 5 keyframes per film, in story order, following the treatment's beats for your film. You may refine beats but keep the treatment's protections (e.g. "the stone must be present from the beginning", "never animate a glowing particle flying from fire to fire"). - Drawings: real compositions a director could shoot from, not diagrams. No text, labels, arrows or legends in the picture. No emoji. Use a consistent cast and set across the 5 frames. Hands and bodies must read. Deterministic (seeded pseudo-random only). Each draw call under ~150 ms. - References: 2-5 per keyframe, real and specific, each URL opened and checked with WebFetch or WebSearch before you set verified:true. Prefer public domain or open licences: Internet Archive (incl. Prelinger Archives), Library of Congress, Wikimedia Commons, Smithsonian Open Access, Getty Open Content, NASA, Royal Society/Biodiversity Heritage Library scans, movingimagearchive.com (the source CRASH LAB's cineosis-lab uses). Give at least one ARCHIVE FOOTAGE (moving image) reference per keyframe where any plausible footage exists, and say honestly when none fits. Never invent a URL. Rights unknown means "unknown — not granted". - Distinguish the treatment's fiction from fact. Do not cite a paper for a claim it does not make. - Self-check: run `cd /home/claude/afterlight/storyboard && node --check filmN.js && python3 shoot.py filmN.js`, then Read the five PNGs and fix anything that does not read. One fix pass is enough. Return to the caller: a short report (the film id, medium, any reference you could not verify, any treatment claim you found wrong or unsupported).