jatui

VideoAdvisors

Pure playback advisors ported from the extension: silence map, speaker pace, resume snapping, quiet listening, deep-link QR

Silence map (smart speed)

A 10-minute synthetic envelope, 1s bins: speech for 30s, silence for 12s, repeating. The advisor finds the gaps, qualifies them (≥0.35s after merging), pads them 0.08s inside, and reports the honest saving measured off the lead-trimmed windows — the number the UI may promise, never the naive covered × boost.

Gaps found
0
Covered
0.0s
Honest saving @ 2.2×
0s
boostAt(45s)
1×

Speaker pace (measured, not guessed)

WPM per speaker from whitespace-tokenised words over talk time, attributed at each segment's midpoint; ad reads are known and never attributed to a person. Rates even everyone out toward the talk-time-weighted median — anyone within ±7% is left exactly alone. The component's rate composer multiplies these; the advisor never writes playbackRate.

  • Ben 180 wpm · on pace
  • Ana 150 wpm → 1.2x
  • median: 180 wpm (talk-time weighted)

Resume at a sentence, never at a second

A stored 1000.0s snaps back to the nearest real boundary within 15s — closest wins, ties go to the more specific boundary. The label quotes the words you're walking back into; it never paraphrases.

stored: 1000.0s → snapped to 998s (sentence)
“picking up where Ana was saying “Now, if you look at the””
resumeLabel alone: “”

Quiet listening — how much, at each volume

amountFor rises as volume falls (smoothstep under the 0.35 knee) and holds a 0.35 floor after dark. The tone graph itself is createQuietChain — mos-5lzns.31 splices it into the audio graph; this module owns tone, never level.

volumedaynight floor
01.001.00
0.10.800.80
0.20.390.39
0.30.060.35
0.350.000.35
0.50.000.35
0.80.000.35
10.000.35

Deep-link QR (continue on phone)

qrMatrix encodes the deep link — versions 1–10, byte mode, all four ECC levels, zero dependencies, and the whole spec in readable source. qrCanvas renders it (in a browser; the demo shows the matrix the canvas would paint). Options degrade to defaults; unrepresentable text throws, because a QR that scans to a truncated URL is the one failure you can't take back.

██████████████      ██  ██  ██              ██████      ██  ██████████████
██          ██    ██  ██      ██████    ██████      ████    ██          ██
██  ██████  ██  ██  ██  ██    ████  ██    ██████    ██  ██  ██  ██████  ██
██  ██████  ██  ██            ██  ██    ██  ██  ██████  ██  ██  ██████  ██
██  ██████  ██  ██████  ██  ████████████████████  ██    ██  ██  ██████  ██
██          ██  ██      ██      ████    ██          ████    ██          ██
██████████████  ██  ██  ██  ██  ██  ██  ██  ██  ██  ██  ██  ██████████████
                ████        ████  ██████████████    ██████                
██  ██████████    ██  ████    ████    ██  ██  ██  ██████    ██████████    
██  ██  ██    ██      ████  ████  ████  ████  ████████        ██  ██  ██  
██████████████████    ████  ██████  ████  ██    ████  ██  ██████  ████████
██        ██  ████  ████    ████      ██████    ██  ██  ████████████    ██
    ██████████  ████████      ██  ██  ██    ████████      ████████  ██████
      ██████    ██████████████  ██  ████      ██        ██    ██      ██  
  ████      ██████████████    ██    ██  ██  ██        ██  ██  ██████  ████
    ████      ██  ████  ██████████    ██      ████          ██████    ████
  ████    ████  ██  ██    ██        ██  ██████    ██  ██  ████████  ██████
    ████      ██  ██  ████    ████            ████████  ██          ████  
██  ████  ████████████  ████            ██  ██    ████████    ██    ██████
████  ██  ██        ██  ██  ██  ██  ██    ████  ██      ██████  ██      ██
        ██  ██    ████████        ██    ██  ██  ██████  ██  ██  ██  ██    
██  ████  ██    ██  ██    ██    ████████████  ██        ██        ██      
██  ██    ██████  ██  ██      ██  ██      ██        ████████████████  ████
██████    ██          ██  ██████  ████  ████████      ██  ████████    ████
    ████  ████        ██████  ████        ██  ██  ██  ██  ████████  ██    
████      ██        ████    ████    ██  ██  ██████      ████  ██  ██      
██  ██████  ██    ████  ████  ████    ██    ██        ██████  ██  ██  ████
██    ██      ████  ████████  ██      ██████        ██                  ██
██    ██  ██████        ████  ██████  ████  ██████████████████████████████
                ████      ██    ██  ██████    ████  ██████      ████  ██  
██████████████          ██    ████  ██      ██  ██████  ██  ██  ██  ██████
██          ██  ██    ██  ██  ████    ████      ██      ██      ████  ████
██  ██████  ██  ██    ██  ██        ██████████    ████████████████  ██  ██
██  ██████  ██  ██        ██████████      ██  ████  ██    ████  ██  ██  ██
██  ██████  ██  ██  ████████      ██    ██████  ██      ██        ██  ████
██          ██    ██████    ██  ██        ████          ██  ██  ██      ██
██████████████  ██      ██        ████      ██    ████    ██    ██████████

37×37 modules (v5) for 68 bytes

The advisor doctrine

  • A disabled feature leaves no trace in the signal.
  • Nothing acts without something the user can see.
  • Measuring code is an advisor; the component decides and applies.
  • Every function returns a safe neutral value instead of throwing on malformed input — the QR capacity error is the one deliberate exception, because a plausible wrong URL is worse than a loud failure.