Skip to content

The prose example stops asking for line breaks - #35

Merged
bojieli merged 2 commits into
mainfrom
fix/prose-stops-adding-line-breaks
Sep 6, 2026
Merged

bojieli merged 2 commits into
mainfrom
fix/prose-stops-adding-line-breaks

Conversation

@bojieli

@bojieli bojieli commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Prose is the seeded default, and it was the thing inserting the line breaks people were choosing prose to avoid.

prompt/dictation-style/prose.md ended with "and paragraph breaks where the speaker changed subject". The model obeys that at hesitation pauses rather than at subject changes, and in spontaneous speech those are mostly the same pauses. The dictation that surfaced it was 65 seconds of Mandarin that came back in 19 fragments, 8 of them splitting a sentence in half.

Measured on real dictations

eval/nearmiss scores spelling under screen context and says nothing about layout, so it cannot see this. Ten recordings were replayed from local history with the screen context each one originally carried, six passes per wording:

wording runs line breaks mid-sentence runs affected
...and paragraph breaks where the speaker changed subject. 60 82 26 24
...in one unbroken paragraph. Never emit a line break. 60 0 0 0

Clearing the box is not the fix, though it also gives no line breaks. On two of the five Mandarin recordings the model then dropped nearly all punctuation, down to 1.0 and 0.0 marks per hundred characters. The prose clause earns its place. Only its paragraph half was doing harm.

Naming the failure made it worse. A variant saying "never in the middle of a sentence" and "a pause is punctuation, never a line break" produced more mid-sentence breaks than the wording it was meant to fix. That is the effect already recorded in ContextEncoder.footer, where illustrating the rule with a concrete wrong value made substitution worse. The shipped wording does not mention line breaks as a mistake; it just stops asking for them.

Cost

None this suite can see. The new wording and the 0.6.0 default were run three passes each on the same day: 38 of 48 matched both times, regressed 2 against 3, inside the per-pass range the runner prints. Both runs are committed as scorecards so the grading can be re-checked without re-billing the suite, and dnt-eval rescore reproduces every count.

Also here

dnt transcribe --example, mirroring the flag dnt-eval already has. It is what made the table above possible without editing the setting the app dictates with while measuring it.

Note for anyone already on 0.6.0

The example box stores a copy of the preset's text and is seeded only once, so an existing install keeps the old sentence. Pressing Prose again in Settings replaces it.

🤖 Generated with Claude Code

bojieli and others added 2 commits September 6, 2026 22:14
dnt-eval has had this flag since the example box shipped, but it points at the
near-miss corpus. The question that actually comes up is narrower and about the
user's own speech: "my dictations have line breaks I did not ask for — which of
the words in my box is putting them there?" Answering it meant editing the
setting the app dictates with, running the hotkey, and editing it back, which
changes the thing being measured while measuring it.

The flag resolves the same three ways dnt-eval's does — a preset name, `none`,
or literal text — through the same builder, so a preset picks up the user's own
override of that file rather than the shipped copy. Nothing is written back:
this reads the box for one run, and the app goes on sending whatever it was
sending.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`prose.md` ended with "and paragraph breaks where the speaker changed subject".
Seeded into every new install since 0.6.0, that turned out to be an instruction
the model obeys at hesitation pauses rather than at subject changes — and in
spontaneous speech those are mostly the same pauses. A 65-second Mandarin
dictation came back in 19 fragments, 8 of them splitting a sentence in half.

Measured on real dictations, not on eval/nearmiss: that suite scores spelling
under screen context and says nothing about layout. Ten recordings replayed from
history with the screen context each originally carried, six passes per wording:
82 line breaks across 60 runs before, 0 across 60 after.

Clearing the box also gives no line breaks, and is not the fix. On two of the
five Mandarin recordings it dropped nearly all punctuation — 1.0 and 0.0 marks
per hundred characters. The prose clause earns its place; only its paragraph
half was doing harm.

A guarded variant naming the failure ("never in the middle of a sentence", "a
pause is punctuation, never a line break") produced *more* mid-sentence breaks
than the wording it was meant to fix. That is the effect already recorded in
ContextEncoder.footer, where illustrating the rule with a concrete wrong value
made substitution worse. The shipped wording does not mention line breaks as a
mistake; it just stops asking for them.

Near-miss cost: none this suite can see. The new wording and the 0.6.0 default
were run three passes each on the same day — 38/48 matched both times, regressed
2 against 3, inside the printed per-pass range. Both runs are committed as
scorecards so the grading can be re-checked without re-billing the suite. The
control doubles as the re-measurement PROMPT.md has owed since the box began
being seeded.

Existing installs keep the old sentence: the box stores a copy and is seeded
only once. Pressing Prose again replaces it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@bojieli
bojieli merged commit b2cba25 into main Sep 6, 2026
13 checks passed
@bojieli
bojieli deleted the fix/prose-stops-adding-line-breaks branch September 6, 2026 14:31
@bojieli bojieli mentioned this pull request Sep 6, 2026
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