OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

Device-to-seven-card arc

Resolve/Fusion construction guidance for pulse-device-card-arc, paired with the retained Remotion implementation. This guide awaits separate critique. It supplies no Resolve import, new media, new render or source-fidelity verdict; resolveApplicationVerified remains false.

Binding and evidence

The native pair makes the largest inherited gap concrete: the source aircraft card becomes an architectural editorial page in the original output. Both variants use original artwork, but that does not make their subject matter, texture or reading density faithful to the source's large illustrations.

Setup and hierarchy

Create a white 1920 × 1080 composition, 235 frames, at 60/1. Local zero maps to source 300. If the Fusion composition starts at another frame, offset every local key/gate consistently. All intervals below are start-inclusive and end-exclusive. Native source seconds in the shared CSV are nominal arithmetic, not measured source PTS.

The full back-to-front root order is deliberately not numeric card order:

Background_Canvas (white)
opening-identity [0,1)
phone-container [1,90)
  phone-outline → phone-heading → phone-copy
takeaway [200,235)
arc-card-0 [74,224)  : tile-shadow-0 → card-face-0
arc-card-1 [74,224)  : tile-shadow-1 → card-face-1
arc-card-2 [74,224)  : tile-shadow-2 → card-face-2
arc-card-4 [74,224)  : tile-shadow-4 → card-face-4
arc-card-5 [74,224)  : tile-shadow-5 → card-face-5
arc-card-6 [74,224)  : tile-shadow-6 → card-face-6
arc-card-3 [1,224)   : tile-shadow-3 → card-face-3
MediaOut1

All 27 layers and their recipe pointers, parents, merge inputs/order, geometry and effective activity are expanded in the JSON. Each card is an independent transparent local group. Merge its shadow and face first, then apply its own transform/exposure. Card 3 is a root sibling of the phone, never its child: its continued motion and visibility must not inherit the phone's fade or gate. Card 3 remains above the surrounding six throughout; there is no dynamic sort.

The initial identity uses Text+ at (700,452), box 700 × 120, fontSize 92, weight 650. It exists for exactly one frame. Cut to the phone/card at frame 1; do not add a dissolve or extend the title to make it easier to read.

Phone, independent fades and crop

Build a 714 × 1500 phone group at x=603. Its rounded white outline has 20-pixel #cccccc border, radius 112 and shadow 0 0 48px #00000010. Use editable Background/rounded Rectangle geometry, not a scaled phone movie. Preserve the 1500-pixel domain and let the final 1080-pixel canvas crop its bottom. A tight crop to the visible phone changes child coordinates.

Phone y is 238 at frame 1, 206 at 2, 192 at 3, 173 at 5, 154 at 8, 138 at 12, 126 at 16, 117 at 20, 105 at 30 and 98 at 45. Keep its remaining keys, including the one-pixel late movement. The recipe's group opacity is:

Local frame 1 74 76 78 80 83 86
Alpha 1 1 0.8 0.15 0.06 0.025 0

The heading sits at (90,506), 580 × 50, fontSize 36, weight 600, centered. The body sits at (48,563), 620 × 163, fontSize 39, color #838383, lineHeight 1.18, centered. Use separate Text+ alpha tracks from the JSON; they reach zero at 76, earlier than the outline. Child alpha is multiplied by parent alpha. Do not replace those three fades with a single phone dissolve.

This is the retained incorrectly late/abrupt fade, not a recovered source curve. The inherited review finds the source border lightens through 68–76, whereas the output holds until 74 then washes out at 77–78. Preserve the implementation baseline for comparison; changing it needs a reviewed revision.

Seven card constructions and placement

Every card uses a 640 × 640 untransformed local domain. Build a white rounded plate, radius 54, with 0 9px 15px #0000001a shadow, then the matching original SVG face with cover fit and the same radius. The face clips to rounded corners; the shadow extends beyond them. Do not put a hard 640 × 640 crop after the shadow or it will cut off the blur. Each card group leaves overflow visible; the final scene clips anything offscreen.

The SVG pack has seven default and seven adaptation faces. These are two content sets for one treatment, not fourteen examples. The full scene remains editable; a flat MP4 or source still is not an asset substitute. Native SVG import and shadow/filter parity in Fusion are not validated by this guide.

The transform origin is (320,320) for all cards. Treat raw x/y as the top-left of the unscaled 640-pixel box. Since scale/rotation are about its center, the parent-space center is (x + 320, y + 320). It is not (x + scaledWidth/2, y + scaledHeight/2). Resize the local face about that center before placing it into the scene. For a centered 640-pixel plane, the target normalized center is ((x+320)/1920, 1-(y+320)/1080). Translate CSS's clockwise-positive screen rotation to the opposite sign if the Fusion Angle is counter-clockwise-positive. Verify a tilted frame rather than assuming the UI default. No 3D camera or perspective projection is used.

Selected implementation anchors for card 3:

Local frame Raw x Raw y Scale Screen rotation
1 639 333 0.22812 -4°
74 640 170.28571 0.3125 -3.86°
100 640 160 0.40625 0°
124 711.3567555 154.3662449 0.40625 2.4366482°
175 1173.5467266 242.1232747 0.40625 19.0466243°
200 1813.2144484 646.6941899 0.40625 45.4588094°

At 1 the card center is (959,653). At 100 it is (960,480), face width 260 before rotation. At 124 it is (1031.3567555,474.3662449), so do not freeze it at the frame-100 center. These anchors are insufficient to recreate the path: retain every x/y/rotation/scale key for each of the seven independent cards. Do not replace the fan with one circular path or animate the entire array as one group. Preserve the other six cards' gates at 74, while phone alpha is 1.

Easing and sampled shutter

Use the retained src/timing.ts sampler. Exact key frames use their exact value; between keys use the left key's easing (linear default, smooth progress² × (3 − 2 × progress), or hold). Clamp before/after keys. The supplied path fits are linear between their many keys. Automatic spline smoothing or a generic spring alters the geometry and exit phase.

Every card uses seven parent-transform samples for positive shutter:

sampleFrame = frame + (sampleIndex/6 - 0.5) * shutterFrames
sampleOpacity = 1 / (sampleIndex + 1)
sampleIndex = 0 through 6, composited in ascending order

Shutter is zero through 73, 0.3 at 74/100/145, rises linearly to 0.5 at 215, then falls to zero at 223. Between 73 and 74 it interpolates; at integer frames the first seven-sample frame is 74. At zero shutter use one sample. Keep the face and shadow at the integer frame; evaluate only their parent placement/rotation/scale at fractional sample times. Do not time-shift the whole composition: that would contaminate phone gates, word reveals and cuts.

For a manual Fusion approximation, branch the already-composited card into seven Transform nodes, evaluate the parent tracks at those fractional times, then Merge with alpha 1, 1/2, 1/3, …, 1/7. The recipe's sampled stack is not proved equivalent to a built-in shutter, directional Blur or Echo. It has known multi-copy smearing of text/charts during exit (175–218). Do not call this corrected because it uses multiple samples. Shadows and exposure weights are fits, not recovered production settings.

Word reveal, overlap and exit

The takeaway is below every card, not on top of the fan. Its single Text+ box is (410,522), 1070 × 128, fontSize 92, weight 600, tracking -2.5. Use the complete currently visible prefix of the four-word statement:

Local interval Visible words
[200,206) First word
[206,211) First two
[211,214) First three
[214,235) All four

Use stepped text changes at those frames, without dissolving letters or re-centering separate word objects. Card activity continues through 223; the statement is partially overlapped as the cards depart. In inherited source contacts, source 522/local 222 has a faint edge, and 523/local 223 is clean. This is different from the implementation's explicit gate at 224. Offscreen geometry can be invisible while its active flag is true. Never force the CSV's activity to mean visible pixels. Keys extending beyond a layer's end remain implementation data; do not extend its gate just to make every key visible. The last statement frame is 234, without an added hold or fade.

Checked command paths

Use an already authorized core plus original SVG pack; the retained website's project files alone may omit those assets. From the toolkit's project/:

npm --silent run catalog -- show pulse-device-card-arc --contract
npm run render -- --help
npm run render -- --recipe pulse-device-card-arc --variant default --out out/pulse-device-card-arc-original.mp4
npm run render -- --recipe pulse-device-card-arc --variant adaptation --out out/pulse-device-card-arc-adaptation.mp4
npm run verify -- out/pulse-device-card-arc-original.mp4
npm run verify -- out/pulse-device-card-arc-adaptation.mp4

The core archive's package scripts, parser and help were checked; read-only catalog/help commands were exercised. No render or output-verify above was run. These commands require existing pinned dependencies, FFmpeg/FFprobe and supported Chromium. Outputs must be new paths and keep their sibling manifests. For custom Content, start from examples/pulse-device-card-arc/default.json, save a full object under inputs/, and use --content instead of --variant. Preserve seven square, rights-declared assets and the four-word statement.

From dual-toolkit-200/, replacing PATH/project with the assembled toolkit:

python3 handoff.py verify --guide guides/layered/pulse-device-card-arc/guide.json --project PATH/project
python3 handoff.py frames --guide guides/layered/pulse-device-card-arc/guide.json --project PATH/project > controls.csv

Write CSV only to authorized storage. This parent-owned exporter reports native local values, ancestor activity and nominal source seconds. It does not produce world-space centers, rounded masks, per-sample images, shaped text or native Resolve controls. The JSON/README supply their construction requirements; actual application behavior remains untested.

Open gate

Use all 19 JSON checkpoints, especially the overlap at 74, artwork at 124, word steps and 222/223/224 boundary. The inherited review keeps one material finding (editorial art versus illustrated subjects) and four minor findings: corners/shadows, exit ghosting, device fade and closing copy sitting lower and smaller. Older anchor/exit-center findings are marked resolved in that review; do not revive them as current failures or turn that targeted resolution into blanket approval. The biggest gap remains the artwork's material mismatch. No source-quality completion or native Resolve validation is asserted.

Read-only helper tests

From this guide directory, run FIELDNOTES_LIBRARY=PATH/library python3 -B test_guide.py with the retained library root. Six tests cover recipe/source/archive pins, every layer/control mapping, original SVG members, inherited findings and the phone/card order, pivot, shutter and word-step boundaries. They inspect ZIP members in memory and reuse the parent handoff helpers; they do not make a second runtime, render, write evidence, or verify Resolve. An absent environment variable causes a skip, which must not be reported as passing validation.

Per-SVG binding repair · September 13, 2026

guide.json.svgAssets now pins all 14 distinct SVG paths referenced by image layers across defaults and adaptation, with no extra pack members. Keys are relative to project/public/; values are SHA-256 hashes of the uncompressed project/public/<path> ZIP member bytes. The accepted asset archive's own hash was verified before deriving these pins. Shared paths are listed once.

The helper test requires the exact referenced path set and checks every member's bytes against its pin; missing, extra or changed assets fail. The regression failed for the missing map before this repair. Recipe bytes, numeric controls, source bounds, Fusion geometry and prior evidence remain unchanged. This adds asset verification, not new media, motion review or native Resolve validation.