OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

Composer context reveal: Resolve / Remotion guide

Biggest gap: the retained result panel skips the source's short bottom-edge settle over local 92–108. Reproducing these controls does not repair that mismatch.

Post-review customization warning: the query caret uses fixed x positions. Changing the query can place it inside the text even when the new text passes general box-fit validation. The custom-Content command below is not a verified arbitrary-query workflow. Keep the supplied query while studying other controls, or derive and verify every caret position from the actual loaded-font prefix width before exporting changed query text. The supplied default itself retains excess prefix spacing; neither this warning nor the guide repairs that output.

This extends an existing illustrated example. It is not a new unique mechanism, accepted render, packaged kit, or native Resolve validation. Original and Adaptation are both Remotion outputs; neither is the OpenAI source.

Source and clock

Introducing ChatGPT Atlas, source frames [253,390) at 30/1 fps, 1920×1080: 137 native frames, local 0–136. Nominal source seconds are 8.433333…–13; duration is 137/30 seconds. These are arithmetic conversions of retained frame bounds, not newly measured PTS or timings. guide.json retains the complete recipe source object and byte hash; its localMedia is provenance, not a required runtime input or a claim that the full master remains accessible.

Library-relative evidence is evidence/atlas-composer-context-reveal/review01/; the two actual movies are under renders/atlas-composer-context-reveal/review01/. The comparison metadata maps 95 retained PNG frames per variant, not all137. Look up frameHashes[variant] by localFrame, then use archive.member; the sparse PNG filename number is not the frame number. Native archive members, existing contact sheets, actual movie hashes and decoded stream properties ground this guide. Selected stills were inspected, not continuous moving footage.

Every exact control value below and in the mapping is a retained implementation value, not a newly measured source value. Earlier source-present-by summaries do not override the revised recipe: results begin at local92.

Fusion construction

  1. Create a silent 1920×1080, 30/1 composition with local frames0–136. Set the local clock deliberately if the timeline begins at another frame. Keep the ILLUSTRATED UI · NOT POE disclosure.
  2. Build outer-desktop beneath anchored-camera; merge disclosure-back and disclosure after that camera, in frame space. Inside the camera follow fusionNodes sibling order: browser plane/edge, spatial chrome, mark, input/results, symbols. Do not animate the desktop or disclosure with the camera.
  3. Register anchored-camera to pixel pivot[960.5,534]. Preserve every x/y/scale key, including scale1.429732868757259 at8, 1.0801393728222997 at9 and1 at34. Its keys use hold interpolation; do not smooth the8→9 reset or replace its measured-frame fit with a generic zoom.
  4. Put spatial-browser-chrome at[211,39], with a1498×97 local clipping box. The chrome artwork is1500×96. Merge structure, three traffic controls, translating2800×96 white feather and early contour in that order. Keep the controls' opacity tracks independent. The feather is an occluding SVG gradient, not a whole-browser opacity fade or Gaussian blur.
  5. Rebuild the input shell at[530,503,861,62], with31px radius. At92 replace it with the full joined-results shell and all five rows together; do not animate a height wipe. The retained shell is already at its final height, which is the documented source discrepancy, not an instruction to claim a match.
  6. Couple typed-query, first-result-query and query-caret: counts2/3/4/5/6 at92/109/112/131/134. Switch the four lower result rows at112, rotate the submit arrow to45 degrees at121, and swap both input/result badges at122. Do not infer these illustrated results from real product behavior.
  7. Keep SVG artwork as separate editable vector branches and text as separate Text+ branches. Confirm native-size vector registration before any camera transform. An SVG import/rebuild route must be checked in the installed Resolve version; this guide does not promise a Loader can ingest arbitrary SVGs. Use masked Background shapes for shells and separate shadow branches where needed.
  8. End after136 with an explicit cut. Additional still holds or new text are editorial adaptations. Do not silently fix the source discrepancies by changing the pinned recipe or importing source-film screenshots.

Coordinates, cuts, crop and easing

The recipe uses parent-local top-left pixels, positive y downward. For a layer without rotation, a local point maps to its parent as position + origin + scaleXY * (point - origin). Apply this recursively; do not add the camera twice. If using full-frame Fusion branches, convert a resulting pixel point to normalized coordinates only after establishing the branch domain and axis convention. Verify two landmarks; a CSS left/top is not a Fusion Center.

src/timing.ts uses the left key's easing: hold until the exact right key, linear interpolation, or progress² * (3 - 2 * progress) for smooth. Preserve these semantics rather than selecting an arbitrary spline preset. Start/end gates are inclusive/exclusive and children share the same local clock; they do not restart when their parent becomes visible.

Keep the chrome crop local to its group before the anchored transform. The final canvas crops off-frame content. CSS radius, SVG feather, outline alpha and shadow strings are not numerically interchangeable with Fusion softness or corner controls; compare them at native scale. No extra motion blur is specified for this camera. Do not add it across the discontinuous reset.

Checkpoints

Executable references

svgAssets pins each image-layer SVG referenced by defaults or adaptation from the hash-checked accepted asset ZIP; per-SVG verification must compare the whole referenced-asset map against these pins, not merely report current file hashes.

From the shared dual-toolkit root, with FIELDNOTES_PROJECT set to an already prepared project containing these recipe/SVG assets:

python3 handoff.py verify --guide guides/interface/atlas-composer-context-reveal/guide.json --project "$FIELDNOTES_PROJECT"
python3 handoff.py frames --guide guides/interface/atlas-composer-context-reveal/guide.json --project "$FIELDNOTES_PROJECT" > atlas-composer-context-reveal-controls.csv

The CSV contains raw local implementation controls and ancestor-aware activity, not world coordinates, glyph shapes, gradients, decoded PTS or a Resolve render. fusionNodes gives the complete ordered hierarchy; tracks binds each numeric control to a recipe JSON pointer and a semantic operation. Static path/paint/font properties remain at each node's recipe pointer; discreteEvents covers gates and text reveal steps. This is an operational map, not a Resolve API schema.

From an already provisioned writable toolkit project/, these archived CLI forms are useful for a later authorized render; no such render ran here:

npm --silent run catalog -- show atlas-composer-context-reveal --contract
npm run render -- --recipe atlas-composer-context-reveal --variant default --out out/composer-original-v01.mp4
npm run render -- --recipe atlas-composer-context-reveal --variant adaptation --out out/composer-adaptation-v01.mp4
npm run verify -- --out out/composer-original-v01.mp4
npm run verify -- --out out/composer-adaptation-v01.mp4

Use the full Content object in examples/atlas-composer-context-reveal/default.json for custom inputs; --content inputs/composer/content.json replaces --variant. Keep assets public-relative, retain rights declarations, and choose new filenames. The project needs its pinned dependencies, Node22.18+, FFmpeg/FFprobe, bundled Geist and an existing Chromium. REMOTION_BROWSER_EXECUTABLE selects a local browser; no download/install is part of this guide-authoring pass. The retained project projection lacks public SVGs: the original files are in the named asset ZIP. A recipe-only projection is insufficient for handoff.py verify.

Source versus adaptation and remaining limits