GeneReviews and StatPearls Baseline Check
just check-genereviews answers, offline, the first question the review skill's
item 15 asks of a new Mendelian entry: does a GeneReviews chapter exist for
this disease, and is it tagged? It also reports the same for StatPearls, which
is a different kind of source (below), and it is deliberately only
semi-deterministic.
Why it exists
The review skill used to answer "does a chapter exist" with a curl to PubMed.
The automated PR reviewer runs in a sandbox that permits just and uv run and
blocks every network tool, so on PR #11592
it recorded, in two consecutive reviews, that it could not verify the entry's
"no GeneReviews chapter exists for isolated Dandy-Walker malformation" note, and
the curator had to prove the negative by hand in a comment. The question is
answerable from data the repository can carry.
How it works
PubMed indexes both collections as books, so the [book] search field selects
every chapter exactly:
genereviews[book] -> 958 chapters
statpearls[book] -> 9,646 chapters (snapshot 2026-09-10)
just refresh-bookshelf-index pulls those lists plus each record's title, NBK
accession and date into cache/bookshelf/genereviews.csv and
cache/bookshelf/statpearls.csv, with the snapshot date in
cache/bookshelf/MANIFEST.yaml. Rows are sorted by PMID and carry no per-row
timestamps, so the diff after a refresh is exactly the chapters that appeared,
retired, or were renamed. The check then compares each entry against that index.
Two of its answers are deterministic and one is a judgement, and the report keeps them apart:
| Verdict | Meaning | Gates? |
|---|---|---|
MISTAGGED |
a reference tagged GeneReviews (or StatPearls) is not a chapter of that collection |
GeneReviews only |
CITED_UNTAGGED |
a chapter PMID or NBK URL is cited somewhere in the file but not tagged in references: |
GeneReviews only |
UNTAGGED_CHAPTER |
a chapter whose title, normalised, equals one of the entry's names exists and is not tagged | GeneReviews only |
TAGGED |
at least one tagged reference is a verified, current chapter | no |
TAGGED_RETIRED |
every tagged chapter is one GeneReviews has retired (below) | no |
CANDIDATE_CHAPTER |
only partial title matches, or only a retired chapter | no, by design |
NO_CHAPTER |
nothing in the snapshot names this entry | only when the entry has no synonyms (below) |
Names compared are the entry name, its synonyms, and the disease_term
preferred term and ontology label. Normalisation drops case, diacritics,
punctuation and hyphens, a leading <GENE>-Related, and a trailing Overview,
so Aicardi-Goutieres Syndrome finds Aicardi-Goutières Syndrome and Marfan
Syndrome finds FBN1-Related Marfan Syndrome as EXACT.
CANDIDATE_CHAPTER is the judgement half. Alpha Thalassemia sits inside
Alpha-Thalassemia X-Linked Intellectual Disability Syndrome and is not that
disease's chapter; Autosomal Dominant Robinow Syndrome 1 sits under Autosomal
Dominant Robinow Syndrome and is. The check lists the title and the match kind
(GENE_SUFFIX, CONTAINS, TITLE_IN_NAME, NEAR, and GENE_SCOPED,
below) and leaves the call to a
reader. Two guards keep this list short: a numbered title never stands in for a
differently numbered name (Usher Syndrome Type I is not a candidate for Usher
Syndrome Type 4), and two <GENE>-Related … forms must name the same gene.
A few chapters put the gene after the disease, set off by a spaced dash:
Autosomal Dominant Tubulointerstitial Kidney Disease – REN, with sibling
chapters for UMOD and MUC1, Autosomal Recessive Polycystic Kidney Disease –
PKHD1, and Pyridoxine-Dependent Epilepsy – ALDH7A1. Normalisation keeps the
gene as a last word, so before #15904 such a title matched only a name equal to
the whole title, gene included, or a name found inside it. The ADTKD-REN entry,
whose synonyms include ADTKD-REN and autosomal dominant tubulointerstitial
kidney disease due to mutations in REN, got NO_CHAPTER. Such a title is now also read as
<disease> – <gene>, and is reported as GENE_SUFFIX when the disease part is
a phrase in one of the entry's names and the gene symbol appears in one of
its names or in its genetic: records (record name, gene_term preferred
term or label). The gene condition is what stops the UMOD, REN and MUC1 chapters
from being offered to each other's entries: the disease words are identical in
all three. A GENE_SUFFIX hit is a candidate, never EXACT, so it does not make
--strict fail; an entry whose name is the exact title, gene included, still
gets EXACT. Only a single upper-case symbol after the dash counts as a gene,
so Udd Distal Myopathy – Tibial Muscular Dystrophy is not read this way. An
entry for the whole family with no gene in it (Autosomal Dominant
Tubulointerstitial Kidney Disease) still sees all three chapters as CONTAINS
candidates, which is the right answer for a grouping-level name.
A negative from an entry with no synonyms is not a verified negative. GeneReviews
often titles a chapter by a synonym: 17q12 Recurrent Duplication is the chapter
for Chromosome 17q12 Duplication Syndrome, and matching the entry name alone
misses it. Stripping the synonyms: block from 88 committed entries that had a
chapter match turned eight exact-title UNTAGGED_CHAPTER findings into
NO_CHAPTER (#12075). So when an entry has no non-empty synonyms, a
NO_CHAPTER or CANDIDATE_CHAPTER verdict carries a note listing the strings
that were searched. That note is printed whenever the file is named on the
command line, and --strict fails a GeneReviews NO_CHAPTER of this kind. A
whole-KB run counts these verdicts on a separate summary line rather than
listing them, because several hundred finished entries have no synonyms;
--all lists them, and so does --strict, since they are then a reason for
the non-zero exit. The fix is to add the entry's synonyms and re-run, not to
record that no chapter exists. For a disease that has no synonyms anywhere
(MONDO included), write an explicit synonyms: []: an empty list records that
synonyms were looked for and none exist, so the negative counts as checked,
while an absent synonyms key still counts as unsearched.
In --format json output, gating is true for a synonym-less GeneReviews
NO_CHAPTER, so a whole-KB count of gating entries includes them. The
synonymless and no_synonyms_recorded fields separate them from the other
gating verdicts; TSV output does not carry either field.
Gating is opt-in (--strict) and only ever on GeneReviews. A TAGGED entry
that also has an untagged candidate is reported, not failed.
just check-genereviews kb/disorders/Asthma.yaml # one or more files
just check-genereviews # whole KB, findings only
just check-genereviews --strict FILE # exit 1 on a GeneReviews gap
just check-genereviews --online FILE # also live PubMed title search
just check-genereviews --format tsv > census.tsv # machine-readable census
--online adds a live "<name>"[TI] AND genereviews[book] search per name so a
chapter published after the snapshot is caught, and a
<GENE>[TIAB] AND genereviews[book] search per causal gene symbol (see
Gene-scoped chapters below). The name is quoted as a phrase:
unquoted, PubMed drops the words it cannot match and searches what is left, so
mesiodens-cataract syndrome became a search for "syndrome" (#14213). A search
PubMed reports having rewritten anyway is skipped with a warning. It needs network and is not
what the reviewer runs; a tagged PMID missing from the snapshot is still
accepted when the cached record carries the Bookshelf citation form. A live
hit is listed with match kind ONLINE, after every index match: PubMed's
[TI] search finds the name's words in the title, which is not the
normalised-title equality EXACT means, so an ONLINE hit makes the entry a
CANDIDATE_CHAPTER and never gates. Read the title, and tag the chapter if it
is this disease's.
Retired chapters
GeneReviews withdraws a chapter by appending – RETIRED CHAPTER, FOR HISTORICAL
REFERENCE ONLY to its title. The index records that as retired = 1 (68 of the
958 GeneReviews chapters in the 2026-09-10 snapshot). A retired chapter is still
a GeneReviews article, so tagging it GeneReviews is correct, and removing the
tag would only turn the citation into a CITED_UNTAGGED finding.
What changes is the verdict. An entry whose tagged GeneReviews chapters are
all retired gets TAGGED_RETIRED instead of TAGGED, so the entries resting
on withdrawn content can be listed (#16018). One current chapter tagged beside
the retired one makes the verdict TAGGED again. TAGGED_RETIRED never fails
under --strict: most retired chapters have no successor, and a retired chapter
can still be the fullest clinical description of its disease. The question it
puts to a curator is whether a current chapter now covers the disease, often a
spectrum or Overview chapter that a GENE_SCOPED row or a title search finds.
If one does, cite and mine it, and re-quote evidence from it rather than
carrying the retired abstract's sentences over. If none does, the retired
chapter stays. The schema cannot yet record a source's standing (#9840), so
say so in notes: when it matters to a claim.
Gene-scoped chapters
GeneReviews often scopes a chapter to a gene rather than to one disease:
Autosomal Dominant TRPV4-Related Disorders covers five skeletal dysplasias,
SED Maroteaux type among them, and no comparison with the entry's disease names
reaches it (#9694). So the check also searches from the gene side. Every
<GENE>-Related … or <GENE>-Associated … title (about 250 chapters, including
forms such as HAMP- and HJV-Related Hemochromatosis and MCM8/MCM9-Related
Syndromes) is indexed under its gene symbols, and a chapter whose symbol
matches one of the entry's causal genes is listed as a GENE_SCOPED candidate.
The genes come from genetic: records that claim to cause the disease:
relationship_type CAUSATIVE or absent, variant_origin not SOMATIC, and no
"somatic" in the record's name or association. A susceptibility, modifier or
somatic-driver gene's chapter is about another disease (HRAS-Related Costello
Syndrome is not a thymoma baseline). Symbols are compared case and all, so
HFE matches and a word does not.
A somatic-mosaic disorder is the exception. When the entry's inheritance, or a
subtype's, binds HP:0001442 Typified by somatic mosaicism (the convention
the somatic-mosaicism skill sets), its somatic causal genes are kept, because
the variant is post-zygotic by definition and the gene's chapter is the
baseline: Hemimegalencephaly, angioosteohypertrophic_syndrome
(Klippel-Trenaunay) and Focal_Cortical_Dysplasia_Type_II all reach
PIK3CA-Related Overgrowth Spectrum this way. Non-causal records stay out even
then.
GENE_SCOPED is a candidate, never a verdict, for the same reason as the other
partial matches: POLG-Related Disorders covers every POLG disease, which may or
may not include this one. It never changes a gating verdict. When it landed it
moved 108 entries from NO_CHAPTER to CANDIDATE_CHAPTER, including
GM1_Gangliosidosis_Type_3 (GLB1-Related Disorders) and
Distal_Hereditary_Motor_Neuronopathy_Autosomal_Dominant (the GARS1, BSCL2,
DCTN1 and TRPV4 chapters).
The index holds titles only, so a chapter that names the gene only in its
abstract, usually an overview (Nuclear Gene-Encoded Leigh Syndrome Spectrum
Overview for SURF1), is out of its reach. --online closes that gap with one
<GENE>[TIAB] AND genereviews[book] search per causal symbol, limited to
symbols in the committed HGNC label cache (cache/hgnc/terms.csv), since a token
such as II, CAG or HLA would match unrelated abstracts. Unlike the name
search it keeps hits already in the snapshot, since the title match never saw
them, and it runs for GeneReviews only. A retired hit is marked
[retired chapter].
Searching PubMed by hand
genereviews[book] is the field that selects chapters. GeneReviews[TI]
searches chapter titles, which never contain the book's name, so it returns zero
for every disease; that query sat in both curation skills until #9694. To drop
withdrawn chapters add NOT retired[TI]. NOT "RETIRED CHAPTER"[TI] looks
equivalent but PubMed's title index does not hold the phrase: it returns a
warninglist and excludes nothing.
| Query | Hits |
|---|---|
TRPV4[TI] GeneReviews[TI] |
0 |
TRPV4[TIAB] AND genereviews[book] |
3, one retired |
TRPV4[TIAB] AND genereviews[book] NOT retired[TI] |
2 |
TRPV4[TIAB] AND genereviews[book] NOT "RETIRED CHAPTER"[TI] |
3, with a warninglist |
genereviews[book] AND retired[TI] |
68 |
(Counts from 2026-10-30.)
What to do with a finding
UNTAGGED_CHAPTER/CITED_UNTAGGED(GeneReviews): fetch the chapter (just fetch-reference PMID:<id>), tag it in the top-levelreferences:block (just tag-references FILEdoes this for a chapter cited by PMID; one cited only by itsNBKURL is tagged by hand), then mine it as the review skill's item 15 describes. If the matched chapter is genuinely not this disease's, say so innotes:.MISTAGGED: the tag is wrong. Remove it, or replace the reference with the real chapter.CANDIDATE_CHAPTER: read the title. Either tag and mine it, or ignore it; the check will keep listing it, which is the intended behaviour for a judgement it cannot make.- StatPearls anything: informational. See the next section.
GeneReviews versus StatPearls
Both are NCBI Bookshelf collections with PubMed-indexed chapters, both are
fetched and cached by just fetch-reference like any PMID, and both are easy to
mistake for each other in a deep-research report's "NCBI Bookshelf" citation.
They are not the same kind of source.
| GeneReviews | StatPearls | |
|---|---|---|
| Scope | Mendelian and heritable disease | all of clinical medicine |
| Size | ~960 chapters | ~9,600 chapters |
| Authorship | invited domain experts | volunteer clinicians |
| Review | peer-reviewed; scheduled comprehensive revisions | light editorial review; continuing-education framing |
| Structure | fixed clinical sections (Clinical Characteristics, Diagnosis/Testing, Management, Genetic Counseling), each quotable from the PubMed abstract | free narrative plus a "Continuing Education Activity" summary |
| Role here | mandatory phenotype baseline for a Mendelian entry (review skill item 15) | citable orientation source; never a baseline, and its absence is never a gap |
So for Dandy-Walker malformation the check reports GeneReviews NO_CHAPTER and
StatPearls UNTAGGED_CHAPTER (PMID:30855785, Dandy-Walker Malformation). The
first closes the reviewer's open item; the second says a StatPearls chapter
exists that the entry could cite for orientation, and nothing more. The
StatPearls value of ReferenceTagEnum exists so that a cited chapter can be
tagged and the KB queried for it, not to make it a requirement.
Tagging is now index-driven
just tag-references decides whether a cited PMID is a chapter by looking it up
in the index, falling back to the Bookshelf citation form in the cached record
(In: GeneReviews(®) [Internet], In: StatPearls [Internet]) for a chapter newer
than the snapshot. It used to grep the cached abstract for the bare word
"GeneReviews", which also matches a journal article that cites GeneReviews in its
reference list. It tags both collections.
Staleness
The index is a snapshot and is refreshed by hand, like cache/<prefix>/hierarchy.csv.
A chapter published after the snapshot is missed until the next refresh; the
snapshot date is printed in every summary line so a reader can see how old the
answer is. Nothing gates on the index being current.