# Composer token: public construction specification

**Native Resolve: 0. This is not a complete, executable native Resolve handoff.**
The manual text-registration step lacks a supplied plate-export entry/command
(B1), and the native equivalent of the single CSS blur remains unverified (B2).
Those are blockers, not claims solved by documentation. No DRP, SVG import
guarantee, new render, moving-quality verdict or new mechanism credit is supplied.

This public derivative preserves both variants' exact **33 frames at 30/1**,
1920×1080, native source **[92,125)**, every node control and all original assets.
The original private kit is untouched. Only portability/privacy instructions and
the D1 wording correction change; see [CORRECTIONS.md](CORRECTIONS.md).

## 1. Public files and original downloads

- [controls.json](controls.json): byte-identical prior controls, both variants,
  122 nodes/116 drawable layers each, frame gates, paths, masks and text states.
- [reproduce_controls.py](reproduce_controls.py) and [test_controls.py](test_controls.py):
  portable Python-only controls reproduction/checks from two explicit public ZIPs.
- [references.json](references.json): exact package URLs, hashes, member bindings,
  original code/SVG identities and research-only links; no private stage dependency.
- [REPRODUCE.md](REPRODUCE.md): download, checksum, controls, original core/addon
  layout, explicit environment configuration and unchanged guarded replay command.
- [assets/](assets/): seven unchanged original SVGs and inherited license notices.
  [original-code/](original-code/) preserves the four original source snapshots;
  that partial inspection directory is not the complete runnable addon.
- [RIGHTS.md](RIGHTS.md) and [INSPECTION.md](INSPECTION.md): asset boundaries and
  inherited inspection limits. No source media or new evidence is bundled.

**Required external Remotion downloads; not standalone:**
[shared core-publication-v08.zip](https://openai-film-fieldnotes-100.pages.dev/videos/editing/benchmark/library/downloads/core-publication-v08.zip)
and the exact
[composer-token r04 editable.zip](https://openai-film-fieldnotes-100.pages.dev/videos/motion/additions/expansion-200/studies/composer-token/editable.zip).
Their hashes and correct assembly commands are in `REPRODUCE.md` and
`downloads.sha256`. No source movie belongs in an editable ZIP.

Research only:
[Source](https://openai-film-fieldnotes-100.pages.dev/videos/motion/additions/expansion-200/studies/composer-token/source.mp4),
[Original](https://openai-film-fieldnotes-100.pages.dev/videos/motion/additions/expansion-200/studies/composer-token/original.mp4),
[Adaptation](https://openai-film-fieldnotes-100.pages.dev/videos/motion/additions/expansion-200/studies/composer-token/adaptation.mp4),
and [published findings](https://openai-film-fieldnotes-100.pages.dev/videos/motion/additions/expansion-200/studies/composer-token/study.json).
“Original” is the fictional botanical Plots reconstruction; “Adaptation” is the
ceramic Tiles reconstruction, not two treatments or official product demos.

The following construction targets retain the prior guide's motion/geometry
instructions. They are not a tested set of native typography/blur presets.

## 2. Set the Resolve timeline before adding graphics

1. Set the project/timeline to **1920×1080, 30 fps, square pixels**. Do not use
   29.97, a rate-converted timeline, optical flow, frame blending or a longer hold.
2. Place one Fusion Composition for **33 frames**. Use local origin frame 0 and
   last included frame 32. If Resolve displays a different Fusion start frame,
   replace every `time` in the supplied expressions with `(time - ORIGIN)` using
   that observed integer. Do not slide individual events by eye.
3. Local first/last timecodes are `00:00:00:00` and `00:00:01:02`. The boundary
   immediately after the clip is `00:00:01:03`, **not an additional output frame**.
   For an inclusive render In/Out selection, select 0 through 32.
4. Create a transparent 1920×1080 RGBA content canvas. Build the hierarchy below
   on that canvas, apply its one screen-softness operation, then Merge over an
   opaque white Background and connect to MediaOut. Keep native framing; the
   composer extends to x=2422 and the menu to x=2423 intentionally.
5. Use Normal/over compositing and the original alpha. No camera, pointer,
   zoom, mask reveal, color animation, animation easing or temporal fades belong
   to this treatment. The footer/control strip stays registered for all 33 frames.

`controls.json` is a manual construction reference, **not an import format**.
Its `normalizedBoxReference` is a coordinate conversion, not an assertion that
every Fusion node has a matching box-size knob.

## 3. Build the layer tree, preserving the existing styling

Build Merge nodes in `layers[].order`, with later siblings over earlier siblings.
Keep each group as a separate transparent subcomposition. Do not combine the four
menu states into one generic menu whose rows slide, or bake the whole shot into
state images. Parent windows gate children in **global local-shot time**:
`text-23` has recipe [0,33), but its `filter-all` parent restricts it to [10,13).
Do not restart its frame clock when the parent enters.

| Group / layers, in original sibling order | Effective [In,Out) | Construction |
| --- | --- | --- |
| `text-0`, `rect-1`, `rect-2` | [0,33) | Heading, attached pale footer, white composer with its border/shadow |
| `text-3` | [0,10) | Placeholder, not query text |
| `rect-4` | [0,4) | Initial caret rectangle |
| `icon-5` through `icon-18`, with intervening `text-7/11/14/17` | [0,33) | Plus, gear, mode, chevron, bolt, folder/workspace, laptop/location, branch and chevrons |
| `filter-all` | [10,13) | First five results and Files heading |
| `filter-apps` | [13,15) | Four results, Programs and Methods headings |
| `filter-skills` | [15,17) | Four results, Methods and Files headings |
| `filter-files` | [17,21) | Five file results and Files heading |
| `text-110` | [10,21) | Common `@` outline; it is a path despite its ID |
| `query-tail` | [13,21) | The five discrete suffix states below |
| `queryCaret0` through `queryCaret5` | See frame table | Separate path/stroke locations, not a text cursor |
| `resolved-token` → `icon-111`, `icon-112`, `text-113` | [21,33) | Teal outer diamond, white inner diamond, Plots/Tiles label |
| `token-caret` | [21,29) | Independent post-token caret |

The heading remains mounted during the menu interval and is covered by the menu;
do not remove or re-center it. The token is an inline icon plus label: **there is
no pill background, grow animation, bounce, highlight flash or morph**.

### Geometry, paths and masks

Coordinates in `recipeControls` are top-left-origin pixels within the parent.
`canvasBoxPxBeforeOwnTransform` adds parent translations; it does not silently
round subpixels. In each `clipRectanglesPx` list, the first rectangle is the
**final** canvas crop [0,0,1920,1080], applied after root blur; the remaining
rectangles are parent masks applied before root blur. Preserve off-canvas shape
content until that final crop so it can contribute to blurred edge pixels.
For native masks and
control points convert a canvas point `(x,y)` to `(x/1920, 1-y/1080)`.

For a path, use its exact `resolvedPath`, fill, stroke, `strokeWidth`, `viewBox`
and transforms. `pathCoordinates.svgToFusionNormalized` supplies the full affine
map **including SVG xMidYMid meet, CSS scale/origin/rotation and the Y flip**:
`X=a*u+c*v+e`, `Y=b*u+d*v+f`. Stroke widths remain SVG-viewBox units and must
receive the same scale; they are not already normalized Fusion widths. Default
SVG paths use butt caps and miter joins unless an explicit property says otherwise.

The seven supplied SVGs are original constructed assets, not recovered OpenAI
vectors. Try the installed application's SVG spline import only as a convenience;
**SVG import is not guaranteed or tested**. If it loses viewBox scaling, winding,
stroke, fill or placement, do not accept the result. A native Polygon/Bezier
construction must retain the exact path. A quadratic segment P0–Q–P1 has cubic
controls `P0+2/3*(Q-P0)` and `P1+2/3*(Q-P1)`; map all points through the supplied
affine. Preserve circular arcs and holes rather than replacing them with a
visually similar icon. Manual path conversion still requires native verification.

For a filled rectangle, use a Background and an exact Rectangle mask. Preserve
the CSS inside-border box, radius, fill, rotation and shadow in `recipeControls`;
a border must not enlarge its outside bounds. Two app-logo rectangles
`rect-53/54` rotate **−35° about their top-left origin**, not their center.
The gear `icon-6` scales 1.06×1.03 about its local [21.5,22.5] center.

Each menu group is [73,0,2350,533] with an unfeathered clipping boundary. Its
white shell is local [0,−150,2350,676], radius 54, 2 px `#ededed` border and
`0 2px 5px #00000008` shadow. Its last overlay is [6,500,2328,24], radius 30,
a **static** transparent-white to opaque-white vertical gradient. Clip the group
before the root blur. The gradient and lower edge are not an opacity animation.
The shell's lower edge at y=526 is not the group's clipping boundary at y=533.

Keep the published lighter lower edge. The source excerpt has a darker lower
band; replacing the r04 lower edge with it would change the accepted styling.

### Typography: preserve targets, do not guess native equivalents

The addon supplies `public/fonts/Geist.ttf` and `public/fonts/OFL.txt`.
`Fieldnotes` is the renderer's alias for that exact variable font, not a separate
installed font. All text is one line. The existing renderer positions CSS
line boxes; the listed y coordinate is **not a glyph baseline**.

| Role | Original typography targets |
| --- | --- |
| Heading | 88 px, weight 400, line-height 1.15, −1 px tracking; box [665,308,1240,114.4] |
| Placeholder | 48 px, weight 400, `#bbbbbb`; box [113,603,580,62.4] |
| Menu label / detail / section | 44 / 40 / 36 px, weight 400, supplied colors and per-variant boxes |
| Query suffix | 48 px, weight 400, −0.4 px tracking, `#101010`; box [156.08808288574218,602,260,62.4] |
| Token label | 48 px, weight 500, `#469a85`; box [183,604,132,62.4] |

Every literal, font weight, line-height and label/detail offset is present in the
JSON. The menu description offsets differ between Original and Adaptation:
**choose both that variant's recipe and its content**, not just new strings in
the other recipe. The 28 px label/detail separation is the published measured
ink-edge gap, not a uniform gap between nominal text-box edges. In file results,
the five label tops are 90,178,266,354,442; details sit 3 px lower in their line
boxes, preserving the existing baseline hierarchy.

Do not map CSS font size to Text+ Size by dividing by 1080 and declare a match.
Native Text+ metrics, variable-weight selection and antialiasing have **not** been
verified. For an unchanged-type build, prepare separate transparent glyph layers
with the existing approved renderer's `FontGate` and `MotionLayer`, using the
exact recipe/content and global prep frame. Retain the original ancestor
translation and menu clip, preserve full 1920×1080 registration and do not
auto-trim/resize. Split `query-tail` into its five text states at prep frames
13,15,17,18,19; other text layers need only their first effective active frame.
In Resolve, place full-canvas alpha layers at center [0.5,0.5], size 1, with their
own frame gates; keep the source code and inputs editable.

That preparation route has **not been executed or packaged as ready PNGs** in
this guide. It must isolate individual drawable layers, not render the entire
scene or four flattened menu-state screenshots. Do not silently use Text+ as a
pixel-equivalent shortcut if no prepared glyph layers are available.

### One root optical operation, not 116 leaf blurs

The original `source-screen-softness` group applies CSS `blur(0.45px)` **once to
its composited children**. Keep shadows/gradients and the menu crop at their
original stage of compositing. Do not blur each isolated plate and Merge them:
blur and alpha compositing do not generally commute.

For the isolated-layer route, leave only this root blur out of plate preparation,
then apply its target to the single assembled content group in Fusion, before
the white backdrop. `rootComposite` records the order and the 0.45 px CSS
Gaussian target. The native Blur node's knob mapping, edge handling,
premultiplication and color pipeline have not been measured here. Consequently
`fusionBlurKnobValue` is null; entering “0.45” into an arbitrary Fusion Blur
control is **not** an established match. This is an open native optical gate,
not a proposed change to softness. Do not declare pixel parity until that gate
and glyph placement have been checked against the published movies.

## 4. Set the exact frame gates

For each layer/group, apply `effectiveInOutExclusive` to its final Merge Blend.
At origin zero the supplied expression is, for example:

```text
filter-all:     iif(time < 10, 0, iif(time < 13, 1, 0))
text-110:       iif(time < 10, 0, iif(time < 21, 1, 0))
resolved-token:iif(time < 21, 0, iif(time < 33, 1, 0))
token-caret:    iif(time < 21, 0, iif(time < 29, 1, 0))
```

Expressions are an unexecuted manual reference, not a supplied Fusion preset.
If setting keys instead, use step/hold interpolation and check each boundary
frame. A fade, even across one frame, is wrong. The parent Merge gates the whole
menu at once; the query suffix and caret have separate gates.

| Local frames, inclusive | Source frames | Menu | Plots query | Tiles query | Caret |
| --- | --- | --- | --- | --- | --- |
| 0–3 | 92–95 | None | Placeholder | Placeholder | `rect-4` |
| 4–9 | 96–101 | None | Placeholder | Placeholder | Absent |
| 10–12 | 102–104 | `filter-all` | `@` | `@` | `queryCaret0` |
| 13–14 | 105–106 | `filter-apps` | `@p` | `@t` | `queryCaret1` |
| 15–16 | 107–108 | `filter-skills` | `@pl` | `@ti` | `queryCaret2` |
| 17 | 109 | `filter-files` | `@plo` | `@til` | `queryCaret3` |
| 18 | 110 | Same file results | `@plot` | `@tile` | `queryCaret4` |
| 19–20 | 111–112 | Same file results | `@plots` | `@tiles` | `queryCaret5` |
| 21–28 | 113–120 | None | Diamond + Plots | Diamond + Tiles | `token-caret` |
| 29–32 | 121–124 | None | Same token | Same token | Absent |

The common `@` is **one path** (`text-110`) throughout [10,21), not a character
in a reflowing text field. The suffix is five discrete states, with durations
2,2,1,1,2 frames. Do not use Follower, a uniform typing speed or a left-to-right
mask over the finished word. At frame 21, remove the menu, `@`, suffix and query
caret together, and reveal the two token paths, label and token caret together.
The caret disappears at 29 while the token persists through 32; no new hold is added.

### Exact caret geometry

`rect-4` is [113,600,2.4,54], with x=113 its **left edge**. Other carets are
vertical paths from y=600 to y=654, 2.4 px `#242424` strokes; x below is the
**stroke center**. The table is rounded for reading; use the full JSON values.

| Path | [In,Out) | Plots x | Tiles x |
| --- | --- | --- | --- |
| `queryCaret0` | [10,13) | 156.488083 | 156.488083 |
| `queryCaret1` | [13,15) | 184.648141 | 174.904123 |
| `queryCaret2` | [15,17) | 196.824161 | 185.448138 |
| `queryCaret3` | [17,18) | 223.640225 | 197.384167 |
| `queryCaret4` | [18,19) | 240.616263 | 223.624228 |
| `queryCaret5` | [19,21) | 264.408310 | 247.704285 |
| `token-caret` | [21,29) | 317.294632 | 305.035431 |

These positions follow the supplied fictional content metrics, not source-word
widths. The original source says `@sites` and resolves to its Sites icon/label;
do not copy those assets or data into either original-content build.

## 5. Icons are separate controls, not typing effects

- **Bolt `icon-9`:** present for every frame [0,33), box [1876,777,32,41],
  viewBox [0,0,32,41], no fill, `#969696` stroke, width **3.2 viewBox units**.
  Use [`bolt.svg`](assets/bolt.svg), including its exact quadratic path. Do not
  force it into a square 24×24 viewport, change its weight, animate its color,
  replace it with a Unicode bolt or treat token resolution as a bolt activation.
- **Token outer `icon-111`:** [123,604,45,45], viewBox [0,0,24,24], diamond path
  `M12 1L23 12L12 23L1 12Z`, fill `#458d94`, stroke width 0.
- **Token inner `icon-112`:** [136.5,617.5,18,18], same diamond path/viewBox,
  white fill and stroke width 0. It is a separate white overlay, not an assumed
  cutout or four-tile source logo. Both paths and the token label enter at 21.
- **Common `@`:** [`common-at.svg`](assets/common-at.svg) has a full-canvas
  1920×1080 viewBox and already positioned glyph coordinates. Do not re-center,
  crop to ink bounds, retype, or apply a second 46 px/.98 font transform.
- **Footer paths:** `g02-folder.svg` maps to `icon-10` [121,916,48,48];
  `g02-laptop.svg` to `icon-13` [407,916,48,40]; `g02-branch.svg` to `icon-16`
  [845,916,44,44]. These remain present [0,33). They are **not replacements**
  for the file menu's folder/document/image/stylesheet paths.
- **File menu icons:** preserve `icon-92/95/98/101/104` at local x=46 and
  y=99/187/275/363/451. Their five paths distinguish folder, two documents,
  image and stylesheet. All five are gated by [17,21), while suffix letters
  continue changing without changing that menu.

## 6. Supported inputs and open source findings

This handoff supports **only the two exact supplied input sets**, Plots and Tiles.
It is not a general task-token builder. Unmeasured token names, new row counts,
additional filter stages, multiline/overwide copy, different aspect ratios or
lengthened timing are unsupported. Do not shrink type, move a caret, truncate
new copy automatically or replace an icon to make an unsupported input fit.

The recipe's 59 fields include generated paths as well as text. The ordinary
text contract of 1–150 characters and one line does not establish visual fit;
`queryTail` is exactly five characters matching `^(plots|tiles)$`, and `token`
is exactly five matching `^(Plots|Tiles)$`. The retained `query` field allows
1–150 characters but is not the rendered query layer: the actual query is the
fixed `@` path plus `queryTail`. Editing `query` alone does not change the image.
The heading must also meet its loaded-font 1120–1240 px tracked-advance-width range:
`measureText(line).width + (characterCount - 1) * letterSpacing` for this nonempty
single line. This is not a glyph-ink-bounds test; see D1 in `CORRECTIONS.md`. Existing
fixed boxes, measured descriptions, footer chevron and caret paths remain bound
to each particular variant. A new input needs its own approved metrics and
optical review, which is outside this guide.

**G02 stays open:** the inherited common `@` has a wider/slanted counter and a
crisper edge than the source. The source font and optical pipeline are unknown.
The r04 bolt is an unaccepted silhouette candidate, not an accepted repair.
The lighter lower band, hierarchy, upper-row reframe and footer drawings are
published adaptations, not recovered source design. This work does not close
any inherited finding, transfer a preference into mechanism credit, or claim
all 33 source frames were perceptually reviewed in motion.

## 7. Verification boundaries

Follow `REPRODUCE.md` for portable controls checks. They require neither a private
filesystem layout nor a private stage; they do not render. Publisher-only
preservation/live-URL checks are separate from these consumer commands.

For a future authorized native build, compare both outputs with their matching
published movie at frames 0,3,4,9,10,12,13,14,15,16,17,18,19,20,21,28,29,32,
then inspect every frame and watch at 1×. Check query, file rows, lower edge,
bolt and footer at native size, plus alpha, glyph registration and the final
composited blur. Export only frames 0–32, 30/1, silent, with no hold extension.
No such new native build or moving comparison was performed for this derivative.

**B1 and B2 remain blockers.** The text-preparation exports are real core exports,
but no executable preparation entry/command or text plates are supplied here.
The native blur control remains null, deliberately. D1 corrects only the heading
measurement terminology; it does not close either blocker or any G02 finding.

Any later replay is subject to the operator's actual storage authority, existing
shared dependencies and original wrapper/encoder-lock/temp requirements. This
public guide grants no task-specific storage allowance and supplies no bypass.

The [Blackmagic Fusion reference manual](https://documents.blackmagicdesign.com/UserManuals/Fusion19_Manual.pdf)
is general application context, not verification of these assets or native
CSS-to-Fusion text/blur equivalence.
