Skip to content

validate-strict is red on main: it downloads the NCBITaxon DB every run, with no cache, and the download now returns 0 bytes #704

Description

@realmarcin

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

  1. Cache OAK in validate-strict, as label-correspondence already does.
    Removes most occurrences; does not help a cold cache or an upstream outage.
  2. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions