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 |