Skip to content

spec(automation): owner_voice_reel -- the 15 s owner-voice reel recipe as data (Closes #10279) - #10281

Merged
gHashTag merged 1 commit into
masterfrom
spec/owner-voice-reel-10279
Oct 18, 2026
Merged

gHashTag merged 1 commit into
masterfrom
spec/owner-voice-reel-10279

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

Closes #10279

What

specs/automation/owner_voice_reel.t27 (module owner_voice_reel) holds the recipe of the 2026-10-18 15 s vertical reel in the owner's voice. Until now its numbers lived only in lab-only JS glue (caps.mjs, frames.mjs, fc.txt on the Railway lab):

  • 30 fps, 15 s total, 3 s CTA hold, voice offset 400 ms;
  • captions at y = 1600, because the slide rows occupy y = 1100-1400; yellow 0xFFFF00, one word per caption;
  • caption font size = min(124, 940 / (len * 0.72)), in integers (940000 / (len * 720));
  • a word shows until min(next start, end + 350 ms);
  • music at volume 0.10, fade-in 0.6 s, fade-out from 13.6 s;
  • voice loudness target I = -15 LUFS (TP -1.5, LRA 7) before the mix; limiter at 0.89.

The measured reel is data in the spec: the 21 whisper word timings, each caption's length in characters, and the font size the lab drew each caption at. The Russian words themselves stay out of the ASCII file; the layout needs only their lengths.

Tests (lab only, never the Mac)

t27c test-report at 043cdea, zig 0.16.0, on the Railway lab:

  • 8 of 8 tests pass, 0 vacuous (every test ran runtime asserts); 3 invariants proved at comptime.
  • the_voice_ends_before_the_cta_hold: 10.16 s from 0.4 s ends at 10.56 s; 11.6 s is the longest voice that fits, and 11.601 s is refused.
  • captions_never_overlap_on_the_lab_reel and overlapping_timings_are_refused: the 21 real windows never overlap and end before the hold; out-of-order, zero-length and past-the-hold timings are refused. The windows equal three of fc.txt's enable ranges exactly.
  • font_sizes_match_the_lab_reel: 21 of 21 font sizes match fc.txt, 0 mismatches.
  • Invariant the_caption_clears_the_slide_rows: the tallest caption with its border starts below y = 1400 and ends inside the frame.

9 planted mutants, 9 caught: dropping the next-start clamp, tail 350 to 450, offset 400 to 900, char width 720 to 700, font cap 124 to 130, caption y 1600 to 1450 (fails at compile), fade-out 13.6 s to 14 s, CTA hold 3 s to 2 s, and <= to < in voice_fits.

Recorded, not hidden

  • Caption 7 of the reel was two words (a preposition with its noun). The spec keeps it as drawn, and one_word_per_caption counts it and allows no other.
  • In this reel every pause was shorter than the 350 ms tail, so the tail decided only the last word. A synthetic case tests the tail on its own.
  • No host reads the spec yet. The lab glue still carries its own copy of the numbers until it is regenerated from this file. The reel itself is not posted.

This PR does not claim a review.

🤖 Generated with Claude Code

…e as data (Closes #10279)

The 2026-10-18 reel in the owner's voice (T27F deck frames, 999 voice-clone,
999 whisper captions, ffmpeg on the lab) was decided by lab-only JS glue.
Its numbers and rules now live in specs/automation/owner_voice_reel.t27:

- 30 fps, 15 s, 3 s CTA hold, voice offset 400 ms;
- captions at y = 1600 (the slide rows occupy 1100-1400), 0xFFFF00, one word
  each; font size min(124, 940 / (len * 0.72)) in integers;
- a word shows until min(next start, end + 350 ms);
- music at 0.10, fade-out from 13.6 s; voice normalised to I = -15 LUFS.

The measured reel's 21 word timings, lengths and drawn font sizes are data in
the spec; the tests hold the formula to all 21 fc.txt font sizes and to three
of its enable windows. One recorded deviation (caption 7 was two words) is
counted, not hidden.

Lab (t27c at 043cdea, zig 0.16.0): 8 of 8 tests pass, 0 vacuous, 3
invariants proved at comptime. 9 planted mutants, 9 caught.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-18 07:27:31 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 49
PRs with All Checks Green 1
READY 0
FAILING 49
PENDING 0
NO CHECKS YET 0

These columns do not partition: 0 + 49 + 0 + 0 = 49, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=0f8c66b9ed0e != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec(automation): owner_voice_reel -- the 15 s owner-voice reel recipe as data, not lab-only glue

1 participant