# Read the diff, move closer, then open an anchored comment

**Draft manual construction guide. Moving-source fidelity and native Resolve
execution remain unverified.** Two original content variants form one example.

## Source and composition

Official film `0e-Brv-gS9Q`, selected native interval
[2218,2350),
24000/1001 fps. Use a silent 1920×1080 square-pixel
composition containing local frames 0–131. Exact duration:
132132/24000 seconds
(5.505500 s).
Source ordinal = 2218 + local frame. No frame-rate rounding,
extra opening pause, closing hold or narration belongs to this study.

The comparison is a retained, hash-bound 960×540 research excerpt. Preserved
native metadata and PTS ledgers bind its clock; the historical full master is
absent, so this is not a fresh full-master decode. Samples informed the build.
Intermediate paths and measured-looking coordinates below are authored
reconstruction controls, not official product timing, latency or design tokens.

## Setup and common coordinate rules

Verify the unmodified kit with `python3 verify_package.py`, then follow
`project/README.md`. Choose either input JSON content set. Install the bundled
licensed Geist font for Text+, and calibrate pixels, weight, tracking and
baselines against the supplied MP4; a font name alone does not guarantee parity.

Regenerate `docs/controls.csv` with
`node --experimental-strip-types scripts/controls.mjs`. Each row includes the
local frame, source ordinal and exact sampled controls. Fusion global frame =
composition start + CSV frame. Coordinates here use pixels from top-left, Y
down. For a point in normalized Fusion image coordinates, X=pixelX/1920 and
Y=1−pixelY/1080; convert top-left rectangles through their centers. Check the
installed tool's coordinate direction instead of assuming CSS and Fusion match.
Parent transforms apply after local transforms. A uniform pivoted transform is
pivot + scale×(point−pivot), followed by the stated translation. Convert angles
to your tool's convention. CSS rotations are clockwise in this Y-down space.

Continuous controls use the CSV per-frame values, not an unspecified default
spline. Held gates, text prefixes, colors and row indexes use stepped keys.
Smoothstep is t²(3−2t), with t clamped to [0,1]; linear progress is clamped t.
Rectangle masks need pixel-correct width and height; normalized X/Y values are
not interchangeable on a non-square raster. Match opacity, clipping and layer
order before attempting a moving comparison.

## Allocate the pane, read, then insert an anchored comment

Keep local 0–2 as a white centered chapter, 96-pixel weight-600 type. Hard-cut
at 3 to the original app on a blue backdrop. The app starts at (252,24),
1376×1032, radius 12; its toolbar is 44 pixels high. Below the toolbar, a
292-pixel sidebar stays fixed. The initial conversation width is 1084 pixels.

At local 29, hard-open a 516-pixel diff pane at app-local (860,44). Narrow
the conversation to 568 pixels and narrow its right-aligned request bubble.
Do not leave the pane hidden until the camera arrives: the split reading
state is visible over 29–67. Use the original layout/code fixtures, not the
source film's code, model names, repository or product marks.

### Camera hierarchy and hover

Place the whole app and pointer in one camera group. Its pivot is (1360,100).
Apply cameraScale first, then screen translation (cameraX,cameraY). Over
67–84 these reach scale 2.3, X=-550 and Y=115. Thus final screen point =
(1360,100) + 2.3×(worldPoint−(1360,100)) + (-550,115). Use the CSV samples.
cameraBlur is an authored 0→6→0-pixel Gaussian approximation. It is not an
optical-shutter reconstruction; calibrate Fusion's blur radius independently.

The pointer travels from world (1595,53) toward (1174,285) over 72–84, then
to the changed-line gutter at (1143,274) over 84–94. The authored smoothstep
path is not a measured source trajectory. Reveal the plus-hover square for
94–106 at diff-local (22,197), size 19×19. The pointer stays inside its world
hitbox [1134,1153)×[265,284). Do not infer a submitted review from a hover.

### In-flow comment insertion

The file header is 49 pixels high. The code block starts at diff-local Y=96,
uses 13-pixel type with 24-pixel line spacing and a 52-pixel left text margin.
Three context rows precede the red removed row and the green added row. The
green row occupies world Y=[260,284); it remains registered during insertion.

At 107, hard-show the empty comment box at diff-local (23,219), 469×100,
with a thin blue-grey border and radius 7. Place the placeholder 12 pixels
inside the box and a disabled-looking Comment affordance at its lower right.
Set followingOffset=108 in the same frame: only the code below the changed
row shifts down. The header and changed code do not move. This layer split is
the contract; an overlay covering the lower code is not an equivalent edit.

Over 118–129, move the pointer to (1225,314), inside the field. Use the I-beam
from 129 through the final local 131. Leave the field empty. Do not add typed
text, submission, acceptance, a commit or any resulting state.

The panel chrome, number of context rows, code fixtures, pointer path, camera
metrics, blur and precise insertion spacing differ. The original code example
is illustrative, not evidence of a real repository modification. Resolve has
not executed this construction; moving-source approval remains open.


## Verification boundary

Inspect both actual exports at their native cadence, including entry/exit,
hard gates, layering, width, masks and holds. Shipped code checks font loading
and selected text-width budgets before rendering; it rejects oversized copy
instead of silently shrinking it. This is not arbitrary-input readability
approval or a guarantee that an independent Text+ rebuild fits.

The kit contains editable original geometry, fixtures, controls and tests;
source screenshots/movies are not renderer inputs. Native .drp execution,
tested Resolve import, independent moving-source review and source-quality
approval are not included. Existing matching pinned dependencies were used,
not a clean dependency install. A modified input needs a new render and review.
