OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

A payment action becomes a receipt

Concrete original SVG/code kit; mechanically testable, unrendered by this builder. Parent renders and independent source-first critique are separate. Source quality remains unresolved; no completed-example or variant-as-example credit.

Source and adaptation

Exact source: Buy it in ChatGPT: Instant Checkout and the Agentic Commerce Protocol, publication date 2025-09-29; source frames [1080,1560), 60/1 fps, 480 frames, 1920x1080 design canvas.

Publication metadata, source-master hash and source frame mapping are inherited from the pinned queue, not a new online metadata or master verification. The retained source excerpt is research only; it is not an active dependency or part of the overlay.

Largest known gap: Original vector planter/notebook products replace the source photograph; materiality and exact drifting light field differ. Chosen spinner, ripple and receipt text cadence need parent output review; no rendered readability or native Resolve calibration is established.

480 consecutive retained excerpt frames decoded and statically viewed in 20 indexed sheets at480x270 per cell; 9 selected frames viewed at960x540. This is not moving review or master-resolution inspection.

Source observations

Intentional differences

Run from the download

Start in a fresh extracted kit root with exactly these runtime files:

guide.json
README.md
handoff.py
controls.csv
overlay-manifest.json
core-publication-v08.zip
active-assets.zip

Use Python3.11+, Node22.18+, npm, unzip, FFmpeg/FFprobe and an existing supported Chromium. The core pins Remotion4.0.520 and the runtime lockfile. Set REMOTION_BROWSER_EXECUTABLE to your local Chromium if discovery fails. No private checkout, preparation script, authoring generator or inspection archive is required.

The core and active overlay both contain project/... members. Apply the selected overlay AFTER the core. The legacy assets-001.zip archives are not this kit; do not install them. The core font and its license remain required even though all active image/video media is SVG/code.

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,json,pathlib; manifest=json.loads(pathlib.Path('overlay-manifest.json').read_text()); assert hashlib.sha256(pathlib.Path('active-assets.zip').read_bytes()).hexdigest() == manifest['archiveSha256'], '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
(cd project && npm ci)

Run the exact archived CLIs from project/. These are user-run commands, not a claim that the author rendered. No --fps, --duration or --output option is supported; cadence and duration come from the recipe.

cd project
node --experimental-strip-types scripts/catalog.mjs show payment-state-sequence --contract
node --experimental-strip-types scripts/render.mjs --help
node --experimental-strip-types scripts/verify.mjs --help
node --experimental-strip-types scripts/render.mjs --recipe payment-state-sequence --variant default --out out/payment-state-sequence-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe payment-state-sequence --variant adaptation --out out/payment-state-sequence-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/payment-state-sequence-default.mp4
node --experimental-strip-types scripts/verify.mjs out/payment-state-sequence-adaptation.mp4
cd ..

Keep each output manifest next to its movie. The CLI refuses to overwrite an output or sibling manifest. Verification is provenance/technical checking, not source-fidelity approval. New editorial holds would change the requested bounded example and are not part of this kit.

Edit the complete Content object

Create the file from the installed recipe, never from a stale example or a partial object. This refuses to overwrite an existing custom file:

cd project
node --input-type=module -e "import {readFileSync,mkdirSync,writeFileSync} from 'node:fs'; const recipe=JSON.parse(readFileSync('recipes/payment-state-sequence.json','utf8')); mkdirSync('inputs',{recursive:true}); writeFileSync('inputs/payment-state-sequence-custom.json',JSON.stringify(recipe.defaults,null,2)+'\n',{flag:'wx'});"
cd ..

Edit project/inputs/payment-state-sequence-custom.json, respecting every field and the limits in guide.json. Both variants are original illustrative content, not real product behavior. For image slots, keep the declared viewBox/aspect and SVG-only dependency rules. Then:

cd project
node --experimental-strip-types scripts/render.mjs --recipe payment-state-sequence --content inputs/payment-state-sequence-custom.json --out out/payment-state-sequence-custom.mp4
cd ..

Construction steps

  1. Start in the downloaded kit root. Verify core-publication-v08.zip and active-assets.zip against the pinned SHA-256 values, then unpack core first and the selected active overlay second with overwrite enabled. Both have project/... member paths. No legacy assets archive, inspection image or private preparation file is needed.
  2. Run unchanged handoff.py verify and frames from the kit root before editing. This checks the recipe and both SVG variants and exports native-frame numerical controls, not visual quality. The complete editable recipe is installed at project/recipes/.json.
  3. In Fusion create a1920x1080 square-pixel composition at60fps with inclusive range0..479. Global local frame0 maps to the source start specified in guide.json. Do not add handles, transition frames, retiming or an ending hold.
  4. Build every group as a transparent local RGBA domain, merge children in listed order, intersect local clipping masks, then transform and apply group alpha once before Over compositing into the parent. Every child key uses the same global frame f; layer start is a gate, not a new clock.
  5. Rebuild the original SVGs from svgConstruction: all element attributes, paths, viewBoxes, gradient stops and alpha are preserved. Use native filled Polygon/Bezier/Ellipse subgroups, not a rasterized interface or source photo. Original source imagery is research only.
  6. Use the core Geist font and the stated pixel boxes, weight, lineHeight and explicit newlines. No auto-shrink or line wrapping is supported. Text+ Size/baseline and native blur need application calibration; nothing here claims a tested .comp/.drp or pixel-equivalent native result.
  7. Select one complete content object. Default depicts a fern planter from fictional Mossworks:48.00 subtotal+4.00 delivery+0.00 tax=52.00 demo total. Adaptation depicts a notebook/pencil kit from fictional Paperwell:32.00+4.00+0.00=36.00. Merchant, productShort, productTitle, productArt, receiptValues and confirmation must change together. No card number, address, delivery promise or live payment exists.
  8. Place context-field behind every state,2048x1152. Its x moves-64→-24 and y-36→-12 over0..479 using smoothstep. The SVG has one linear base and three transparent radial ellipse layers. This chosen material drifts even during apparent UI holds; it is not the source optical field.
  9. Create detail-rim=(550,-32,820,1200), alpha.36, and detail-clip=(574,-32,772,1180), white fill, overflow hidden, gate[0,133). Build product-hero at(0,0,772,515) from productArt, title at(30,548), option controls at690, merchant/price at844/880 and Buy at(654,864,88,64). Keep the entire detail group vertically cropped by the canvas; do not resize it to fit.
  10. Draw detail-dim over the product but below checkout-drawer, gate[32,133), black alpha0 at32→.18 at43 linearly. The drawer is its own white772x1180 child: x772 at36→0 at76 smoothstep; y0 through92→-48 at132 smoothstep. It enters under the fixed detail clip. Do not animate product geometry together with the drawer.
  11. Inside checkout-drawer use the SAME productArt at(30,42,240,160), title at(306,42), quantity plate at(306,164,210,68), and three rows with tops290/410/530. Each row has its exact path icon, primary label and muted secondary label. Summary columns begin684; demo total begins830; black action box=(30,936,712,94), radius47. All exact label/line limits and icons are enumerated in fusionNodes.
  12. At133 switch the whole detail branch off and action-pill on. This is a stepped branch switch, not a dissolve or a zoom. action-pill=(526,y,868,224), radius112, dark fill, local origin(434,112); y436 at133→432 at145 smoothstep. Keep child alpha inside the rounded clipping mask.
  13. Hold the pay label through175. The whole pill scale is1 through172, .985 at175,1 at180 with smoothstep segments; origin is its original center. At176 switch to working-spinner and working-label. Working-label opacity.12 at176→1 at188 linearly. Do not interpolate the label strings or crossfade both labels together.
  14. working-spinner uses its original80x80 SVG at(170,72), origin(40,40); rotation0 degrees at176→1290 at262 linearly, i.e.15 degrees/native frame. The eight spokes have fixed descending opacities1,.9,...,.3. For Fusion rebuild on a local80x80 transparent square, rotate around its center using Angle=-rotation, then place in the pill; do not rotate a full-canvas image about the default canvas pivot.
  15. From244 to261 narrow the pill width868→188 and move x526→866 with smoothstep, preserving center960. The label and spinner retain their fixed local dimensions and are cropped by the shrinking rounded alpha mask. This is NOT scaling the type down or keying its font size. The branch ends at262 before its last rotation key is rendered.
  16. At262 hard-switch to success-rim=(534,0,852,1120), alpha.34, and success-column=(566,0,788,1120), white. The merchant stays at(56,12), centered. Column y holds0 through328 and reaches-32 at343 smoothstep. The isolated pay branch must be absent.
  17. Create the black64px dot at(362,508), centered origin(32,32), scale.22 at262→1 at270; gate[262,280). Black ring is164px at(312,458),14px inside stroke, scale.65 at266→1 at271, gate[266,272). These are separate local layers, not a recolored shared circle.
  18. Green ripple is176px at(306,452),9px inside stroke,#32b94b, gate[272,290), center pivot, scale.92→1.5 over272..289 smoothstep and alpha1→0 linearly. Green disc is188px at(300,446),#2abd46, gate[280,344), scale.30 at280→1 at290 smoothstep. Apply each alpha before Over, no Screen blend or dark matte.
  19. For success-check use the exact path M12 34 L26 48 L54 14 in viewBox0 0 64 64, box(346,492,96,96), white stroke7 viewBox units, unfilled, default SVG butt caps and miter joins. Gate[284,344), dashArray80 and dashOffset80 at284→0 at294 linearly. Fusion fallback trims the same64-unit path by arc length, not a rectangular left-to-right wipe. The two segment lengths are sqrt(392) and sqrt(1940); visible path length is clamp(80-dashOffset,0,totalLength). Hold the completed check through343.
  20. At344 hard-switch success off and receipt-phone on. Phone x742,width436,height882,radius70, overflow hidden. Its y is116 at344→108 at375, holds through400, then96 at479, smoothstep on moving segments. The separate translucent rim is16px larger on every side, x726,width468,height914,radius86,alpha.52, y exactly phoneY-16. Do not retain a floating success check over the receipt.
  21. Build receipt-phone children in the listed order: time/signal/app header; receipt plate(28,126,380,390); state dot/label; SAME productArt at(46,190,136,91); productShort at(198,190); quantity/merchant/total columns at322; details button at452. Receipt plate exists fully at344; the product is not replaced by another icon.
  22. Keep confirmation at(30,548,378,112),18px Geist, lineHeight1.45, explicit four lines. Gate[376,480). Character-prefix steps are0 at376,22 at383,48 at394,80 at405,112 at417,180 at430; slices beyond actual text length simply show the complete string. Bake held StyledText prefixes if Text+ Write On counts differently. Small action symbols start435; composer and home bar already exist from344.
  23. Check cuts133/262/344 on both sides, working onset176, width clip244..261, distinct ring/disc/check stages, receipt identity and late streamed copy. Final479 stays on the phone. Treat these chosen controls as an editable source-informed fixture, never measured checkout latency or a successful transaction.

Fusion hierarchy and controls

This is an application-unverified construction map, not a .comp or .drp import. No native Resolve output exists from this worker. The full controls, exact paths, materials and text are in guide.json; the per-frame numeric sampler is controls.csv.

Use Background_Canvas -> the ordered root Merge chain -> MediaOut1. Build every group on transparent RGBA before its parent transform. A group fill is behind all of its children. Each row identifies the exact recipe node, parent, half-open local gate and local pixel box. Do not flatten the whole interface into an image.

Layer / tool Parent Local gate x; y; width; height
context-field / image Canvas [0,480) 0:-64 smooth; 479:-24 hold; 0:-36 smooth; 479:-12 hold; 2048; 1152
detail-rim / rect Canvas [0,133) 550; -32; 820; 1200
detail-clip / group Canvas [0,133) 574; -32; 772; 1180
product-hero / image detail-clip [0,133) 0; 0; 772; 515
product-title / text detail-clip [0,133) 30; 548; 714; 58
option-label / text detail-clip [0,133) 30; 636; 710; 42
option-border / rect detail-clip [0,133) 30; 690; 712; 90
option-value / text detail-clip [0,133) 62; 712; 620; 44
option-chevron / path detail-clip [0,133) 676; 714; 32; 32
product-merchant / text detail-clip [0,133) 30; 844; 420; 48
product-note / text detail-clip [0,133) 30; 892; 470; 42
product-price / text detail-clip [0,133) 502; 880; 142; 46
buy-button / rect detail-clip [0,133) 654; 864; 88; 64
buy-label / text detail-clip [0,133) 661; 883; 74; 32
checkout-hint / text detail-clip [0,133) 30; 956; 710; 42
detail-dim / rect detail-clip [32,133) 0; 0; 772; 1180
checkout-drawer / group detail-clip [36,133) 36:772 smooth; 76:0 hold; 36:0 hold; 92:0 smooth; 132:-48 hold; 772; 1180
checkout-thumb / image checkout-drawer [36,133) 30; 42; 240; 160
checkout-title / text checkout-drawer [36,133) 306; 42; 422; 104
quantity-plate / rect checkout-drawer [36,133) 306; 164; 210; 68
quantity-value / text checkout-drawer [36,133) 322; 181; 176; 40
checkout-rule-0 / rect checkout-drawer [36,133) 30; 268; 712; 2
checkout-icon-0 / path checkout-drawer [36,133) 40; 299; 48; 48
checkout-row-0 / text checkout-drawer [36,133) 116; 290; 570; 42
checkout-subrow-0 / text checkout-drawer [36,133) 116; 336; 570; 36
checkout-rule-1 / rect checkout-drawer [36,133) 30; 388; 712; 2
checkout-icon-1 / path checkout-drawer [36,133) 40; 419; 48; 48
checkout-row-1 / text checkout-drawer [36,133) 116; 410; 570; 42
checkout-subrow-1 / text checkout-drawer [36,133) 116; 456; 570; 36
checkout-rule-2 / rect checkout-drawer [36,133) 30; 508; 712; 2
checkout-icon-2 / path checkout-drawer [36,133) 40; 539; 48; 48
checkout-row-2 / text checkout-drawer [36,133) 116; 530; 570; 42
checkout-subrow-2 / text checkout-drawer [36,133) 116; 576; 570; 36
checkout-summary-labels / text checkout-drawer [36,133) 30; 684; 370; 112
checkout-summary-values / text checkout-drawer [36,133) 434; 684; 308; 112
checkout-total-label / text checkout-drawer [36,133) 30; 838; 410; 48
checkout-total / text checkout-drawer [36,133) 456; 830; 286; 58
checkout-pay-button / rect checkout-drawer [36,133) 30; 936; 712; 94
checkout-pay-label / text checkout-drawer [36,133) 58; 959; 656; 46
action-pill / group Canvas [133,262) 133:526 hold; 244:526 smooth; 261:866 hold; 133:436 smooth; 145:432 hold; 133:868 hold; 244:868 smooth; 261:188 hold; 224
pay-label / text action-pill [133,176) 28; 61; 812; 98
working-spinner / image action-pill [176,262) 170; 72; 80; 80
working-label / text action-pill [176,262) 290; 61; 540; 100
success-rim / rect Canvas [262,344) 534; 0; 852; 1120
success-column / group Canvas [262,344) 566; 262:0 hold; 328:0 smooth; 343:-32 hold; 788; 1120
success-merchant / text success-column [262,344) 56; 12; 676; 54
success-dot / ellipse success-column [262,280) 362; 508; 64; 64
success-black-ring / ellipse success-column [266,272) 312; 458; 164; 164
success-green-ripple / ellipse success-column [272,290) 306; 452; 176; 176
success-disc / ellipse success-column [280,344) 300; 446; 188; 188
success-check / path success-column [284,344) 346; 492; 96; 96
phone-rim / rect Canvas [344,480) 726; 344:100 smooth; 375:92 hold; 400:92 smooth; 479:80 hold; 468; 914
receipt-phone / group Canvas [344,480) 742; 344:116 smooth; 375:108 hold; 400:108 smooth; 479:96 hold; 436; 882
phone-time / text receipt-phone [344,480) 48; 32; 110; 30
phone-signal / rect receipt-phone [344,480) 344; 36; 40; 10
phone-menu / path receipt-phone [344,480) 32; 74; 27; 27
phone-app / text receipt-phone [344,480) 76; 70; 278; 35
receipt-plate / rect receipt-phone [344,480) 28; 126; 380; 390
receipt-state-dot / ellipse receipt-phone [344,480) 46; 146; 15; 15
receipt-state / text receipt-phone [344,480) 69; 142; 310; 30
receipt-thumb / image receipt-phone [344,480) 46; 190; 136; 91
receipt-product / text receipt-phone [344,480) 198; 190; 178; 86
receipt-labels / text receipt-phone [344,480) 46; 322; 164; 99
receipt-values / text receipt-phone [344,480) 214; 322; 174; 99
receipt-details-button / rect receipt-phone [344,480) 46; 452; 342; 42
receipt-details / text receipt-phone [344,480) 58; 461; 318; 26
receipt-confirmation / text receipt-phone [376,480) 30; 548; 378; 112
receipt-actions / path receipt-phone [435,480) 34; 668; 120; 36
phone-composer / rect receipt-phone [344,480) 30; 774; 378; 46
phone-composer-label / text receipt-phone [344,480) 57; 786; 314; 26
phone-home-bar / rect receipt-phone [344,480) 144; 846; 148; 5

Coordinates, easing and alpha

Editable SVG materials

Every SVG is generated from scratch by generate_assets.py. That optional source file can reproduce assets byte-for-byte when supplied; it is not a runtime prerequisite. The active archive already contains the required SVGs. No tracing, bitmap conversion, source master, remote resource, SVG image node or embedded font is present.

Rebuild each SVG as a vector subgroup using svgConstruction in guide.json: all viewBoxes, element attributes, paths, gradient coordinates, stop colors and opacities are explicit. Resolve SVG imports may lose paint/gradient semantics; do not assume a successful import is equivalent. Native Background/Polygon/Ellipse material layers are the fallback, not a screenshot export.

Active SVG path under project/public SHA-256
art/payment-state-sequence/field-adaptation.svg f65c221328d5f64ba5d276fb8b5da125144098a469a1b84ac5dc2ac3ed55e936
art/payment-state-sequence/field-default.svg 3fe3f674a2d468aa23f15adccc5ebf62f93f1e673891bebf4ba1464e600bb1ba
art/payment-state-sequence/product-adaptation.svg 14f928f2146028316607a36ff04dfbcbf496e2cc73c9decb7b5ef3e87d2c24f5
art/payment-state-sequence/product-default.svg 5a4dd7c17b5c8d9679e63f758897809aa9137fea23a55ef9fd507194f480c5a1
art/payment-state-sequence/spinner-adaptation.svg 63f1e00e21cbdb5c5c52d4a7857d30f8d710cd5811a06dc1178cb0a877aa2ae9
art/payment-state-sequence/spinner-default.svg 63f1e00e21cbdb5c5c52d4a7857d30f8d710cd5811a06dc1178cb0a877aa2ae9

Checkpoints and regression gates

Local / source frame Expected implementation state
0 / 1080 Cropped original product detail; no drawer or receipt.
31 / 1111 Product-only branch before dim.
32 / 1112 Dim branch starts at zero alpha; no hard cut.
36 / 1116 Checkout drawer starts at localx772, fully clipped at the right.
60 / 1140 Drawer enters over dim product; thumb uses the same productArt.
76 / 1156 Drawerx0; its contents and pay action are populated.
120 / 1200 Checkout content has moved upward; its own y track is not frozen.
132 / 1212 Last detail/drawer frame; drawery-48.
133 / 1213 Hard cut to isolated pay pill; product/detail absent.
150 / 1230 Pill settled aty432, full868px width.
175 / 1255 Last pay label, scale.985; no working text yet.
176 / 1256 Working label and spinner replace pay text; label alpha.12.
210 / 1290 Spinner rotated510 degrees; fixed-size working label remains.
244 / 1324 Pill begins width clipping from868px, not text scaling.
261 / 1341 Last working frame: width188,x866, clipped children.
262 / 1342 Hard cut to white success column; small black dot only.
270 / 1350 Black dot and black ring visible as separate layers.
272 / 1352 Black ring absent; green ripple begins.
280 / 1360 Dot absent; green disc starts under the fading ripple.
284 / 1364 Check branch starts with dashOffset80, initially hidden.
294 / 1374 Complete check path, green disc at full size; ripple absent.
300 / 1380 Completed success state; no receipt yet.
343 / 1423 Last success-column frame; y-32.
344 / 1424 Hard cut to full receipt phone with the same product and totals.
360 / 1440 Populated receipt; confirmation paragraph not yet active.
376 / 1456 Confirmation branch begins with zero visible characters.
400 / 1480 Confirmation is a partial prefix; no all-at-once final paragraph.
430 / 1510 Complete confirmation for both original variants.
479 / 1559 Final included phone frame at y96, receipt and confirmation retained.

The focused test_guide.py is an authoring regression suite, not a required download step. It checks exact recipe/source/SVG pins, archive whitelist, deterministic SVG generation, hierarchy and masks, native/quarter-frame sampler agreement, all handoff rows, half-open cuts, content rejection and actual archived CLI options without rendering.

A human still needs to review parent-rendered default and adaptation outputs at native cadence, compare the source and validate the Fusion reconstruction. A contact sheet is not moving review.

Limits

Historical inputs and source masters are provenance only. The downloadable run steps use only the listed kit files and installed tools. The source-only builder pass precedes any fresh critic findings; it does not accept its own visual quality.