# Atlas r08 — copy-specific horizontal approach in Resolve

**Resolve native render count: 0. App execution: UNVERIFIED.** This revision
changes only horizontal placement. It reuses the preserved r07 SVG plates,
glyph code, reveal schedule, Y/lift, scale, duration and reading intervals.
No PNG conversion, Resolve import, native render or moving comparison was run.
No `.drp`, `.dra`, `.setting`, source footage or replacement narration is supplied.

## Package contract and checks

This directory is **`resolve-r08/`, a sibling of `resolve/`**, never a descendant.
[`preservation.json`](preservation.json) binds all 65 existing r07 files;
checks reject edits, removals and new descendants. Do not regenerate r07's
`FILES.txt` to accommodate this revision.

Required assets/code: the unchanged sibling [`resolve/`](../resolve/README.md),
including its 56 SVGs, `glyphs.json`, `OFL.txt`, `prepare.py` and recipe. This
revision does not duplicate or modify them. Run commands from `resolve-r08/`:

```bash
python3 -B check.py
python3 -B controls.py --variant original --line line1 --count 16
python3 -B controls.py --variant adaptation --line line2 --count 19
```

**Complete project dependency:** `atlas-r08-remotion`, the actual runnable r08
package with `src/core-model.ts`, `src/model.ts`, `frame-metadata.json`, inputs
and six exported SVGs. The repository's `atlas/revisions/r08/project/` contains
only patch files and is **not** this complete dependency. No broken Markdown
link to that incomplete tree is used here.

The proposed combined ZIP layout was sent to the coordinator:

```text
atlas-dual-toolkit/
  resolve/              unchanged r07 files and all original SVG assets
  resolve-r08/          this revision
  atlas-r08-remotion/   complete named r08 project dependency
```

The coordinator controls staging; this guide does not claim that third sibling
already exists in the checkout. When packaged there, run:

```bash
python3 -B check.py --project ../atlas-r08-remotion
```

For another layout, pass the **complete** project directory explicitly with
`--project`. Node 22.18+ is required only for this code check; no npm install,
Remotion render or Resolve connection is made. Relative asset/guide links refer
to the downloaded bundle, not standalone preview Markdown. Ordinary
`check.py` runs offline tests only; `--project` additionally calls the actual
r08 `stateAtFrame(frame, content)` and `titleSvg` in memory.

[`portable-binding.json`](portable-binding.json) records checks against all
180 content/frame states, actual metadata/native-clock rows, and the six
existing SVGs at frames19,55,89, using unchanged r07 plates plus the new native
control algebra. These are geometry checks, not native pixels or fidelity approval.
[`recipe.json`](recipe.json) includes sanitized hashes/probe summaries of the
other builder's existing two r08 movies; movies are not included, rendered or
viewed by this guide builder. [`FILES.txt`](FILES.txt) lists this revision's files;
[`SHA256SUMS.txt`](SHA256SUMS.txt) hashes every other file in this directory.

### Frozen output binding

The guide now binds to the final Atlas r08 handoff, SHA-256
`9311d4707a3005e19c80b0aab76c20602e1ff4c3983855da1373af20bd0399c8`.
`recipe.json → existing_remotion_evidence → frozen_handoff` records only
public artifact names, sizes and hashes, and links the frozen metadata/clock/
six SVGs to the existing geometry receipt. The original handoff is not included:
its private paths must not enter the editable archive.

Actual movie bytes were re-hashed against that handoff:

| Public artifact name (not a download URL) | SHA-256 |
| --- | --- |
| `atlas-r08-original.mp4` | `6f1dfb9cfc4dce592a477754d762c14ef4b623ebad8838e29787c9602fe98d46` |
| `atlas-r08-adaptation.mp4` | `2e4498694b688d9fd5f6b2a3c9d5a59f6a846e54bd81efdb4915022b148cc701` |

The coordinator can repeat the byte check with `check.py --handoff HANDOFF_JSON
--renders R08_RENDER_DIRECTORY`, substituting the existing files' locations;
neither dependency is supplied here. The render directory contains
`original.mp4` and `adaptation.mp4`; public delivery names are mapped above.
The checker does not follow private paths embedded in the handoff. The two
CSVs and geometry are unchanged. **Independent blind review is still pending;
no quality result or winner is recorded. Resolve native render count stays0.**

## The single change

The inherited r07 source-center offsets combined with replacement prefix
widths produced rightward first-line steps at18→19: about **9.29 px** for
`original` and **23.36 px** for `adaptation` in vector geometry. Native decoded
9/23 px and source preference in both static pairs were reported in the r08
decision; they are not a new moving review or a verdict on r08.

R08 instead maps measured source **ink-left progress** between each copy's own
old entry-left and fully centered final-left. Reference remains
[Ej6hnsQgV_c](https://www.youtube.com/watch?v=Ej6hnsQgV_c&t=16s), bounded native
**[507,597)**, **1920×1080**, nominal **30 fps**. The supplied measurements are
native gray8 threshold160 ink bounds, not source application parameters:

| Line | Inclusive measured range | Source ink-left endpoints | Endpoint first reached |
| --- | --- | --- | --- |
| 1 | local0–25 / native507–532 | 830→520 px | local24 |
| 2 | local29–64 / native536–571 | 864→488 px | local62 |

The exact arrays are in `recipe.json → horizontal_control`; no fit or smoother
is applied. For each line and content:

```text
initialLeft = 960 - entryPrefixInkWidth/2 + retainedEntryOffsetX
finalLeft   = 960 - fullLineInkWidth/2
progress    = (sourceLeftAtEntry - sourceLeftAtClampedFrame)
              / (sourceLeftAtEntry - sourceLeftAtEndpoint)
targetLeft  = initialLeft + progress * (finalLeft - initialLeft)
newOffsetX  = targetLeft - (960 - currentPrefixInkWidth/2)
```

At line entry preserve the old offset exactly. When progress is1 **and the line
is complete**, use exact offset X=0. Thus line1's endpoint plateau at24 does not
mean prematurely setting X=0 before its final glyph at25. Frames85–89 use the
retained state unchanged, including both zero offsets and the original scale.

**This is content-aware adaptation of quantized source ink bounds, not
recovered OpenAI easing or transforms.** The source samples are already monotone;
there is no isotonic fit, interpolation of the measurements, blur, retiming or
new type treatment. The same X replacement removes r07's −0.5 px first-line
excursions at38–39 and44–63. A native X *offset* can still increase at a reveal;
the resulting **ink-left**, after prefix-centering compensation, is the monotone
quantity. Do not smooth the CSV's offset column into a monotone curve.

## Per-copy controls — never swap these CSVs

| Variant | Text | Inspector reference |
| --- | --- | --- |
| `original` | Follow the map home / Wonders on your path | [controls-original.csv](controls-original.csv) |
| `adaptation` | Sketch the big idea / Details in your work | [controls-adaptation.csv](controls-adaptation.csv) |

Each CSV has **151 included title samples**: 90 on V2 and61 on V3. It gives
variant, SVG/PNG filenames, recipe/native frames, timeline timecode, clip In,
exclusive Out, clip-local frame/timecode, visible slots, progress, target
ink-left and **actual Inspector Position X/Y plus linked Zoom X/Y**. It is a
printable reference, **not an alleged native Resolve CSV import format**.
`controls.py` requires `--variant`; there is no universal r08 X table and the
old r07 `prepare.py controls` output is not valid for this revision.

Examples below are rounded for reading; enter full CSV precision:

| Variant / line | Recipe frames | Clip-local keys | Position X | Position Y |
| --- | --- | --- | --- | --- |
| original /1 | 18→19 | 2→0, across a clip cut | −121.920371→−90.158188 | −54→−54 |
| adaptation /1 | 18→19 | 2→0, across a clip cut | −97.457178→−79.107260 | −54→−54 |
| original /2 | 54→55 | 1→0, across a clip cut | −35.563231→−18.142921 | 0→0 |
| adaptation /2 | 54→55 | 1→0, across a clip cut | −39.072072→−21.742891 | 0→0 |

Original line1 ink-left moves **499.965610→496.519382**, while adaptation moves
**539.673196→536.879189** at18→19: both leftward despite increasing offset X.

## Assets, timeline and clip ranges

Read the [r07 asset/conversion and general construction guide](../resolve/README.md)
for unchanged setup. Do not use its motion CSV or its settling description as
the r08 X contract. Use **1920×1080, square pixels, progressive30/1 CFR**,
timeline start **01:00:00:00**, 90 frames, no audio:

```text
native frame     = 507 + recipe frame
clip-local frame = recipe frame - prefix clip In
timeline TC      = 01:00:00:00 + recipe frame/30
last included    = local89 / native596 / 01:00:02:29
exclusive end    = local90 / native597 / 01:00:03:00
```

V1 is paper [0,90), unanimated. V2 is [0,90); V3 is **absent [0,29)**.
Every prefix still uses the full1920×1080 canvas from
`../resolve/assets/<variant>/<stem>.svg`. Spaces count as slots but draw no
glyph. All replacements are hard cuts, never a fade, mask wipe or Write On:

| V2 [In,Out) | Stem | V3 [In,Out) | Stem |
| --- | --- | --- | --- |
| [0,2) | `line1-count05-plate` | [29,31) | `line2-count03-plate` |
| [2,5) | `line1-count06-plate` | [31,32) | `line2-count04-plate` |
| [5,7) | `line1-count08-plate` | [32,34) | `line2-count05-plate` |
| [7,9) | `line1-count09-plate` | [34,36) | `line2-count06-plate` |
| [9,12) | `line1-count10-plate` | [36,39) | `line2-count07-plate` |
| [12,14) | `line1-count12-plate` | [39,40) | `line2-count09-plate` |
| [14,16) | `line1-count13-plate` | [40,44) | `line2-count10-plate` |
| [16,19) | `line1-count14-plate` | [44,45) | `line2-count12-plate` |
| [19,21) | `line1-count16-plate` | [45,47) | `line2-count13-plate` |
| [21,23) | `line1-count17-plate` | [47,49) | `line2-count14-plate` |
| [23,25) | `line1-count18-plate` | [49,52) | `line2-count15-plate` |
| [25,90) | `line1-count19-plate` | [52,53) | `line2-count17-plate` |
| — | — | [53,55) | `line2-count18-plate` |
| — | — | [55,57) | `line2-count19-plate` |
| — | — | [57,90) | `line2-count20-plate` |

Direct SVG import remains **unvalidated**. On a later authorized machine with
Inkscape available, convert the same immutable SVGs to PNG. From `resolve-r08/`,
not `resolve/`, for one chosen variant. First set `ATLAS_PREP_ROOT` to an existing, dedicated output directory outside the entire extracted package. The command rejects an unset, missing or in-package destination before conversion. The CSV column `preparatory_png` is relative to this external output root; `svg_asset` remains relative to `resolve-r08/`. Do not move or rewrite the CSV controls:

```bash
: "${ATLAS_PREP_ROOT:?Set an existing output directory outside the extracted package}"
test -d "$ATLAS_PREP_ROOT" || exit 1
output_root="$(cd "$ATLAS_PREP_ROOT" && pwd -P)" || exit 1
package_root="$(cd .. && pwd -P)" || exit 1
case "$output_root/" in
  "$package_root/"*) printf '%s\n' 'Choose an output directory outside the package.' >&2; exit 1 ;;
esac
variant=original
mkdir -p "$output_root/preparatory-png/$variant" || exit 1
for asset in "../resolve/assets/$variant/"*.svg; do
  stem="$(basename "$asset" .svg)"
  inkscape "$asset" --export-type=png --export-area-page \
    --export-width=1920 --export-height=1080 --export-background-opacity=0 \
    --export-filename="$output_root/preparatory-png/$variant/$stem.png" || exit 1
done
```

These [documented conversion controls](https://inkscape.org/doc/inkscape-man.html)
create **preparatory exports, not native Resolve renders**. They were not run.
Do not trim alpha or crop to ink. Keep generated PNGs outside the delivered
code-only archive and never write into the preserved r07 tree.

## Native control entry and frame checks

1. Import prepared PNGs as **Individual** frames. Check full canvas, RGB levels,
   Straight alpha and edge appearance over paper/contrasting backgrounds.
   Record actual version/edition/platform; these imports remain untested.
2. Assemble the three tracks with exact numeric durations `Out−In`, no ripple
   across tracks or transitions. A65-frame still lasts `00:00:02:05`.
3. Inspector Transform: Anchor0,0 at full-frame center, linked Zoom, crop/rotation/
   Dynamic Zoom off; Composite Normal, Opacity100%. The plates already include
   Geist650/100px/−1 tracking, **18px pre-scale spaces and202/214 horizontal
   normalization**. These remain adaptation geometry, not OpenAI settings.
4. Enter the **selected variant's** CSV values at its timeline timecode and
   clip-local key. Position X=`scale × new copy-specific offsetX`;
   Position Y=`−scale × retained offsetY`; linked Zoom=`retained scale`.
   Both lines scale around(960,540), not their individual ink-box centers.
5. Key every included frame, including repeats. Linear between adjacent sample
   keys is an Edit construction choice, not recovered source easing. No curve
   simplification, motion blur or retiming. Last key is `duration−1`, never Out.
6. Check every reveal's previous/current frames, particularly **18/19,24/25,
   28/29,38/39,54/55,56/57,61/62/63/64/65 and84/85/86/87/88/89**. Compare
   actual ink-left, not offset monotonicity. Frame90 is outside the title.

Line1-only hold **[25,29)** stays4 frames. Both lines are complete **[57,90)**,
33 frames, not33 still frames. The previously documented **[64,85)** settled
interval and the project's declared reading hold **[65,85)** remain unchanged.
With r08 X correction, both lines actually reach exact settled geometry at62:
**[62,85)** is23 stationary frames, because the old−0.5px first-line excursion
is gone. This is not an inserted hold or changed duration. Y is unchanged.
Late scales at85–89 remain **884/883,885/883,887/883,890/883,895/883**; offsets
stay zero. Do not add a91st frame, fade or outgoing browser.

Resolve uses90 CFR frames. The existing Remotion/source timing uses1/16000 PTS,
528/544-tick steps and48005-tick file extent; equal frame indices do not imply
container-clock or encoded-pixel equality. No new timebase remux is proposed.

## Substitution and remaining gap

The two CSVs are bound to the two exact copies. New copy requires regenerated
prefix SVGs **and its own X controls**, checked against r08's content-taking
state function. Retain19/20 ASCII letters/spaces,750–1100px final ink widths,
visible ink in entry prefixes, and opaque six-digit colors; check contrast and
space-onset meaning. Do not shrink, re-track, stretch words or silently reuse
either CSV for a third input. Keep all glyph licensing with the original assets.

The changed path is still a measured-bound adaptation; it does not recover the
film's font, easing, optical gaps or native editor. PNG/Resolve filtering can
differ from Remotion's rasterization. **The biggest unresolved gap is actual
Resolve import, trims, alpha, subpixel key evaluation and90-frame output.**
Fresh independent r08 critique is separate. Native render count remains **0**;
no guide, CSV, geometry test or other builder's movie changes that number.

This is not final all-hands production: no source-footage asset, talking-head
composite, soundtrack, OBS cue, playback offset or ending buffer is supplied.

Official technical references: the [current Resolve21.1 manual](https://documents.blackmagicdesign.com/UserManuals/DaVinci_Resolve_21.1_Reference_Manual.pdf),
[Blackmagic support](https://www.blackmagicdesign.com/support/family/davinci-resolve-and-fusion),
and the [inherited control/page map](../resolve/README.md#official-technical-sources).
That map explicitly anchors Resolve21 pages, not re-audited21.1 pagination or
an installed-version claim. No new Resolve API or assumed SVG importer is used.
