85453da49f
regression / regression-shards (style-16-prod style-9-prod style-17-prod iframe-render-compat variables-prod mp4-h265-sdr, shard-4) (push) Has been cancelled
regression / regression-shards (style-4-prod style-11-prod style-2-prod animejs-adapter typegpu-adapter parallel-capture-regression, shard-5) (push) Has been cancelled
regression / regression-shards (style-7-prod style-8-prod style-10-prod css-spinner-render-compat webm-transparency mp4-h264-sdr webm-vp9, shard-3) (push) Has been cancelled
regression / regression-shards (sub-composition-video style-18-prod raf-ball-render-compat font-variant-numeric sub-comp-t0 sub-comp-id-selector, shard-7) (push) Has been cancelled
Windows render verification / Detect changes (push) Has been cancelled
Windows render verification / Preflight (lint + format) (push) Has been cancelled
Windows render verification / Render on windows-latest (push) Has been cancelled
Windows render verification / Tests on windows-latest (push) Has been cancelled
CI / Detect changes (push) Has been cancelled
CI / Build (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Fallow audit (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Producer: integration tests (push) Has been cancelled
CI / Producer: unit tests (push) Has been cancelled
CI / File size check (push) Has been cancelled
CI / Test: skills (push) Has been cancelled
CI / Skills: manifest in sync (push) Has been cancelled
CI / CLI: npx shim (macos-latest) (push) Has been cancelled
CI / CLI: npx shim (ubuntu-latest) (push) Has been cancelled
CI / CLI: npx shim (windows-latest) (push) Has been cancelled
CI / SDK: unit + contract + smoke (push) Has been cancelled
CI / Test: runtime contract (push) Has been cancelled
CI / Studio: load smoke (push) Has been cancelled
CI / Smoke: global install (push) Has been cancelled
CI / CLI smoke (required) (push) Has been cancelled
CI / Semantic PR title (push) Has been cancelled
Player perf / Detect changes (push) Has been cancelled
Player perf / Preflight (lint + format) (push) Has been cancelled
Player perf / player-perf (push) Has been cancelled
Player perf / Perf: drift (push) Has been cancelled
Player perf / Perf: fps (push) Has been cancelled
Player perf / Perf: parity (push) Has been cancelled
Player perf / Perf: scrub (push) Has been cancelled
Player perf / Perf: load (push) Has been cancelled
preview-regression / Detect changes (push) Has been cancelled
preview-regression / Preflight (lint + format) (push) Has been cancelled
preview-regression / Preview parity (push) Has been cancelled
preview-regression / preview-regression (push) Has been cancelled
regression / regression (push) Has been cancelled
regression / Detect changes (push) Has been cancelled
regression / Preflight (lint + format) (push) Has been cancelled
regression / regression-shards (hdr-regression style-5-prod style-3-prod mov-prores, shard-1) (push) Has been cancelled
regression / regression-shards (overlay-montage-prod style-12-prod chat missing-host-comp-id png-sequence portrait-edge-bleed, shard-6) (push) Has been cancelled
regression / regression-shards (style-13-prod style-6-prod vignelli-stacking gsap-letters-render-compat audio-mux-parity, shard-8) (push) Has been cancelled
regression / regression-shards (style-15-prod hdr-hlg-regression style-1-prod many-cuts vfr-screen-recording render-symlinked-assets, shard-2) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docs / Validate docs (push) Has been cancelled
Sync skills to ClawHub / Publish changed skills (push) Has been cancelled
69 lines
4.4 KiB
Markdown
69 lines
4.4 KiB
Markdown
# Rail track — standard lower-third subtitle
|
||
|
||
The **default** caption track and the workhorse: a clean, readable subtitle that sits **in
|
||
front** of everything (never occluded by the matte) in the lower third. It carries **most**
|
||
of the transcript. It is deliberately **plain** — the cinematic craft (planes, occlusion,
|
||
Vogue-masthead, accumulation) lives in the _embed_ track only ([composition-craft.md](composition-craft.md)).
|
||
|
||
For talking-head / explainer / voiceover, the typical output is **the whole transcript on the rail**
|
||
with only the climax(es) promoted to embed. Rail is not a fallback — it's the baseline.
|
||
|
||
> **Implementation note.** A dedicated rail renderer is the next build step. The rail is a
|
||
> plain `fg` caption track and maps cleanly onto hyperframes' native caption pipeline
|
||
> (`media-use` captions) — prefer reusing that over hand-rolling. Until wired, render
|
||
> the rail as a simple `data-caption-layer="fg"` composition (no matte overlay for these caps).
|
||
|
||
## Position & safe area
|
||
|
||
- **Lower third, horizontally centered.** Landscape (16:9): baseline ~80–120px above the
|
||
bottom edge. Portrait (9:16): lower-middle, ~ 600–700px from the bottom (clear of platform UI).
|
||
- **Title-safe margins:** keep text within ~90% width / inside any letterbox-pillarbox bars
|
||
(see the letterbox probe). Never flush to the frame edge.
|
||
- **One caption group on screen at a time.** No accumulation, no cascade — that's embed-track behaviour.
|
||
- It rides above the subject; the matte does **not** occlude it (rail = in front).
|
||
|
||
## Lines, length, timing
|
||
|
||
- **≤ 2 lines.** Broadcast target ~ 32–42 chars/line; break at a clause/phrase boundary, never
|
||
mid-word, never leave a dangling 1-word line.
|
||
- **Word-synced.** Each group's window envelops its words (`group.in ≤ first word.start`,
|
||
`group.out ≥ last word.end`); each group ≥ 0.5s on screen; ~1.5s min gap discipline so it
|
||
doesn't strobe. Word timings within 80ms of transcript (same gate as everywhere).
|
||
- **Grouping** = short readable phrases (see [caption-grouping.md](caption-grouping.md)) — not the
|
||
embed track's "phrase = composition" rule; here it's just legible subtitle chunking.
|
||
|
||
## Look (restrained on purpose)
|
||
|
||
- **Size: ~`calc(0.045 * var(--h))`** (≈48px @1080, ≈58px @1290) — readable, _not_ hero. The rail is a subtitle; it is deliberately much smaller than the embed body/climax. Express as a `var(--h)` fraction (never hardcode px) so it scales across resolutions. The embed climax is sized to the frame independently (see composition-craft § POP) — **never** size the climax as a multiple of this rail.
|
||
- One clean sans (Inter / Helvetica Now / Neue Haas), weight 500–600; white (or near-white).
|
||
- **Legibility without grading the video:** a tight text treatment local to the glyphs only —
|
||
a soft dark drop-shadow, or a subtle rounded gradient pill / 30–40% scrim **sized to the text
|
||
box** (not a full-frame bar, never a frame-wide grade). On luminance > 180 backgrounds, keep
|
||
the scrim; never rely on bare light text.
|
||
- Motion is minimal: 150–250ms fade-up in / fade-down out. No glitch, no scale-pop, no per-word
|
||
choreography on the rail — that energy is reserved for embed.
|
||
|
||
## The `emphasis` flag (active-word highlight)
|
||
|
||
The only intensity the rail carries. When a word is graded `emphasis` (the 1–2 punch words in a
|
||
phrase), give it an **inline** lift on the rail — accent colour and/or +weight, optionally a
|
||
karaoke-style active-word pop (≤1.1× scale) as it's spoken. Keep it inline; it does **not**
|
||
leave the rail. Anything that wants to leave the rail is an `embed`, not an emphasis.
|
||
|
||
## What the rail never does
|
||
|
||
- Never goes behind the subject (that's embed).
|
||
- Never accumulates into a multi-line poem (that's embed).
|
||
- Never crosses the face / uses occlusion as an effect.
|
||
- Never grades or textures the underlying video.
|
||
- Doesn't drop content to "fit fewer blocks" — split into more groups instead. The only drops
|
||
are filler (um/uh, exact stutters, self-corrections); dense conversational `narrator` glue
|
||
("you know", "sort of") may be trimmed for readability, content/structure words stay.
|
||
|
||
## Hand-off to embed
|
||
|
||
Rail + embed coexist in one render: the rail runs the whole clip; an embedded peak appears over
|
||
it at its moment (the rail can briefly clear or dim under the embed if they'd collide). Decide
|
||
which phrases promote via the role read in SKILL.md § Caption model; author the promoted ones
|
||
with [composition-craft.md](composition-craft.md).
|