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
- Source: Introducing ChatGPT Pulse, frames [300,535) at 60/1 fps, 1920 × 1080. Local frames are 0–234, duration 235 frames.
guide.jsonpins the complete source, recipe hash, core archive and selected SVG pack.recipePathis relative to toolkitproject/. Other artifact paths are relative tovideos/editing/benchmark/library/.- This authoring pass inspected retained
review03/consecutive-12.jpg(source/original/adaptation locals 94–99), and the hash-verified source/original native PNG pair at 124. It did not play the moving source or inspect every extracted PNG. Other checkpoints are code checks or inherited review findings, explicitly not fresh measurements.
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.