Rendered from CHANGELOG.md.
1.20.0 — 2026-10-12 (release R2026.25, every pass on every project)
- Every applicable annotation pass has now run on every project. New package table
gut_pass_coverage.csvlists, per project, whether full text, abstract, interventions, deep per-sample, supplementary tables, subject_id and study design ran; the release fails if a pass never ran without a recorded exception (7 exceptions, all subject coverage lowered by withheld contradictory ids). Gap-fill waves: full text (R3 + R3b) for 150 + 120 projects, abstracts (R4 + R4b) for 99, interventions for 58, supplementary tables for 80 + 148 retries + 505 projects whose supplements Europe PMC could not serve (now read from the PubMed Central open-access bucket), subject ids for 5 and study design for 8 projects; 22,984 new per-sample values from the bucket supplementary pass alone. - Self-contradictory metadata is withheld (red ! badge). When two sample-level sources give incompatible values (sex, country, antibiotics yes/no, ages more than 30 d and 20 % apart, BMI more than 2 apart, healthy control vs a disease) or one subject id's samples disagree on sex, neither value is published; both sides are in the new
gut_metadata_contradictions.parquet(8,853 rows, 8,303 samples, 140 projects; new gut_studies columnsn_contradicted_samples,contradiction_summary). - Scope: 95 projects moved out of the shotgun catalog. Projects whose median run is under 50 Mbp were read twice independently; the 95 that both readings call amplicon (78), targeted / enriched (16) or not reads (1) are owner decisions in config/registry_overrides.yaml (the registry keeps them with the reason). Catalog: 2,893 to 2,798 projects, 588,558 to 573,001 samples.
- Pooled BioSamples split by library. The lane-suffix rule no longer strips library numbers (G15-003-669 was read as lane 669), and a library sequenced in several runs is one sample: 40 BioSamples became 2,928 library units in 35 projects (PRJNA361402: 868 runs under one BioSample, now 861 samples).
- Longitudinal timing. Bare-number timepoints take a unit from the stated schedule (23 projects) and a visit-code timing pass mapped 616 visit codes to quoted day offsets (155 projects, 27,341 samples; axis
timepoint_mapped). Longitudinal projects with a resolved timeline: 542 to 635. One timing batch (100 projects) was stopped by the content filter and not retried. - Site: home-page globe (click a country to open its projects), redesigned Contribute table, relationship graphs for every family / setting / explicit relation, intervention I marker (solid = per-sample arms resolved, 202 of 913 intervention projects) with arm diagrams by trial design, solid / dotted L, R and I markers, red ! for contradictions, shallow runs shown in Mbp instead of 0.00 Gbp, and Atlas › Figures (the six resource-paper figures) replacing Observations.
1.19.1 — 2026-10-10 (release R2026.24, external annotation of the content-filter gap projects)
- Owner-run external annotation, verified on ingest. The 706 projects whose R2026.23 subject-id / relatedness batches were stopped by the content filter were annotated outside the pipeline by the owner (two independent readings per project with claude-haiku-4-5 and claude-sonnet-5; orchestration claude-opus-5) using the bundle
external_annotation_R2026_23.zip. On ingest every row was re-checked: catalog sample, project, gut site, no existing subject_id, and every quote re-fetched from the cited source (ENA description, Europe PMC abstract / full text, BioSample attributes, sample names). A first bundle quoted the catalog's own model-written short descriptions; those 2,707 rows were rejected and the bundle rules now forbid it. QA reports:data/inputs/gut/design/logs/external/. - subject_id: 46 projects gain ids (4,126 generated one-sample-per-person, 18 single-subject, 72 from BioSample attributes, 46 decoded from sample names + 29 timepoint labels); coverage 73.9 % → 74.6 %. Three projects rejected on ingest (PRJNA272371, PRJNA386422, PRJNA311208); PRJNA850529 (922 ids from a supplementary table) is held until Europe PMC serves the file for re-verification.
- Merged ids split: PRJEB108450 published the household code as subject_id for 3,660 samples (now host_subject_id; the household code becomes family_id) and PRJNA1086951 an arm × timepoint code (e.g.
Control_BL) for 637 samples (now the 213 person ids from the library names). Both projects are now longitudinal. - Relatedness and design: family / household fields for 8 more projects (6,100 values); 500 study-design rows and 107 relations (77 FMT donor_of, 28 twin pairs, 1 partner). Projects with a relatedness design 281 → 342; relatedness groups 5,858 → 6,775; longitudinal status unknown 373 → 199.
1.19.0 — 2026-10-10 (release R2026.23, subject ids, longitudinal design and relatedness)
- Catalog-wide subject_id pass. Every project with subject_id coverage < 95 % (1,671 projects) was re-read: archive attributes, sample-name decoding, author repositories / supplementary tables where reachable, and the papers' design statements. 1,423 projects were processed (7 of 48 shards, ≈ 250 projects, were stopped by the model provider's content filter and were not retried). subject_id now covers 434,745 of 588,558 catalog samples (73.9 %; was 319,084, 54.2 %): 36,371 samples gained a recovered per-person id and 81,031 a generated id.
- Generated subject ids (new rule, docs/DEEP_ANNOTATION_BRIEF.md › SUBJECT RULE). When the paper or record states one sample per person (or a single-subject case study), the id is minted by rule:
subject_id = sample_key(determined_by gut_subject_unique_v1) or the project accession for a single subject (gut_subject_single_v1,gut_subject_single_case_v1);parse_notestarts withgenerated:and carries the basis. Generated ids pass the subject_id route gate although their evidence is R3/R4 text; they are excluded from source counts and from longitudinal statistics, and are marked "generated" on sample pages. - Merged subject ids split. The relatedness pass flagged published subject ids that merge people (mother–infant dyad or couple ids, FMT procedure / donor numbers, placeholders such as
stool,unique, diagnoses used as ids). 3,575 samples were re-identified (recode,determined_by gut_subject_fix_v1) and 1,741 lost an id that names no person (retire); 1,830 further proposals that the agents marked for review are not applied (data/inputs/gut/design/logs/subject_id_fixes_shard_*.csv). - Longitudinal design. New wide columns
subject_n_samples,days_since_first_sample(age, else full collection date, else parsed timepoint label),time_axis,person_key. New gut_studies columnsn_subjects,n_subjects_repeated,n_samples_repeated,samples_per_subject_median/max,followup_days_median/max,interval_days_median,time_axis,longitudinal_status(longitudinal 1,143 · cross_sectional 1,153 · repeated_unresolved 189 · unknown 373) and the stated design from a study-design pass over 2,385 projects (longitudinal_design,sampling_schedule,planned_offsets_days,time_origin,followup_days_stated; 7 of 40 shards were stopped by the content filter). - Relatedness and shared settings. New pack fields
family_id,family_role(config/vocab/family_roles.yaml),shared_setting_type(config/vocab/shared_settings.yaml),shared_setting_id; new tablesgut_relatedness.parquet(5,858 groups: 5,230 families, 628 shared settings) andgut_relations.parquet(1,015 stated pairwise relations: FMT donor_of, twins, partners, roommates, mother_of …). gut_studies gainsn_families,n_related_people,n_mother_child_families,n_twin_sets,n_shared_settings,family_motifs,shared_setting_types,relatedness_designs,relatedness_summary; 281 projects carry a relatedness design (mother–infant 79, FMT donor → recipient 77, households 58, twins 25 …). - Site. Project pages get a "Sampling design" section (longitudinal badges and statistics, schedule, per-person swimlane timeline, family motif glyphs, settings and a families table); the Project sheet has a Sampling filter (longitudinal, mother–infant, parent–child, twins, siblings, households, communities, institutions, FMT); minimal sample pages (
samples/sample.html?id=<sample>, one static page reading 100 lookup shards) show every value with its route, evidence and the person's other samples; About › Where values come from now counts facts (one per sample × concept; location fields and date grouped, identifiers excluded) and documents subjects, generated ids, the longitudinal derivation and the relatedness fields.
1.18.2 — 2026-10-09 (release R2026.22, owner audit of empty projects and of split deposits)
- Catalog projects without samples removed (25). A catalog project must now have at least one catalog sample (
build_gut_scope, logged asempty_projects_droppedin the scope summary). Removed: 20 umbrella children whose single BioSample is catalogued under the parent BioProject (MetaHIT subject projects under PRJNA33049; PRJEB80526 → PRJEB101484; PRJNA871195 → PRJNA869587; PRJNA888226 → PRJNA880658); PRJEB39960 (all 87 BioSamples are mouse recipients of human faecal microbiota; registry host set tonoby a curator-audit override); PRJNA1401443, SRP005975 and SRP006081 (no harvestable runs in the registry run table: Salmonella isolate genomes with mislabelled metagenomes, an SRA-only culturomics record, gnotobiotic-mouse culture collections). All stay in the registry. - Study groups. BioProjects that are deposits of one study (per-subject deposits, split or top-up deposits, identical records, a shared own-data paper) are linked by
gut_studies.study_group_id/study_group_basis/study_group_members/study_group_n_samples(config/study_groups.csv; 55 groups proposed from identical records, title templates, near-identical titles of one submitter and shared papers, each partition confirmed by two independent reasoning-model replicates with a verified quote; 51 groups / 123 projects remain after the empty-project rule). Project pages show the group with links; the Project sheet marks grouped projects and filters a group with?group=<id>. Projects stay accession-keyed (no merge).
1.18.1 — 2026-10-09 (release R2026.21, deep annotation of the R2026.20 samples; owner audit of PRJEB120967)
- Deep annotation of the 15,457 samples added in 1.18.0 that remain in the catalog (13 sub-agent shards, same method as R2026.18: every BioSample attribute, two-replicate sample-name decoding, linked papers' body and supplementary tables joined by identifier, cohort-wide statements from the paper or archive description). Coverage on these samples, 1.18.0 → 1.18.1: subject 0 → 58 %, timepoint 0 → 36 %, exact age 12 → 27 %, sex 14 → 29 %, health condition 10 → 66 %, BMI 0 → 10 %, antibiotics 2 → 26 %, country 81 → 92 %, collection date 3 → 55 %. Agreement with published values where both exist: sex and country 100 %; the age disagreements were published errors (below).
- 85 new paper links for 60 projects (66 own-data, 19 re-use; accession in full text, BioProject link or reasoning-model-verified title match) and model-written short titles / descriptions for 57 projects.
- Never-downloaded BioSamples harvested (owner audit: PRJEB120967 showed 0 samples). 3,299 DNA BioSamples of 37 catalog projects had no archive record in the registry tables; 3,243 were fetched, 54 private PRJEB80390 BioSamples enter from their public run records. PRJEB120967 (32), PRJEB120968 (66), PRJEB120969 (36) and PRJEB80390 (54) now have samples. A new release check (
scripts/check_unharvested.py) fails when a catalog project has DNA BioSamples that are neither catalog samples, exclusions nor harvested. - Removed: 458 control samples published in 1.18.0 (364 American Gut blanks in PRJEB11419, 88 KatharoSeq dilutions in PRJEB83236, 5 water blanks in PRJNA477357, 1 bioreactor sample in PRJNA1145114), plus, among the newly harvested records, bacterial isolate genomes (e.g. 664 in PRJEB63570), mouse / livestock / wastewater samples, mock communities, 392 amplicon-only oral samples of PRJEB77729 and 16 blood-culture isolates of PRJNA947616 (
config/sample_exclusions.csv). - Audited corrections (
config/deep_corrections.csv, applied byintegrate_deep.py --corrections): infant ages that the archive gives without a unit or in months had been read as years (PRJNA1148144 day of life; PRJNA1067625 months; PRJEB123118 month tokens; PRJNA1249435 '12 months' normalised to 30 d); 10 mis-normalised 'months' age pairs fixed in registry_pairs_normalised. - Known gaps: PDF-only supplements were mostly not parsed; several papers are not open access (abstract only); run-unit samples of split BioSamples still have no Sandpiper profile.
1.18.0 — 2026-10-09 (release R2026.20, owner review of 1.17.1 + external coverage report)
- Pooled BioSamples split into run units. 26 BioSamples (26 projects) that each held many distinct stool libraries under one BioSample accession (e.g. PRJNA398187: UC1–UC16 / CD1–CD3 / HT1–HT3 all under SAMN11885869; PRJNA1219367: 358 libraries under SAMN46555814) now give one sample per sequencing run (
sample_key= run accession,sample_unit= run,biosample_accessionkept): 1,441 run samples replace 24 BioSample rows. Rule: >= 5 DNA runs, all library names distinct after stripping lane / read / platform suffixes, and the BioSample holds >= 50 % of the project's runs or the project has <= 3 BioSamples (build_gut_scope.split_pooled_biosamples). Values written on the shared BioSample record are not copied to the run units. - 53 projects brought into the catalog (10,653 samples) after a two-replicate reasoning-model review of 101 registry studies whose runs look like human gut shotgun metagenomes but were classified out (
config/registry_overrides.yaml, stagecurator_audit; quotes in each entry): mostly assay recorded asother(library strategy OTHER / WGA on random metagenomic runs) or site unknown, a few hostno. Includes PRJEB63587 (1,519 Bangladeshi infant samples) and PRJEB66487 (225; ENA base counts are 0 but the submitted FASTQs are 2.3–2.8 GB each). 41 reviewed studies stay out (in-vitro gut models and faecal cultures, animal hosts, environmental or mock material, isolates, gastric), 8 are unresolved. - Extra samples of infant-extension projects. Registry samples that the infant curation did not cover (later deposits, other time points, maternal samples) now enter through the registry route (3,186 samples in 14 projects, e.g. PRJNA1249435 315 → 1,109). The curated infant row still wins for every BioSample it covers;
in_infant_catalogis now per sample (true only for curated infant rows). - 17,969 + 225 BioSamples harvested (registry_biosample_attributes) and 453 new attribute pairs normalised; the host / control scan of the new records removed 1,329 samples (
config/sample_exclusions.csv: extraction / kit / PCR blanks, ZymoBIOMICS and other positive controls, wastewater, mouse, chicken, sea slug, soil, synthetic). - Sandpiper community composition on every profiled project page:
gut_sandpiper_study_panels.parquet(mean relative abundance of the top 12 genera over the project's profiled gut samples, low-depth / non-metagenome profiles left out; 2,028 projects), drawn as a full-width stacked bar. - Known gap: the new samples carry archive (R1) values only; they have not been through the deep paper / supplement annotation of R2026.18, and the run-unit samples of split BioSamples have no Sandpiper profile yet (profiles are keyed by BioSample).
1.17.1 — 2026-10-09 (release R2026.19, owner review of 1.17.0)
- PRJEB14941 leaves the infant extension and the gut catalog (owner decision;
audit/findings/2026-10-09_owner_decisions.csv, reasonassay_amplicon_misfiled): its 1,118 runs are 16S amplicon data deposited as library_strategy OTHER (library_selection PCR, median 17,207 reads per run). An owner / curator-audit override now beats the infant-curation include in the gut study rule. - "Expert curation" source replaced by "Human verified" (
gut_studies.src_verified;src_expertremoved). No catalog values were curated by a human expert — the infant extension values are model-extracted and keep their archive / paper source flags. A project is marked human verified only when a person checks it against the web and confirms its metadata is complete, through the new Verify a project's metadata issue form (config/human_verified.csv, built byscripts/ingest_verifications.py). None are verified yet. - Site: project pages show only the fields a project has values for (sample table and coverage list); Details sit above the sample table; the depth histogram uses fixed repository-wide bins with all projects in grey behind the project's samples and a median marker; persistent search in the top bar (Project sheet listed before Sample sheet; the sheet-level search boxes are gone); shorter footer; table columns no longer misalign when the window is resized.
1.17.0 — 2026-10-09 (release R2026.18, deep annotation of every project)
- Deep per-sample annotation of all 2,837 gut projects. Every project was re-read from every source we can reach: all BioSample attributes (not only the mapped keys), sample titles / aliases / library names decoded into subject, time point, group and arm with two independent reasoning-model replicates that must agree (
gut_r1_deep_v1), supplementary tables joined on sample, run, alias or subject identifiers (gut_r2_deep_v1), article body tables (gut_r3_tables_v1), and cohort-wide statements from newly linked papers (gut_r3_newlink_v1,gut_r4_newlink_v1). New values fill gaps only (never replace an equal or higher-ranked route). Sample coverage, 1.16.0 → 1.17.0: subject id 34.3 → 54.2 %; time point 13.5 → 30.0 %; exact age 26.3 → 28.6 %; sex 30.8 → 32.8 %; health condition 39.6 → 48.3 %; BMI 8.4 → 9.0 %; antibiotics 16.9 → 19.4 %; collection date 62.9 → 74.4 %; intervention arm 3.5 → 8.4 %; medication 0.7 → 1.6 %; diet 0.7 → 2.5 %; smoking 0.8 → 2.1 %. Where a new value and a published one both exist they agree for sex 99.9 %, country 99.8 %, exact age 98.9 % (± 15 days / 5 %), BMI 100.0 % of 141,369 / 448,327 / 116,791 / 39,208 compared samples. Evidence for every value is ingut_sample_determinations(evidence_source / locator / quote / parse_note). - Per-project source flags (
gut_studies.src_archive,src_abstract,src_fulltext,src_supplement,src_external,src_contribution,src_expert= used / checked / none, withsrc_detailJSON). Current counts — archive {'used': 2751, 'checked': 115}; abstract {'checked': 1622, 'used': 928, 'none': 316}; full text {'none': 1002, 'used': 984, 'checked': 880}; supplementary tables {'none': 1313, 'checked': 1239, 'used': 314}. - Paper links: 466 new study × paper links for 401 projects that had none (accession search in Europe PMC full text and NCBI BioProject links, then title / description search judged by a reasoning model;
registry_study_papers.source = paper_search_verified). - Scope corrections from the deep pass: a catalog-wide BioSample host / organism scan removed 7,150 non-human, environmental and mock-community samples (
config/sample_exclusions.csv, reason host_nonhuman / other, with the attribute quoted); 18 projects leave the catalog because no human gut sample remains or because their runs are 16S amplicon data deposited as metagenomes (PRJDB19255, PRJEB39960, PRJEB70509, PRJNA1155655, PRJNA1190698, PRJNA1209134, PRJNA1213876, PRJNA1245131, PRJNA1305438, PRJNA1433968, PRJNA1472735, PRJNA1514052, PRJNA428537, PRJNA450709, PRJNA596121, PRJNA769748, PRJNA804967, PRJNA976196;config/registry_overrides.yaml, stage curator_audit). - Model-written short titles (≤ 60 characters) and one- or two-sentence descriptions for every project (
gut_studies.short_title,short_description,short_description_model), from the archive record, the linked abstract and the curated sample facts; labelled as machine-written on the site. - Known limits: Europe PMC delivered supplementary archives at roughly 20–600 KB/s during this pass, so many supplements were not read (flag
src_supplement = none; listed on the Contribute page under "supplementary tables not accessible to us"); PDF-only supplements are not parsed; medication / diet / lifestyle attributes are mostly finer-grained than the vocabularies and stay unmapped. - Site: project pages and every page header redesigned in the home-page style; per-project source checkmarks; at-a-glance panel with a globe of sample origins, depth and timeline sparklines; field coverage lists only fields the project has; sample tables load client-side with every metadata column the project has; Project sheet with narrow columns, short titles, source columns and filter; Contribute filters for missing supplements / full text.
1.16.0 — 2026-10-08 (release R2026.17, owner review part 2)
- Pending and unresolved registry studies classified. 657 human studies that were
pendingor had assayunknown(plus gut-worded ones) went through the registry classifier (two Sonnet-class replicates, Opus-class adjudication on disagreement; 31 remain pending). Six enter the gut catalog (PRJEB6358 human samples only, PRJNA1441102, PRJNA1501268, PRJNA783956, PRJNA804967, PRJNA895415); PRJNA1501268 was recodedother→shotgun_dnafrom ENA run metrics (METAGENOMIC source, 151 bp PE NovaSeq X, ≈ 5.5 Gbp/run). Five catalog studies that had entered on pending defaults leave (16S amplicon, cancer cell-line, isolate genomes, or no gut evidence): PRJEB96943, PRJNA1273462, PRJNA1377467, PRJNA1457996, PRJNA755511. - Host / assay audit of the catalog (
classification_stage = curator_audit,config/registry_overrides.yaml, report docs/HOST_AUDIT_REPORT.md). The 37 catalog studies with animal words or "Genome sequencing and assembly" in their titles were checked against run and BioSample fields: 4 studies leave (PRJNA1082665 dogs/cats, PRJNA1337640 mice, PRJNA1240831 and PRJNA609594 in-vitro cultures) and the non-human, non-gut, culture and control samples of 26 others are removed throughconfig/sample_exclusions.csv(2,104 samples; mice, pigs, dogs, cats, gorillas, chickens, horses, urine, skin, reagent controls). Three classifier-eligible studies were found to be isolate collections during the BioSample harvest and are held out the same way (PRJNA1255389, PRJNA1258574, PRJNA631464). - Infant-catalog samples get the gut_all routes. BioSample attributes harvested for all 153,845 infant-catalog BioSamples (
gut_r1_infant_v1; agreement with the infant curation: sex 100 %, country 99.6 %, age 99.2 %), abstract/description statements for the 389 infant studies (gut_r4_infant_v1), and gut_all study-level statements (R3b/R4b) now expand to infant samples for fields other than age and the infant-only fields. The infant curation still wins wherever it has a value. Coverage gradient documented on Methods → Limitations ("Known bias"). - Docs: DATA_DICTIONARY / README qualify the infant-era
triage_verdict,catalog_statusandreason_codecolumns (they describe the infant extension, not gut_all membership). - Site: Contribute page reduced to three steps and one "Share metadata" button per project, opening a short issue form (
share-metadata.yml: accession, what you are sharing, link or file, sample-ID column, CC-BY checkbox); registry table shows ✓ / — for catalog membership with the reason in the detail panel only.
1.15.0 — 2026-10-08 (release R2026.16, owner review)
- Sequencing depth for every sample.
gut_sample_metadata_widegainsn_runs,seq_gbp(bases summed over the sample's runs / 1e9),seq_readsandseq_depth_source(ena | ncbi_sra);gut_runsgainsbase_count_sourceandrun_study_accession. ENA reports base_count 0 for runs whose files it does not mirror (dbGaP-protected deposits such as TEDDY PRJNA400115, very recent submissions); those now take NCBI SRA runinfo bases (scripts/fill_run_bases.py, cached in data/inputs/registry/run_bases_ncbi.parquet). Samples without a run in their own study take the same BioSample's runs filed under another study, then the curated infant runs table.gut_studies.gbp_per_sample_medianadded. - Registry: why a study is or is not in the catalog. Every registry row and detail panel states the failing criteria of the catalog rule (host not human / not established, assay not a DNA shotgun metagenome with the library source and strategy, no gut samples, owner decision, pending).
- Fields page: the per-age-category cells of the
age_categoryrow now show the share of each category that rests on an exact age (they read 100 % by definition before). - Site: navigation Home · Sample sheet · Project sheet · Contribute · Explore ▾ (Registry, Cohorts, Collections, Authors, Insights: Atlas) · About ▾ (About, For LLMs & API, Downloads & releases, Scope, Methods, Fields, Sources); minimalist home page (description, one search box that also matches conditions and interventions, example queries, links); Project-sheet filters — health condition × intervention × design × age × country × "cases & healthy controls" × "treated & control arms", all URL-addressable; Sample sheet shows depth and intervention arm.
- For LLMs & API:
llms.txt(root),llms/index.htmlwith a copy-paste prompt, and static endpointsapi/index.json,api/projects.json,api/by-intervention/<code>.json,api/by-condition/<code>.json,api/by-age/<category>.json,api/vocabularies.json,api/samples/<ACCESSION>.csv. - Analytics:
config/site.yaml analytics(GoatCounter, GA4 or Plausible); off until an id is set.
1.14.0 — 2026-10-01 (release R2026.15, owner review)
- Interventions (new; vocabulary
config/vocab/interventions.yaml, 15 study-level codes: fmt, probiotic, prebiotic_or_fibre, synbiotic, live_biotherapeutic, antibiotic, diet_intervention, dietary_supplement, drug_therapy, surgery, bowel_preparation, exercise, vaccine, phage_therapy, other_intervention). - Study level —
gut_studies.interventions(';'-joined codes; '' = nothing administered) +intervention_design,intervention_detail,population_condition, one verbatim evidence quote, route R4, confidence 0.5–0.55: every catalog study classified from its title, BioProject description and up to 3 linked abstracts by two independent reasoning-model replicates (a code is committed only when both return it; single-replicate codes ininterventions_unreplicated); deterministic guards exclude observed routine treatment, transplants into animals and in-vitro systems. Only interventions the investigators administered count. - Sample level — new field
intervention(+intervention_detail), route R1, from BioSample attributes that record the subject's arm / FMT recipient status / pre- vs post-intervention timing (addsplaceboandno_intervention). Study-level codes are never copied onto samples: the controls of an FMT trial are not FMT samples. health_condition = intervention_cohortcohort statements are recoded to the trial population's underlying condition (e.g. ulcerative_colitis for a UC FMT trial), so "IBD + FMT" is now a health-condition filter plus an intervention filter.- Core fields: age is core at the level of life stage —
age_category(exact age, else the sample's life-stage attribute, else a paper / abstract cohort statement, else the study's single life stage; basis inage_category_basis).age_at_collection_daysandsexmove to key fields. Core fields are now age_category, country, health_condition, subject_id;gut_studies.cov_age_categoryadded. - Site: grouped drop-down navigation (Browse · Insights · Registry · Data · About); Atlas under Insights; narrower Studies table (samples, interventions, median Gbp per sample; depth and per-field coverage columns removed — they remain on study pages); the Registry table states for every study whether it is in the catalog and counts samples instead of runs; sample explorer filters for study interventions and sample arms; study pages show an Interventions block; Zenodo concept DOI in the footer and cite box.
1.13.1 — 2026-10-01 (release R2026.14, owner decisions)
- PRJNA50637 (ileal-pouch cohort, 102 samples) leaves the gut scope — owner decision (option B): luminal aspirates / brushes of a post-colectomy pouch are not stool or intestinal mucosa in situ. Implemented as the first entry of
config/registry_overrides.yaml(registry body siteother_site, classification_stageowner_decision); the study stays in the registry, its catalog samples and determinations are retired in this release. - Collection-date floor 1980 (was 1990): 602 archived-cohort dates admitted (PRJNA1303200 pre-HIV MACS stool 1984/1985, PRJEB12449 and PRJNA510571 1985/1987, PRJNA322324 1982/1984, PRJEB55787 1981/1988). Everything before 1980 (73 Excel-epoch "1905" values, 1222, 1942–1979) stays rejected.
- Collections: new
controlled-access-population-cohorts(LifeLines-DEEP PRJEB76860, reference only, no samples — option A); the industrialization-gradients note now records that Tsimane and Hutterite deposits are 16S-only. - Same-country institute coordinates (~300 single-coordinate studies) are kept by owner decision (option A); the 66 cross-country retirements of 1.13.0 stand.
- No other data change.
1.13.0 — 2026-09-30 (release R2026.13, cleanup)
- Repositories renamed to
OlmLab/microbiome_repo(site, https://olmlab.github.io/microbiome_repo/),microbiome_repo-dataandmicrobiome_repo-pipeline; GitHub redirects the old names for git and web (not for the old Pages URL). - New per-sample fields (route R1 from BioSample attributes):
diet(+diet_detail),smoking_status,medication(';'-joined class codes; antibiotics stay inantibiotic_exposure),stool_consistency_bristol; vocabulariesconfig/vocab/{diet,smoking,medication}.yaml. - Completion passes: the original R3 full-text shard 09 (55 studies, blocked by a content filter in R2026.8) re-run; R3b (lifestyle / location / collection_date) completed for the studies the first wave could not process and for the 260 infant-extension studies with open-access full text; R4b completed for 62 studies.
- Registry gap fill: ENA studies with blank taxon fields and landmark cohorts absent from the catalog were enumerated, classified and harvested; new human gut shotgun studies enter the registry and catalog (counts in RELEASE_NOTES_R2026.13.md).
- Data-quality corrections from the adjudication of items flagged in R2026.11–12 (pouchitis cohort, legacy NEC codes, a mislabelled age category, institute-coordinate locations, new-field conflicts, implausible study-level lifestyle codes) — retired / recoded rows are listed in
dq_correctionsand carrydetermined_by = dq_adjudication_v1. - Atlas rebuilt on the official UNDP HDR 2025 HDI table (HDI 2023) — the transcribed table is gone — with new lifestyle and collection-year observation cards; the observation analyses now ship as
scripts/atlas_observations.py. - Release assets: the Sandpiper genus/species long tables and
registry_runsare no longer committed to the data repository; they live on the single-commitrelease-assetsbranch and are attached to the GitHub Release. The SQLite asset skips the two largest tables. - Sources page: explicit acknowledgement of the incorporated external resources.
1.12.0 — 2026-09-29 (release R2026.12, owner site review: new fields, collections, atlas)
- New per-sample fields in
gut_sample_metadata_wide/gut_sample_determinations(config/packs/gut.yaml):collection_date(ISO partial date or interval, as specific as the source gives it),location_region,location_locality,location_siteand the composeddetailed_location,latitude/longitude,lifestyle(+lifestyle_detail; vocabulary config/vocab/lifestyle.yaml). Routes: R1 deterministic parsers over the BioSample attributes (collection_date, lat_lon and the location keys; distinct location strings normalised by the utility model into region / locality / site with a substring guard — reviewable mapgut_location_map), R3b cohort-level statements from open-access full text (two Sonnet-class replicates, verbatim quotes; 24 shards) and R4b statements from abstracts and ENA descriptions (6 shards). Counts are in RELEASE_NOTES_R2026.12.md. - Field tiers: core fields are now age, sex, country, health condition and subject_id (antibiotic exposure moved to the key fields next to detailed_location, lifestyle, collection_date, BMI, timepoint); the contribute worklist and the site read the tiers from the pack.
gut_runs.parquet(one row per run of a catalog study: accessions, library layout, instrument, read/base counts, first_public, Sandpiper flag, catalog sample_key) and study-level sequencing summaries ongut_studies(n_runs_total, Gbp per run mean / median, instrument models, layouts, Sandpiper share).- Sandpiper community profiles for the whole catalog: 372,911 profiled runs → 339,626 samples in 2,084 studies (
gut_sandpiper_sample_summary, QC flags never dropped) and a genus-level CLR-PCA (gut_sandpiper_pca_scores/_loadings/_variance; 335,956 samples × 383 genera; PC1–5 explain 16.3 / 6.5 / 3.8 / 3.2 / 2.3 %). The genus and species long tables (185 + 199 MB) ship as the release assetgut_sandpiper_profiles_1.12.0.zip. - Site: About section (Olm Lab, Anthropic AI for Science), Collections (31 curated sets with pre-entered explorer filters), Atlas (taxon world map over 7,992 taxa × 101 countries, interactive PCA of 335,956 samples, 14 data-driven observations), Downloads & releases merged, Registry page led by the explorer and stating the human/non-human breakdown, simple one-question issue form, study pages with a sequencing block and a plain-language registry classification, sample rows linking to NCBI / ENA / DDBJ,
samples/index.html?sample=filtering to the sample.
1.11.0 — 2026-09-28 (release R2026.11, external curated resources)
- Ten external curated metadata resources ingested as route R2 evidence (owner decision): curatedMetagenomicData curation tables (141,320 rows / 24,547 samples / 118 studies), GMrepo v3 live API (140,605 / 39,805 / 286), Meta2DB (51,784 / 11,338 / 78), HumanMetagenomeDB 1.1 (34,330 / 19,876 / 165), MicrobiomeDB (18,921 / 5,113 / 10), MicrobeAtlas coordinates → country (15,074 / 15,074 / 151, after excluding 17 systematically disagreeing studies), HMP/iHMP via IBDMDB + archived HMASM table (14,152 / 2,456 / 3), mBodyMap (6,404 / 3,070 / 5), African Human Microbiome Portal (6,209 / 2,192 / 15), BugSigDB study-level statements (103 rows / 62 studies). Every row carries
evidence_source = external.<resource>, anevidence_locatorURL to the source record, the source's raw value as quote anddetermined_by = external_ingest_v1:<resource>@<version>; confidence 0.6–0.75 so a study's own archive attributes (R1) and supplementary tables (R2 ≥ 0.8) win ties. Health-condition strings were mapped to the vocabulary by written rules and, for the long tail, the utility model (mapping tables in the pipeline repository). - Effect on
gut_sample_metadata_wide(579,252 samples): age 23.6 → 26.0 %, sex 28.6 → 31.0 %, BMI 5.3 → 7.0 %, country 90.1 → 91.1 %, health condition 31.0 → 37.5 %, antibiotic exposure 12.5 → 16.5 %; determinations 1,729,195 → 1,861,883 (R2 142,737 → 312,314). Agreement with pre-existing catalog values where both exist: sex 97–100 %, country 91–100 %, age (±10 %) 95–99.9 %, health condition 52–87 % (differences are mostly granularity: study-level IBD code vs per-sample CD/UC). - Site: the Sources page now acknowledges the incorporated resources (with terms and the ingested counts) and lists the consulted-but-not-incorporated ones; evidence tables link to the source record. Terms: several resources publish no licence (GMrepo, HumanMetagenomeDB, MicrobeAtlas, mBodyMap, AHMP) — values are redistributed with attribution and a link to the source; contact us if this conflicts with your terms.
1.10.1 — 2026-09-28 (release R2026.10, sources and acknowledgements)
- Site: new Sources and acknowledgements page (
sources.html, fromconfig/sources.yaml): the archives and literature services the catalog is built from with their terms, the software and models, the funding acknowledgement, and 15 related human-microbiome metadata efforts (curatedMetagenomicData 3, GMrepo v3, HumanMetagenomeDB, MicrobeAtlas, Human Microbiome Compendium, mBodyMap, MicrobiomeDB, African Human Microbiome Portal, Meta2DB, BugSigDB, MGnify, HMP/iHMP, EMBERS, PRIME, and the derived gut resources) each with scope, size, licence, join key and an ingestion assessment; the pipeline repository carries the same content asdocs/RELATED_RESOURCES.mdwith a proposed ingestion route. No table changed.
1.10.0 — 2026-09-28 (release R2026.9, all-age catalog site)
- Site rebuilt around the all-age catalog. Every section — Studies (one page per catalog study), Cohorts, Samples (explorer), Fields, Authors, Scope, Methods, Downloads, Contribute, Changes — is now generated from the
gut_*catalog tables and theregistry_*tables; the former infant-only sections are gone. Study pages show the registry classification with its evidence, papers (registry links ∪ curated infant links), authors, age / condition / country / sex mix, per-field coverage by route, the cohort-wide statements applied to the study, evidence examples, a sample table and per-study downloads (data/studies/<PRJ>.csv.gz|.parquet,<PRJ>_determinations.csv.gz). Cohorts are recomputed at every release: curated cohort records plus registry papers that describe 2–4 catalog studies (or cite 2–4 studies all submitted by the same centre). The contribution worklist covers every catalog study with ≥ 50 samples that is below 50 % coverage on ≥ 3 of the five core fields. - Fix — duplicate cohort-wide rows. 1.9.0 shipped both an R3 (full-text) and an R4 (abstract) row for 58,659 sample × field pairs where a cohort-wide statement existed on both routes;
gut_sample_determinationsnow keeps one statement per study × field (route precedence R1 > R2 > R3 > R4, then confidence): 1,787,854 → 1,729,195 rows.gut_sample_metadata_widealready carried the winning value and is unchanged. - README intro rewritten from the
gut_*/registry_*tables (docs/package_readme_intro.md); the former infant description is kept under Infant extension (historical description). Release notes gain a catalog and a registry section. No new curation in this release.
1.9.0 — 2026-09-28 (release R2026.8, gut_all route R3 — full-text cohort statements)
- Route R3 for the non-infant gut studies. For each of the 1,317 non-infant gut studies with an open-access paper, the first PMC full text was fetched from Europe PMC (1,262 studies attempted, 1,138 with full-text XML; 124 PMCIDs returned no XML); Methods → abstract → Results (one chunk ≤ 36 k characters, shorter where the token budget required) were read by two independent Sonnet-class replicates. A cohort-wide statement is committed only when both replicates agree and its ≤ 12-word quote is a verbatim substring of the text (confidence 0.7; 0.6 from Results); deterministic guards drop age ranges that span life-stage categories, antibiotic exclusion windows < 1 month,
healthy_controlwithout healthy/control wording, cohort-level disease codes in case–control designs, and ethics-committee-only country mentions. Result: 1,871 study-level statements over 789 studies (country 596, life stage 366, health condition 315 + detail 274, antibiotic exposure 241, sex 77, age 2) — seedata/inputs/gut/r3/in catalog-pipeline (merged determinations, unreplicated and subgroup side tables, per-study summary, token costs). - Effect on
gut_sample_metadata_wide(all 579,252 samples): antibiotic exposure 7.2 % → 12.4 %, health condition 28.8 % → 30.9 %, sex 26.8 % → 28.6 %, country 89.2 % → 90.1 %;age_category = unknown222,970 → 212,487 (R3 life stage now precedes the R4 abstract life stage; basisr3_fulltext_life_stage). Precedence per sample × field: infant catalog > R1 > R2 > R3 > R4; R3 rows arescope = study_allexpanded to the study's samples that lack a higher-precedence value. - Limits: one paper per study (first PMCID; re-analysis papers yield nothing); 55 studies of one shard were not read (the extraction run for that shard was stopped by the model provider's content filter and was not retried); 362 studies were read with truncated chunks (< 16 k characters) to fit the per-worker budget; case–control group statements (2,754) are recorded but not assigned to samples. Infant tables unchanged.
1.8.0 — 2026-09-28 (release R2026.7, curated scope gut_all — "Microbiome Repo")
- New curated scope
gut_all(config/packs/gut.yaml): every human gut shotgun-metagenome study in the registry, all ages — 2,837 studies / 579,252 samples — curated at sample level for age at collection, sex, BMI, country, health condition (config/vocab/health_conditions.yaml), antibiotic exposure, subject and timepoint. Tables:gut_sample_determinations.parquet(one row per sample × field with route, confidence, verbatim evidence quote and source),gut_sample_metadata_wide.parquet(one row per sample, fields with route/confidence,age_category+ basis,body_site_class,infant_scope),gut_studies.parquet(registry columns + per-field coverage, age-category / health-condition distributions, curated depth). - Routes for the 2,448 non-infant studies: R1 archive attributes (registry normalisation + a gut attribute field map of 287 keys with deterministic parsers; key triage by the utility model), R2 supplementary tables of open-access papers (exact-accession join gate, header-named columns, no model), R4 cohort-wide statements from titles / ENA descriptions / abstracts (utility model, verbatim-quote check, confidence ≤ 0.5). Health-condition text → vocabulary codes by 20 rules + a utility-model pass over 3,719 distinct (key, value) pairs. R3 (full-text prose) not run for non-infant studies.
- The infant catalog is the
infant_scopefilter of this scope: its 389 studies' rows are copied verbatim (src_trackinfant_catalog) and win over archive-only values;infant_scope = truereproduces the infant catalog_scope (72,358 samples) exactly. The infant tables are unchanged. - Site: renamed Microbiome Repo; new
gut/section (coverage by age category, health conditions, countries, largest studies, DuckDB-WASM sample explorer with an "infant catalog scope" switch); home page leads with the registry → gut scope → infant scope; Methods › Curated scope gut_all; future plans (other body sites) stated on the home page.
1.7.1 — 2026-09-28 (release R2026.6, rebrand — no data change)
- The site and the package are now presented as the Human Shotgun-Metagenome Catalog: the registry tier (all human shotgun metagenomes, all body sites and ages) is the front door; the Infant Gut Shotgun-Metagenome Catalog is its first curated scope and keeps its name on its own pages (Studies, Cohorts, Sample explorer, Fields, Authors, Universe). Names live in
config/site.yaml(site.title,site.short_title,site.curated_scope_title); repository names and the site URL are unchanged pending the owner's final choice of name. - Package README heading and intro updated accordingly; every table is byte-identical to 1.7.0.
1.7.0 — 2026-09-27 (release R2026.5, scale-up S2: registry sample tier)
- New table
registry_biosamples.parquet— one row per harvested BioSample of the 4,217human_allregistry studies outside the curated infant catalog (611,601 of 612,857 BioSamples resolved via ENA sample XML, NCBI BioSample for the misses). Attributes were harvested in full (13.5 M key/value rows, the working_data artifactregistry_biosample_attributes.parquet) and the R1 fields normalised to the vocabularies: body site (config/vocab/body_sites.yaml), life stage +age_days, sex, ISO-3166 country, collection year;disease_rawis carried as free text. Normalisation = one utility-model pass over the 42,989 distinct (field, key, value) pairs (9.1 M tokens; docs/REGISTRY_S2_PILOT.md, config/budgets.yamlregistry_s2); every value keeps its raw key/value provenance. registry_studies.parquetgains the sample roll-up columns (n_biosamples_harvested,n_biosamples_with_site/age/sex,sample_body_sites,sample_life_stages,sample_countries,sample_age_days_median) andn_runs_sandpiper(runs with a Sandpiper 2.0.0 community profile; 838,702 of 1.98 M registry runs). Where the study-level body site / life stage was unknown and ≥ 60 % of harvested samples agree, the primary is refined from the samples (evidence rowsample.attr.<key>); codes present in ≥ 10 % of samples join the study's lists. Curated-verdict precedence: included infant studies are alwayshuman_all, assayshotgun_dna.- New tables
registry_study_papers.parquet(6,398 study × paper links from Europe PMC accession mentions + NCBI BioProject declared publications; 2,676 of 4,217 studies linked, 90 % open access),registry_authors.parquet(52,110 author rows, 18,527 with ORCID) andregistry_bioproject_records.parquet(4,217 BioProject records) — docs/REGISTRY_S2_PAPERS.md. - Curated infant scope unchanged (389 studies, 154,356 samples, 619,647 determinations).
1.6.0 — 2026-09-27 (release R2026.4, scale-up S1: registry tier)
- New tier: the registry of ALL human shotgun metagenomes (SCALE_UP_PLAN §2; docs/EXPANSION.md). The universe was enumerated over all of ENA without a taxon frame (slices S1 METAGENOMIC WGS/WXS, S2 misfiled GENOMIC on verified human-metagenome taxa, S3 OTHER/Targeted-Capture/WGA adjudication; every slice count-complete against ENA): 54,361 studies / 1,980,623 runs.
registry_studies.parquetclassifies every study by host (human yes/no/mixed/unknown), assay, body sites and life stages (controlled vocabularies with UBERON anchors: config/vocab/*), population flags and scope memberships (config/scope.yaml), with evidence rows (≤12-word quotes) and a classification stage: deterministic prior (infant-universe verdicts), deterministic rule, Sonnet ×2 replicates, Opus adjudication, or pending.registry_universe_audit.csvrecords the per-slice ENA counts.registry_runs.parquet(all 1.98 M runs, 46 ENA fields) is attached to the GitHub Release as a separate asset (too large for the package zip and the Pages site). - The infant catalog is unchanged and becomes the first curated scope (
infant_gut) inside the registry; its 9,581 screened studies carry their infant verdicts asin_infant_catalog/infant_reason_code. - Site:
registry/landing with facets and a DuckDB-WASM registry explorer, one page per scope (registry/scopes/<id>.html), Methods › Registry classification. - Counts for the curated infant scope are unchanged from 1.5.0 (389 studies, 154,356 samples, catalog_scope 72,358, 619,647 determinations).
1.5.0 — 2026-09-27 (release R2026.3, monthly cycle 2026-09b)
- Re-sweep of ENA for deposits first public since 2026-08-20 (
make resweep): 225 studies not in the catalog, 2 with a human signal, both judgedexclude/site_excludedin R2026.2 (PRJEB108618 adult skin; PRJEB124241 maternal reproductive-tract and tracheal samples). Universe 9,581 studies. - Gap-fill of an included study (
make gapfill/make apply-gapfill, new in this cycle): PRJNA1140720 (Modelling human microbiome transmission in a nursery setting) gained 150 BioSamples / 150 WGS runs published 2026-09-02. They are saliva samples of mothers (81), fathers (62) and siblings (7) —body_site_class = excluded,catalog_scope = False, roles mother/other — so the catalog-scope headline is unchanged while the study's sample count now matches ENA (1,013 → 1,163). 749 validated R1 determinations (country, sex, subject_id, timepoint_label; 149 ages, 145 of them adult and committed under the out-of-scope-adult convention; 1 age rejected as disagreeing with the paper table); subjects joined to the study's existing family keys (149/150). Sandpiper has not profiled any of these runs (per-run API confirmed; miss reasonpublished_after_snapshot_horizon). - Counts: 154,356 sample units (+150), 619,647 current determinations (+749), catalog_scope 72,358 (unchanged), 389 included studies.
1.4.0 — 2026-09-27 — release R2026.2 (community-contribution worklist)
Deterministic changes only; no LLM calls; no value of any 1.3.0 table changed. Adds the read-only worklist that drives the site's contribute/ pages and the GitHub-Issue contribution intake (MATURITY_PLAN §3.2–3.4; pipeline config/contribute.yaml, docs/CONTRIBUTE.md).
* contribute_worklist.csv — one row per OPEN included/uncertain study (at least one of age / delivery / feeding / preterm / antibiotics / probiotic below 0.5 coverage on its catalog_scope samples; body-site scope for studies without catalog_scope samples), ranked by priority_score = Σ weight × (1 − coverage) × log10(n_catalog_scope + 1) (weights 3/2/2/1.5/1/0.5). Per study: missing fields, the six coverages, best recoverability tier per field, one blocker_code (controlled_access · no_linked_paper · paywalled_abstract_only · tables_unjoinable_need_key · pdf_only_supplement · no_supplement_found · archive_only_uncertain · unitless_age_needs_curator · partial_coverage) with blocker_detail, an imperative unlock_text, the primary contribution_type, linked papers, ENA/NCBI links and a prefilled issue_url (Issue form catalog-contribution.yml, label contribution).
* contribute_worklist_fields.csv — study × field detail (coverage, n_with_value, best tier, field-level blocker incl. complete, evidence ≤ 120 chars).
* Both tables carry release_added = R2026.2, release_retired (null), package_added = 1.4.0; a row is retired when the study becomes complete in a later release.
* Coverage is recomputed from sample_metadata_wide on catalog_scope at build time (the shipped study_field_coverage_matrix.csv is on a different scope and is unchanged).
* Inputs (registered in the pipeline's config/inputs.json, group contribute): extraction_worklist_v3.csv, recoverability.parquet, RESCUE_REPORT_v2.md (sample-ID forms), r2_rescue_studies.csv, supp_inventory.parquet, controlled_access_registry.csv. No e-mail address or participant name enters any table.
* DATA_DICTIONARY.md section 'Contribute worklist' (every column); README Files-table rows; build_counts.json gains n_worklist_studies, n_worklist_fields_rows.
* Counts unchanged: 389 included studies · 154,206 samples · 72,358 catalog_scope · 618,898 current determinations · Sandpiper 2.0.0.
1.3.0 — 2026-09-26 — release R2026.1 (first numbered catalog release; bitemporal columns)
Deterministic changes only; no LLM calls; no value of any 1.2.2 table changed (asserted at build: dropping the new columns reproduces every 1.2.2 fact table).
* Release model (VERSION.json.release_id = R2026.1, previous_release_id = 1.2.2; registry releases.csv, one row per release id with the counts the CHANGELOGs state). Release ids are R<YYYY>.<n>; pre-numbered states are their package semver (1.0.0 first public package 2026-09-25, 1.1.0 release v11, 1.2.0, 1.2.1, 1.2.2).
* Bitemporal columns release_added, release_retired (null = current), package_added appended at the end of sample_determinations, universe_studies_all, study_metadata_wide (parquet + csv), cohorts.csv, study_paper_links.csv, sandpiper_sample_summary, sandpiper_run_qc, sandpiper_top_genera, sandpiper_study_panels. sample_metadata_wide is derived and unchanged. release_added of pre-existing rows is reconstructed from value_history.change_stage/src_track (exact for 13,191 determinations: 3,632 run-level rows → 1.1.0, 9,559 adult-age recommits → 1.2.0; all other pre-1.3.0 rows 1.0.0 by assumption — DATA_DICTIONARY 'Release columns').
* sample_determinations_all.parquet (620,214 rows = 618,898 current + 1,316 retired): retired published values reconstructed from value_history rows with status superseded / moved_to_parent_biosamples / recommitted_out_of_scope_host / recommitted_out_of_scope_isolate — 75 retired in 1.1.0 (sample_unit_fix), 245 in 1.2.0 (B2 97 + B9 148), 295 in 1.2.1 (R3-3), 701 in 1.2.2 (owner_decision) — with retired_reason and retired_change_stage.
* RELEASE_NOTES_R2026.1.md generated from 1.2.2 → 1.3.0 (studies/samples, coverage on catalog_scope, verdict flips, findings, Sandpiper, gold metrics, schema changes, token cost).
* build_counts.json regenerated from the tables (the 1.2.2 copy was stale: package_version 1.2.1, n_catalog_scope 71,795 → now 72,358); README heading carries the package version (1.2.2 shipped "v1.2.0").
* Counts unchanged: 389 included studies · 154,206 samples · 72,358 catalog_scope · 618,898 current determinations · Sandpiper 2.0.0 (Zenodo 20419175).
1.2.2 — 2026-09-26
Owner decisions applied (value_history change_stage=owner_decision, 701 rows):
* PRJEB90577 (PediCAP, 631 peri-rectal swab samples): body_site_class excluded → primary, new column body_site='rectal_swab'; catalog_scope 71,795 → 72,358.
* 70 samples labelled METAGENOMIC whose organism is a named microbe (68 PRJNA799247: Staphylococcus epidermidis/Clostridioides difficile; 2 PRJNA1082298: Enterobacter asburiae) and flagged non-metagenome by Sandpiper: body_site_class → excluded, reason assay_isolate_genome. Studies remain included.
* body_site column added to sample_metadata_wide (currently only 'rectal_swab'; stool is implied by body_site_class=primary otherwise).
v1.2.1 (2026-09-26) — data fixes from the three final reviews (patch)
- F1 / R3-5 organisations. 6,143 of 18,888 organisation rows tagged
org_type = not_an_organisation({'submission_id': 6033, 'lowercase_username': 93, 'placeholder': 9, 'email_or_handle': 8}); for PRJNA studies the NCBI BioProject Organization is preferred over the ENA center_name.organisations_index.json9,886 → 3,747 keys;study_authors_summary.organisationsrows containing a SUB id 6,042 → 0; studies with a displayable organisation 9,579 → 9,513 (included studies 386/389). - R3-1 GTDB suffix genera. Genus indicators match
^g__<Name>(_[A-Z]+)?$:sp_ra_g_Enterococcuschanged on 19,090 samples (mean 0.0234 → 0.0324),sp_ra_g_Veillonella6,076,sp_ra_enterobacterales_core3,315,sp_ra_g_Bacteroides1,786,sp_ra_g_Phocaeicola590;gtdb_to_ncbi_notetable in the dictionary. - R3-2 / F3 / F13 panels and medians.
sandpiper_study_panels.parquetv2 recomputed from the full profiles overcatalog_scope ∧ sp_profiled ∧ NOT sp_low_depth: 298 → 181 studies with a panel (118 fall back withno_catalog_scope_samples, 2no_age_evidenced_profiled_samples, 3 all low depth); panel n asserted equal to the recomputation from the shipped sample table; merge artefactsn_samples_x/_yremoved;sp_median_*recomputed on the same scope (changed for 182 studies; null withsp_panel_scopefallback label for 208). - R3-3 host / isolate rule. Deterministic sample rule: non-human ENA scientific_name/tax_id (Mus musculus 10090, Gallus gallus 9031) →
body_site_class = excluded,exclusion_reason_code = host_nonhuman(172 rows, PRJEB6921); every run GENOMIC with a named-microbe organism →assay_isolate_genome(123 rows: PRJEB6921 103, PRJEB49206 20). 295 validatedvalue_historyrows (change_stage = auditor_review:R3-3). Body-siteexcluded5,180 → 5,475. Owner lists shipped:review_genomic_only_samples.csv(3,158 GENOMIC-only samples),review_named_microbe_metagenomic_samples.csv(70: PRJNA799247, PRJNA1082298),sandpiper_auditor_candidate_runs.csv. - R3-6 verdict history.
stage_orderfollows a stage ontology (stage_rank,stage_level); Haikuyes→uncertain(screen-pass),no→exclude,ERROR/empty → null withverdict_norm_note;is_consolidated+consolidated_kind(20,222 rows). verdict_norm null 3,775 → 176. - R3-7 notebook.
getting_started.ipynbrewritten onage_scope/catalog_scope, coverage cell fixed, Sandpiper cell added, runs joined viabiosample_accession/run_accession; executed (flattened exec, outputs stored) with 0 errors. - R3-8 / F9 / F10 / F19 / R3-13 dictionary.
sandpiper_run_qcsection with the miss-reason and organism-class vocabularies;sample_unitbiosample_pooled→runinsandpiper_run_qcandsandpiper_study_coverage; body_site_class vocabulary primary/unknown/excluded/linked defined;catalog_scopecolumn (71,795 rows) added to the sample table andn_catalog_scopeto the study table; single-sourcesandpiper_flag_table.csv(GlobDB flags marked unused); complete generated column reference for both wide tables (build fails on an undocumented column);adult_flaggedfootnoted as over-age (includes children); placeholder genera and Bifidobacterium-share denominator documented. - R3-9 flags.
sp_flag_non_metagenomederived fromsp_nonmeta_class ∈ {named_nonhuman_host, named_microbe_or_other}(sample table 1,650 → 365); any-runsp_nonmeta_classcolumn added. - R3-11 / R3-12 / F6. Panel columns renamed (
n_samples_panel,n_samples_study);sp_coverage_classdefined on sample rows withsp_coverage_notefor the two cross-study studies;sp_n_runs_totalfilled for every row,sp_partialFalse when unprofiled;sandpiper_url= RANDOM-selection run with the highest root coverage (1,324 URLs changed);sp_frac_samples_profiledon the single denominatorn_sample_rows;shared_biosample_notefor the five BioSample-sharing studies. - R3-14 miss reasons. Strategy evaluated first:
non_wgs_strategy94 → 511 (AMPLICON, Targeted-Capture, WXS — the strategies with zero profiled runs);unknown_sizefor base_count ≤ 0 (2 runs);review_amplicon_runs.csv(39 runs, PRJNA61745). - R3-10 / R3-15 authors. Transliteration before NFKD folding and folded initials (111 rows re-keyed; keys 10,965 → 10,964); 'Frontiers Production Office' → group;
name_needs_checkfor 3 no-initials names; homonym statistic recomputed from the table: 1,075 of 8,181 surnames. - F4.
n_biosamples= BioSample-unit rows (153,685);n_run_units(521) andn_parent_biosamples(16) added; card wording in README. - F22.
cohorts.csvgainsunique_infants_display/unique_infants_display_source: single-study cohorts (362) take the study display value. - R1-11. Package zip built with fixed timestamps (2026-09-26 00:00) and no extra attributes; per-file sha256 in VERSION.json;
VERSION.jsonregenerated last and lists every file; the zip's own sha256 is indata_package_v1.2.1.sha256and the sidecarVERSION.jsonartifact. - Counts corrected: study
sp_*columns are 18 (CHANGELOG v1.2.0 said 16);study_paper_links.csv973 rows (README said 972); AUTHORS_REPORT organisation keys 9,886 → 3,747 displayable.
CHANGELOG
v1.2.0 — 2026-09-26 (release v12) — Sandpiper profiles, author index, versioning
Deterministic changes only; no LLM calls.
* Sandpiper (A6, B5, B6, B7). 79,473 / 154,206 samples profiled (87,125 / 174,022 runs); 38 sp_* columns on the sample table, 16 sp_* columns on the study table; seven on-site Sandpiper tables; full profiles off-site.
* Scope (B13). <field>__scope for the 16 coverage fields.
* Authors. authors.parquet (28,367 rows), study_authors_summary.csv, authors_index.json; first_author, n_authors, organisations on the study table.
* Versioning (A7, B11). VERSION.json with per-table sha256 and row counts; README heading carries the semver; all *.csv.gz written with gzip mtime 0 so rebuilds are byte-identical.
* Wide table: 143 columns.
v1.2 — 2026-09-26 (release v12) — data-model fix after Reviewer B
Deterministic changes only; no LLM calls. Before/after counts in DATA_MODEL_FIX_REPORT.md.
* B1 age scope. New sample columns age_scope, age_scope_basis, role_source; role defaults to unknown when unevidenced (infant 138,348 → 72,848); new roles adult/child for out-of-range ages. Study columns n_age_scope_infant, n_<age_scope> counts, mixed_age_deposit. Headline coverage is now reported on age-scope infant samples (74,695), with the body-site denominator (146,631) kept in field_coverage_summary.csv.
* B2 parent BioSamples. The 16 biosample_pooled rows left the sample table (parent_biosamples.parquet); their 97 determinations are in value_history.parquet. Sample table 154,222 → 154,206 rows.
* B9 adult_age_flag. Now literally age_at_collection_days > 1100: 9,559 out-of-range R1 ages committed as determinations (parse_note out_of_scope_adult | validate_age: …, src_track = adult_scope_fix, all validate_row-checked). The 12 samples with a conflicting in-scope age were resolved for the archive attribute (23 in-scope rows superseded: PRJEB14941 maternal-visit dob arithmetic ×16, PRJNA716780 mother rows read as months ×6, PRJNA695570 R1>R2 ×1); 8 adult rows on PRJEB14941 .infant. samples rejected (maternal age copied onto infant samples); 125 PRJEB14941 title-parser birth → 0 d rows on maternal birth-visit samples superseded (sample_id_pattern). Flag count 9,567 → 9,559.
* B10 unique infants. n_unique_infants_est is NaN unless subject evidence exists; new n_unique_infants_source, n_unique_infants_upper, n_unique_infants_display.
* B15 identity. biosample_accession (always) and run_accession (run units) on every sample row.
* B3 history. study_verdict_history.parquet (32,231 rows, 56 stage tables) and value_history.parquet (45,591 rows).
* B8 confidence. confidence_tiers.csv, tier_field_precision.csv, dictionary paragraph "not a calibrated probability".
* B14 reconciliation. Gold recall: 17/22 automated, 18/22 after human review. Age covered: 54,105 body-site-scope samples with age ≤ 1,100 d (v1.1 README 53,802 predates the run-unit fix; site 54,150 counted parent rows and later-superseded values). Multi-run studies: 57 class-C + 6 class-A assessed; the 4 further studies with multi-run BioSamples in the sample table (PRJNA1019702, PRJNA1198101, PRJNA613032, PRJNA613054) share BioSamples with a sibling BioProject (class X_cross_study_biosample, sample_unit_classification_by_study.csv); the dictionary's "33 technical multi-run studies" was the pre-classification heuristic count and is withdrawn. Study n_samples/n_runs now come from runs.parquet (PRJEB49206: 419/457 → 439/477).
* Determinations 609,584 − 97 (parent rows) − 23 (superseded conflicting ages) − 125 (superseded title-parser ages) + 9,559 (adult ages) = 618,898.
v1.1 — 2026-09-25 (release v11)
Sample-unit fix (run-level rows for 6 one-BioSample-per-infant deposits), auditor findings applied, group-statement audit.
v1 — 2026-09-25
First public data package.