[tool.wads.ci.install].extras defaults to empty, so declared test-time deps are silently never installed
The mechanism
CIConfig.install_extras (wads/ci_config.py:85) defaults to "", so CI runs
uv pip install -e . — core dependencies only. A repo that puts its test-time tooling in a
dev / test / testing extra and does not also declare
[tool.wads.ci.install] extras = "dev" gets a CI job that never installs it.
This does not announce itself. Depending on the tool, the test either errors on import, or —
worse — is silently skipped (pytest-asyncio absent means async tests are collected and
skipped rather than failed).
Fleet measurement
Across the locally-maintained wads-managed repos:
- 131 declare a
dev/test/testing extra and no [tool.wads.ci.install].extras.
- Most are false alarms:
run-tests-uv installs pytest (and pytest-cov when coverage
is on) itself, and ruff comes from the ruff actions. ~95 of the 131 list only
pytest/pytest-cov/ruff, so nothing is actually missing.
- ~22 are genuinely exposed — their extra carries tooling CI does not otherwise provide:
| repo |
never installed in CI |
dn |
pandas, pypdf, nbconvert, nbformat, openpyxl, mammoth, python-pptx, tabulate, html2text |
ayn |
pytest-asyncio, fastapi, pydantic, uvicorn, langserve |
nw |
pytest-postgresql, psycopg, psycopg_pool |
tonal |
music21, mido, dol, config2py |
hedger |
pytest-asyncio |
heed |
httpx, pytest-asyncio |
enlace_docker |
pytest-asyncio |
aix |
hypothesis |
xa |
httpx |
oa, article |
playwright |
tabled |
pyarrow, requests |
aw |
oa, openai |
scribed, denote |
soundfile |
ocracy |
pillow |
arioso |
numpy |
epythet |
hubcap, pandas |
yb |
muvid |
ek, ke |
ocracy |
typola |
jupyter, ipykernel |
Two were confirmed as live CI failures during the current repo-improvement rollout and fixed
by adding extras = "dev": i2mint/heed (collection error — httpx missing under
fastapi.testclient) and i2mint/enlace_docker (pytest-asyncio missing).
Why this is a wads problem, not 22 repo problems
The config is one line, so per-repo fixes are easy — but the failure mode is invisible, so
nobody discovers it until a test happens to fail loudly, and every new repo scaffolded with
a dev extra inherits the same hole. Suggested fixes, in preference order:
- Auto-detect. When
[tool.wads.ci.install].extras is unset and the project declares an
extra named dev/test/tests/testing/ci, install it. This matches what every one of
the 131 repos evidently intended. An explicit extras = "" remains the opt-out.
- Warn loudly in
read-ci-config when that combination is detected, so it shows up in
every CI log until fixed.
- At minimum, make
populate's generated pyproject.toml ship
[tool.wads.ci.install] extras = "dev" alongside the dev extra it already creates, so new
repos are consistent by construction.
Option 1 or 3 stops the bleeding; option 2 alone leaves the existing repos silently broken.
Found during the wads repo-improvement rollout.
[tool.wads.ci.install].extrasdefaults to empty, so declared test-time deps are silently never installedThe mechanism
CIConfig.install_extras(wads/ci_config.py:85) defaults to"", so CI runsuv pip install -e .— core dependencies only. A repo that puts its test-time tooling in adev/test/testingextra and does not also declare[tool.wads.ci.install] extras = "dev"gets a CI job that never installs it.This does not announce itself. Depending on the tool, the test either errors on import, or —
worse — is silently skipped (
pytest-asyncioabsent means async tests are collected andskipped rather than failed).
Fleet measurement
Across the locally-maintained wads-managed repos:
dev/test/testingextra and no[tool.wads.ci.install].extras.run-tests-uvinstallspytest(andpytest-covwhen coverageis on) itself, and ruff comes from the ruff actions. ~95 of the 131 list only
pytest/pytest-cov/ruff, so nothing is actually missing.dnaynnwtonalhedgerheedenlace_dockeraixxaoa,articletabledawscribed,denoteocracyariosoepythetybek,ketypolaTwo were confirmed as live CI failures during the current repo-improvement rollout and fixed
by adding
extras = "dev": i2mint/heed (collection error —httpxmissing underfastapi.testclient) and i2mint/enlace_docker (pytest-asynciomissing).Why this is a wads problem, not 22 repo problems
The config is one line, so per-repo fixes are easy — but the failure mode is invisible, so
nobody discovers it until a test happens to fail loudly, and every new repo scaffolded with
a
devextra inherits the same hole. Suggested fixes, in preference order:[tool.wads.ci.install].extrasis unset and the project declares anextra named
dev/test/tests/testing/ci, install it. This matches what every one ofthe 131 repos evidently intended. An explicit
extras = ""remains the opt-out.read-ci-configwhen that combination is detected, so it shows up inevery CI log until fixed.
populate's generatedpyproject.tomlship[tool.wads.ci.install] extras = "dev"alongside thedevextra it already creates, so newrepos are consistent by construction.
Option 1 or 3 stops the bleeding; option 2 alone leaves the existing repos silently broken.
Found during the wads repo-improvement rollout.