OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

Timeline insertion: code-only dual-tool kit

Cursor-entry correction

This candidate keeps the prior camera repair and refits only approach-arrow.start, .x and .y. Entry moves from local26 to43, with an edge-clipped tail first and a down/right approach to the unchanged hand gate82. Eight linear anchors are inferred from retained960px source support. They are not recovered OpenAI cursor coordinates. cursor-correction.json records the source, every measurement, rejected timestamp-contaminated ROI and fit rule.

Both content variants are freshly rendered and code/source/clock-bound. Independent static inspection covers all720 candidate frames and360 repeated source frames. It closes the early interior pop, but finds premature pointer departure at243–275. The source remains preferred; this is not a moving-review or quality pass. The hand, hover, insertion, final hold and all other layers stay unchanged. Pointer shape/exposure and the missing final caret remain limitations. Run this revision's guide/active archive and regenerate its CSV; older controls are not interchangeable. BUILDER_NOTES.md retains the initial repair handoff.

Preserved camera correction

The original recipe and its retained movie both contain false camera jumps at local frame 4 and frames 7–11. They are not cuts in the source. This corrected camera repair replaces 16 values in workspace-camera.x, .y and .scale. This revision additionally includes the isolated cursor change described above. camera-correction.json records each old/new value and its measurement basis. These are estimates from the retained 960×540 source excerpt, not recovered OpenAI authoring parameters.

Unpack the core first and then this kit's active-assets.zip. Its replacement recipe is mandatory even though this treatment uses no external SVG files. Use this revision's regenerated controls.csv; the old CSV contains the jumps. The correction must be judged from its actual new renders. It does not confer a moving blind win, completed full-film coverage or native Resolve equivalence.

A code-only reconstruction with per-treatment Resolve/Fusion construction guidance. No external image conversion is required. The active recipe includes the explicitly recorded camera and cursor changes, rather than being an exact replay of the uncorrected core recipe. This is not a tested .setting import or a source-fidelity verdict. resolveApplicationVerified remains false. Render and delivery records in the finished kit, not this guide alone, establish which actual files were checked.

Run from the public download

Extract the downloaded kit into a new writable folder. That kit root contains this README, guide.json, handoff.py, controls.csv, core-publication-v08.zip and the required active-assets.zip. Core supplies the runtime and the older recipe containing the camera jumps. The active archive replaces that recipe with this corrected revision; it is mandatory even though no external images are needed. No repository, private worker or sibling Sora kit is needed. Both content variants are embedded in the recipe; no separate inputs/ JSONs or generator helpers are required.

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 corrected recipe

From the kit root:

unzip core-publication-v08.zip -d .
unzip -o active-assets.zip -d .
python3 -c "import hashlib,pathlib; assert hashlib.sha256(pathlib.Path('project/recipes/sora-timeline-insertion.json').read_bytes()).hexdigest() == 'abd94ed2003a52e9807145deb560db6af8c0fc85d8174717b03133b4decc3054'"

Core creates project/, including the older recipe with SHA-256 b96642f5ea6045a31da02cb32e8c23d2ed31c3336e76aaa2a465ee045ab7ac90. The second archive must replace it with the corrected recipe whose hash is checked by the command above. Core also supplies project/public/fonts/Geist.ttf and its OFL license. The recipe has no image/video slots or external SVG assets to install.

The supplied active archive uses project/recipes/ member paths. Extract it at the kit root as shown, never into another project/ directory. Core alone is not this revision and is expected to fail this guide's recipe hash check. There is no need to fetch the historical asset index or any assets-001.zip.

2. Verify and prepare the Resolve handoff

Still from the kit root:

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

Verification checks the unpacked recipe against the guide without npm or private audit files. The supplied controls.csv and regenerated CSV describe 151,920 data rows: 360 native frames × 422 numeric controls. Compare them to check the packaged export; keep the supplied CSV unchanged. These are local implementation values with ancestor-aware activity, not measured film parameters, world-space positions or directly importable Resolve curves.

For a Fusion-only workflow, continue with Fusion hierarchy and Coordinate and track conventions below. Use guide.json, controls.csv, the unpacked recipe's inline geometry and core's font. No Node installation or external artwork is needed for this branch. The handoff is a construction specification, 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-timeline-insertion --variant default --out out/sora-timeline-insertion-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe sora-timeline-insertion --variant adaptation --out out/sora-timeline-insertion-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/sora-timeline-insertion-default.mp4
node --experimental-strip-types scripts/verify.mjs out/sora-timeline-insertion-adaptation.mp4
cd ..

Choose fresh --out names on reruns: the renderer refuses to overwrite an MP4 or its adjacent manifest. Use the matching names with verify.mjs and retain each .manifest.json. These are runnable instructions, not a claim that the authoring pass executed an export or verified Fusion.

This is direct Content, not builder design input. Within project/, core supplies examples/sora-timeline-insertion/default.json, adaptation.json and input.ts. For custom original content, copy the recipe's complete defaults or adaptation object into your own JSON (create project/inputs/ if needed), then replace --variant with --content inputs/<name>.json; they are mutually exclusive. Preserve native frame count, aspect ratio, structure and pointer/camera timing. Loaded-font fit and output verification must pass for the new content.

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

Binding and eligibility

guide.json follows the shared handoff.py schema, with all 104 nodes, 422 numeric controls, 12 animated tracks, parent links, Merge ordering, static geometry/style controls and references to every animated recipe property. The source checkout's optional historical provenance.json pins the actual core/recipe/font bytes, empty asset index, retained source excerpt, native archive/member hashes and historical full-source binding; it is not required public-kit content. source.localMedia is research metadata, not a retrieval task or an active runtime input. The full master is absent; its recorded hash is not newly verified. The actual excerpt and selected native PNGs are verified.

Inherited source inspection

Opened seven individual 1920×1080 native source PNGs from hash-verified archive members, not a contact sheet: local 26,82,179,180,208,243,359. Separately probed the 960×540 source excerpt: 360 silent frames at 60/1. This is selected static inspection, not continuous-frame or moving-source review.

Local Source / nominal film seconds Viewed source state
26 2906 / 48.433333 Existing tall-card bottom, ruler and toolbar; no visible pointer
82 2962 / 49.366667 Held hand above timeline plus-cell
179 / 180 3059 / 50.983333; 3060 / 51.000000 Plus-cell becomes numbered item; second tall card appears at right
208 3088 / 51.466667 Selected outline clearly visible, old/new tall cards above
243 3123 / 52.050000 Reframe toward tall cards, arrow near departing timeline
359 3239 / 53.983333 New tall card centered, old card retained at left, visible text caret

The clear outline at208 is not proof of its first onset. The former recipe started its arrow at26. The consecutive-frame cursor follow-up described above changes that gate to43 and refits the approach; independent output review is still required. The final source caret is not represented as a separate recipe layer. Preserve that remaining difference rather than silently inventing a final-caret timing change.

Optional source-checkout audit

These checks apply only to maintainers who already have the original authoring checkout and accepted research library. They are not prerequisites for public rendering or Resolve construction. The public kit does not ship the private worker, these test/audit helpers or a sibling pullback kit. Do not restore a deleted benchmark or fetch historical source media to use this download.

Set REPO_KIT to the source checkout's guides/sora/sora-timeline-insertion/ directory and LIBRARY to the retained accepted library root, then optionally run:

PYTHONDONTWRITEBYTECODE=1 python3 "$REPO_KIT/../sora-moving-result-pullback/verify_kit.py" \
  --kit "$REPO_KIT" --library "$LIBRARY"
FIELDNOTES_LIBRARY="$LIBRARY" PYTHONDONTWRITEBYTECODE=1 python3 "$REPO_KIT/test_guide.py"

These historical tests share an archive helper in the authoring checkout. The public Remotion/Fusion workflow has no such sibling dependency: verify the unpacked project using only the shipped handoff.py, as shown in the quick start.

Fusion hierarchy

Use Background_Canvas #252525, 1920×1080, 60/1. Place keys at composition start plus local frame. Source ordinal is 2880+L, nominal seconds (2880+L)/60. All gates are start-inclusive/end-exclusive; a tool gated [82,243) is last visible at 242. Children remain on the same local clock. Do not restart nested keys when their parent enters.

Background_Canvas
  workspace-camera, 1920×2200, x/y/scale: 360 native keys each
    editor-field, (-1500,-1800), 6500×4000
    linked-workspace-pan, 3000×1320, x: 360 native keys
      existing-card / paragraph / time / edit / delete
      inserted-card [180,360) / shared index / instruction / time / add / delete
    timeline-track-bed / color-timeline-strip
    41 ruler ticks + 21 numeric labels
    timeline-selection-cell / plus OR shared small index + content rule
    selected-timeline-outline [208,360)
    toolbar-bed / seven icons + labels + button / bottom edge / desktop strip
  approach-arrow [43,82), ROOT domain
  held-native-hand [82,243), ROOT domain
  focus-arrow [243,360), ROOT domain
MediaOut1

The JSON expands every branch in exact back-to-front sibling order, including all ruler and toolbar nodes. Each group begins on Transparent_<parent> and its child Merge chain is assembled before the group's transform/opacity. backgroundInput, foregroundInput, output, mergeIndex, parentLayerId and recipePointer remove ambiguity. Construction names are not a .setting syntax guarantee; sanitize hyphens in Fusion names while retaining the mapping.

Do not put the timeline under linked-workspace-pan. Only the tall-card lane moves horizontally. The ruler, cell and toolbar share the outer workspace's vertical/scale reframe, but not that horizontal pan. Root pointers must not inherit either camera transform.

Coordinate and track conventions

The required geometry is top-left, downward-positive CSS pixels. For a point p in a layer's local domain, use the following at each parent boundary:

t = (x,y); o = origin or (0,0)
S = diag(scale*scaleX, scale*scaleY), absent scales are 1
p_parent = t + o + R_clockwise(rotation) * S * (p-o)
normalized Fusion image coordinate = (p_parent.x/W, 1-p_parent.y/H)

Compose parents before the final conversion. The default pivot is top-left, not image center. For an untransformed rectangle its center is (x+width/2,y+height/2); after transformation use the equation at p=(width/2,height/2). Center and Pivot depend on the chosen padded input image domain. Never paste CSS X into normalized Center or add a parent translation twice. Use separate placement and origin/pivot transforms if that makes the equation easier to reproduce. Negative CSS rotation corresponds to the up-positive Fusion 2D Angle; the current timeline has no rotation track.

Keep input-domain dimensions explicit. The 3000×1320 group's card height is 1324; neither that overhang nor negative coordinates are a crop. The 6500×4000 editor field and 5000-wide timeline beds extend beyond nominal group boxes. Retain a padded transparent data window until the final canvas crop; account for padding offsets before applying local transforms. Only an explicit clip or overflow: hidden licenses local clipping. Otherwise shrinking a group's data window to its named dimensions will remove visible material.

At L359, the pan is -1142; camera X=525.27671, Y=20.04553, scale=.78546. The new card at local X=1142 consequently begins at (525.27671,20.04553) in output pixels. The old card begins at (-371.71861,20.04553). Both are 1106×1324 before scaling. These anchors catch accidental horizontal motion on the whole workspace or double scaling.

Every key uses the left key's easing: linear by default; smooth=t*t*(3-2*t); hold until the right key then exactly its value. Clamp outside first/last keys. Do not apply Fusion automatic smoothing to the 360-key tracks. Use Step for visibility and plus/index state changes. The plus-cell position holds X=359 from 82 through 97, then becomes X=399 at 98. Its small outline has X=400, Y=1440, 160×169, radius12, 4px inward border.

Construct CSS rectangles with inward borders; SVG-path strokes are centered on the path and scale with their viewBox. For path/pointer shapes preserve xMidYMid meet, rather than stretching normalized points independently to width and height. The hand has viewBox 0 0 34 36, local box62×66, original path in the JSON and stroke1.4. The two generic arrows use the shared 24×30 polygon documented in their nodes. Match the fingertip/arrow tip, not simply the top-left bounding box, when checking pointer locality.

The colored strip is the declared CSS linear-gradient(100deg,#382727,#46302c,#343a28,#263932) across its 5000×168 box. Use four evenly spaced stops, corresponding to 0, 1/3, 2/3 and 1; retain the CSS angle convention (zero points upward, increasing clockwise), local box and crop. A solid-color substitute loses workspace density. CSS blur values, font pixels and radius are not guaranteed same-number Fusion parameters. Match rendered geometry/antialiasing rather than asserting parity.

Editable inputs and review checkpoints

Remaining differences

Historical changes-required: timeline-entry-pointer was open before this revision. The new static review closes that early pop, not overall fidelity. The old L207 height jump and L241 stretch findings were marked resolved in the retained review, not newly tested visually by this worker. Source-outline onset remains partial; the viewed final caret has no separate recipe layer. Original copy/icon paths, Geist metrics, gradient colors, camera fit and antialiasing remain substitutions. No source frame, screenshot or movie belongs in the runtime input plan.

Largest visual gap: the later pointer leaves the selected timeline too early at local243–275, particularly248–263. Moving/source and native Resolve verification are still missing, and the final caret remains absent. The source's actual product behavior is not asserted by this illustrated board. No full-master inspection or fidelity completion is claimed. Two actual exports exist; their recorded bindings and static critique accompany the kit.

Coordinate reference: Blackmagic's Fusion Tool Reference, Transform tools documents normalized image Center controls. This is not the distinct Fusion Shape/Matrix width-normalized system. Check a noncentral asymmetric polygon in the actual Resolve version before committing the node transforms.