OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

Moving result pullback: code/SVG kit

An editable Remotion recipe and complete Resolve/Fusion construction handoff. Bounded adaptation, not a source-fidelity repair or a tested Fusion import. resolveApplicationVerified is false. This worker did not render during the authoring checks. The parent subsequently reports ten batch outputs; their kit-specific hashes and review status are not independently verified here. The original photographic deformation and the archived paper-video motion are not reproduced by the new six-blade vector rotor.

Run from the public download

Extract the downloaded kit into a new writable folder. That folder is the kit root: it contains this README, guide.json, handoff.py, controls.csv, core-publication-v08.zip and required active-assets.zip. No repository, private worker, historical asset ZIP or separate authoring script is needed. The active archive needs only the recipe and its active SVGs. Separate inputs/ JSONs and generator helpers are not required for either built-in variant.

Use Python 3.11+ and an unzip utility for setup and the numeric handoff. Rendering also needs Node 22.18+, npm, FFmpeg/FFprobe and an installed Chromium executable. If Chromium is not on PATH, set REMOTION_BROWSER_EXECUTABLE to its executable path before rendering. The archived renderer does not download a browser.

1. Unpack core, then the active override

From the kit root:

unzip core-publication-v08.zip
unzip -l active-assets.zip

Core creates project/. Merge the active archive into that project after core, allowing its selected recipe to replace the core's legacy video recipe. Choose the extraction destination from the member paths printed above:

Use only the matching command; do not create project/project/. The resulting layout must include project/recipes/sora-moving-result-pullback.json, project/public/art/sora-moving-result-pullback/vector-kit/ with 25 SVGs, and project/inputs/defaults.json and project/inputs/adaptation.json. The active recipe SHA-256 is a16084d72b93944968dd62736d69b5029d0f567ac67001bb5cc8c40b655eaab0. Core supplies project/public/fonts/Geist.ttf and its OFL license.

Do not fetch the old assets-001.zip or use core's old pullback examples or toolkit-manifest as render inputs: they describe the archived video variant. The supplied override replaces all active JPEG/PNG/MP4 references. No source movie or decoded frame belongs in the project inputs.

2. Verify and prepare the Resolve handoff

Still from the kit root, before rendering or constructing the Fusion graph:

python3 handoff.py verify --guide guide.json --project project
python3 handoff.py frames --guide guide.json --project project > controls-regenerated.csv

Verification must pass against the unpacked recipe and SVG bytes. It does not need npm or private provenance files. The supplied controls.csv and regenerated CSV describe 148,500 data rows: 300 native frames × 495 numeric controls. Compare them if checking the packaged export; do not overwrite the supplied evidence. Values are local implementation controls with ancestor-aware activity, not baked world-space positions or directly importable Resolve curves.

For a Fusion-only workflow, continue with Fusion construction and coordinates below using guide.json, controls.csv, the unpacked recipe and its SVGs. No Node installation is needed for this branch. The guide supplies the complete hierarchy and per-property mappings; it is not an automatic .setting import.

3. Install and render with the archived CLI

From the kit root, enter project/ and install its exact lockfile:

cd project
npm ci
node --experimental-strip-types scripts/render.mjs --recipe sora-moving-result-pullback --variant default --out out/sora-moving-result-pullback-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe sora-moving-result-pullback --variant adaptation --out out/sora-moving-result-pullback-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/sora-moving-result-pullback-default.mp4
node --experimental-strip-types scripts/verify.mjs out/sora-moving-result-pullback-adaptation.mp4
cd ..

The renderer refuses an existing output or adjacent manifest; choose fresh --out names on reruns and use those names with verify.mjs. Retain each generated .manifest.json. These are runnable instructions, not a claim that this authoring pass executed an export or verified Fusion.

The default variant reads recipe defaults; adaptation reads recipe adaptation. Both complete Content objects are embedded in the recipe. For custom original content, copy one of those objects into your own JSON (create project/inputs/ if needed) and replace --variant with --content inputs/<name>.json; they are mutually exclusive. No builder script is required. Loaded-font fit and output verification must pass for new content.

guide.recipePath is relative to this unpacked project/. Historical authoring directories and source/review paths in the JSON are provenance, not extra downloads or prerequisites. Use the kit-root commands here rather than the repository-variable command examples retained in that metadata.

Source and active-input decision

The source checkout's historical provenance.json binds the accepted parent manifest, core/member hashes, original asset members, active recipe, every SVG, native source PNG members and the source excerpt. It is an optional audit record, not required public-kit content. Its accepted paths are relative to the historical library root; authored paths describe the source checkout. source.localMedia is a historical research reference, not a dependency to retrieve or restore. The full master is absent: its recorded hash is not newly verified. The actual retained excerpt and selected native archive members are verified.

What was inspected

Seven separate 1920×1080 native source stills were opened: local 28,29,126,127,140,219,299. Their archive and PNG member hashes were checked. The separate 960×540 source excerpt probes as 300 silent frames at 60/1. No contact sheet, moving-source playback, worker-authored export or Fusion execution is credited to these authoring checks. Later parent exports are separate evidence. The following are bounded still observations:

Local Source ordinal / nominal seconds Viewed source state
28 / 29 4408 / 73.466667; 4409 / 73.483333 Button word disappears; faint busy arc replaces it; hand remains
126 / 127 4506 / 75.100000; 4507 / 75.116667 Last influence control versus first result/player state; hard change
140 4520 / 75.333333 Cropped photographic subject enters, blurred chrome; no claim of exact shutter
219 4599 / 76.650000 Wide player with visible toolbar and associated thumbnails
299 4679 / 77.983333 Hybrid butterfly/flower state, unlike L219, inside the wide app

These observations do not establish a continuous motion review or measured camera easing. Exact numbers in the kit are implementation controls, not new measurements of OpenAI's authoring parameters.

Optional source-checkout audit

This section is for maintainers who already have the authoring checkout and accepted research library. None of these files or checks is a prerequisite for the public render or Resolve workflow. The public kit does not ship the private worker, source archives, audit helpers or original raster/video ZIP. Do not restore a deleted benchmark or retrieve source films to run the kit.

The source checkout's frozen r01 whitelist is overlay-manifest.json, SHA-256 2d02f2ba83020816fffd32f0e133725ee5772617ce263a513c5e4c46b2d2f1de: 28 files, 413,112 uncompressed bytes. This is the authoring subset record, not the hash of the published active-assets.zip archive. Publication may wrap those same members with a project/ path prefix; active recipe/SVG bytes must still match guide.json.

In the source checkout, set REPO_KIT to the original guides/sora/sora-moving-result-pullback/ directory and LIBRARY to the retained accepted library root, then optionally run:

PYTHONDONTWRITEBYTECODE=1 python3 "$REPO_KIT/build_adaptation.py" \
  --core "$LIBRARY/downloads/core-publication-v08.zip" --check
PYTHONDONTWRITEBYTECODE=1 python3 "$REPO_KIT/verify_kit.py" --library "$LIBRARY"
FIELDNOTES_LIBRARY="$LIBRARY" PYTHONDONTWRITEBYTECODE=1 python3 "$REPO_KIT/test_guide.py"

These check historical archive bindings and authoring reproducibility, not the public download's install state. Use the standalone handoff.py commands in the quick start to check the unpacked public recipe and assets.

Fusion construction and coordinates

Create a 300-frame Fusion composition at 60/1, 1920×1080, square pixels. If composition start is F0, a local key L goes at F0+L; source ordinal is 4380+L, nominal film seconds (4380+L)/60. Gates are half-open: [127,300) means first visible 127, last visible 299. Use stepped gate keys; do not shift a child's keys by its own or its parent's start. Fractional group subframe samples are unrelated to source ordinal or decoder timestamps.

The complete hierarchy is in guide.json, with 115 nodes, not just this outline:

Background_Canvas (#1d3541)
  close editor / upper input contexts / control panel / influence geometry
  two strips of seven thumbnails / action button / label-or-busy / held hand
  outer-result-pullback [127,300), local 1860×1040
    border / black field / header / subheader
    continuous-moving-result, x275 y125 1296×729, CLIPPED
      vector-design-domain, 1280×720, scale1.0125
        field / ground shadow
        vector-rotor, x640, animated y and rotation
          six blade groups (face + crease), animated scaleY / hub
    associated input pair / caption / track / progress / pause / duration
    five tool icons + labels / six header actions / original mark / bottom pair
  independent-cursor-exposure [127,300), ROOT 1920×1080
    action arrow / 21 one-frame SVG exposures / settled arrow
MediaOut1

Each sibling array is a back-to-front Merge chain. Begin group children on a transparent background, not the preceding root image; composite the children before applying group alpha. Processed_<id> means vector/text content, local mask, transformation and alpha. Labels in the JSON are construction identifiers, not literal pasted .setting tools. Sanitize hyphens if naming Fusion tools; keep the layer-ID mapping intact.

All recipe boxes use downward-positive top-left pixels. For a local point p, translation t=(x,y), origin o (default 0,0), and S=diag(scale*scaleX,scale*scaleY), the required 2D map is:

p_parent = t + o + R_clockwise(rotation) * S * (p - o)
Fusion normalized point in a chosen parent image W×H = (p_parent.x/W, 1-p_parent.y/H)

Compose that map through ancestors before normalizing at the destination boundary. width/height define the unscaled source domain, not its final visible size. origin is in local pixels, not fractions. Do not enter x/W,y/H as a Fusion Center, or rotate about the default image center instead of the declared origin. For an untransformed box, its center is (x+w/2,y+h/2); for a transformed box apply the full formula to p=(w/2,h/2). A practical construction uses a placement Transform followed by an origin/pivot Transform; if source plates are padded, account for their padding offsets in both transforms. The output should match the formula, regardless of the chosen node decomposition.

For an up-positive Fusion 2D angle use negative CSS rotation. Size X/Y targets are scale*scaleX and scale*scaleY. Use independent axes, not an inferred Aspect slider ratio. These are mathematical construction targets, not a tested Resolve import. Check an asymmetric triangle's three corners before replicating the transforms. Avoid automatic reference-size/domain changes after keying.

At L127, the result box's top-left in the output is (-1123.6,-978.9) and its displayed size 2721.6×1530.9. At L219 it is (312,140) and 1296×729. These numerical anchors catch double-parent transforms. Outer x/y/scale first reach (37,15,1) at 219, not 195; hold through 299. The source still alone does not prove that exact settle frame.

Keep overflow-visible content outside nominal group dimensions. The blades extend into negative Y; the rotor's nominal 1×1 box is only a transform anchor, not a crop. Preserve a padded transparent data window until the declared result clip or final canvas. Apply the result clip in its own domain, not to each blade independently.

Tracks, substitutions and checkpoints

Inspect all guide.json checkpoints, especially 28/29, 126/127, 128/148/149, 219/240 and 298/299. The last pair must show unchanged outer placement but advancing inner geometry. Freeze, reset, a second cut, or restarting at a camera key is a regression. Evaluate CSS gradients, inward rectangle borders versus centered SVG strokes, rounded masks, SVG meet/image cover, text advances and antialiasing against your actual render. Text+ Size is not a CSS-pixel font size; do not invent a universal conversion or shrink failed copy.

Differences and outstanding gates

Inherited review remains changes-required, with OPEN result-streak-contours and result-subject-deformation. The new vector kit does not resolve either. It also departs from the archived paper sculpture's shading and motion. The photo subject/deformation is the largest visual gap; no amount of hash verification closes it. Native Resolve execution, SVG import behavior, loaded-font fit, fresh exports and moving-source comparison remain unverified. Source material is research only, never a permissible input.

Coordinate reference: Blackmagic's Fusion Tool Reference, Transform tools documents normalized Center storage. This guide targets those 2D image controls, not Fusion's distinct Shape/Matrix width-normalized coordinate convention.