v2.15.1 — err is a verb¶
Released 2026-08-07. Upgrade:
A patch release with two fixes, both of which came from tightening something that had been left loose.
Dictation stopped deleting "err"¶
err shipped in the default [filters.disfluency] filler_words — a reasonable-looking entry, since people do write "err, I'm not sure". It is also an ordinary English verb, and disfluency filtering is on by default, so ordinary dictation quietly lost a real word:
"To err is human" → "To is human" ❌ before
"Err on the side of caution" → "on the side of caution" ❌ before
Both are correct now.
This was not part of the sentence-initial filler chain fixed in v2.15.0, and none of those fixes touched it — "To err is human" is lowercase and mid-utterance, so plain filler removal did it, with no capitalisation guard or position-0 rule involved. It had been there the whole time.
The principle applied is the one settled in #120: deleting a real word from someone's dictation is worse than leaving a filler in. If you genuinely say "err" as a hesitation and want it stripped, add it back:
Contract 4.0.0 → 5.0.0 — shared text behaviour changed, so the golden vectors were regenerated and the Android port inherits the fix.
The type gate is real now, and it found a crash¶
mypy src had been carrying a 73-error backlog across 21 files. A gate that is always red cannot tell a new mistake from the pile, so it was not a gate at all. It is now zero errors, and ruff covers scripts/ too — it had silently drifted out of scope and was hiding two errors nobody could see.
Almost all 73 were annotation debt rather than defects. One was real: yazses update did " ".join(status.command) where command is list[str] | None. It is None for any install method that has no upgrade recipe. Today detect_install_method() only returns snap/uv/pipx/pip, so it was unreachable — but APT is a shipped install channel, and the day an apt branch is added it would have raised a TypeError instead of a helpful message. It now names the install method that has no automatic upgrade and exits non-zero, with a regression test verified to fail without the guard.
Upgrading¶
Nothing to do beyond upgrading. No configuration changes, no migration. If you had worked around the err bug by editing filler_words, your edit still applies — remove err from your list only if you want the new default behaviour.