# v2.30.0 — the release that measured its own claims

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

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

176 commits. The theme is uncomfortable and worth stating plainly: a great deal of what
YazSes said about itself had never been checked against what it does. Not lies — nobody
wrote a false number on purpose. Values that were true once and then quietly stopped being
true, claims copied from an assumption, defaults nobody had ever scored. Each was
individually invisible, because the thing that would have noticed did not exist.

So this release mostly consists of measuring, and then repairing what the measurements
found.

## Speaker labels were wrong, and nobody had checked

Meeting Mode and `yazses transcribe --diarize` have labelled who said what since v2.11.
That labelling had **never been scored against annotated audio**. It is now, on AMI:

| | Old shipped default | Now |
|---|---|---|
| DER (collar 0), four-meeting subset | **84.09%** | **28.55%** |
| Speakers found in a four-person room | 81 to 257 | 4 |

Missed speech and false alarm barely moved between those columns — the segmentation was
finding the speech all along. What collapsed was *who said it*: 68% of scored time went to
the wrong speaker, because the clustering split four people into up to 257 clusters. A
transcript in that state is not "somewhat inaccurate"; it is unreadable, and that is what
the feature was shipping.

The default is fixed, and on the full AMI test split auto-clustering now scores **26.71%
DER**. Along the way the sweep that found it had to be fixed too — its range excluded the
answer, which reads exactly like "nothing helps" — and the harness learned to record which
machine produced a number, since it turns out not to be portable.

## Seventeen capabilities that existed and could not be reached

`yazses features` listed them. The config keys were real. The code was written and tested.
There was simply no caller, so enabling them did nothing and the feature page said "not
possible yet". Seventeen are now wired end to end — among them `yazses fileopen`,
`yazses jump`, whole-utterance undo/redo, and meeting recovery for a post-pass that never
finished. The count of capabilities that are wired rather than merely present moved from
85 to **102**.

## What we hand people said the opposite of what the code does

- **`pip install yazses[all]` was eight extras short of "all"** — no denoise, no Chinese
  script normalisation, no Silero VAD, no Moonshine, no EMG band, no MCP agent, no pyannote
  diarization. Two separate guards exempted `all` on the grounds that it is an aggregate;
  neither computed the aggregate.
- **The example config three packagers install** set `model = "tiny.en"` against a default
  of `base.en`, and `max_record_seconds = 90` — the ceiling that had been *raised* because
  90 was cutting long dictations off. Copying the file we ship re-introduced the bug that
  raised it. The README's own block was further out: a silence gate twelve times more
  sensitive than the default, handed to every reader of the front page.
- **Flathub advertised 2.29.0 and installed 2.18.2** — eleven releases apart. The guard
  that kept the store listing current made the stale half *harder* to notice, because the
  visible number was always right.
- **Parakeet was documented as four times whisper-small's speed.** It is about twice.
- **The `silero` VAD backend documented itself as avoiding torch.** It requires torch and
  torchaudio unconditionally: choosing it downloads ~3.0 GB, most of it the NVIDIA CUDA
  stack, onto a CPU-only tool. The cost is now stated where the choice is made.
- **Three benchmark claims had never been measured**, and the WER page could only measure
  the easy half of what it was warning you about. `--split test-other` exists now, so "your
  real-world error rate will be worse" is a number instead of a caveat.

## Nothing but DEBUG may carry what you said

A privacy pass with a rule attached, and a test that enforces it: no log level a normal
install runs at may contain your transcript. `yazses report` promised "never transcripts"
and would have included them at DEBUG. `redact_patterns` scrubbed the text and kept the
audio clip, which nothing said. The egress inventory — the guard that is supposed to know
every outbound path — could not see the SSH tunnel that carries your dictation to a remote
host, and no surface told you that dictation was leaving the machine at all.

## The daemon stopped refusing to start

A typo in `macros.toml`. An invalid regex in `redact_patterns`. **One** non-UTF-8 byte in
`vocabulary.txt`, which broke every dictation burst. Each of these stopped a working
install dead, and each is now a reported problem with a working daemon behind it.

## Also

`yazses meeting --speakers`, because the setting that mattered most was unreachable from
the command line. Diarization now says so when speaker labels cannot be people rather than
inventing them. `doctor` explains what a redaction pattern does and does not cover. The
status poll stopped re-reading the package version five times a second. Subtitles wrap
instead of running to 80 characters. And `yazses tune` no longer calls a proposal
"validated" on 4% corroboration.

The full list — every change, with the reasoning — is in
[CHANGELOG.md](https://github.com/MSKazemi/yazses/blob/main/CHANGELOG.md).
