Skip to content

Record that incremental transcription was not built, and why - #12

Merged
bojieli merged 3 commits into
mainfrom
incremental-conclusions
Aug 25, 2026
Merged

Record that incremental transcription was not built, and why#12
bojieli merged 3 commits into
mainfrom
incremental-conclusions

Conversation

@bojieli

@bojieli bojieli commented Aug 25, 2026

Copy link
Copy Markdown
Owner

Why

docs/INCREMENTAL.md currently recommends engaging the live segmenter at 45 s and cutting every 30 s, taking it from 8% to 20% of dictations. That was written before the measurements that mattered, and it is now wrong in the direction that would cost users quality.

What the measurements said

Segmenting does not recover content. Ten recordings, 136–312 s, whole vs Silero-policy segments, no screen context:

whole 3.5 segmented 3.5 whole 3.6
content, chars/s 7.79 7.64 7.77
divergence from reference 0.120 0.129
closer to reference 7/10 3/10

segmenting recovered >15% more text on 0/10 recordings. Six Mandarin recordings were consistently worse.

The maintainer reviewed the disagreements by ear and preferred whole-file. 258 aligned differences judged against the audio — the only ground truth in the investigation.

So blanket segmentation trades a frequent small quality loss for protection against a rare large one, and the rare one now has a direct fix in the model (#8). Bad trade.

What it actually found

gemini-3.5-flash silently truncates long recordings — 6 runs in 10 on one 90-second clip, returning fluent text missing two thirds of what was said. Nothing noticed, because HallucinationGuard's rate ceiling is a maximum and 1.1 chars/second passes it from below.

The near-miss suite is structurally blind to this. Its cases are short clips; truncation only happens on long audio. It reported 3.6 ahead by 4 points — inside its own noise — when the real margin was 0 truncations against 6 in 10. That blind spot is the most reusable lesson here and it now leads the document: ask what a suite cannot see before citing it.

What changed in the doc

  • Opens with what was proposed, what survived, and the bug — instead of a design pitch for something that should not be built.
  • The body/tail split, rolling context, the whole policy and the aggressive live policy are removed as recommendations and kept only as recorded rejections.
  • The scorer fix and the Silero boundary source are re-stated against the policy that actually ships, not the proposed one, with the Silero trade (better seams, longer final chunk) and the reason it is not yet shipped.
  • Four more entries in Mistakes already made against this code, each of which cost real time here: trusting a suite outside what it measures, a Latin-only tokenizer on Mandarin, a synthetic fixture with less pause than real speech, and C# record structs ignoring primary-constructor defaults.

Documentation only.

🤖 Generated with Claude Code

https://claude.ai/code/session_015XKX6zEAGiZFE5wAxJgYbV

The document recommended engaging the live segmenter at 45 seconds and
cutting every 30, taking it from 8% to 20% of dictations. That was written
before the measurements that mattered, and it is now wrong in the direction
that would cost users quality.

Segmenting does not recover content: 0 of 10 long recordings gained more
than 15% more text, six Mandarin recordings were consistently worse, and
the maintainer's review of 258 aligned disagreements preferred the
whole-file transcript. Blanket segmentation would trade a frequent small
quality loss for protection against a rare large one, and the rare one now
has a direct fix in the model.

What the investigation actually found was a silent data-loss bug —
gemini-3.5-flash truncating a long recording on 6 runs in 10, returning
fluent text missing two thirds of what was said — and that the near-miss
suite is structurally blind to it, because its cases are short clips and
truncation only happens on long audio. That blind spot is the most reusable
thing here and it is now stated first.

The body/tail split, the rolling context, the `whole` policy and the
aggressive live policy are all removed as recommendations and kept only as
recorded rejections, so nobody re-derives them.

Four more mistakes added to the list, each of which cost time: trusting a
suite outside what it measures, scoring a Mandarin transcript with a
Latin-only tokenizer, a synthetic fixture with less pause than real speech,
and assuming a C# record struct honours its primary constructor's defaults.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015XKX6zEAGiZFE5wAxJgYbV
bojieli and others added 2 commits August 25, 2026 18:03
This section said 'measured, not yet shipped'. It is shipped, so the
document would have contradicted the code the moment both landed.

Records what the streaming implementation costs, and the two edges that
were wrong on the first attempt: a still-open speech run has to count when
finding the newest gap, and fewer than two runs must hand the decision back
to the energy finder rather than refuse to cut.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015XKX6zEAGiZFE5wAxJgYbV
@bojieli
bojieli merged commit 8065d12 into main Aug 25, 2026
13 checks passed
@bojieli
bojieli deleted the incremental-conclusions branch August 25, 2026 10:37
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.

1 participant