Repository navigation
t27f: R4e -- mode 5 cards stay inside one scene, token_floor_mux takes a caller window (Closes #10628) - #10647
Merged
Merged
Conversation
…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>
…ock's cuts, on whole frames (Closes #10603) lesson_reel.t27 gains: - beat_xfade_frame: the last base frame at or before c - BEAT_HALF_MS. - beat_solo_frames: a floor on how many frames each beat shows alone. - beat_graph: inputs 0..2 (the open, main and close scene clips), crossfaded with xfade at offset beat_frame_ms(f) in AV_TIME_BASE, then trimmed to 450 frames. - LR_MODE=4, which prints the graph and refuses a voice that does not fit, as mode 3 does. Tests: 17/17 pass, 0 vacuous. - New: every cut from 1250 to 13500 ms lands on its frame. - New: the offset for every frame 0..450 selects that frame. - New control: an offset rounded up misses 300 of 451 frames. - New: on R4a's voice grid, every beat keeps MIN_SCENE_FRAMES whole frames, except the counted early case. Measured with ffmpeg 5.1 on the Railway lab, on solid-colour inputs, 450 frames each: - 1300/4200/6800 ms: runs 50 / 332 / 38. - 2500/8000/9000 ms: runs 88 / 235 / 98. - 200/1500/13100 ms: runs 28 / 30 / 362. - 9000/9000/9000 ms: refused. Every run equals beat_solo_frames, with one extra frame when the offset falls on a whole ms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r runs (Refs #10603) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… LR_MODE=5 (Closes #10609) lesson_reel.t27: - graph() takes a beats flag. With it, the picture is the beat chain over inputs 0..2 instead of input 0, and the voice and music inputs move past the three clips (3..5 and 6). - beat_graph() is now beat_chain() plus its [v] label, so mode 5 goes on filtering the same stream. - beat_video_inputs / beat_voice_input / beat_music_input number the inputs. - LR_MODE=5 prints both orientations and refuses a voice that does not fit. Tests: 19/19 pass, 0 vacuous. New: every input from the picture to the music is used exactly once in both layouts. New control: without beats the inputs are mode 3's. Regression on the Railway lab: 96 graphs (4 lessons, 2 languages, 4 voices; mode 3 against master and the beat-graph branch, mode 4 against the beat-graph branch) are byte-identical. Mode 5 rendered with ffmpeg 5.1 from solid-colour clips, sine phrases and music. Tall and wide each give 450 frames and 15.000 s of audio. Pixels outside the text run 50 red, 332 green and 38 blue frames, which equals beat_solo_frames for 1300/4200/6800 ms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…th cmp, and three lab traps (Refs #10609) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… clock (Refs #10609) specs/skills/t27-reel-beat.t27 is a spec-only skill card, in the same shape as the four t27-social-visual cards from #10570. It points at specs/t27f/lesson_reel.t27 (beat_* functions, LR_MODE=4 and LR_MODE=5) and copies none of it. It does not cite reel_factory.t27: lesson_reel does not read the scene plan yet, and the card says so. Railway lab: 1/1 test, 9 runtime asserts, 0 vacuous. Seal saved and verified. t27b's front end accepts it (x86 lab: JIT-only CRASH, as for t27-self-host), so the ledger row is pass. The ledger row sits between providers-steward and self-host. That keeps it one line away from the four rows #10613 adds after self-host, so the two PRs do not conflict. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ress on a beat crossfade (Closes #10614) LR_MODE=5 now takes every caption, tag and address window from the beat clock, on whole frames. beat_scene_lo/hi give the frames each scene owns outside its crossfades; beat_piece_lo/hi clip an overlay to them; beat_piece_kept drops a piece with no room (fewer than BEAT_OVERLAY_MIN_FRAMES and not the whole overlay) instead of squeezing it; and print_pieces prints exactly those frames as between(n,lo,hi) terms. Modes 3 and 4 print the same bytes as before. Railway lab: - t27c test-report: 25/25, 0 vacuous; seal saved and verified. - The grid test covers every lesson, both languages and every voice the clock accepts: 85437 asserts that no enabled frame is on a crossfade. A control shows mode 3's windows over mode 4's cuts put the goal's first caption on one. - Regression: 216 graphs (modes 3 and 4, 27 lessons, 2 languages, 2 voices) cmp equal to the #10610 binary. - ffmpeg, mode 5 rendered from solid-colour clips, both orientations: a 40-row band over the captions shows text on 405 frames and on 0 of the 30 crossfade frames; the tag band, 404 and 0. Costs, named in tests and the header: a short caption whose scene ends under it is dropped (every phrase keeps one); on a voice the reel speeds up the address is held for less than REEL_CTA_MIN_MS; the cards are still on their own frames, since token_floor_mux prints their enable. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… is dropped, and two lab traps (Refs #10614) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ndows # Conflicts: # .claude/skills/t27f/SKILL.md # .trinity/seals/t27f_lesson_reel.json # specs/t27f/lesson_reel.t27
…ed at BEAT_CUT1_LAST_MS (Closes #10629) On a voice that runs long the reel speeds it up so the address starts at REEL_MS - REEL_CTA_MIN_MS, but the beat clock centred crossfade 1 on that start, so the close beat owned fewer than 45 frames and mode 5 held the address for less than REEL_CTA_MIN_MS. beat_cut_ms now caps cut 1 at BEAT_CUT1_LAST_MS = 13249, the latest cut whose close beat still owns 45 frames (one ms later it owns 44). Tests: the bound itself with a +1 ms control; every lesson, both languages, every grid voice the clock accepts holds the address for the floor; the cost -- on a moved cut crossfade 1 starts under the task's last words, by at most 184 ms, and lesson 1's measured voice is one of them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rd printer takes a caller window (Closes #10628) In LR_MODE=5 the captions, tags and address were clipped to their scene's own frames, but the cards kept token_floor_mux's enable= and rose in under crossfade 1 (frames 393..404 on lesson 1's voice). token_floor_mux: print_ramp, print_rise_from and print_alpha take the window; print_rise(o, c, dy) and print_fade(c) are thin wrappers that pass CARD_ON, so token_floor_mux's own graph is byte-identical. lesson_reel: with beats a card is clipped with beat_piece_* like a caption, dropped when no piece is kept, rises from its first kept frame and fades out on its last (new beat_last_hi); card_hi clamps CARD_ON's 450 to the reel's last frame. Modes 3 and 4 are unchanged. Tests: card windows and beat_last_hi; every lesson, both languages, every voice the clock accepts puts no card piece on a crossfade, with a control that token_floor_mux's own windows do meet one (lesson 1's last card from frame 392 under crossfade 1 at 389, moved to 405). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d-window # Conflicts: # .claude/skills/t27f/SKILL.md # .trinity/seals/t27f_lesson_reel.json # specs/t27f/lesson_reel.t27
This was referenced Oct 18, 2026
Contributor
Owner
Author
|
Pixel evidence beyond lesson 1 is in #10675 (Closes #10651). With this PR's binary, a whole-frame colour count on every crossfade frame of mode 5 covered 27 lessons x 2 languages x 3 voices x 2 orientations: 324 renders, 10368 frames, 0 flagged. The #10632 binary used as a control was flagged on 162 of 162 renders. |
gHashTag
added a commit
that referenced
this pull request
Oct 18, 2026
Closes #10651) (#10675) Whole-frame colour count on every crossfade frame of every lesson, language, voice and orientation with PR #10647's binary: 10368 frames, 0 flagged. The #10632 control is flagged on 162 of 162 renders. Adds the method and four ffmpeg lab traps (-nostdin, pids.max thread caps, lavfi duration format, pkill leaving children). Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #10628
#10632 (R4f), which this PR was stacked on, is merged; master is merged in (4eb371d), so the diff is R4e alone plus the sar_comparator ledger row from #10650.
What was wrong
In
LR_MODE=5the captions, tags and address were clipped to their own scene's frames (R4d), but the cards were not. They kept token_floor_mux'senable=between(n,CARD_ON...), so on lesson 1's measured voice the last card rose in on frame 392, three frames into crossfade 1 (389..404).The change
print_ramp(lo, hi),print_rise_from(o, lo, dy)andprint_alpha(lo, hi)now take the window.print_rise(o, c, dy)andprint_fade(c)are thin wrappers that passCARD_ON, so token_floor_mux's own graph prints the same bytes as before. lesson_reel is its only importer.beat_piece_*, the same function the captions use, and is dropped when no piece is kept.beat_last_hi).card_hiclampsCARD_ON's last frame, 450, to the reel's last frame, 449.Evidence (Railway lab)
t27c test-reporttoken_floor_muxt27c test-reportlesson_reel--verifyall hashes MATCH; the spec sha256 values in the seals equal the committed files@sin. lesson_reel:[*:0]const u8, env_num,@sin. These are the same constructs the base already had; nothing new.cmptoken_floor_mux's own graph (tall + wide)cmplesson_reel mode 3, 27 lessons x 2 languages x 3 voices, against #10632's binarycmpmode 4cmpmode 5451-n->450-n). The sampled diffs, lesson 1 with three voices, touch only the cards'y=,alpha=andenable=(for examplen-392->n-405); I did not check the other 159 line by line.The pixel check crops a full-width band from the card label's top to below the second code line. It splits the raw video per frame and counts distinct colours per frame. A crossfade between two solid clips is one colour, so more than one colour means text is in the band.
Not followed
The issue's Queen-appended second "Success Criteria" section names commands that do not exist:
t27c test ... --grid cards, and an ffmpegdrawtextwithfontfile=/dev/nullthat would draw text rather than detect it. This PR meets the first, human-written Success Criteria instead: the test-report, the grid test with a control, the cmp runs, and the ffmpeg band.Not checked
cmp, not by pixels.🤖 Generated with Claude Code