# v2.29.0 — forty-three things that were quietly wrong

**Released 2026-08-19.** Upgrade:

```sh
sudo snap refresh yazses     # snap
pipx upgrade yazses          # or: uv tool upgrade yazses
```

Sixty-two commits, and only one of them adds a feature. The rest are corrections, and
they share a shape worth naming: almost none of these produced an error. They produced a
**confident wrong answer** — a command that printed success and changed nothing, a
transform that corrupted the sentence it was asked to improve, a check that certified
hardware it had never actually listened to.

That is what makes them expensive. A crash gets reported. A silent wrong answer gets
believed, and the person believing it is usually the one who can least afford to check.

## Diagnostics that certified things they had not tested

`yazses verify` walked the whole chain — capture, silence gate, transcription, injection —
and reported it healthy for a **microphone that was hearing nobody**. It also certified a
chain the daemon then discards. `yazses doctor` claimed voice window focus works while the
feature was switched off, and printed two entirely different checks both labelled
"Microphone". When a silent-clip streak did occur, the advice it offered led to a dead end.

If you have ever run `doctor`, seen green, and still had nothing typed — this is why.

## Text transforms that damaged ordinary writing

Every one of these fired on prose that was never a command:

- `yazses reflow` cut **"Firstly"** down to **"ly"**, and never stripped a filler.
- The grammar fixer turned **"an FBI agent"** into **"a FBI agent"**.
- Autopair appended a stray apostrophe to **"it's"**.
- Dictating *"look at the dot com boom"* produced **"look@the.com boom"**.
- Inline compute replaced whole sentences with a number.
- Self-repair deleted a word out of ordinary speech.
- *"undo that sentence"* deleted the entire burst when it ended in a full stop.
- `yazses acronyms expand` corrupted a document when run twice.
- Enabling `[translit]` transliterated **every English sentence** into Persian.
- An acronym and a Title-Case word produced identical braille.
- `yazses screenplay` — none of its documented forms worked when spoken.
- `yazses case` required a colon you cannot dictate.

## Commands that reported success and did nothing

`yazses corpus status` showed a size with nothing to compare it against — a number is not
an answer to "am I near the cap". `mic-level --set` could tell you it had written the
threshold when it had not. Approving
**one** `tune` proposal changed **two** settings. `tune` also offered to prime Whisper with
its own hallucinations, and to delete the word "this" from every dictation you make. In
remote mode, **every voice command was a silent no-op**.

## Meetings

Re-enrolling a participant destroyed the first voiceprint without saying so. A single brace
in a summary threw away the whole set of minutes. A crashed meeting's recovery transcript
was unreadable — and unmentioned. `srt`/`vtt` merged two speakers into one caption and
dropped their names, and diarized transcripts could attribute words to the wrong speaker
outright.

## Safety and privacy, where the guard was the thing that was wrong

- `redact_patterns` scrubbed **four of the six** stored text fields.
- A destructive-command pattern in the command-safety guard **could never fire**.
- An LLM rewrite could change a number and pass the guard written to catch exactly that.
- `yazses audio use` could write a `config.toml` that does not parse.
- A negative `vad_threshold` was type-correct, catastrophic, and reported as valid.

## Notifications finally behave like notifications

Every failure toast went out at `critical` urgency, which the freedesktop spec exempts from
expiry — so a dictation burst that merely failed to inject left a pop-up that outranked
everything on the desktop and waited for a click it had no button to receive. Now the level
follows whether the toast is answerable: informational ones clear themselves, and only the
one offering **[Prepare a bug report]** persists. Together with 2.28.0's fix for the
orphaned `notify-send` process, that closes both halves of the same defect.

## Added

Spoken separators in branch names — `dash`, `hyphen`, `underscore`, `dot` — so
`gitvoice` can hear a branch name with punctuation in it.

Full detail in the [changelog](https://github.com/MSKazemi/yazses/blob/main/CHANGELOG.md).
