Summary
validate-strict is failing on main (run for 22673ba, 2026-08-29T02:03)
for an environmental reason, not a code change. The NCBITaxon SQLite database
download returns zero bytes on the runner:
Downloading ncbitaxon.db.gz: 0.00B [00:00, ?B/s]
so communitymech.validators.ncbi_domain._adapter() returns None, domain_of
returns None for everything, and the assertions that depend on it fail:
tests/test_ncbi_domain_scope.py:63 assert False is True
tests/test_ncbi_domain_scope.py:115 NO_GTDB_EQUIVALENT on an in-scope taxon
tests/test_ncbi_domain_scope.py:138 assert None == 'NCBITaxon:2'
tests/test_prokaryotic_lineage.py:48 AssertionError: []
It is new, and it is on main
$ gh run list --branch main --workflow validate-strict.yaml
08-29T02:03 22673ba failure <-- and 22673ba passed as a PR
08-28T08:26 2031b7e success
08-28T07:35 4a65c99 success
08-28T06:49 d11d1ad success
08-27T19:16 80b882c success
The five runs before it succeeded, so the download broke some time between
08-28T08:26 and 08-29T02:03. Any PR opened now inherits a red validate-strict
that has nothing to do with its contents — which is how a real failure gets
waved through as "the flaky one".
Why it can happen at all
validate-strict.yaml has no actions/cache step:
$ grep -c actions/cache .github/workflows/validate-strict.yaml
0
$ grep -c actions/cache .github/workflows/label-correspondence.yaml
1
label-correspondence caches ~/.data/oaklib across runs; validate-strict
re-downloads the NCBITaxon database every time and has nothing to fall back on.
So the lane that runs the whole test suite is the one with no protection against
the download it depends on.
The library code is already correct about this — domain_of's docstring says
None covers "no adapter, a lookup failure, and a taxon above every domain",
and outside_gtdb_scope is deliberately one-directional so a caller "may
downgrade on False but must never upgrade on it". tests/test_ncbi_domain_scope.py
even has test_an_unavailable_adapter_degrades_rather_than_guesses. It is the
other tests in those modules that assume the adapter is present.
Two fixes, and they are not alternatives
- Cache OAK in
validate-strict, as label-correspondence already does.
Removes most occurrences; does not help a cold cache or an upstream outage.
- Make the adapter-dependent assertions skip, with a reason, when the adapter
is unavailable — asserting a lookup result without the lookup is not a test
of anything. This must be done carefully: a blanket skip would hide a real
regression, so the skip should be narrow and label-correspondence (which
caches, and therefore usually has the adapter) stays the lane that genuinely
exercises it.
Doing only (1) leaves the suite red whenever the download fails. Doing only (2)
leaves every run paying for a download it could have cached.
Acceptance test
With the network to the OAK download blocked, uv run pytest tests/ reports
skips with a stated reason rather than failures, and a run with the cache warm
exercises the assertions normally.
Summary
validate-strictis failing onmain(run for22673ba, 2026-08-29T02:03)for an environmental reason, not a code change. The NCBITaxon SQLite database
download returns zero bytes on the runner:
so
communitymech.validators.ncbi_domain._adapter()returnsNone,domain_ofreturns
Nonefor everything, and the assertions that depend on it fail:It is new, and it is on main
The five runs before it succeeded, so the download broke some time between
08-28T08:26 and 08-29T02:03. Any PR opened now inherits a red
validate-strictthat has nothing to do with its contents — which is how a real failure gets
waved through as "the flaky one".
Why it can happen at all
validate-strict.yamlhas noactions/cachestep:label-correspondencecaches~/.data/oaklibacross runs;validate-strictre-downloads the NCBITaxon database every time and has nothing to fall back on.
So the lane that runs the whole test suite is the one with no protection against
the download it depends on.
The library code is already correct about this —
domain_of's docstring saysNonecovers "no adapter, a lookup failure, and a taxon above every domain",and
outside_gtdb_scopeis deliberately one-directional so a caller "maydowngrade on False but must never upgrade on it".
tests/test_ncbi_domain_scope.pyeven has
test_an_unavailable_adapter_degrades_rather_than_guesses. It is theother tests in those modules that assume the adapter is present.
Two fixes, and they are not alternatives
validate-strict, aslabel-correspondencealready does.Removes most occurrences; does not help a cold cache or an upstream outage.
is unavailable — asserting a lookup result without the lookup is not a test
of anything. This must be done carefully: a blanket skip would hide a real
regression, so the skip should be narrow and
label-correspondence(whichcaches, and therefore usually has the adapter) stays the lane that genuinely
exercises it.
Doing only (1) leaves the suite red whenever the download fails. Doing only (2)
leaves every run paying for a download it could have cached.
Acceptance test
With the network to the OAK download blocked,
uv run pytest tests/reportsskips with a stated reason rather than failures, and a run with the cache warm
exercises the assertions normally.