Skip to content

release: 2.3.0 — add the NHGRI-EBI GWAS Catalog (37th database) - #184

Merged
arkinjo merged 3 commits into
mainfrom
dev
Jul 31, 2026
Merged

release: 2.3.0 — add the NHGRI-EBI GWAS Catalog (37th database)#184
arkinjo merged 3 commits into
mainfrom
dev

Conversation

@arkinjo

@arkinjo arkinjo commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

What

Adds gwascatalog — the NHGRI-EBI GWAS Catalog — as TogoMCP's 37th database, and cuts 2.3.0.

MINOR under the agent-pragmatic policy: a database is added, nothing is removed or renamed, no return shape changes.

Why this database

Chosen from the 2026-07-27..30 production tool-call log, not by guesswork. Filtering the ~94% of traffic that turned out to be a load-test harness (2,474 identical query triples) plus one automated ChEMBL pipeline leaves ~478 organic calls, and the largest cluster there is disease-variant work chaining clinvartogovarmedgenmondohcohgnc. Trait association is the layer that thread was missing.

It sits on the ebi endpoint we already query, so this is a registry row plus an MIE — no new infrastructure.

What the MIE documents

10 live-verified examples (4 basic, 3 intermediate, 2 aggregation, 1 cross_db), including two first-class set-level enumeration routes per spec §4.4. Three traps drove the file, none recoverable without probing:

  • Opposite literal forms in one graph. gwas:has_snp_reference_id "rs1296720" matches 0 rows and needs ^^xsd:string; m2r:snps "rs1296720"^^xsd:string matches 0 rows and needs the plain form. DATATYPE() reports xsd:string for both, so only an ASK separates them. Getting it backwards fails silently — it caught me mid-authoring.
  • Two parallel association models. 955,930 med2rdf blank-node Associations carrying the flat row, versus 782,879 IRI-addressable OBAN TraitAssociations. Different populations; mixing them double-counts.
  • ?s a gwas:Study returns 224,583 across two disjoint IRI families — only 89,981 are real GCST study records, the rest are EBI Trackable/* publication stubs. 89,981 is the figure the intro page states.

Trait labels exist only in the co-hosted ontology/efo graph, which is what makes the cross_db example a route rather than a nicety.

Adding a database touches five files, not one

endpoints.csv, the MIE, the regenerated 02b_database_catalog.md, the hand-written endpoint table in 02_budgets_and_discovery.md (no generator touches it — two TestUsageGuideEndpointTable tests are what catch a miss), and the intro page's database grid. Documented in the changelog so the next person doesn't rediscover it.

Verification

  • check_mie_examples.py gwascatalog10 ok, 0 zero-row, 0 error
  • Every verified: block re-run live and dated 2026-07-31; all 21 predicates cited in gotchas confirmed non-zero
  • Phase 2g cross-graph probe run; graphs.co_hosted records measured multipliers (rdf:type ×3 in-graph, ×4.18 unpinned)
  • OLS4 searchClasses("QT interval", efo)EFO_0004682 at rank 1, confirming the keyword_search_api routing
  • No benchmark leakage: all 7 example subjects clean against benchmark/questions/*.yaml
  • Composition: examples 63.0% of 21,049 bytes (corpus mean 64%)
  • Full suite: 253 passed

Note

generate_whatsnew.py keeps 5 items, so this entry rolls the 2026-07 Database paper citation off the intro page's What's New. It remains in CHANGELOG.md — say the word if it should stay pinned instead.

After merge

Tag the merge commit per CLAUDE.md step 4: git tag v2.3.0 <merge-sha> && git push origin v2.3.0

🤖 Generated with Claude Code

arkinjo and others added 3 commits July 31, 2026 09:36
Registers `gwascatalog` on the existing `ebi` endpoint (graph
<http://rdf.ebi.ac.uk/dataset/gwas_catalog>) and ships a v3 MIE with 10
live-verified examples: 4 basic, 3 intermediate, 2 aggregation, 1 cross_db,
including two first-class set-level enumeration routes (§4.4).

Chosen from the 2026-07-27..30 production tool-call log: after filtering the
~94% of traffic that is a load-test harness plus one automated pipeline, the
largest remaining usage cluster is disease-variant work chaining
clinvar -> togovar -> medgen -> mondo -> hco -> hgnc. GWAS Catalog is the
missing trait-association layer for exactly that thread, and it needs no new
infrastructure.

Three findings drove the file, none recoverable without probing the endpoint:

- Opposite literal forms in one graph. `gwas:has_snp_reference_id "rs1296720"`
  matches 0 rows and needs ^^xsd:string; `m2r:snps "rs1296720"^^xsd:string`
  matches 0 rows and needs the plain form. DATATYPE() reports xsd:string for
  both, so only an ASK distinguishes them. This is the lead global_gotcha.
- Two parallel association models over the same science: 955,930 med2rdf
  `gwas:Association` BLANK NODES carrying the full flat row, versus 782,879
  IRI-addressable OBAN `gwas:TraitAssociation`. Different populations; mixing
  them double-counts.
- `?s a gwas:Study` returns 224,583 across two disjoint IRI families — 89,981
  real GCST study records and 134,602 EBI Trackable/* publication stubs. The
  honest study count is 89,981, and that is the figure the intro page states.

Also documents the empty-string sentinel (absent values stored as "", so
OPTIONAL always binds) and rdf:type inflation (trait IRIs typed x3 in-graph,
x4.18 unpinned across efo/biosamples/clo).

Adding a database touches five places, not one: endpoints.csv, the MIE, the
regenerated 02b_database_catalog.md, the hand-written endpoint table in
02_budgets_and_discovery.md (no generator touches it; two test_server tests
guard it), and the intro page's db-grid.

check_mie_examples.py gwascatalog: 10 ok, 0 zero-row, 0 error.
Composition: examples 63.0% of 21,049 bytes (corpus mean 64%).
Full suite: 253 passed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
MINOR under the agent-pragmatic semver policy: adds a database (`gwascatalog`),
no tool removed or renamed, no return shape changed.

- pyproject 2.2.1 -> 2.3.0, uv.lock synced in the same commit.
- CHANGELOG [2.3.0] section dated 2026-07-31, with the compare link at the foot
  and a whatsnew marker (a new database is a user-facing highlight).
- generate_whatsnew.py re-run; the intro page's What's New now leads with the
  GWAS Catalog. The generator keeps 5 items, so the 2026-07 Database paper
  citation rolls off the list — it remains in CHANGELOG.md.

Full suite: 253 passed (catalog + whatsnew drift guards included).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…steps

- Databases table: add GWAS Catalog to Genes / Genomics, alongside the other
  variant resources (TogoVar, MoG+).
- Contributing: the section said adding a database was two steps (MIE +
  endpoints.csv). It is five. Only the registry row affects what the server
  VALIDATES; the other three are documentation surfaces that drift silently,
  each with a guarding test now named inline:
    3. regenerate 02b_database_catalog.md   -> test_catalog_in_sync.py
    4. the HAND-WRITTEN endpoint table in 02_budgets_and_discovery.md
       -> TestUsageGuideEndpointTable in test_server.py
    5. the intro page's database grid       -> not generated, not tested
  Three of these were missed on the first pass of this very release, following
  the old two-step instruction; the tests caught 3 and 4, and 5 was caught by
  review. A removal really is just the registry row, so that asymmetry is
  stated explicitly.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@arkinjo
arkinjo merged commit eac7e7f into main Jul 31, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant