# v2.19.0 — the tray can finally answer the questions you ask it

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

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

## About, Help and Check for updates in the tray menu

The tray menu ended at daemon control, so the three questions you have *at the icon* — what
version am I running, where are the docs, is there a newer release — could only be answered
in a terminal (`yazses about`, `yazses update`), which is exactly what a tray user does not
have open. All three are now menu entries, on **Linux, macOS and Windows**:

- **About YazSes** — version, tagline and clickable Website / Source / Issues links, from
  the same `branding.contact_lines()` block `doctor` prints.
- **Help ▸** — Documentation, Troubleshooting, Report a bug…, each opening the page in your
  browser.
- **Check for updates…** — asks PyPI or your snap channel, then offers **Install now** when
  the upgrade can run without a password. A snap install is shown `sudo snap refresh yazses`
  to run in a terminal instead: launched from a tray click there is nowhere to type a
  password, so an Install button there would hang invisibly. The check runs on a worker
  thread — a 5-second network lookup on the UI loop would freeze the icon and the menu with
  it.

Windows had shipped a `Help` entry wired to nothing (`enabled=False`); it is now real. The
cross-OS parity test written for #63 was generalised from `Settings…` to every shared label,
including the wiring check that would have caught that placeholder.

## Three shipped commands were missing from the CLI reference

`docs/cli-reference.md` documented 55 of the 58 commands the CLI actually ships. `gitvoice`,
`fileopen` and `jump` were absent — all three appeared in the generated
`docs/command-index.md`, so the gap was only visible by diffing the generated index against
the hand-written reference.

The reference is hand-written on purpose (example-first, grouped like the CLI's own `--help`
panels), and the cost of that choice is exactly this. It is now guarded:
`tests/test_cli_reference_covers_every_command.py` asserts against the **live Click tree**,
not against the generated index — a stale index would agree with a stale reference and both
would pass.

Also documented: the **Voice Undo/Redo timeline** (`[timeline]`, off by default). The
voice-command reference had only the `undo` command, which sends Ctrl+Z; the timeline is a
different mechanism that steps back over what YazSes itself injected. Reading the old page, a
user would reasonably conclude "undo two words" sent Ctrl+Z twice.

## The roadmap's headline numbers were stale again

`ROADMAP.md` claimed **141 capabilities (74 wired / 67 planned)** and **3049 tests**; the
registry and the suite say **144 (79 / 65)** and **4005**. The same counts in
`docs/mobile/index.md` were stale *and* did not add up (68 + 72 ≠ 141).

That file already carried a note that these numbers had gone stale once before, "each one
understating what had actually shipped". They did it again, in the same direction. So the fix
is not just the numbers: the two commands that re-derive them from `yazses.system.features`
and from `pytest` now sit beside them, and the text says to re-derive rather than edit.

## Arch and Fedora get real packages

Both built and installed on clean containers rather than asserted — the AUR package and a
Fedora/RHEL package, each proven end to end before shipping. The Nix flake, which had never
been evaluated and did not evaluate, now does.

## Also

- **The CLI demo now plays in the docs site** (#23) instead of only linking out
- **Build provenance on every release artifact**
- **Three bugs found by actually running Meeting Mode** (#48)
- **The BSD row on the platform-support page** stopped claiming an install that fails, and
  the advisory FreeBSD CI job stopped timing out — contributed by
  [@mercael91](https://github.com/mercael91) ([#307](https://github.com/MSKazemi/yazses/pull/307))
- **Obsidian, Zed, GNOME Terminal, Firefox, Thunderbird and VS Code app profiles**, plus
  harness claims withdrawn where the harness — not the app — turned out to be at fault
- **The Android skeleton's architecture rules verified by breaking them on purpose**

The full list for this release is in
[CHANGELOG.md](https://github.com/MSKazemi/yazses/blob/main/CHANGELOG.md).
