OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

Mode selection to a quiet activity dot

Unrendered dual-tool candidate. This worker made no new render, movie encode, deployment or native Resolve run. Completion credit, moving-source blind wins and native Resolve proofs are all 0. Independent source-first critique is pending the parent's source-only freeze and subsequent output inspection. Do not give a source-first critic this builder-informed guide before that freeze.

Source binding and inspection

Source: You can just use your voice | ChatGPT Work, https://www.youtube.com/watch?v=ceBruD6v5Bk. Native source interval [90,210), 120 frames at 30/1 fps, 4.000000 seconds. Source-frame/rate arithmetic gives nominal interval [3.000000,7.000000) seconds; these values are not independently measured decoder PTS.

Retained excerpt SHA-256: 3af39b374b72e2e921fdcdd5d764a9b79173f66e0b5c4d1a9111bf7bb90287db. Source master SHA-256 (inherited, not rehashed): d75296d6561d87dcda171c5a8cfe68c330ad8f4bacfe78f51e8933f84c82f1b8. Active recipe SHA-256: 7884dfcb2d81262da3a792ac96ab1a95b377300933c3ba2958347c6bf35f20d0.

The actual retained excerpt was rehashed and all 120 consecutive frames were decoded and viewed as ordered 240x135 stills. This is static inspection, not moving viewing. Voice additionally has sixteen 480x270 still inspections listed in source-inspection.json. The builder read the queue's prior observations; neither this guide nor its source notes are a blind critic report. No whole-film inspection is claimed. Historical source paths are provenance, not prerequisites or editable assets. Source movies are deliberately absent from the kit.

Biggest remaining adaptation gap: The original control labels/glyphs and authored composer withdrawal are a visual approximation. The dot geometry is fitted from half-resolution stills, not recovered easing or an audio algorithm; temporal feel and native Fusion shadow/Text+ matches await real renders.

Public kit and installation

Use a fresh directory containing core-publication-v08.zip, active-assets.zip, guide.json, README.md, handoff.py, controls.csv, overlay-manifest.json, provenance.json, source-inspection.json, test_guide.py, and verify_runtime.mjs. validation-results.json records builder tests, not a runtime prerequisite. The parent supplies the pinned core alongside this kit; it is not copied into each candidate's source directory.

Python 3.11+, Node 22.18+, npm and unzip suffice for installation and mechanical checks. Rendering later also needs FFmpeg/FFprobe and an existing supported Chromium. REMOTION_BROWSER_EXECUTABLE can select that browser. No command below depends on a private script, source movie, unpublished asset archive, repository checkout, prewritten missing input file or a restored historical project.

Both ZIPs begin at project/. Extract core first, overlay second at the kit root, not inside another project/. The overlay replaces the selected recipe and installs all active SVGs and both input variants. Reversing this order would restore the legacy video/raster fields in the two inherited recipes.

set -eu
test ! -e project
python3 -c "import hashlib,pathlib; assert hashlib.sha256(pathlib.Path('core-publication-v08.zip').read_bytes()).hexdigest() == '307fb6b927e35e6d73779652873d994f5c3e36cb7deba65f22fa64748057a0de', 'Core checksum mismatch'"
python3 -c "import hashlib,pathlib; assert hashlib.sha256(pathlib.Path('active-assets.zip').read_bytes()).hexdigest() == '48b5a9d9be2cc22755f8bd83744001aeef39a70e365446ff69d0441b81e59905', 'Overlay checksum mismatch'"
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
cmp controls.csv controls-regenerated.csv
PYTHONDONTWRITEBYTECODE=1 python3 test_guide.py
node verify_runtime.mjs --project project
(cd project && npm ci)

The core's other recipe definitions and old examples/ files are not this adapter's active inputs. Use only the selected recipe variants or the new project/inputs/voice-toggle-to-orb/ files. Do not run full-library asset tests with only this selected SVG whitelist installed. The builder did not run npm ci; schema and timing checks use the hash-pinned public core TypeScript without installing or copying node_modules.

Render later, under the owner's authority

These commands are provided for the parent/recipient. They were not run by this worker. Both examples are silent and use the source cadence without holds.

cd project
npm run render -- --recipe voice-toggle-to-orb --variant default --out out/voice-toggle-to-orb-default.mp4
npm run render -- --recipe voice-toggle-to-orb --variant adaptation --out out/voice-toggle-to-orb-adaptation.mp4

For a custom edit, copy the supplied input file to an unused local filename, edit only declared content fields, then use that file:

cp inputs/voice-toggle-to-orb/adaptation.json inputs/voice-toggle-to-orb/custom.json
npm run render -- --recipe voice-toggle-to-orb --content inputs/voice-toggle-to-orb/custom.json --out out/voice-toggle-to-orb-custom.mp4

Inspect the manifest emitted beside each later render. It must bind the active recipe, code, complete content and used SVG bytes, with the exact rational fps, 120 frames, 1920x1080 and no audio. A prior video or stale manifest cannot verify changed inputs. verify_runtime.mjs does not load Chromium or measure the actual browser font. Remotion's loaded-Geist FontGate must pass before any render can qualify for visual review. Never silently shrink replacement copy.

This adapter

The source contains three hard state changes and an overlap: statement to toggle at10, toggle to enlarged composer at39, activation feedback at58, and dot entry at81 before the composer branch ends84. The dot moves downward before pulsing. Its name is historical; there is no colored orb inside this interval.

project/inputs/voice-toggle-to-orb/default.json and adaptation.json are complete Content objects, not a separate design DSL. They change original copy/art while keeping event count, gate frames and native duration. guide.json includes the whole field contract, both inputs, every layer, every parent connection, local domain, path/viewBox, mask, gate, text reveal and animated control.

Resolve / Fusion construction

This is a native construction specification, not a tested .drp or .setting. Use the supplied SVG source as editable geometry, not Loader images of flattened frames. Keep node branches for independently animated objects and Text+ for runtime copy. fusionNodes provides a complete back-to-front Merge graph with exact parent IDs and recipe pointers; controls.csv supplies native integer-frame numeric controls. They are not an automatic Fusion import.

  1. Create 1920x1080 at 30/1, local [0,120), source [90,210), silent on white. Preserve the opening statement tail [0,10); this four-second excerpt is not only the toggle.

  2. Build opening-statement as centered Geist100/600 in box(230,477,1460,112), [0,10). Use original supplied wording. At10 cut to mode-control; do not dissolve the words into the control.

  3. Construct mode-control at (440,430), 1040x220. mode-track has radius110 and neutral fill; selection-thumb is 502x190 at y15 with radius96 and a2px border. Animate only the thumb x using all supplied keys20..32. Labels remain centered in their fixed 405px boxes. This is a sliding selection, not a stepped label swap.

  4. At39 disable the entire mode-control and enable composer-exit. Its 2220x1240 domain starts at(-420,-280), pivot(2220,0); the left and top extend offscreen. Build the rounded shell, label, speaker, microphone, activation circle, bars and close path as separate branches in the documented order. Do not resize the full composer to fit onscreen.

  5. Use supplied original microphone/speaker SVG paths, not source glyph images. The activation circle is 342x342 at(1790,814). Four individual rounded rect bars live inside voice-bars at(1884,920). At58 hard-disable voice-bars and composer-label, then enable speaker-feedback and close-action. Do not crossfade the voice bars into the X.

  6. Keep activation-pointer canvas-local above composer-exit. It holds until57, descends on58..60, then hard-disables at61. Its fill is black and outline white; its oversized entry is deliberate because this shot is a tight crop.

  7. Animate composer-exit y and scale independently about its upper-right origin, following the local-frame table. The parent scale affects all chrome, not the dot. Keep its final sliver through83, then hard-disable at84. These are authored fit tracks, not recovered source springs.

  8. Build quiet-activity-dot as its own Ellipse/Background branch above the composer. Start81; source171. Its x,y,width,height each have one key per frame81..119. The center first descends then settles near the lower canvas while its diameter varies. Preserve the small overlap with departing chrome; do not delay the dot until84.

  9. Use the same near-black ink for the button and dot. The later colored voice orb is outside [90,210), despite this historical recipe id. No sound, transcript, synthesized speech, audio-reactive link or continuous transition from the X into the dot is part of this recipe.

  10. Swap default Write/Speak/Field Studio specimen for adaptation Notes/Listen/River Lab with its own statement. Geometry and event gates stay fixed. The labels describe an original motion specimen, not verified Poe product behavior.

  11. Compare 9/10,38/39,57/58,60/61,80/81 and83/84 first. Review the thumb glide, composer withdrawal and dot settling at normal speed later. Boundaries were inspected as ordered stills; source-quality eligibility and native Resolve playback remain unproven.

Coordinate, text and compositing calibration

Recipe positions use a top-left, downward-positive parent pixel domain. All tracks use the same local frame number even inside groups. For box width/height w,h, origin ox,oy, and sampled properties, use this local mapping:

M = T(x+ox, y+oy) * R_CSS(rotation) * S(scale*scaleX, scale*scaleY) * T(-ox,-oy)
world = M_parent * M_child * ... * localPoint
Fusion point for domain W,H: (worldX/W, 1-worldY/H)
unrotated/unscaled center: ((x+w/2)/W, 1-(y+h/2)/H)
unrotated/unscaled pivot:  ((x+ox)/W, 1-(y+oy)/H)

The last two formulas are calibration cases, not replacements for the matrix under a transformed parent. Test a known asymmetric corner to establish Fusion's rotation sign and normalized pivot. Missing width/height inherit the containing domain; missing origin is (0,0). Never assume image center. Preserve overflow until the explicitly declared mask or the final canvas; pad group domains when needed rather than clipping children to their nominal width/height.

Keys use left-key easing: linear by default, smooth=t*t*(3-2*t), hold until the right key and then take its exact value. Clamp outside keys. Gates are Step at start and end; Resolve's displayed inclusive end is 119. Do not add end-frame 120. Sampled one-frame path states and numeric rows must not gain automatic Bezier smoothing or retiming. These are implementation controls, not source-time PTS or a recovered physical model.

SVG path viewBoxes stretch independently into the declared path layer width and height; image SVGs preserve their supplied aspect/fit. Import compound paths, gradient stops and outlined monoline glyphs, not just a screenshot of the SVG. CSS shape borders are inside the border box; path strokes are centered on their curves. Match eight-digit color alpha, premultiplication and node alpha once. Parent opacity applies after child compositing. Blur/shadow radii are not numerically portable between CSS and Fusion and require a rendered fit.

Core public/fonts/Geist.ttf and its OFL license supply runtime text. Geist is a declared substitute, not a recovered source font. Align Text+ to actual glyph bounds within each prescribed box, including tracking, weight, line height, right/center alignment and complete-word reveal. A raw Fusion Size parameter or matching character count does not establish the same baseline or fit.

Native checkpoints

Local frame Source frame Check
0 90 Original centered statement.
9 99 Final statement frame.
10 100 Hard cut to segmented mode control.
20 110 Thumb still at the first selection.
23 113 Thumb crossing; both labels remain stationary.
32 122 Second mode settled.
38 128 Final mode-control frame.
39 129 Hard cut to enlarged composer/button/pointer.
57 147 Last voice-bars state.
58 148 Voice bars become close; speaker appears; composer label disappears.
60 150 Pointer is leaving the lower edge.
61 151 Pointer off; composer remains.
68 158 Composer starts withdrawing.
75 165 Composer reduced and descending.
80 170 No dot yet; tiny composer sliver.
81 171 Dot enters while a lower composer sliver can remain.
84 174 Composer hard-disabled; dot only.
94 184 Dot has settled near its lower position.
104 194 Larger dot pulse, still monochrome.
112 202 Smaller pulse.
119 209 Final active dot frame, no added freeze.

Verification and unresolved eligibility

test_guide.py checks hashes, SVG-only closure, exact overlay members, both inputs, the full node hierarchy, every exported native control, source bounds, specific gates and rejected invalid inputs. verify_runtime.mjs loads the pinned v08 validators and sampler to check both variants and every CSV row. These tests do not render, establish font/blur equivalence, or prove native Resolve behavior.

Fresh critics must inspect the actual future default/adaptation outputs after their source-first freeze, checking motion, holds, layers, typography, density, overlap and boundary frames. Their findings must bind output and recipe hashes. Keep this candidate outside completed counts until those checks resolve its material gaps. Final all-hands production and talking-head synchronization are not authorized by these standalone motion specimens.

Exact project overlay manifest

overlay-manifest.json is the machine-readable byte/size ledger. No runtime source, dependencies, fonts, source media or unrelated recipe is overlaid. Active ZIP SHA-256: 48b5a9d9be2cc22755f8bd83744001aeef39a70e365446ff69d0441b81e59905.