Candidate construction guide · native Resolve not tested
Moving result pullback: code/SVG kit
An editable Remotion recipe and complete Resolve/Fusion construction handoff.
Bounded adaptation, not a source-fidelity repair or a tested Fusion import.
resolveApplicationVerified is false. This worker did not render during the
authoring checks. The parent subsequently reports ten batch outputs; their
kit-specific hashes and review status are not independently verified here.
The original photographic deformation and the archived paper-video motion are
not reproduced by the new six-blade vector rotor.
Run from the public download
Extract the downloaded kit into a new writable folder. That folder is the
kit root: it contains this README, guide.json, handoff.py, controls.csv,
core-publication-v08.zip and required active-assets.zip. No repository,
private worker, historical asset ZIP or separate authoring script is needed.
The active archive needs only the recipe and its active SVGs. Separate inputs/
JSONs and generator helpers are not required for either built-in variant.
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 active override
From the kit root:
unzip core-publication-v08.zip
unzip -l active-assets.zip
Core creates project/. Merge the active archive into that project after
core, allowing its selected recipe to replace the core's legacy video recipe.
Choose the extraction destination from the member paths printed above:
- Members beginning
project/: rununzip -o active-assets.zip -d .. - Members beginning
recipes/,public/orinputs/: rununzip -o active-assets.zip -d projectinstead.
Use only the matching command; do not create project/project/. The resulting
layout must include project/recipes/sora-moving-result-pullback.json,
project/public/art/sora-moving-result-pullback/vector-kit/ with 25 SVGs, and
project/inputs/defaults.json and project/inputs/adaptation.json. The active
recipe SHA-256 is
a16084d72b93944968dd62736d69b5029d0f567ac67001bb5cc8c40b655eaab0.
Core supplies project/public/fonts/Geist.ttf and its OFL license.
Do not fetch the old assets-001.zip or use core's old pullback examples or
toolkit-manifest as render inputs: they describe the archived video variant.
The supplied override replaces all active JPEG/PNG/MP4 references. No source
movie or decoded frame belongs in the project inputs.
2. Verify and prepare the Resolve handoff
Still from the kit root, before rendering or constructing the Fusion graph:
python3 handoff.py verify --guide guide.json --project project
python3 handoff.py frames --guide guide.json --project project > controls-regenerated.csv
Verification must pass against the unpacked recipe and SVG bytes. It does not
need npm or private provenance files. The supplied controls.csv and regenerated
CSV describe 148,500 data rows: 300 native frames × 495 numeric controls. Compare
them if checking the packaged export; do not overwrite the supplied evidence.
Values are local implementation controls with ancestor-aware activity, not
baked world-space positions or directly importable Resolve curves.
For a Fusion-only workflow, continue with Fusion construction and coordinates
below using guide.json, controls.csv, the unpacked recipe and its SVGs. No
Node installation is needed for this branch. The guide supplies the complete
hierarchy and per-property mappings; it is 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-moving-result-pullback --variant default --out out/sora-moving-result-pullback-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe sora-moving-result-pullback --variant adaptation --out out/sora-moving-result-pullback-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/sora-moving-result-pullback-default.mp4
node --experimental-strip-types scripts/verify.mjs out/sora-moving-result-pullback-adaptation.mp4
cd ..
The renderer refuses an existing output or adjacent manifest; choose fresh
--out names on reruns and use those names with verify.mjs. Retain each
generated .manifest.json. These are runnable instructions, not a claim that
this authoring pass executed an export or verified Fusion.
The default variant reads recipe defaults; adaptation reads recipe
adaptation. Both complete Content objects are embedded in the recipe. For
custom original content, copy one of those objects into your own JSON (create
project/inputs/ if needed) and replace --variant with
--content inputs/<name>.json; they are mutually exclusive. No builder script
is required. Loaded-font fit and output verification must pass for new content.
guide.recipePath is relative to this unpacked project/. Historical authoring
directories and source/review paths in the JSON are provenance, not extra
downloads or prerequisites. Use the kit-root commands here rather than the
repository-variable command examples retained in that metadata.
Source and active-input decision
- Film: How to blend videos with Sora. Source interval [4380,4680) at 60/1 fps, 73.000–78.000 seconds. Canvas 1920×1080, square pixels, local frames 0–299. No audio or extra holds.
- The supplied
core-publication-v08.ziphas SHA-256307fb6b927e35e6d73779652873d994f5c3e36cb7deba65f22fa64748057a0de. Its recipe member hashes to0aec372765f2bf1dc288204b162f77fb5abc6a0b6b94ab41852753e083176d4e. - The archived recipe is ineligible for code/SVG-only playback: its 41
image instances and one video layer reference 21 pointer PNGs, four thumbnail
JPEGs and two result MP4s across the two variants. All 27 distinct member
hashes were checked in the historical
downloads/assets/sora-moving-result-pullback/assets-001.zip. That archive is not shipped or required by this public kit. project/recipes/sora-moving-result-pullback.jsonis the active replacement. It has 115 layers, 495 numeric controls, 17 animated controls, and 25 SVG file inputs. The result itself is animated code geometry, not an SVG movie or a flattened image sequence. The 25 SVGs are four associated thumbnails and 21 one-frame pointer-only vector exposures, with nine paths each.- The source-checkout script
build_adaptation.pyauthored those SVGs from polygons and existing original pointer-path code, never pixels or photographic contours. It accepts only the pinned core ZIP; it does not read the source film, PNGs, JPEGs or MP4 inputs. New SVGs are not falsely attributed to the accepted archive. Their actual bytes are pinned inguide.jsonand were regenerated in the authoring tests. The public download supplies the editable assets, not this script.
The source checkout's historical provenance.json binds the accepted parent
manifest, core/member hashes,
original asset members, active recipe, every SVG, native source PNG members and
the source excerpt. It is an optional audit record, not required public-kit
content. Its accepted paths are relative to the historical library root;
authored paths describe the source checkout. source.localMedia is a historical research
reference, not a dependency to retrieve or restore. The full master is
absent: its recorded hash is not newly verified. The actual retained excerpt
and selected native archive members are verified.
What was inspected
Seven separate 1920×1080 native source stills were opened: local 28,29,126,127,140,219,299. Their archive and PNG member hashes were checked. The separate 960×540 source excerpt probes as 300 silent frames at 60/1. No contact sheet, moving-source playback, worker-authored export or Fusion execution is credited to these authoring checks. Later parent exports are separate evidence. The following are bounded still observations:
| Local | Source ordinal / nominal seconds | Viewed source state |
|---|---|---|
| 28 / 29 | 4408 / 73.466667; 4409 / 73.483333 | Button word disappears; faint busy arc replaces it; hand remains |
| 126 / 127 | 4506 / 75.100000; 4507 / 75.116667 | Last influence control versus first result/player state; hard change |
| 140 | 4520 / 75.333333 | Cropped photographic subject enters, blurred chrome; no claim of exact shutter |
| 219 | 4599 / 76.650000 | Wide player with visible toolbar and associated thumbnails |
| 299 | 4679 / 77.983333 | Hybrid butterfly/flower state, unlike L219, inside the wide app |
These observations do not establish a continuous motion review or measured camera easing. Exact numbers in the kit are implementation controls, not new measurements of OpenAI's authoring parameters.
Optional source-checkout audit
This section is for maintainers who already have the authoring checkout and accepted research library. None of these files or checks is a prerequisite for the public render or Resolve workflow. The public kit does not ship the private worker, source archives, audit helpers or original raster/video ZIP. Do not restore a deleted benchmark or retrieve source films to run the kit.
The source checkout's frozen r01 whitelist is overlay-manifest.json, SHA-256
2d02f2ba83020816fffd32f0e133725ee5772617ce263a513c5e4c46b2d2f1de:
28 files, 413,112 uncompressed bytes. This is the authoring subset record, not
the hash of the published active-assets.zip archive. Publication may wrap
those same members with a project/ path prefix; active recipe/SVG bytes must
still match guide.json.
In the source checkout, set REPO_KIT to the original
guides/sora/sora-moving-result-pullback/ directory and LIBRARY to the
retained accepted library root, then optionally run:
PYTHONDONTWRITEBYTECODE=1 python3 "$REPO_KIT/build_adaptation.py" \
--core "$LIBRARY/downloads/core-publication-v08.zip" --check
PYTHONDONTWRITEBYTECODE=1 python3 "$REPO_KIT/verify_kit.py" --library "$LIBRARY"
FIELDNOTES_LIBRARY="$LIBRARY" PYTHONDONTWRITEBYTECODE=1 python3 "$REPO_KIT/test_guide.py"
These check historical archive bindings and authoring reproducibility, not the
public download's install state. Use the standalone handoff.py commands in
the quick start to check the unpacked public recipe and assets.
Fusion construction and coordinates
Create a 300-frame Fusion composition at 60/1, 1920×1080, square pixels.
If composition start is F0, a local key L goes at F0+L; source ordinal is
4380+L, nominal film seconds (4380+L)/60. Gates are half-open: [127,300)
means first visible 127, last visible 299. Use stepped gate keys; do not shift a
child's keys by its own or its parent's start. Fractional group subframe samples
are unrelated to source ordinal or decoder timestamps.
The complete hierarchy is in guide.json, with 115 nodes, not just this outline:
Background_Canvas (#1d3541)
close editor / upper input contexts / control panel / influence geometry
two strips of seven thumbnails / action button / label-or-busy / held hand
outer-result-pullback [127,300), local 1860×1040
border / black field / header / subheader
continuous-moving-result, x275 y125 1296×729, CLIPPED
vector-design-domain, 1280×720, scale1.0125
field / ground shadow
vector-rotor, x640, animated y and rotation
six blade groups (face + crease), animated scaleY / hub
associated input pair / caption / track / progress / pause / duration
five tool icons + labels / six header actions / original mark / bottom pair
independent-cursor-exposure [127,300), ROOT 1920×1080
action arrow / 21 one-frame SVG exposures / settled arrow
MediaOut1
Each sibling array is a back-to-front Merge chain. Begin group children on a
transparent background, not the preceding root image; composite the children
before applying group alpha. Processed_<id> means vector/text content, local
mask, transformation and alpha. Labels in the JSON are construction identifiers,
not literal pasted .setting tools. Sanitize hyphens if naming Fusion tools;
keep the layer-ID mapping intact.
All recipe boxes use downward-positive top-left pixels. For a local point p,
translation t=(x,y), origin o (default 0,0), and
S=diag(scale*scaleX,scale*scaleY), the required 2D map is:
p_parent = t + o + R_clockwise(rotation) * S * (p - o)
Fusion normalized point in a chosen parent image W×H = (p_parent.x/W, 1-p_parent.y/H)
Compose that map through ancestors before normalizing at the destination
boundary. width/height define the unscaled source domain, not its final visible
size. origin is in local pixels, not fractions. Do not enter x/W,y/H as a
Fusion Center, or rotate about the default image center instead of the declared
origin. For an untransformed box, its center is (x+w/2,y+h/2); for a transformed
box apply the full formula to p=(w/2,h/2). A practical construction uses a
placement Transform followed by an origin/pivot Transform; if source plates are
padded, account for their padding offsets in both transforms. The output should
match the formula, regardless of the chosen node decomposition.
For an up-positive Fusion 2D angle use negative CSS rotation. Size X/Y targets
are scale*scaleX and scale*scaleY. Use independent axes, not an inferred
Aspect slider ratio. These are mathematical construction targets, not a tested
Resolve import. Check an asymmetric triangle's three corners before replicating
the transforms. Avoid automatic reference-size/domain changes after keying.
At L127, the result box's top-left in the output is (-1123.6,-978.9) and its displayed size 2721.6×1530.9. At L219 it is (312,140) and 1296×729. These numerical anchors catch double-parent transforms. Outer x/y/scale first reach (37,15,1) at 219, not 195; hold through 299. The source still alone does not prove that exact settle frame.
Keep overflow-visible content outside nominal group dimensions. The blades extend into negative Y; the rotor's nominal 1×1 box is only a transform anchor, not a crop. Preserve a padded transparent data window until the declared result clip or final canvas. Apply the result clip in its own domain, not to each blade independently.
Tracks, substitutions and checkpoints
- Preserve all 21 outer x/y/scale keys. Linear means linear; never auto-smooth the copied keys. The current parent has no exposure property: inherited nine-sample camera prose is historical, not an instruction to add blur.
- The inner native clock is
N=L-127. For N=0…172, rotor angle is-28+0.72*Ndegrees; Y is336+18*sin(N/37). Bladejhas static rotation60*jand Y scale0.72+0.23*sin(N/24+0.9*j). Values are stored, rounded to six decimals, at every native frame. At L299 angle is 95.84°, still advancing. - The rotor uses six original kite polygons, creases and a circular hub. Palette
fields
kineticBackground,kineticColor0..2drive code geometry. Four SVG thumbnails are generated from the same geometry/palettes at N=0 and 172. Change palettes and thumbnails together, never just one control strip. - Pointer exposure SVGs preserve original layer boxes and gates, but replace premultiplied raster fields with nine source-over vector samples over a centered .35-frame span. This changes brightness, coverage and contour. Do not label it an optical-shutter match. Retain the overlapping settled-arrow opacity ramp [139,149]; deleting it changes the handoff.
- Optional source-checkout regeneration uses palette/polygon parameters in
build_adaptation.py; that script is not needed or supplied for public-kit playback. Public assets and recipe geometry remain directly editable, but regenerated or edited recipe/assets invalidate existing guide hashes; reauthor the handoff and review them as new content. Do not merely changesvgAssetsto waive differences. Original media/source footage is prohibited. - Existing editable copy retains exact character/line/text-box constraints.
Product marks, film slogans or claims about generation latency are not supplied.
3sis a short illustrative label for a 173/60-second inner interval, not a measured result duration or an authorized retime.
Inspect all guide.json checkpoints, especially 28/29, 126/127, 128/148/149,
219/240 and 298/299. The last pair must show unchanged outer placement but
advancing inner geometry. Freeze, reset, a second cut, or restarting at a camera
key is a regression. Evaluate CSS gradients, inward rectangle borders versus
centered SVG strokes, rounded masks, SVG meet/image cover, text advances and
antialiasing against your actual render. Text+ Size is not a CSS-pixel
font size; do not invent a universal conversion or shrink failed copy.
Differences and outstanding gates
Inherited review remains changes-required, with OPEN
result-streak-contours and result-subject-deformation. The new vector kit
does not resolve either. It also departs from the archived paper sculpture's
shading and motion. The photo subject/deformation is the largest visual gap;
no amount of hash verification closes it. Native Resolve execution, SVG import
behavior, loaded-font fit, fresh exports and moving-source comparison remain
unverified. Source material is research only, never a permissible input.
Coordinate reference: Blackmagic's Fusion Tool Reference, Transform tools documents normalized Center storage. This guide targets those 2D image controls, not Fusion's distinct Shape/Matrix width-normalized coordinate convention.