OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

Three-file handoff across an overlapping window

An original SVG/code Remotion treatment with a complete manual DaVinci Resolve / Fusion construction guide. Two meaningful content variants share one framegraph. No source artwork, raster/video adaptation input or native Resolve project is shipped. Builder tests are not a rendered-quality approval.

Public kit: install and verify

The kit root contains core-publication-v08.zip, active-assets.zip, handoff.py, guide.json, this README, controls.csv, fusion-controls.csv, overlay-manifest.json, provenance.json and test_kit.py. The distributor supplies the pinned core and handoff helper; neither a private worker nor a repository checkout is required. No generator or prebuilt inputs helper is needed: both payloads are embedded in the recipe.

Both ZIPs start with project/. From the kit root, unpack core first, then the active overlay into the same kit root, not into project/ again:

python3 -m zipfile -e core-publication-v08.zip .
python3 -m zipfile -e active-assets.zip .
python3 handoff.py verify --guide guide.json --project project
python3 handoff.py frames --guide guide.json --project project > controls-regenerated.csv
cmp controls.csv controls-regenerated.csv
PYTHONDONTWRITEBYTECODE=1 python3 test_kit.py --project project --core core-publication-v08.zip

Integrity contracts (SHA-256):

Artifact SHA-256
Core ZIP 307fb6b927e35e6d73779652873d994f5c3e36cb7deba65f22fa64748057a0de
Active ZIP 67ca3db3e6c3445fab96e5c186c60aec2a8f8721082dd9f1372e643187968258
Recipe 617eeef203210d783b1b1694300c5284c60915315095e255e47988b9e03c3368
Guide abbdbc829dde49b5f4b71a0f535208819c48b0fb90ec704355b98f1d3a85246d
Handoff helper dedfeaefb89a3158c060f092d9393fe208a52f88b51e21e8bd06c8b272a25721

overlay-manifest.json binds every active recipe/SVG ZIP member and every guide/control/provenance artifact. The active ZIP has only this recipe and its 6 original SVGs, no core, dependencies or legacy art. source.localMedia is research metadata, not a requested input path.

Remotion: preflight, then authorized rendering

Read project/README.md and project/AGENT_GUIDE.md. Use Node >=22.18, Python 3.11+, FFmpeg/FFprobe and an explicitly installed supported Chromium. Preserve project/public/fonts/Geist.ttf and its OFL.txt; do not replace the font or silently shrink text. The core browser text-fit gate remains authoritative. Set REMOTION_BROWSER_EXECUTABLE if your installed browser is not discovered. No automatic browser download is required by these instructions.

From project/, the actual archived CLI is:

cd project
npm ci
node --experimental-strip-types --input-type=module -e '
import {prepareInput} from "./scripts/lib.mjs";
for (const variant of ["default", "adaptation"]) {
  const prepared = await prepareInput({projectRoot: process.cwd(), recipeId: "codex-three-file-handoff", variant});
  console.log(variant, prepared.expected);
}
'
node --experimental-strip-types scripts/render.mjs --recipe codex-three-file-handoff --variant default --out out/codex-three-file-handoff-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe codex-three-file-handoff --variant adaptation --out out/codex-three-file-handoff-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/codex-three-file-handoff-default.mp4
node --experimental-strip-types scripts/verify.mjs out/codex-three-file-handoff-adaptation.mp4

Expected: 1920×1080, 24000/1001 fps, 124 frames, 31031/6000 seconds (5.171833333), zero audio streams. The renderer refuses an existing MP4 or its sibling manifest; choose a new basename instead of overwriting. Keep each generated .manifest.json with its output. These commands are for the authorized renderer: this builder did not encode or review candidate output.

Content substitutions

Default: field-journal route card, Markdown notes and CSV cues. Adaptation: studio-release layout, release notes and room list. The attachment thumbnail and two document marks are original SVGs in both variants; the displayed file labels do not load documents or videos.

Every slot, both literal payloads, consuming layers and field contracts appear under guide.json.editableSubstitutions. Keep the same number of rows/items, literal line breaks, aspect ratios and range/camera parenting. Character limits are not a font-fit guarantee. For custom SVGs use original permitted geometry, no <image>, raster data URI, external resource, script, embedded font or source frame. Inspect both content and framing after every edit.

From project/, create a complete Content object, not a partial override:

python3 - <<'PY'
import json
from pathlib import Path
recipe = json.loads(Path("recipes/codex-three-file-handoff.json").read_text())
content = dict(recipe["defaults"])
content["file2"] = "walk-notes.md"
Path("custom.json").write_text(json.dumps(content, indent=2) + "\n")
PY
node --experimental-strip-types --input-type=module -e '
import {prepareInput} from "./scripts/lib.mjs";
console.log((await prepareInput({projectRoot: process.cwd(), recipeId: "codex-three-file-handoff", contentPath: "custom.json"})).expected);
'
node --experimental-strip-types scripts/render.mjs --recipe codex-three-file-handoff --content custom.json --out out/codex-three-file-handoff-custom.mp4

--content and --variant are mutually exclusive. Relative content paths are resolved against the process working directory; the example deliberately runs inside project/. The frozen guide verifies the embedded variants. A changed recipe or SVG requires a revised hash contract; do not relabel it as this freeze.

Source clock, observation and adaptation

Film: Record & Replay in Codex. Retained official-player publication: 2026-06-18, timestamp 2026-06-18T11:57:34-07:00. This is pinned local metadata, not a new live web verification. Selection window: September 5, 2024 through September 5, 2026 at 17:13:40.602033 UTC; no later publication is used.

Source interval [1504, 1628) at 24000/1001, with exact nominal source seconds [47047/750, 407407/6000). Local frame zero = source 1504; last local frame 123 = source 1627. Excerpt offset is zero. Source-relative PTS and durations are retained verbatim in guide.json.sourceClock; every excerpt PTS was separately compared as a rational time. Absolute master PTS and coded-tail duration were not recovered. Do not round this clock or stretch it to another timeline rate.

Research excerpt SHA-256: c2365b1bc59e3ae0266dbe6a16bfa399ce62ec74ce8207d428e7fe8ec0e7242a. The source master SHA is inherited, not freshly rehashed. The source/timing unit and related implementation file hashes are in provenance.json. Related Edit/FocusType and its partial Resolve guide supplied parenting/masking concepts, not a complete adapter.

Inspection: all 124 excerpt frames viewed statically as consecutively decoded 480×270 thumbnails, plus 5 selected 1920×1080 native-size stills. Contact sheets are not moving review or all-frame full-resolution inspection. No whole-film/new-coverage claim, native Resolve execution, exact source-quality approval or measured OpenAI props is made.

Authored choreography

  1. Local 0–9: blank composer. 10–14: an overlapping file window fades/rises into place, with a pointer approaching the list.
  2. 61: only the bottom row is selected. 72: all three rows belong to the selected cohort. Selection does not delete or move the original list.
  3. 88–100: a separate three-row drag ghost detaches and crosses left; the window remains above the destination. At 91 the target wash, partially occluded drop cue and green copy mark appear. At 101 the ghost/wash disappear and two document attachments appear; the SVG thumbnail follows at 102.
  4. The file window remains through 115 and disappears at 116. The next request reveals only three characters over 116/117/119 and stays unfinished at 123. Neither upload completion nor a sent request is asserted.

Visible-state brackets are source observations/estimates; all numeric tracks are chosen adaptation values. guide.json.observationPolicy keeps those categories separate. The following samples are checkpoints to inspect, not assertions that a rendered output already passed:

Local frame Source frame Nominal source seconds Expected authored state
0 1504 62.729333 Empty composer before the file window.
10 1514 63.146417 File window begins fading in.
14 1518 63.313250 Window visible; pointer begins its approach.
60 1564 65.231833 No selected row yet.
61 1565 65.273542 Bottom row only.
71 1575 65.690625 Still one selected item.
72 1576 65.732333 All three selected.
88 1592 66.399667 Cohort ghost detaches; list remains selected.
90 1594 66.483083 Ghost crosses in front of file window.
92 1596 66.566500 Target wash behind window; copy mark and count 3.
100 1604 66.900167 Last drag frame.
101 1605 66.941875 Two document chips; no ghost or target wash.
102 1606 66.983583 Original SVG thumbnail joins the two document chips.
115 1619 67.525792 Window still occludes destination.
116 1620 67.567500 Window gone, attachment cohort exposed; partial request begins.
119 1623 67.692625 Three characters only.
123 1627 67.859458 Unfinished request at cutoff; no send or completion hold.

Resolve / Fusion construction

  1. Create a 1920×1080, square-pixel composition at 24000/1001, local frames 0–123 inclusive. Set the actual rational cadence, not a rounded integer substitute. Do not add a final hold. Keep audio empty.
  2. Work on transparent 4096×4096 domains, with design pixel (0,0) placed at work pixel (1024,1024). Parent/child domains stay identical. Build the opaque RootPaper Background and nodes listed below in order; later siblings are foreground. guide.json.rootPipeline supplies its color/domain, final crop coordinates and MediaOut connection. nativePalette supplies normalized RGB values for editable colors in both variants; use opacity separately.
  3. For each layer build Construct → LocalMask → AnchorShift → ScaleRotate → Position → Gated → Merge.Foreground; the previous sibling feeds Merge.Background. For a group, Construct is its ordered child merges over a transparent background. Apply group alpha once after assembly.
  4. guide.json.fusionNodes names every tool, connection, parent, raw/static control, content binding and gate. svgSubgraphs enumerates every original SVG Rectangle/Ellipse/Polygon, color, alpha and merge order for both variants. Build those natively; do not rasterize SVGs or use source footage as Loaders.
  5. Bake the numeric rows in fusion-controls.csv at each integer local frame. Its AnchorShift/Position/ScaleRotate/Gated columns are derived below. controls.csv contains every raw property sample, including independent width/radius tracks. Neither CSV is a magically importable .setting file: transfer columns to the named native controls using frame-based keys.
  6. Install the licensed bundled Geist. Use Text+ for text, the explicit weight, pixel box, line advance, tracking and alignment in each node. Text+ Size fontSize/4096 is only an uncalibrated starting estimate, not a verified CSS conversion. Compare glyph footprint, baseline and fit natively before delivery. Retain literal line breaks and stepped character reveals. Never scale type down just to hide overflow.
  7. After the last root merge, crop exactly work pixels x=[1024,2944), y=[1024,2104) to 1920×1080; do not resize. Send to MediaOut. Keep anything outside the final crop until this final operation, except declared local masks.

Coordinates and interpolation

Treatment-specific hierarchy

Keep row membership, the source list, the detached ghost and the destination attachments as different groups. In Fusion the file-window Merge is after composer and target-wash but before drag-ghost. Never clip the ghost to the file window. Preserve the one-frame thumbnail delay and the 15-frame overlap after the document chips appear.

RootPaper -> ordered root merges -> FinalCrop -> MediaOut
main-heading [text] -> main-heading_Merge
composer [group] -> composer_Merge
  composer-shadow [rect] -> composer-shadow_Merge
  composer-paper [rect] -> composer-paper_Merge
  placeholder [text] -> placeholder_Merge
  composer-plus [path] -> composer-plus_Merge
  mode [text] -> mode_Merge
  project-strip [rect] -> project-strip_Merge
  workspace [text] -> workspace_Merge
  send-disc [ellipse] -> send-disc_Merge
  send-arrow [path] -> send-arrow_Merge
  attachment-1 [group] -> attachment-1_Merge
    attachment-art-1 [image] -> attachment-art-1_Merge
    attachment-close-bg-0 [ellipse] -> attachment-close-bg-0_Merge
    attachment-close-0 [path] -> attachment-close-0_Merge
  attachment-2 [group] -> attachment-2_Merge
    attachment-box-2 [rect] -> attachment-box-2_Merge
    attachment-art-2 [image] -> attachment-art-2_Merge
    attachment-name-2 [text] -> attachment-name-2_Merge
    attachment-kind-2 [text] -> attachment-kind-2_Merge
    attachment-close-bg-1 [ellipse] -> attachment-close-bg-1_Merge
    attachment-close-1 [path] -> attachment-close-1_Merge
  attachment-3 [group] -> attachment-3_Merge
    attachment-box-3 [rect] -> attachment-box-3_Merge
    attachment-art-3 [image] -> attachment-art-3_Merge
    attachment-name-3 [text] -> attachment-name-3_Merge
    attachment-kind-3 [text] -> attachment-kind-3_Merge
    attachment-close-bg-2 [ellipse] -> attachment-close-bg-2_Merge
    attachment-close-2 [path] -> attachment-close-2_Merge
  partial-request [text] -> partial-request_Merge
target-wash [rect] -> target-wash_Merge
drop-cue [text] -> drop-cue_Merge
file-window [group] -> file-window_Merge
  file-window-paper [rect] -> file-window-paper_Merge
  file-toolbar [rect] -> file-toolbar_Merge
  folder [text] -> folder_Merge
  column-name [text] -> column-name_Merge
  column-kind [text] -> column-kind_Merge
  column-size [text] -> column-size_Merge
  window-button-0 [ellipse] -> window-button-0_Merge
  window-button-1 [ellipse] -> window-button-1_Merge
  window-button-2 [ellipse] -> window-button-2_Merge
  file-stripe-0 [rect] -> file-stripe-0_Merge
  file-stripe-1 [rect] -> file-stripe-1_Merge
  file-stripe-2 [rect] -> file-stripe-2_Merge
  file-stripe-3 [rect] -> file-stripe-3_Merge
  file-stripe-4 [rect] -> file-stripe-4_Merge
  file-stripe-5 [rect] -> file-stripe-5_Merge
  file-stripe-6 [rect] -> file-stripe-6_Merge
  file-stripe-7 [rect] -> file-stripe-7_Merge
  file-stripe-8 [rect] -> file-stripe-8_Merge
  file-stripe-9 [rect] -> file-stripe-9_Merge
  file-stripe-10 [rect] -> file-stripe-10_Merge
  file-stripe-11 [rect] -> file-stripe-11_Merge
  file-stripe-12 [rect] -> file-stripe-12_Merge
  file-stripe-13 [rect] -> file-stripe-13_Merge
  file-stripe-14 [rect] -> file-stripe-14_Merge
  file-stripe-15 [rect] -> file-stripe-15_Merge
  selection-1 [rect] -> selection-1_Merge
  file-icon-1 [image] -> file-icon-1_Merge
  file-name-1 [text] -> file-name-1_Merge
  file-kind-1 [text] -> file-kind-1_Merge
  file-size-1 [text] -> file-size-1_Merge
  selection-2 [rect] -> selection-2_Merge
  file-icon-2 [image] -> file-icon-2_Merge
  file-name-2 [text] -> file-name-2_Merge
  file-kind-2 [text] -> file-kind-2_Merge
  file-size-2 [text] -> file-size-2_Merge
  selection-3 [rect] -> selection-3_Merge
  file-icon-3 [image] -> file-icon-3_Merge
  file-name-3 [text] -> file-name-3_Merge
  file-kind-3 [text] -> file-kind-3_Merge
  file-size-3 [text] -> file-size-3_Merge
drag-ghost [group] -> drag-ghost_Merge
  ghost-icon-1 [image] -> ghost-icon-1_Merge
  ghost-label-bg-1 [rect] -> ghost-label-bg-1_Merge
  ghost-name-1 [text] -> ghost-name-1_Merge
  ghost-icon-2 [image] -> ghost-icon-2_Merge
  ghost-label-bg-2 [rect] -> ghost-label-bg-2_Merge
  ghost-name-2 [text] -> ghost-name-2_Merge
  ghost-icon-3 [image] -> ghost-icon-3_Merge
  ghost-label-bg-3 [rect] -> ghost-label-bg-3_Merge
  ghost-name-3 [text] -> ghost-name-3_Merge
  ghost-count-disc [ellipse] -> ghost-count-disc_Merge
  ghost-count [text] -> ghost-count_Merge
pointer [group] -> pointer_Merge
  pointer-outline [path] -> pointer-outline_Merge
  pointer-fill [path] -> pointer-fill_Merge
copy-cue [group] -> copy-cue_Merge
  copy-disc [ellipse] -> copy-disc_Merge
  copy-plus [path] -> copy-plus_Merge

Animated controls

Every static numeric/text/shape control remains in guide.json.fusionNodes; this short table lists animated controls only. The complete raw key arrays and per-frame values are in the guide and CSVs.

Layer.property Keys Numeric minimum → maximum
composer-shadow.height 3 152 → 236
composer-paper.height 3 152 → 236
placeholder.y 3 20 → 105
composer-plus.y 3 99 → 183
mode.y 3 103 → 187
project-strip.y 3 154 → 238
workspace.y 3 175 → 259
send-disc.y 3 99 → 183
send-arrow.y 3 107 → 191
file-window.y 2 371 → 389
file-window.opacity 2 0.08 → 1
drag-ghost.x 5 625 → 1038
drag-ghost.y 5 510 → 545
pointer.x 13 600 → 1070
pointer.y 13 502 → 982
copy-cue.x 3 621 → 631

Differences and acceptance limits

Source PNG/MP4/SRT attachments become SVG/Markdown/CSV-labeled original items. The source thumbnail, precise native file-manager styling, system cursor shape, shadows and drag-label spacing are not reproduced. Pointer travel and easing are authored approximations. The destination cue remains partly occluded rather than being moved to an invented unobstructed position.

The builder has not executed Resolve or reviewed moving candidate output. Archive hashes, schema checks, sampled controls and custom-content preflights cannot validate native antialiasing, Text+ layout, browser shaping, occlusion readability or motion quality. Parent rendering and independent comparison are separate acceptance gates. Source quality remains false until that process explicitly establishes otherwise. No corpus or publication count is changed.

Optional provenance audits may resolve the repo: and accepted-stage: bindings in provenance.json against the retained research archive. Those historical sources are not needed to install, preflight, render or manually construct this public kit, and may never become adaptation inputs.