Skip to content

Pathologies

Archive behaviours that lose data silently. One page each: the symptom, a curl reproducer, the affected accessions, what it is not, and the workaround.

Every page here has a matching test in tests/pathologies/ that asserts the bug still reproduces. Run them with uv run pytest -m pathology. A failure is good news — the archive fixed something.

Pathology Archive Effect
ELink gds→sra returns no links NCBI 25% of SRA-bearing series in a random sample report as having no sequencing data
GEO omits the SRA relation NCBI Samples with SRA data look like they have none
Shared umbrella BioProject NCBI Series with sequencing data record no BioProject, breaking project-based routing
SOFT names experiments with no runs NCBI A complete-looking experiment list resolves to zero downloadable files
BioStudies 20,000-hit window EBI Enumerating a collection hangs at 96.6%, retrying a permanent 500
ENA fastq omits the barcode read EBI 39.2% of runs. Downloads cleanly, checksums correctly, and every read is unassignable to a cell
SDRF URIs on a decommissioned mirror EBI Trusting them discards the real submission; two studies look identical and are not
BioSample efetch ignores the accession prefix NCBI id=SAMEA11294529 returns a rumen bacterium where a human liver sample was asked for, with HTTP 200
ZOOMA's filter forces a term EBI Constraining to an ontology selects which wrong answer you get, at confidence GOOD
ELink's MegaLink backend fails in bursts NCBI A backend message inside an HTTP 200 reads as "no links": 5,107 log lines on 2026-05-11, the dominant failure signal
ENA's fastq carries Lite qualities EBI 122 of 452 NCBI runs' ENA fastqs read ? for every quality, where NCBI serves real ones
ENA's fastq splits through the barcode read EBI Two files listed, every base present, and no read starts with a cell barcode (SRR14522447)
ENA lists a fastq it does not serve EBI 2 of 4,466 listed fastqs are empty directories behind a 301, listed with a size and an md5
ESummary refuses more than 500 UIDs NCBI The refusal arrives inside an HTTP 200 with no result, which reads as "nothing found"
SRA's ESummary buries its accessions NCBI Every accession is inside an XML string in the JSON; reading fields finds none
An IDF does not declare its ENA study EBI 551 of 20,693 ArrayExpress studies with an ENA link name none in the IDF
BioStudies lists 25 files by default EBI A study with 43 files appears to register 25, unless pagination.total is read
A series' BioProject holds more than the series NCBI 77 series get 5,115 experiments their SOFT file does not name, by asking for their project
One EFetch stops at 10,000 runs NCBI PRJEB14362's 46,468 runs come back as 5,387 from one request, with HTTP 200; the reason ENA once held "111,665 runs efetch never returns"
sra-db-be stops at 5,000 runs, and is cut off under load NCBI PRJEB82511's 7,263 runs come back as 10,000 rows of 5,000; under load an answer ends mid-row or is empty, with HTTP 200
[GPRJ] misses experiments its project holds NCBI PRJNA66167's SRX135150 names the project in every record and is not under PRJNA66167[GPRJ]: 1,100 runs in 2 projects
ELink gives a BioProject its siblings' runs NCBI PRJNA1033389's 8 runs come back as 80, with 72 from projects under the same umbrella: 607 runs in 22 projects
BioStudies answers 404 for a file it holds EBI E-MTAB-13459's IDF answers 404 at its address and 200 on the mirror: 328 of 3,000 ArrayExpress IDFs on 2026-10-26
An SDRF split across two files EBI E-GEOD-29264 has no .sdrf.txt; its IDF names a hyb and a seq SDRF. Every SDRF route failed 9 of 3,000 studies. Not a fault in the archive

Known, declared, and not yet written up

None, since 2026-10-26. A route can declare a behaviour it exhibits before that behaviour has a page, and such a slug goes in PATHOLOGY_BACKLOG in graph.py rather than being left implicit: --explain names it and says "not yet written up" instead of offering a path to a file that does not exist. Three tests keep the backlog honest:

  • a declared slug must be a page or a backlog entry;
  • a written page must leave the backlog;
  • a page no route declares is a warning the resolver can never issue.

Reporting upstream

A pathology page is not finished until it can be handed to the archive. Drafts live in upstream/, each with the command that regenerates its affected-accession list, so a report is current on the day it is filed rather than on the day it was written.

Retired: declared once, not reproduced

A declared behaviour that no longer reproduces is retired here, with the date and how it was checked, rather than left declared on a route as a claim nothing supports.

Slug Archive Retired Why
gprj-falls-through-to-all-fields NCBI 2026-10-26 No [GPRJ] search fell through. The 24 projects where [GPRJ] and ELink disagree, the 22 [GPRJ] still finds empty, and an accession that does not exist all kept [GPRJ] in their query translation; the empty ones answer phrasesnotfound. What does go wrong is narrower, and ELink's opposite.
sra-be-timeout-on-large-projects NCBI 2026-10-23 It rested on one ReadTimeout, PRJEB9859's in the 2026-05 script survey. On 2026-10-23 all three named projects answered in full on both sra-db-be routes. What large projects meet is a 5,000-run cap and cut-off answers under load, now written up.
superseries-carries-no-bioproject GEO 2026-10-23 Of 400 seeded series of the reprocessed corpus, 62 are SuperSeries, and all 62 carry their own BioProject relation. The SubSeries are the ones that often carry none (GSE287249's three siblings, GSE201855's), and the SuperSeries is where their project is found. Nothing measured the claim as written.
elink-history-missing-querykey NCBI 2026-10-23 In 2026-05, 27 BioProjects got an ELink cmd=neighbor_history answer with no usable querykey (docs/bioproject2geo_troubleshooting.md). On 2026-10-23 all four named examples (PRJNA1214811, PRJNA1088541, PRJNA672686, PRJNA1169288) answered with a querykey, from UIDs and from an ESearch history alike. The routes use cmd=neighbor, which needs no history, so nothing depended on it.