Skip to content

check: line_unread reports every text chunk of a closing card as "the film's last line" #7709

Open

Description

@wonjangcloud9

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 an elements-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

  1. added
    bugSomething isn't working
    triage/needs-designEvidence is adequate; desired behavior or scope needs a maintainer decision.
    difficulty/mediumBounded work requiring subsystem knowledge, related paths, or additional regression fixtures.
    on Nov 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdifficulty/mediumBounded work requiring subsystem knowledge, related paths, or additional regression fixtures.triage/needs-designEvidence is adequate; desired behavior or scope needs a maintainer decision.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions