Repository navigation
Description
Context: I've been using HyperFrames every day for the past two weeks to make Korean Shorts and long-form videos, and it's been great to work with. This is one of a batch of things I ran into along the way (most came as small PRs from me today) — sorry for the pile-up, and thanks for your patience.
Describe the bug
When a film's last frame is an end card made of several text elements (a headline, a big number, its unit, a source line, a signature), line_unread reports each element as "the film's last line", with the same hold and the same 2 s rule each time. All of them come from one fact: the card is held too briefly.
Repro (hyperframes check --no-cache --json, 0.9.43): a 6 s film whose last 1.5 s is one card holding seven text blocks.
line_unread | #p3-pp0 | The film's last line "설계자" (1 word) is on screen 1.50 s …, under the 2.00 s a closing line needs …
line_unread | #p3-pp0 > div:nth-of-type(1) | The film's last line "코드는 코덱스" (2 words) is on screen 1.50 s …
line_unread | #k | The film's last line "UNTIL A 2ND ALERT SAID "FALSE ALARM"" (7 words) is on screen 1.50 s …
line_unread | #b | The film's last line "38" (1 word) is on screen 1.50 s …
line_unread | #u | The film's last line "MINUTES" (1 word) is on screen 1.50 s …
line_unread | #n | The film's last line "SENT 8:07 A.M. · CORRECTED 8:45 A.M. · FCC" (11 words) is on screen 1.50 s …, under the 2.85 s …
line_unread | #sig | The film's last line "— 간고" (1 word) is on screen 1.50 s …
(The parent/child pair #p3-pp0 / #p3-pp0 > div used to count the child's words twice. That part is a bug, fixed separately in #7705. The output above is with that fix.)
The same thing happened on a real Short, with four warnings for one closing card (#k, #b, #u, #n in compositions/e1.html).
Where
packages/cli/src/utils/craftAudit.ts, lineCandidates: every track whose last sighting is the latest sample is a finalLine. detectLineUnread then produces one finding per track, so a closing card yields one finding per text block.
Expected behavior
Lines that come on together and stay to the end are one closing card, so they get one finding. It would report the card's hold against the longest floor among its lines (here 2.85 s for the 11-word source line) and list the other lines, the way text_below_floor lists every element in one finding. A line that comes on later than the rest (a signature added 0.8 s before the end) still gets its own finding, because its hold is different.
Possible directions
- In
detectLineUnread, group final-line candidates whose refined start times are within one sample of each other. Anchor the group on the line with the highest floor and carry the others in anelements-style list (selector, text, words). - The message would name the count:
The film's closing card (7 lines) is on screen 1.50 s, under the 2.85 s its longest line "SENT 8:07 A.M. …" needs ….
Environment
hyperframes 0.9.43 (affa03b6), macOS arm64.
Activity