<!-- GENERATED by scripts/campaign.py --generate. Do not edit by hand. -->
# Open contributor tasks

**130 open** of 929 in the inventory · 90 need no Python · 40 work in a browser container · 70 need your own machine.

You do not need permission and nothing is assigned. Pick one, say so on the linked
issue so nobody doubles up, and open the PR. A coding agent is welcome — you remain
the author, and you are expected to have read every line you send.

`Risk` is who reviews it, not how hard it is: **L0** schema-only, **L1** bounded
docs/config, **L2** bounded code.

## compatibility (28)

| Task | ID | Risk | Time | Needs | Validate with |
|---|---|---|---|---|---|
| Report YazSes on Ubuntu 24.04 + GNOME Wayland, installed via snap | `COMPAT-001` | L0 | 25 min | GNOME Wayland, Ubuntu 24.04, snap | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + GNOME Wayland, installed via pipx | `COMPAT-002` | L0 | 25 min | GNOME Wayland, Ubuntu 24.04, pipx | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + GNOME Wayland, installed via apt | `COMPAT-003` | L0 | 25 min | GNOME Wayland, Ubuntu 24.04, apt | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + GNOME Wayland, installed via uv tool | `COMPAT-004` | L0 | 25 min | GNOME Wayland, Ubuntu 24.04, uv tool | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + GNOME X11, installed via snap | `COMPAT-005` | L0 | 25 min | GNOME X11, Ubuntu 24.04, snap | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + GNOME X11, installed via pipx | `COMPAT-006` | L0 | 25 min | GNOME X11, Ubuntu 24.04, pipx | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + GNOME X11, installed via apt | `COMPAT-007` | L0 | 25 min | GNOME X11, Ubuntu 24.04, apt | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + GNOME X11, installed via uv tool | `COMPAT-008` | L0 | 25 min | GNOME X11, Ubuntu 24.04, uv tool | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + KDE Wayland, installed via snap | `COMPAT-009` | L0 | 25 min | KDE Wayland, Ubuntu 24.04, snap | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + KDE Wayland, installed via pipx | `COMPAT-010` | L0 | 25 min | KDE Wayland, Ubuntu 24.04, pipx | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + KDE Wayland, installed via apt | `COMPAT-011` | L0 | 25 min | KDE Wayland, Ubuntu 24.04, apt | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + KDE Wayland, installed via uv tool | `COMPAT-012` | L0 | 25 min | KDE Wayland, Ubuntu 24.04, uv tool | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + KDE X11, installed via snap | `COMPAT-013` | L0 | 25 min | KDE X11, Ubuntu 24.04, snap | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + KDE X11, installed via pipx | `COMPAT-014` | L0 | 25 min | KDE X11, Ubuntu 24.04, pipx | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + KDE X11, installed via apt | `COMPAT-015` | L0 | 25 min | KDE X11, Ubuntu 24.04, apt | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + KDE X11, installed via uv tool | `COMPAT-016` | L0 | 25 min | KDE X11, Ubuntu 24.04, uv tool | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + sway, installed via snap | `COMPAT-017` | L0 | 25 min | Ubuntu 24.04, snap, sway | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + sway, installed via pipx | `COMPAT-018` | L0 | 25 min | Ubuntu 24.04, pipx, sway | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + sway, installed via apt | `COMPAT-019` | L0 | 25 min | Ubuntu 24.04, apt, sway | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + sway, installed via uv tool | `COMPAT-020` | L0 | 25 min | Ubuntu 24.04, sway, uv tool | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + Hyprland, installed via snap | `COMPAT-021` | L0 | 25 min | Hyprland, Ubuntu 24.04, snap | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + Hyprland, installed via pipx | `COMPAT-022` | L0 | 25 min | Hyprland, Ubuntu 24.04, pipx | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + Hyprland, installed via apt | `COMPAT-023` | L0 | 25 min | Hyprland, Ubuntu 24.04, apt | `uv run python scripts/check-compatibility.py` |
| Report YazSes on Ubuntu 24.04 + Hyprland, installed via uv tool | `COMPAT-024` | L0 | 25 min | Hyprland, Ubuntu 24.04, uv tool | `uv run python scripts/check-compatibility.py` |
| Report YazSes on macOS 15 Sequoia, installed via pipx | `COMPAT-DESKTOP-001` | L0 | 25 min | macOS 15 Sequoia, pipx | `uv run python scripts/check-compatibility.py` |
| Report YazSes on macOS 15 Sequoia, installed via Homebrew | `COMPAT-DESKTOP-002` | L0 | 25 min | Homebrew, macOS 15 Sequoia | `uv run python scripts/check-compatibility.py` |
| Report YazSes on macOS 14 Sonoma, installed via pipx | `COMPAT-DESKTOP-003` | L0 | 25 min | macOS 14 Sonoma, pipx | `uv run python scripts/check-compatibility.py` |
| Report YazSes on macOS 26, installed via pipx | `COMPAT-DESKTOP-004` | L0 | 25 min | macOS 26, pipx | `uv run python scripts/check-compatibility.py` |

## app-profile (20)

| Task | ID | Risk | Time | Needs | Validate with |
|---|---|---|---|---|---|
| Add a tested example config for VS Code | `APP-001` | L1 | 30 min | VS Code | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for VS Code (Remote-SSH) | `APP-002` | L1 | 30 min | VS Code (Remote-SSH) | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Cursor | `APP-003` | L1 | 30 min | Cursor | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Neovim | `APP-004` | L1 | 30 min | Neovim | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Vim | `APP-005` | L1 | 30 min | Vim | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Emacs | `APP-006` | L1 | 30 min | Emacs | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Helix | `APP-007` | L1 | 30 min | Helix | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Zed | `APP-008` | L1 | 30 min | Zed | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Sublime Text | `APP-009` | L1 | 30 min | Sublime Text | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for JetBrains IntelliJ | `APP-010` | L1 | 30 min | JetBrains IntelliJ | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for JetBrains PyCharm | `APP-011` | L1 | 30 min | JetBrains PyCharm | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for JetBrains WebStorm | `APP-012` | L1 | 30 min | JetBrains WebStorm | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Android Studio | `APP-013` | L1 | 30 min | Android Studio | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Xcode | `APP-014` | L1 | 30 min | Xcode | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Eclipse | `APP-015` | L1 | 30 min | Eclipse | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for NetBeans | `APP-016` | L1 | 30 min | NetBeans | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for RStudio | `APP-017` | L1 | 30 min | RStudio | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Jupyter Lab | `APP-018` | L1 | 30 min | Jupyter Lab | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for Spyder | `APP-019` | L1 | 30 min | Spyder | `uv run python scripts/check-app-profile.py` |
| Add a tested example config for kitty | `APP-020` | L1 | 30 min | kitty | `uv run python scripts/check-app-profile.py` |

## localization (10)

| Task | ID | Risk | Time | Needs | Validate with |
|---|---|---|---|---|---|
| Translate README module 1 (Landing) into German | `I18N-DE-M1` | L1 | 30 min | a text editor | `uv run python -m pytest tests/test_contributors_wall.py -q` |
| Translate README module 1 (Landing) into Spanish | `I18N-ES-M1` | L1 | 30 min | a text editor | `uv run python -m pytest tests/test_contributors_wall.py -q` |
| Translate README module 1 (Landing) into French | `I18N-FR-M1` | L1 | 30 min | a text editor | `uv run python -m pytest tests/test_contributors_wall.py -q` |
| Translate README module 1 (Landing) into Portuguese, Brazilian | `I18N-PTBR-M1` | L1 | 30 min | a text editor | `uv run python -m pytest tests/test_contributors_wall.py -q` |
| Translate README module 1 (Landing) into Chinese, Simplified | `I18N-ZHCN-M1` | L1 | 30 min | a text editor | `uv run python -m pytest tests/test_contributors_wall.py -q` |
| Translate README module 2 (Quick Start) into German | `I18N-DE-M2` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_contributors_wall.py -q` |
| Translate README module 2 (Quick Start) into Spanish | `I18N-ES-M2` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_contributors_wall.py -q` |
| Translate README module 2 (Quick Start) into French | `I18N-FR-M2` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_contributors_wall.py -q` |
| Translate README module 2 (Quick Start) into Portuguese, Brazilian | `I18N-PTBR-M2` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_contributors_wall.py -q` |
| Translate README module 2 (Quick Start) into Chinese, Simplified | `I18N-ZHCN-M2` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_contributors_wall.py -q` |

## contract-vector (20)

| Task | ID | Risk | Time | Needs | Validate with |
|---|---|---|---|---|---|
| Add a semantic contract vector: self-correction rolls back the right span | `VEC-DYSFLUENCY-011` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: a stutter is not a repeat word | `VEC-DYSFLUENCY-012` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: filler removal keeps a meaningful 'like' | `VEC-DYSFLUENCY-013` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: 'I mean' as correction vs idiom | `VEC-DYSFLUENCY-014` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: restart mid-clause | `VEC-DYSFLUENCY-015` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: repeated word that IS intended | `VEC-DYSFLUENCY-016` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: trailing 'um' removed | `VEC-DYSFLUENCY-017` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: 'sorry, I meant' rollback | `VEC-DYSFLUENCY-018` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: false start before a name | `VEC-DYSFLUENCY-019` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: hesitation inside a code identifier | `VEC-DYSFLUENCY-020` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: negation is never dropped | `VEC-SAFETY-001` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: hedging survives | `VEC-SAFETY-002` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: a refusal is not softened | `VEC-SAFETY-003` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: 'not' inside a subordinate clause | `VEC-SAFETY-004` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: double negation | `VEC-SAFETY-005` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: a conditional stays conditional | `VEC-SAFETY-006` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: quantity words are exact | `VEC-SAFETY-007` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: 'never' vs 'not always' | `VEC-SAFETY-008` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: a warning keeps its force | `VEC-SAFETY-009` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |
| Add a semantic contract vector: an instruction is not turned into a suggestion | `VEC-SAFETY-010` | L0 | 25 min | a text editor | `uv run python -m pytest tests/test_contract_vectors.py -q` |

## feature-wiring (10)

| Task | ID | Risk | Time | Needs | Validate with |
|---|---|---|---|---|---|
| Wire the `acoustic_profiles` capability so it is reachable from the daemon or CLI | `WIRE-ACOUSTIC-PROFILES-001` | L2 | 90 min | python | `uv run python -m pytest tests/test_features_write_targets.py -q` |
| Wire the `affect` capability so it is reachable from the daemon or CLI | `WIRE-AFFECT-001` | L2 | 90 min | python | `uv run python -m pytest tests/test_features_write_targets.py -q` |
| Wire the `agent` capability so it is reachable from the daemon or CLI | `WIRE-AGENT-001` | L2 | 90 min | python | `uv run python -m pytest tests/test_features_write_targets.py -q` |
| Wire the `audioguard` capability so it is reachable from the daemon or CLI | `WIRE-AUDIOGUARD-001` | L2 | 90 min | python | `uv run python -m pytest tests/test_features_write_targets.py -q` |
| Wire the `autostop` capability so it is reachable from the daemon or CLI | `WIRE-AUTOSTOP-001` | L2 | 90 min | python | `uv run python -m pytest tests/test_features_write_targets.py -q` |
| Wire the `bookmarks` capability so it is reachable from the daemon or CLI | `WIRE-BOOKMARKS-001` | L2 | 90 min | python | `uv run python -m pytest tests/test_features_write_targets.py -q` |
| Wire the `breath` capability so it is reachable from the daemon or CLI | `WIRE-BREATH-001` | L2 | 90 min | python | `uv run python -m pytest tests/test_features_write_targets.py -q` |
| Wire the `bridge` capability so it is reachable from the daemon or CLI | `WIRE-BRIDGE-001` | L2 | 90 min | python | `uv run python -m pytest tests/test_features_write_targets.py -q` |
| Wire the `checkdigit` capability so it is reachable from the daemon or CLI | `WIRE-CHECKDIGIT-001` | L2 | 90 min | python | `uv run python -m pytest tests/test_features_write_targets.py -q` |
| Wire the `cmdsafety` capability so it is reachable from the daemon or CLI | `WIRE-CMDSAFETY-001` | L2 | 90 min | python | `uv run python -m pytest tests/test_features_write_targets.py -q` |

## measurement (12)

| Task | ID | Risk | Time | Needs | Validate with |
|---|---|---|---|---|---|
| Measure a USB headset in a quiet room with `yazses mic-level` | `MIC-001` | L0 | 15 min | a USB headset, a quiet room | `uv run python -m pytest tests/ -q` |
| Measure a USB headset in an open-plan office with `yazses mic-level` | `MIC-002` | L0 | 15 min | a USB headset, an open-plan office | `uv run python -m pytest tests/ -q` |
| Measure a USB headset in with a fan or AC running with `yazses mic-level` | `MIC-003` | L0 | 15 min | a USB headset, with a fan or AC running | `uv run python -m pytest tests/ -q` |
| Measure a USB headset in with music playing with `yazses mic-level` | `MIC-004` | L0 | 15 min | a USB headset, with music playing | `uv run python -m pytest tests/ -q` |
| Measure a USB headset in on a train or in a cafe with `yazses mic-level` | `MIC-005` | L0 | 15 min | a USB headset, on a train or in a cafe | `uv run python -m pytest tests/ -q` |
| Measure a USB headset in with a mechanical keyboard with `yazses mic-level` | `MIC-006` | L0 | 15 min | a USB headset, with a mechanical keyboard | `uv run python -m pytest tests/ -q` |
| Measure a laptop built-in array in a quiet room with `yazses mic-level` | `MIC-007` | L0 | 15 min | a laptop built-in array, a quiet room | `uv run python -m pytest tests/ -q` |
| Measure a laptop built-in array in an open-plan office with `yazses mic-level` | `MIC-008` | L0 | 15 min | a laptop built-in array, an open-plan office | `uv run python -m pytest tests/ -q` |
| Measure a laptop built-in array in with a fan or AC running with `yazses mic-level` | `MIC-009` | L0 | 15 min | a laptop built-in array, with a fan or AC running | `uv run python -m pytest tests/ -q` |
| Measure a laptop built-in array in with music playing with `yazses mic-level` | `MIC-010` | L0 | 15 min | a laptop built-in array, with music playing | `uv run python -m pytest tests/ -q` |
| Measure a laptop built-in array in on a train or in a cafe with `yazses mic-level` | `MIC-011` | L0 | 15 min | a laptop built-in array, on a train or in a cafe | `uv run python -m pytest tests/ -q` |
| Measure a laptop built-in array in with a mechanical keyboard with `yazses mic-level` | `MIC-012` | L0 | 15 min | a laptop built-in array, with a mechanical keyboard | `uv run python -m pytest tests/ -q` |

## docs (10)

| Task | ID | Risk | Time | Needs | Validate with |
|---|---|---|---|---|---|
| Write a reproducible troubleshooting page: recovering microphone permissions on macOS | `DOC-001` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_docs_frontmatter.py -q` |
| Write a reproducible troubleshooting page: recovering input permissions on Wayland | `DOC-002` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_docs_frontmatter.py -q` |
| Write a reproducible troubleshooting page: choosing a Whisper model for a low-RAM machine | `DOC-003` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_docs_frontmatter.py -q` |
| Write a reproducible troubleshooting page: running YazSes fully air-gapped | `DOC-004` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_docs_frontmatter.py -q` |
| Write a reproducible troubleshooting page: using YazSes over Remote-SSH in VS Code | `DOC-005` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_docs_frontmatter.py -q` |
| Write a reproducible troubleshooting page: when dictation types into the wrong window | `DOC-006` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_docs_frontmatter.py -q` |
| Write a reproducible troubleshooting page: diagnosing 'Silent audio -- discarding' end to end | `DOC-007` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_docs_frontmatter.py -q` |
| Write a reproducible troubleshooting page: running two audio devices | `DOC-008` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_docs_frontmatter.py -q` |
| Write a reproducible troubleshooting page: using YazSes inside a container | `DOC-009` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_docs_frontmatter.py -q` |
| Write a reproducible troubleshooting page: dictating into a VM guest | `DOC-010` | L1 | 45 min | a text editor | `uv run python -m pytest tests/test_docs_frontmatter.py -q` |

## packaging (10)

| Task | ID | Risk | Time | Needs | Validate with |
|---|---|---|---|---|---|
| Verify the Snap install path on x86-64 | `PKG-001` | L0 | 20 min | Snap, x86-64 | `uv run python -m pytest tests/ -q` |
| Verify the Snap install path on arm64 | `PKG-002` | L0 | 20 min | Snap, arm64 | `uv run python -m pytest tests/ -q` |
| Verify the PyPI via pipx install path on x86-64 | `PKG-003` | L0 | 20 min | PyPI via pipx, x86-64 | `uv run python -m pytest tests/ -q` |
| Verify the PyPI via pipx install path on arm64 | `PKG-004` | L0 | 20 min | PyPI via pipx, arm64 | `uv run python -m pytest tests/ -q` |
| Verify the PyPI via uv tool install path on x86-64 | `PKG-005` | L0 | 20 min | PyPI via uv tool, x86-64 | `uv run python -m pytest tests/ -q` |
| Verify the PyPI via uv tool install path on arm64 | `PKG-006` | L0 | 20 min | PyPI via uv tool, arm64 | `uv run python -m pytest tests/ -q` |
| Verify the APT repo install path on x86-64 | `PKG-007` | L0 | 20 min | APT repo, x86-64 | `uv run python -m pytest tests/ -q` |
| Verify the APT repo install path on arm64 | `PKG-008` | L0 | 20 min | APT repo, arm64 | `uv run python -m pytest tests/ -q` |
| Verify the winget install path on x86-64 | `PKG-009` | L0 | 20 min | winget, x86-64 | `uv run python -m pytest tests/ -q` |
| Verify the winget install path on arm64 | `PKG-010` | L0 | 20 min | arm64, winget | `uv run python -m pytest tests/ -q` |

## qa-fixture (5)

| Task | ID | Risk | Time | Needs | Validate with |
|---|---|---|---|---|---|
| Turn into a minimal failing test: streaming character duplication (#153) | `QA-001` | L2 | 60 min | python | `uv run python -m pytest tests/ -q` |
| Turn into a minimal failing test: a config file that crashes the loader | `QA-002` | L2 | 60 min | python | `uv run python -m pytest tests/ -q` |
| Turn into a minimal failing test: a voice grammar that matches a suffix it should not | `QA-003` | L2 | 60 min | python | `uv run python -m pytest tests/ -q` |
| Turn into a minimal failing test: an injection backend timing out on long text | `QA-004` | L2 | 60 min | python | `uv run python -m pytest tests/ -q` |
| Turn into a minimal failing test: a device change mid-recording | `QA-005` | L2 | 60 min | python | `uv run python -m pytest tests/ -q` |

## security-privacy (5)

| Task | ID | Risk | Time | Needs | Validate with |
|---|---|---|---|---|---|
| Document exactly which files leave the machine on `yazses report` (none) | `SEC-004` | L1 | 30 min | python | `uv run python -m pytest tests/ -q` |
| Add a redaction test for home paths in `yazses report` output | `SEC-001` | L1 | 40 min | python | `uv run python -m pytest tests/ -q` |
| Add a test that no log line can contain transcribed text | `SEC-002` | L1 | 40 min | python | `uv run python -m pytest tests/ -q` |
| Add a privacy regression test that the learning corpus stays encrypted at rest | `SEC-003` | L2 | 60 min | python | `uv run python -m pytest tests/ -q` |
| Add fuzz seeds for the voice-command grammar parser | `SEC-005` | L2 | 60 min | python | `uv run python -m pytest tests/ -q` |
