Skip to content

t27f: beat clock -- reel beats cut where the voice changes, crossfaded (Closes #10596) - #10598

Merged
gHashTag merged 2 commits into
masterfrom
claude/t27f-beat-clock
Oct 18, 2026
Merged

gHashTag merged 2 commits into
masterfrom
claude/t27f-beat-clock

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

Closes #10596 (R4a of epic #10560).

What

specs/t27f/lesson_reel.t27 gets a beat clock. For any millisecond or frame of a lesson reel it says which of the three beats from R7 (#10584) is on screen, and how much of each when two crossfade:

  • Cut 0 (open to main) is the goal phrase's start. A title too short to read holds it to a 1250 ms floor.
  • Cut 1 (main to close) is cta_from, the point where the address takes over.
  • Each cut is a crossfade of reel.t27's TRANSITION_FRAMES (500 ms at BASE_FPS), centred on the cut.
  • The main beat always keeps its own scene. If the voice reaches the address before 2750 ms, the open beat gives way. That happens at one grid point, 200/1500/13100 ms, where the task phrase is dropped.

Tests (13/13 pass on the Railway lab, 0 vacuous)

test asserts run
crossfade and floor are reel.t27's frame counts 3
lesson 1's measured cuts fall where the sentence changes 5
a short title holds the open beat to the floor 4
every beat alone for a scene's length: every lesson, both languages, 80 voices 15124
the three weights sum to 1000 at every 10 ms, each fades one way 15021
over 450 frames the beat changes exactly twice 2
control: fixed-thirds cuts land inside a spoken phrase 4

The grid test reaches all three outcomes: a full clock, a voice too short for an open scene (counted exactly), and a voice the rule refuses.

My first draft failed this test. Its grid never reached a voice the rule refuses, and it missed the dropped-task case, where the main beat would have been alone for only 950 ms.

Deviation from the issue

The issue names a new module specs/t27f/beat_clock.t27. That module was written and measured, but it cannot work. use t27f::lesson_reel::phrase_start (and cta_from, voice_fits) from another module comes back as UNRESOLVED ... ambiguous, not spliced, because token_floor_mux.t27 declares the same names. An explicit path does not disambiguate (#10556). So the clock lives inside lesson_reel.t27, where local declarations win, under beat_ names.

Ledger and seal

  • Seal saved and verified.
  • t27b: still blocked on type [N]T, as the existing row says.
  • max_not_pass is unchanged at 134.

Not done

Wiring the clock into the ffmpeg graph is R4b.

🤖 Generated with Claude Code

…s, crossfaded (Closes #10596)

R4a of epic #10560. lesson_reel.t27 gains a beat clock: cut 0 at the goal
phrase's start (held to a 1250 ms open floor), cut 1 at cta_from, each a
crossfade of reel.t27's TRANSITION_FRAMES centred on the cut. Seven tests:
frame constants, lesson 1's measured cuts, the short-title floor, a grid of
80 voices x every lesson x both languages (full clock, voice too short for an
open scene, refused), weights summing to 1000 at every 10 ms, exactly two
beat changes over 450 frames, and a fixed-thirds control that lands
mid-phrase.

The clock lives in lesson_reel.t27, not in the beat_clock.t27 module the
issue names: importing phrase_start or cta_from into another module leaves
them UNRESOLVED because token_floor_mux.t27 declares the same names, and
the splicer drops ambiguous imports even on an explicit path (#10556).

Lab: 13/13 tests pass, 0 vacuous; seal saved and verified. t27b still
blocked on type [N]T, as the ledger row already says; max_not_pass unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eel (Refs #10596)

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

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-18 19:38:06 UTC

Summary

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

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

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=fad12492937a != 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.

t27f: beat_clock.t27 -- the three beats cut on the voice (R4a of #10560)

1 participant