The default prompt tells the model never to write an em dash, so shipping them in our own strings and docs was a standard we did not hold ourselves to.
User-facing strings
Before
After
**Error** — {msg}
**Error:** {msg}
{status} — press ⏎ to stop
{status}. Press ⏎ to stop
Never — always reopen the last chat
Never (always reopen the last chat)
The last one also reads better next to its siblings, which are all bare phrases like "After 15 minutes".
Comments and README
Rewritten rather than having the dash swapped for a comma, so the sentences still read naturally. Two README table cells used a bare — to mean "no default"; those now say None.
Guard
src/__tests__/voice.test.ts fails if an em dash appears anywhere in the shipped source or in the README.
Comments are covered on purpose. Guarding only the UI strings means picking them out by hand, and a documented standard that depends on remembering to check drifts. Tests are excluded, because the unicode fixture in ollama.test.ts ("café ☕ — ok") needs one.
The guard was verified to actually fail and name the offending file before committing, since a test that cannot fail proves nothing.
Verification
173 tests across 12 files, tsc --noEmit, eslint . and vici build -o dist all clean. Setup screen checked visually after the sweep: connection still live and all preferences render.
The default prompt tells the model never to write an em dash, so shipping them in our own strings and docs was a standard we did not hold ourselves to.
## User-facing strings
| Before | After |
| --- | --- |
| `**Error** — {msg}` | `**Error:** {msg}` |
| `{status} — press ⏎ to stop` | `{status}. Press ⏎ to stop` |
| `Never — always reopen the last chat` | `Never (always reopen the last chat)` |
The last one also reads better next to its siblings, which are all bare phrases like "After 15 minutes".
## Comments and README
Rewritten rather than having the dash swapped for a comma, so the sentences still read naturally. Two README table cells used a bare `—` to mean "no default"; those now say `None`.
## Guard
`src/__tests__/voice.test.ts` fails if an em dash appears anywhere in the shipped source or in the README.
Comments are covered on purpose. Guarding only the UI strings means picking them out by hand, and a documented standard that depends on remembering to check drifts. Tests are excluded, because the unicode fixture in `ollama.test.ts` (`"café ☕ — ok"`) needs one.
The guard was verified to actually fail and name the offending file before committing, since a test that cannot fail proves nothing.
## Verification
173 tests across 12 files, `tsc --noEmit`, `eslint .` and `vici build -o dist` all clean. Setup screen checked visually after the sweep: connection still live and all preferences render.
The default prompt tells the model never to write an em dash, so shipping
them in our own strings and docs was a standard we did not hold.
Three user-facing strings changed:
- `**Error** — {msg}` becomes `**Error:** {msg}`
- `{status} — press ⏎ to stop` becomes `{status}. Press ⏎ to stop`
- `Never — always reopen the last chat` becomes `Never (always reopen the
last chat)`, which also reads better next to its siblings ("After 15
minutes" and friends)
Comments and README prose were restructured rather than having the dash
swapped for a comma, so they still read naturally. The two table cells
using a bare em dash to mean "no default" now say `None`.
A guard test fails if an em dash appears anywhere in the shipped source or
the README. Comments are covered on purpose: guarding only the UI strings
means picking them out by hand, and the rule then drifts. Tests are
excluded, because the unicode fixture in `ollama.test.ts` needs one.
Verified the guard actually fails and names the offending file before
committing, since a test that cannot fail proves nothing.
173 tests, tsc, eslint and vici build all clean.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The default prompt tells the model never to write an em dash, so shipping them in our own strings and docs was a standard we did not hold ourselves to.
User-facing strings
**Error** — {msg}**Error:** {msg}{status} — press ⏎ to stop{status}. Press ⏎ to stopNever — always reopen the last chatNever (always reopen the last chat)The last one also reads better next to its siblings, which are all bare phrases like "After 15 minutes".
Comments and README
Rewritten rather than having the dash swapped for a comma, so the sentences still read naturally. Two README table cells used a bare
—to mean "no default"; those now sayNone.Guard
src/__tests__/voice.test.tsfails if an em dash appears anywhere in the shipped source or in the README.Comments are covered on purpose. Guarding only the UI strings means picking them out by hand, and a documented standard that depends on remembering to check drifts. Tests are excluded, because the unicode fixture in
ollama.test.ts("café ☕ — ok") needs one.The guard was verified to actually fail and name the offending file before committing, since a test that cannot fail proves nothing.
Verification
173 tests across 12 files,
tsc --noEmit,eslint .andvici build -o distall clean. Setup screen checked visually after the sweep: connection still live and all preferences render.The default prompt tells the model never to write an em dash, so shipping them in our own strings and docs was a standard we did not hold. Three user-facing strings changed: - `**Error** — {msg}` becomes `**Error:** {msg}` - `{status} — press ⏎ to stop` becomes `{status}. Press ⏎ to stop` - `Never — always reopen the last chat` becomes `Never (always reopen the last chat)`, which also reads better next to its siblings ("After 15 minutes" and friends) Comments and README prose were restructured rather than having the dash swapped for a comma, so they still read naturally. The two table cells using a bare em dash to mean "no default" now say `None`. A guard test fails if an em dash appears anywhere in the shipped source or the README. Comments are covered on purpose: guarding only the UI strings means picking them out by hand, and the rule then drifts. Tests are excluded, because the unicode fixture in `ollama.test.ts` needs one. Verified the guard actually fails and names the offending file before committing, since a test that cannot fail proves nothing. 173 tests, tsc, eslint and vici build all clean.