# Resolve construction: one exact double-underline treatment

## Status and timing

This is a specific Fusion construction guide for the unchanged review02 recipe.
Native Resolve has not run here. The Remotion replays and 36 isolated layer
plates have run; that does not validate Fusion's pixel rendering. No `.drp` or
native-pass claim is supplied. Use Resolve's installed reference manual for the
local version's node labels; no version-specific menu behavior is attested here.

Set a 1920×1080, square-pixel, progressive, **30 fps** timeline before creating a
60-frame Fusion Composition. The first frame is local **L0**, final visible frame
**L59**, exclusive end **L60**. A composition starting at timeline frame `T` uses
`T+L` for every key. Do not use 29.97 fps, Optical Flow, Speed Warp, added holds,
frame blending or motion blur. Add no audio. Render exactly two seconds.

Source indices are **S153–S212**. Nominal source seconds equal `(153+L)/30`.
Actual source-master PTS are only inherited from the retained comparison ledger;
the guide does not replace them with nominal values. Read `source-clock.json`
for all 60 inherited starts and independently measured excerpt/replay clocks.

## Prepare the editable material

Run the preparation in `README.md` using full Chrome and the original dependency
versions. Import `resolve-prepared/original/` or `adaptation/` as individual still
images, not an automatically detected numbered sequence. Use each PNG's full
image rectangle, including transparent padding. Do not trim to its visible ink.

Each variant contains:

| Plate | Dimensions | Meaning |
| --- | --- | --- |
| `diagonal-field.png` | 2160×1200 | Original drifting field striations |
| `upper-material.png` | 640×700 | Separate folded upper material |
| `lower-material.png` | 640×700 | Separate lower folded material |
| `right-material.png` | 640×700 | Separate right-edge curl |
| `drafting-marks.png` | 1920×1080 | Original corner marks, alpha not reduced |
| `lead-f02.png`, `lead-f04.png` | 586×140 | First word / complete lead |
| `keyword-f06.png`, `keyword-f08.png` … `keyword-f14.png` | 555×140 | Eight character states; no `f07` plate |
| `upper-emphasis.png` | 550×34 | Whole unmasked first filled path |
| `lower-emphasis.png` | 550×34 | Whole unmasked opposing return |
| `emphasis-overdraw.png` | 550×34 | Whole unmasked loop/retrace |

The SVG source plates remain in `project/public/art/…` and `controls/*.svg`.
Raster preparation avoids assuming Resolve supports every SVG filter or gradient.
Typography remains the browser's real retained TextLayer; it is not replaced
with a differently shaped Text+ font or an SVG `<text>` implementation.

PNG RGBA is straight/unassociated alpha. Interpret it as straight on import and
premultiply once for compositing. Do not apply alpha twice. Inspect a prepared
white stroke over black, gray and cyan for halos before building the sequence.
The original SVG's internal translucency remains; the layer opacity below is
additional. Use Normal/Over, not Add or Screen.

Work in an explicitly documented SDR color configuration. The browser's CSS/PNG
colors are display-referred sRGB-like values; the replay encode is tagged bt709.
Do not silently use an ACES/HDR transform, tone map or LUT. Matching tags alone
does not guarantee numerical matching. Record input/output gamma, alpha mode,
filtering and data levels with the native render and compare all 60 frames.

## Graph and occlusion: back to front

Create an opaque 1920×1080 Background: original `#57c8ee`, adaptation `#65cbd9`.
Merge the following independent branches over it, in exactly this order:

1. `diagonal-field`, opacity 1.
2. `upper-material`, opacity .96.
3. `lower-material`, opacity .96.
4. `right-material`, opacity 1.
5. `drafting-marks`, opacity .23.
6. The title: lead, keyword, first emphasis, opposing return, irregular retrace.

The title order is itself back-to-front. The return never erases the first sweep;
the retrace does not replace either previous path. Keep every completed stroke
through L59. A mask belongs to its own stroke before that branch is merged.
Do not connect it to the entire accumulated background/title merge, which would
clip earlier strokes and turn the treatment into a sequential replacement.

The material leaves the frame at its edges through the **composition boundary**.
Do not add a title-shaped mask, remove the corner overlap, or crop each material
to its visible alpha bounds. Drafting marks pass over material but under type.
All five background branches remain independent of the title's late scale.

## Pixel coordinates and frame tables

`controls/original.csv` and `adaptation.csv` each contain **660 rows**: six root
nodes (including the title group), five title children, at every L0–L59.
`original.json`/`adaptation.json` preserve the same hierarchy and per-frame paper.
Every row has visibility, local x/y, dimensions, pivot, scale, rotation, opacity,
four clip insets, visible text, mask parameters and destination corners.
Inactive rows still have geometry; use `active=false` to hide them.

CSS x/y are top-left coordinates, positive y downward. A node applies:

```text
point1 = (x,y) + origin + Rclockwise(angle) × diag(scale×scaleX, scale×scaleY)
                                      × (point0 - origin)
```

Apply the title parent transform **after** a child transform. The parent pivot
is (960,550), not canvas center (960,540). No material branch inherits it.
`quadTLX/Y`, `quadTRX/Y`, `quadBLX/Y`, `quadBRX/Y` already include this parent
transform and the image's contain-fit padding. They are Fusion-style normalized
destination points `(pixelX/1920, 1-pixelY/1080)`, with y upward. Do not invert
y again. Negative or greater-than-one corners are intentional off-frame coverage.

The right ribbon is a subtle case: its CSS box is 760×831 but its SVG is 640×700.
Contain-fit yields 759.771428571…×831, centered with 0.114285714… px horizontal
padding before rotation. Do not stretch it to 760×831 or round the padding away.
The lower CSS box is 1000×1093.75; do not round its height to a pixel.

### Explicit corner-placement route

This route avoids relying on different nodes' image-size-dependent Center/Pivot
defaults. Keep all ten leaf branches separate.

1. Load the complete prepared still. Apply its local reveal mask, if any, to
   multiply RGBA before positioning. Use a transparent Background plus a masked
   Merge, not a mask on an identity Transform (which may only mask the effect).
2. Resize that plate's entire rectangle to a 1920×1080 intermediate canvas with
   aspect lock **off**. This is a coordinate-normalization intermediate, not the
   final image shape. Its four edges now occupy the full unit square.
3. Feed it to a **Corner Positioner**. At each integer frame enter the four
   `quad*` point pairs for that leaf. Map Top Left to TL, Top Right to TR, Bottom
   Left to BL, Bottom Right to BR. Keep perspective-free affine parallelograms;
   do not use an automatic tracking solve.
4. Merge that branch over the preceding branch at Center (.5,.5), Size 1,
   Angle 0, Normal/Over. Blend is the row's opacity when active, otherwise zero.
   Do not add another title-group scale: these corners already include it.

This two-resample route can soften thin edges compared with Chromium. It is a
precise geometry/control recipe, **not a demonstrated pixel-identical Resolve
implementation**. A workstation may replace it with a one-resample affine
placement only if the resulting corner coordinates, mask order and complete
all-frame comparison agree. Keep any difference as a measured limitation, not
a waived score. Do not call prepared PNGs proof of this native graph.

For direct transform construction instead, use the local x/y/pivot/scale rows,
preserve the title group, and apply its scale once at the end. Do not mix those
local controls with the already-parented `quad*` coordinates.

Set a key on **every integer frame** for corner points and opacity; use linear
interpolation between sampled keys and disable motion blur. This reproduces the
specified sampled values without depending on Fusion's smooth-tangent defaults.
For text switches use step/hold keys, with only one word/character-state plate
visible at once. No crossfades.

## Background controls

All x/y/angle tracks in this table interpolate linearly between the listed keys
and hold beyond their last key. Image sizes and pivots are in CSS pixels before
the corner conversion. The CSV contains each intervening sample.

| Layer | x keys | y keys | Box / pivot | Clockwise angle |
| --- | --- | --- | --- | --- |
| diagonal-field | L0 −140 → L59 −58 | L0 −65 → L59 −101 | 2160×1200 / (0,0) | 0 |
| upper-material | L0 −74, L30 −83, L59 −96 | L0 −145, L30 −151, L59 −160 | 800×875 / (400,437.5) | L0 −8° → L59 1° |
| lower-material | L0 −122, L30 −105, L59 −89 | L0 614 → L59 638 | 1000×1093.75 / (500,546.875) | L0 −9° → L59 −2° |
| right-material | L0 1440, L30 1418, L59 1398 | L0 447 → L59 426 | 760×831 / (320,350) | L0 6° → L59 0° |
| drafting-marks | L0 0 → L59 17 | L0 0 → L59 12 | 1920×1080 / (0,0) | 0 |

Do not stop these tracks at L24 when the retrace completes. They change across
every adjacent pair through L59. A frozen card with moving text is incorrect.

## Text switches and late scale

Lead box: (404,475), 586×140. Keyword: (990,475), 555×140. Preserve the plate
canvas, baseline, line height and left alignment. Use supplied native text plates
if the installed variable-font shaping is uncertain. No font substitution.

| Local frames | Lead state | Keyword state |
| --- | --- | --- |
| 0–1 | hidden | hidden |
| 2–3 | `lead-f02` | hidden |
| 4–5 | `lead-f04` | hidden |
| 6–7 | `lead-f04` | `keyword-f06`: one character |
| 8–13 | `lead-f04` | `keyword-f08` … `keyword-f13`: 2–7 characters |
| 14–59 | `lead-f04` | `keyword-f14`: complete eight-character word |

The title group is scale 1 at L0 and L46, 1.01 at L52, 1.024 at L57,
1.034 at L59. Each segment uses `u²(3−2u)` on its normalized progress, not a
generic ease-in/out preset. For example L49 = 1.005. The CSV and quad values
already sample that function exactly. Do not enlarge the background with it.

## Emphasis masks and overlap

All three path plates are 550×34, y=590, origin=(0,0), opaque `$ink` fill,
no added border or line stroke. Their shape is the supplied filled SVG path,
not a thin constant-width polyline. No path-Length/Write On approximation.

| Layer | First frame | x | Horizontal scale | Visible local x interval |
| --- | --- | --- | --- | --- |
| upper-emphasis | L13 | 1007,1009,1011,1011,1013 at L13–17; then hold | .776 | [0,550−R] |
| lower-emphasis | L18 | 1014 | .776 | [Left,550] |
| emphasis-overdraw | L20 | 974 | .87 | [0,550−R] |

| L | Upper right inset R | Return left inset | Retrace right inset R |
| --- | --- | --- | --- |
| 13 | 389 | hidden | hidden |
| 14 | 333 | hidden | hidden |
| 15 | 261 | hidden | hidden |
| 16 | 161 | hidden | hidden |
| 17 | 0 | hidden | hidden |
| 18 | 0 | 301 | hidden |
| 19 | 0 | 0 | hidden |
| 20 | 0 | 0 | 390 |
| 21 | 0 | 0 | 259 |
| 22 | 0 | 0 | 167 |
| 23 | 0 | 0 | 103 |
| 24–59 | 0 | 0 | 49 |

For a Rectangle mask before positioning: solid, no border, corner radius 0,
soft edge 0. Use the CSV's `fusionMaskCenterX/Y`, `fusionMaskWidth/Height`.
They normalize in the **plate** coordinate system, not the full-frame final
coordinates. Mask full height; top/bottom insets are zero. Examples:

```text
upper L13: visible [0,161]; CenterX=161/1100, Width=161/550
return L18: visible [301,550]; CenterX=851/1100, Width=249/550
retrace L24: visible [0,501]; CenterX=501/1100, Width=501/550
all: CenterY=.5, Height=1
```

Do not animate the retrace's remaining 49 px inset to zero. The first stroke's
path itself does not fill its whole 550 px viewport, so mask width is not ink
length. The filled path taper, tight return and left-loop retrace must overlap.
At L13 underline and the seven-letter keyword coexist; at L14 the word completes
while the first path is still growing. At L18 and L20 each additional path is
added over the existing ones. From L24 onward all three remain.

## Native workstation acceptance: still outstanding

1. Confirm every imported plate size and RGBA interpretation against the actual
   preparation manifest; keep reference source footage in a separate bin.
2. Solo each branch at L0,13,18,20,24,46,59 to verify corners and masks. Check
   the lower fractional box and the right contain-fit padding.
3. Export both 60-frame 1920×1080 30 fps silent sequences. Verify all integer
   PTS/durations and no audio stream; do not compare file duration alone.
4. Compare every frame with its Remotion counterpart. Retain masks, residuals,
   maximum/mean errors and alpha/color/filter settings. The Remotion replay
   floor is zero error against retained review02, not permission to relax a
   Resolve threshold after seeing its output. No Resolve threshold/pass exists
   yet; agree it before adjudication and preserve disagreements.
5. Inspect continuous playback independently at source cadence. Verify the
   overlapping gesture and background travel, not merely start/end stills.

The guide ends at a documented native-execution limit. Neither its controls nor
the successful Remotion preparation promote this lane to a Resolve pass, a
moving-quality win, a new mechanism, or publication approval.
