OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

Historical builder snapshot: 2026-09-14. Earlier README and handoff statements about being unrendered or unpublished describe that authoring stage. The current selected report verifies both content exports at 2026-09-14T02:20:33.205891+00:00; those earlier statements do not describe their current availability. Native Resolve execution and source-quality approval remain unverified.

Current selected render verification · Batch export report

Title scaffold yields to a growing portrait stack

Concrete source-bound vector adaptation. Authoring-time mechanical checks only; no source-quality approval. Parent renders and independent review are separate.

Download and run

Run from the extracted kit root. Required files: guide.json, README.md, handoff.py, controls.csv, overlay-manifest.json, core-publication-v08.zip, active-assets.zip. Optional self-contained test: test_kit.py. No private worker, prepared project, generator, inspection image, sidecar or external helper documentation is required.

Install the accepted core first, then the selected active override. Never substitute legacy assets-001.zip; that historical archive can contain raster media. Start with no project/ directory:

test ! -e project
unzip core-publication-v08.zip
unzip -o active-assets.zip
python3 handoff.py verify --guide guide.json --project project
python3 handoff.py frames --guide guide.json --project project > controls-regenerated.csv
cd project
npm ci

npm ci and movie rendering are reader/parent steps. This builder ran neither. The font and license arrive in the core. From project/:

node --experimental-strip-types scripts/catalog.mjs show character-title-inset --contract
node --experimental-strip-types scripts/render.mjs --help
node --experimental-strip-types scripts/verify.mjs --help
node --experimental-strip-types scripts/render.mjs --recipe character-title-inset --variant default --out out/character-title-inset-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe character-title-inset --variant adaptation --out out/character-title-inset-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/character-title-inset-default.mp4
node --experimental-strip-types scripts/verify.mjs out/character-title-inset-adaptation.mp4

For custom content, first create the complete editable file from this selected recipe, then edit only its values (including accurate SVG dimensions and rights):

node --input-type=module -e "import {readFileSync,mkdirSync,writeFileSync} from 'node:fs'; const recipe=JSON.parse(readFileSync('recipes/character-title-inset.json','utf8')); mkdirSync('inputs',{recursive:true}); writeFileSync('inputs/character-title-inset-custom.json',JSON.stringify(recipe.defaults,null,2)+'\n',{flag:'wx'});"

Edit project/inputs/character-title-inset-custom.json from the kit root. Keep field caps and fixed geometry; run the actual font gate when rendering. From project/:

node --experimental-strip-types scripts/render.mjs --recipe character-title-inset --content inputs/character-title-inset-custom.json --out out/character-title-inset-custom.mp4
node --experimental-strip-types scripts/verify.mjs out/character-title-inset-custom.mp4

Do not combine --variant with --content. This archive uses --out, not --output; no --fps or --duration override belongs to this treatment. From the kit root, the optional tests need only the extracted project and downloaded handoff:

python3 test_kit.py --project project

Tests are source/preflight checks, not render or native Resolve approval. controls-regenerated.csv is a generated output, not a missing file.

Exact binding

Source and native clock

Official research reference: Character Consistency with 4o Image Generation; source URL https://www.youtube.com/watch?v=PFsOUNfBhzI. Published 2025-03-25. Metadata authority, response hash, retrieval date and inherited master hash are pinned separately in guide.json. Exact half-open source bounds: [72,216); 144 selected frames at 24000/1001. All retained excerpt frames are selected; no trim required. Local f maps to source index start+f. Nominal seconds=(start+f)*denominator/numerator.

Not supplied. Nominal frame/rational-FPS seconds are arithmetic labels, not recovered absolute master PTS. Do not silently replace the separately retained rounded samples with nominal times. Fresh decoded excerpt time base: 1/24000. Every integer PTS and duration, independently retained rounded source-relative time, exact source selection and provenance are in guide.json. Excerpt timing does not prove absolute master PTS.

Every selected native index viewed in a static480x270 cell. Four explicitly listed960x540 stills per piece viewed in detail. Not moving review, a master-resolution pass or an output inspection. No external source window or critic findings supplied these controls. The original source media are research only, never active assets.

Source observations versus choices

Adaptation differences

Editable Remotion construction

Install the selected recipe under project/recipes/. The accepted Treatment framegraph reads groups, text, vector-image slots and native shapes from it. Layer order is back-to-front. Start/end gates use the global local frame, not frame minus layer.start. Edit fields and both embedded content objects; do not alter source bounds or reuse the historical builder timing.

All numeric tracks below are chosen implementation values. Held string prefixes live in the node controls; they do not resize their text boxes. The original SVGs have separate vector elements and local gradients; no image element or linked media is allowed.

Resolve / Fusion manual build

Create1920x1080 at 24000/1001 fps, V1 Fusion composition[0,144), timeline timecode01:00:00:00. No audio. There is no supplied or validated native .setting macro.

Recipe coordinates are top-left pixels, local to parent. For a local domain W,H and pivot ox,oy, place the transform pivot at(ox/W,1-oy/H). Translate by(x/W,-y/H) in that parent domain after local scaling/rotation; use the explicit affine mapping below rather than assuming canvas dimensions for every nested group.

p_parent = (x,y) + origin + R_clockwise(rotation) * diag(scalescaleX,scalescaleY) * (p_local-origin). Merge children before applying this once per group. Convert final top-left pixels to Fusion normalized(x/W,1-y/H). Fusion angle convention must be calibrated against positive clockwise recipe rotation.

Left-key smooth=uu(3-2*u), linear=u, hold until next key. Never Auto. All tracks sampled on global recipe-local time.

Normal Over with transparent outside shape; group opacity after child composition; local clip and SVG clipPath before local transform. No image/video Loader or black/Screen workaround.

  1. Create one1920x1080 Fusion Composition on Edit V1, no audio tracks. Set the exact guide rational timeline cadence before insertion. The timeline GUI may label24000/1001 as23.976; keep the rational value in the delivery contract. Set length to the listed nativeFrameCount, local0 through count-1. Do not import the research excerpt.
  2. Use one explicit Background_Paper and ordered Over Merge chain. Treat JSON layer IDs as node names and fusionNodes parentLayerId as nesting ownership. A group contains a transparent RGBA local domain, ordered child Merges, then its own Transform and one opacity multiplier. Never apply parent travel separately to already transformed children.
  3. Reconstruct each active SVG from svgConstruction in guide.json. Use Background plus Rectangle/Ellipse/Polygon/Bezier masks; preserve viewBox, exact path controls, fill/stroke and gradient stops. Keep separate editable shape nodes in XML order; the orb uses two fills intersected with its circle alpha. No Loader of a bitmap or video. SVG import is optional, not required to obtain editable native nodes.
  4. Use bundled Geist for Text+. Enter defaults or adaptation values from contentContract. Text values remain editable, with fixed recipe width/height and no auto-wrap/shrink. Match pixel font size, weight, line height and alignment through a native baseline/width check; no numeric claim that Text+ Size equals CSS px. The supplied source-only browser gate does not certify Fusion typography.
  5. Set each layer gate start inclusive and end exclusive. When using clip trims, local Fusion time must still evaluate the global recipe-local clock: add the clip In before sampling. Use held StyledText prefixes for reveal.steps, with no interpolation of glyph counts. A disappearing group cuts all children together.
  6. For numeric tracks use controls.csv per-native-frame values, or exact left-key interpolation: linear u; smooth uu(3-2*u); hold returns left value strictly until next key. No Auto spline, overshoot, cross-dissolve or optical-flow interpolation. Evaluate keys beyond duration only to derive the truncated last in-window sample.
  7. Keep alpha transparent outside vector shapes. SVG fill/stroke opacity and gradient stop-opacity multiply their own coverage; Merge with Normal/Over, not Screen or black-keying. Clip the final canvas only; explicit inset masks, if present, apply in local pixels before that group transform. Do not shrink live text widths as a reveal mechanism.
  8. Use opening-context SVG at[0,1), then white-only[1,3). Put initial-title-1/2/3 at x100,y10/360/710, fixed1720x270 boxes and230px font. Gates3/4/5; first two cut72, third cuts73. Preserve60frames of complete title before the first card64.
  9. New headings are siblings below portrait-stack: top x70,y42,1780x270 at75; bottom x60,y768,1800x270 at78; both224px. They never resize, shift or shrink to accommodate cards. Word occlusion is intentional.
  10. Build portrait-stack at x840,y360, local240x360, pivot120,180. Each portrait-card is a240x360 original SVG with its own small x/y offset from the exact node controls. Merge them in ordinal order. Every card survives beneath later ones until144; this leaves colored edge slivers rather than a one-slot image swap.
  11. Hard replacement gates are64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133. Each picks the slot listed in its controls. Eight original styles intentionally consolidate the source material range; their motifs are not new examples.
  12. Scale only portrait-stack: .90 at64,1.22 at78,1.52 at100,1.86 at120,2.25 at148, linear segments. Pivot stays centered; previous edges grow with the front. The last front card holds content133..143 but the group is still growing. Stop at143, not at the off-window endpoint.
  13. Check every listed source-bound checkpoint and adjacent frames against the scalar contract. Inspect an actual parent render and native Resolve output separately before any fidelity/equivalence claim. Default, adaptation and custom passing here are content/framegraph/font preflights only.

Complete node hierarchy and track ownership

Each row is one authored layer, with its native subgroup tools. Follow the sibling Merge order and parent IDs; guide.json contains full literal controls, local box, effective gates, mask order, text values and SVG construction trees. Child groups are transparent until their active children contribute alpha. A dormant child never makes a parent visible.

Layer Parent Kind Local gate Native tools
paper ROOT rect [0, 144] Background with Rectangle/Ellipse mask, Inside-border ring if stroke is present, Blur if present, Local Transform, Over Merge
opening-context ROOT image [0, 1] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
initial-title-1 ROOT text [3, 72] Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge
initial-title-2 ROOT text [4, 72] Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge
initial-title-3 ROOT text [5, 73] Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge
new-top-title ROOT text [75, 144] Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge
new-bottom-title ROOT text [78, 144] Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge
portrait-stack ROOT group [64, 144] Transparent RGBA working domain, Ordered child Merges, Rounded Rectangle/Polygon alpha intersection if required, Transform, Group opacity, Over Merge
portrait-card-00 portrait-stack image [64, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-01 portrait-stack image [67, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-02 portrait-stack image [70, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-03 portrait-stack image [73, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-04 portrait-stack image [76, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-05 portrait-stack image [79, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-06 portrait-stack image [82, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-07 portrait-stack image [85, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-08 portrait-stack image [88, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-09 portrait-stack image [91, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-10 portrait-stack image [94, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-11 portrait-stack image [97, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-12 portrait-stack image [100, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-13 portrait-stack image [103, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-14 portrait-stack image [106, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-15 portrait-stack image [109, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-16 portrait-stack image [112, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-17 portrait-stack image [115, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-18 portrait-stack image [118, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-19 portrait-stack image [121, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-20 portrait-stack image [124, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-21 portrait-stack image [127, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-22 portrait-stack image [130, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge
portrait-card-23 portrait-stack image [133, 144] Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge

Exact numerical controls

Coordinates are local pixels. Keys are frame:value easing; constant values remain held. Whole-group origin and nonnumeric controls are in the adjacent node contract in guide.json. controls.csv enumerates every native value, including inactive rows (see active column).

Layer Property Value / keys
paper x 0
paper y 0
paper width 1920
paper height 1080
opening-context x 0
opening-context y 0
opening-context width 1920
opening-context height 1080
initial-title-1 x 100
initial-title-1 y 10
initial-title-1 width 1720
initial-title-1 height 270
initial-title-2 x 100
initial-title-2 y 360
initial-title-2 width 1720
initial-title-2 height 270
initial-title-3 x 100
initial-title-3 y 710
initial-title-3 width 1720
initial-title-3 height 270
new-top-title x 70
new-top-title y 42
new-top-title width 1780
new-top-title height 270
new-bottom-title x 60
new-bottom-title y 768
new-bottom-title width 1800
new-bottom-title height 270
portrait-stack x 840
portrait-stack y 360
portrait-stack width 240
portrait-stack height 360
portrait-stack scale 64:0.9 linear; 78:1.22 linear; 100:1.52 linear; 120:1.86 linear; 148:2.25 hold
portrait-card-00 x 0
portrait-card-00 y 0
portrait-card-00 width 240
portrait-card-00 height 360
portrait-card-01 x -7
portrait-card-01 y -3
portrait-card-01 width 240
portrait-card-01 height 360
portrait-card-02 x 14
portrait-card-02 y -6
portrait-card-02 width 240
portrait-card-02 height 360
portrait-card-03 x 0
portrait-card-03 y -9
portrait-card-03 width 240
portrait-card-03 height 360
portrait-card-04 x 7
portrait-card-04 y 0
portrait-card-04 width 240
portrait-card-04 height 360
portrait-card-05 x -14
portrait-card-05 y -3
portrait-card-05 width 240
portrait-card-05 height 360
portrait-card-06 x 0
portrait-card-06 y -6
portrait-card-06 width 240
portrait-card-06 height 360
portrait-card-07 x -7
portrait-card-07 y -9
portrait-card-07 width 240
portrait-card-07 height 360
portrait-card-08 x 14
portrait-card-08 y 0
portrait-card-08 width 240
portrait-card-08 height 360
portrait-card-09 x 0
portrait-card-09 y -3
portrait-card-09 width 240
portrait-card-09 height 360
portrait-card-10 x 7
portrait-card-10 y -6
portrait-card-10 width 240
portrait-card-10 height 360
portrait-card-11 x -14
portrait-card-11 y -9
portrait-card-11 width 240
portrait-card-11 height 360
portrait-card-12 x 0
portrait-card-12 y 0
portrait-card-12 width 240
portrait-card-12 height 360
portrait-card-13 x -7
portrait-card-13 y -3
portrait-card-13 width 240
portrait-card-13 height 360
portrait-card-14 x 14
portrait-card-14 y -6
portrait-card-14 width 240
portrait-card-14 height 360
portrait-card-15 x 0
portrait-card-15 y -9
portrait-card-15 width 240
portrait-card-15 height 360
portrait-card-16 x 7
portrait-card-16 y 0
portrait-card-16 width 240
portrait-card-16 height 360
portrait-card-17 x -14
portrait-card-17 y -3
portrait-card-17 width 240
portrait-card-17 height 360
portrait-card-18 x 0
portrait-card-18 y -6
portrait-card-18 width 240
portrait-card-18 height 360
portrait-card-19 x -7
portrait-card-19 y -9
portrait-card-19 width 240
portrait-card-19 height 360
portrait-card-20 x 14
portrait-card-20 y 0
portrait-card-20 width 240
portrait-card-20 height 360
portrait-card-21 x 0
portrait-card-21 y -3
portrait-card-21 width 240
portrait-card-21 height 360
portrait-card-22 x 7
portrait-card-22 y -6
portrait-card-22 width 240
portrait-card-22 height 360
portrait-card-23 x -14
portrait-card-23 y -9
portrait-card-23 width 240
portrait-card-23 height 360

Original SVG whitelist and construction

These are the complete default+adaptation active image dependencies. Each SVG is supplied in active-assets.zip at project/public/. Rebuild its independent shape elements from the exact svgConstruction XML tree; use the per-element attributes, transforms, gradient stops and clipPath alpha. No generated source or private script is required.

Active SVG path SHA-256
art/character-title-inset/context-adaptation.svg fb3ad9894652aab7fcd314ddb9a89a0008b8ba24596a139ff1d808e0f126c337
art/character-title-inset/context-default.svg d0676f118f8c005a644e59eedd099c63d68472c688eb4705330ea89930de132d
art/character-title-inset/portrait-0-adaptation.svg a993de7d828a56d82fc38c771eac9b4e848b3637a11f759e283de93d74b0ddd7
art/character-title-inset/portrait-0-default.svg e9dc12531c9df5d4e3ef9dc71194b5826ac18964b75a504cf5c810ee8656a907
art/character-title-inset/portrait-1-adaptation.svg 2f9fa8d99e1c1d17a852a8c586250bc581b5ab041892f438e8a70832f7a85da0
art/character-title-inset/portrait-1-default.svg 5ed05bcc4723fb872ef85c0a5ba968a177790c8b1a06e0a79c05b98007938952
art/character-title-inset/portrait-2-adaptation.svg fee2e361ac203df0d7274f35045e675bfeb9eec2741b584457ebc376cd52fa8f
art/character-title-inset/portrait-2-default.svg c221aebb58d462fb3f95e3958e43b972978a7990792910b8609994ed8d6e1bce
art/character-title-inset/portrait-3-adaptation.svg 13ccfbcc44bcd7b1579cc0928d795b257a0f06308cf16cfbc92cd74e6b11fd4a
art/character-title-inset/portrait-3-default.svg 2e66a95129c276339d90d62b2495a2baf4b08019e7ec585e04933f179320ecab
art/character-title-inset/portrait-4-adaptation.svg 8816aa46b46965dff7f68595bcae5f63521d19f61e22f223cc9f3a723a78fdd2
art/character-title-inset/portrait-4-default.svg 425b3b1902da5bb0f72a0ce917a9375460b02ab5d7ef5d0465ad85e68e7327d2
art/character-title-inset/portrait-5-adaptation.svg a1affe50a2a2b01b05706bd58e4341db6fbbba514b802479ce5ea247c644336a
art/character-title-inset/portrait-5-default.svg a45eb0f7a652d92b751d57269d7e14b027342d5e573e5142316f74b003d4e786
art/character-title-inset/portrait-6-adaptation.svg a373c0f1c2b03fe16154583bcbda0f852904aeae4ecb22e048ecabb4bd900b3c
art/character-title-inset/portrait-6-default.svg fee2772313e676a6f29d75e2793b03ead8a5e774a67334e52baf287bad8ddb32
art/character-title-inset/portrait-7-adaptation.svg 87938baed6ec0308b9c249314eb09cb57d2667c4335ad921b81536c648444cac
art/character-title-inset/portrait-7-default.svg 9c373e9e9b23ba1960fde1504c21f7536d87602312689283ce54507481320a27

Checkpoints and regression limits

Local Source Required condition
0 72 Single original context frame.
1 73 Blank white.
2 74 Blank white.
3 75 First title line.
4 76 Second title line.
5 77 Third title line.
63 135 Last title-only frame.
64 136 First portrait above middle word.
67 139 Second portrait.
70 142 Third portrait.
72 144 Only initial bottom word remains.
73 145 All initial title gone; portraits persist.
74 146 Portrait without title.
75 147 New top heading.
78 150 New bottom heading.
100 172 Stack overlaps more title area.
112 184 Another hard portrait replacement.
130 202 Penultimate portrait content.
133 205 Final front portrait.
143 215 Last sample still enlarges and occludes type.

The tests verify installed core/recipe/artifact pins, exact flat ZIP whitelist, active SVG closure, node ownership, every numerical control and CSV row, real archived CLI options and default/adaptation/custom prepareInput bindings. The frozen font receipt checks actual full-text widths; parent renders still need their normal font gate. No passing scalar test establishes visual fidelity.

Largest remaining gap: Original vector bird/robot studies replace diverse rendered cat styles and the live-action context frame. Exact material variation, subtle card offsets and scale acceleration remain unresolved; the final enlargement is intentionally truncated.