TreeGrafter Inference Evaluation

MATURE EVALUATIONPIPELINE

Collection: Propagation by homology · Function prediction evaluation

TreeGrafter Inference Evaluation

Bottom line: TreeGrafter grafts a protein that is not in a PANTHER reference
tree onto the best-matching node and copies that node's GO terms to it as IEA
annotations (GO_REF:0000118), with no curator in the loop. We took every such
annotation in the review corpus at commit f81b9f300 (1,074 annotations on
577 reviewed proteins) and tallied how reviewers treated them, alongside the
curated PAINT/IBA set as a contrast. Reviewers accepted 43.2% of TreeGrafter
annotations as-is, removed 11.1% outright and down-graded 26.4% in all
(REMOVE, MODIFY or MARK_AS_OVER_ANNOTATED), against 73.1% accepted for
PAINT/IBA; molecular-function terms fared worst, with 41.5% down-graded. When
another pipeline reproduced the same TreeGrafter call (GO_REF:0000120)
acceptance rose to 77%, though reviewers could see that label. In about three
of four down-graded cases (four of five of those assigned a failure mode) the
tree placement was sound and the inherited term was the problem (too coarse, a
sibling term, or a generic or out-of-context term). The errors cluster by
family: 26 of the 77 PANTHER families with at least four reviewed annotations
had half or more of their terms down-graded. Two mechanical checks pick out
down-grades well: a GO term whose EC number contradicts the protein's own
UniProt EC (53 rows, 92% down-graded) and a query organism outside the clade
of the PAINT node the term came from (45 rows, 69%); see
Propagation rules and graft paths.
Much of what TreeGrafter says is right and said nowhere else: 623 rated rows
are the protein's only annotation to that term or a related one, and the
reviews kept 70% of them; where it and another pipeline give related terms and the
review keeps only one, it keeps TreeGrafter more often (see
What TreeGrafter gets right).

We did this because TreeGrafter output is routinely conflated with curated
PAINT/IBA, and knowing where automated grafting over-reaches gives PANTHER and
PAINT curators concrete families to fix. 65% of the rows come from the
Pseudomonas putida KT2440 batch, so the rates are directional, and they are
pinned to a commit because the corpus keeps growing.

Overview

TreeGrafter (Tang et al. 2019,
doi:10.1093/bioinformatics/bty625)
is the algorithm — bundled into InterProScan — that grafts a query protein
onto the most appropriate PANTHER reference phylogenetic tree and then
propagates the GO annotations attached to the grafting node down onto the query.

The critical distinction this project keeps straight is TreeGrafter vs.
PAINT/IBA
, which are routinely conflated:

PAINT / IBA TreeGrafter
Applies to genes already in the PANTHER reference tree (well-studied "core" species) sequences not in the reference tree — grafted on
Made by curators, by hand, on the tree fully automated propagation
Evidence code IBA (Inferred from Biological aspect of Ancestor) IEA (Inferred from Electronic Annotation)
Reference GO_REF:0000033 GO_REF:0000118
Assigned by GO_Central TreeGrafter
WITH/FROM PANTHER:PTN... PANTHER:PTN...

So the TreeGrafter-based inferences are the IEA / GO_REF:0000118 /
assigned-by TreeGrafter annotations
— not the IBA ones. (We verified this
directly in the corpus GOA: every GO_REF:0000118 row is IEA / TreeGrafter
/ PANTHER.)

One more reference matters, and it changes what the GO_REF:0000118 set is.
GO_REF:0000120 is UniProt's "Combined Automated Annotation using Multiple
IEA Methods"
: per its GO reference-collection definition it "integrates
identical annotations from multiple electronic pipelines, including UniRule,
ARBA, InterPro2GO, TreeGrafter2GO (GO_REF:0000118), RHEA2GO, KeyWord2GO,
SubCellular2GO, EC2GO and EnsEMBL Compara", listing the contributing pipelines
pipe-separated in WITH/FROM. In this corpus every GO_REF:0000120 row
with a PANTHER:PTN… in WITH/FROM (979 rows in the cached GOA files at
f81b9f300; 891 at the 2026-09-06 snapshot) also lists at least one other
pipeline (InterPro in most cases), and no reviewed protein has the same term
under both GO_REF:0000118 and GO_REF:0000002
(0 shared pairs in the
summary sidecar). So the three electronic references
partition the predictions by corroboration:

Reference What the row means
GO_REF:0000118 (TreeGrafter) a TreeGrafter prediction that no other pipeline reproduced
GO_REF:0000120 with PANTHER:PTN… a TreeGrafter prediction corroborated by ≥1 other pipeline
GO_REF:0000002 (InterPro2GO) an InterPro2GO prediction that no other pipeline (TreeGrafter included) reproduced

The headline rates below are therefore for the uncorroborated TreeGrafter
output. The corroborated set and the uncorroborated InterPro2GO set are
evaluated alongside it in Corroboration.

This project evaluates how good those automated TreeGrafter inferences are when
each is held to standard GO review criteria, using the AIGR corpus of
agent-written gene reviews as the reference standard (see
Reference standard).

Method

Each genes/*/*/*-ai-review.yaml records, per existing annotation, an
evidence_type, an original_reference_id, and a reviewer action from the
AIGR action enum (ACCEPT, KEEP_AS_NON_CORE, MODIFY,
MARK_AS_OVER_ANNOTATED, REMOVE, UNDECIDED, …). We treat the AIGR
adjudication as the reference judgement (see
Reference standard) and ask how the annotations with
evidence_type: IEA and original_reference_id: GO_REF:0000118 (TreeGrafter)
were treated. The PAINT/IBA set (GO_REF:0000033) is reported alongside purely
as a contrast — it is a different, curator-driven pipeline, on a largely
different set of genes. Existing annotations marked retired: true (rows that
a later GOA refresh no longer contains, kept in the review for provenance) are
not live annotations and are skipped by every script.

Reproduce everything on this page (about three minutes; only graft_check.py
needs the network):

uv run --with pyyaml projects/TREEGRAFTER/analyze_treegrafter.py   # review/contrast/summary
python3 projects/TREEGRAFTER/analyze_placement.py                   # placement + family hotspots
uv run --with pyyaml projects/TREEGRAFTER/classify_failure_modes.py # failure modes
python3 projects/TREEGRAFTER/snapshot_drift.py                      # drift vs the 2026-09-06 snapshot
uv run --with pyyaml projects/TREEGRAFTER/exemplar_independence.py  # exemplar citation check
python3 projects/TREEGRAFTER/graft_check.py                         # live UniProt; or --refresh-actions offline
python3 projects/TREEGRAFTER/propagation_rules.py --go-obo go-basic.obo  # rule scoring (GO from purl.obolibrary.org)
uv run --with pyyaml projects/TREEGRAFTER/tg_versus_other_sources.py --go-obo go-basic.obo  # TreeGrafter vs other sources
uv run --with pyyaml projects/TREEGRAFTER/tg_versus_protnlm.py --go-obo go-basic.obo        # TreeGrafter vs ProtNLM2
python3 projects/TREEGRAFTER/ec_contradiction_scale.py              # live UniProt + QuickGO
python3 projects/TREEGRAFTER/trace_graft_paths.py                  # examples: live PANTHER tree API + QuickGO
python3 projects/TREEGRAFTER/trace_graft_paths.py --all --panther-trees Tree_MSF \
    --ibd-gaf IBD.gaf --paint-total PAINT_TreeGrafter_Annotations_TOTAL.txt.gz  # every row, offline

analyze_treegrafter.py --out-dir DIR writes its three sidecars elsewhere, so
the numbers can be checked against a newer tree without touching the committed
files. It writes:

analyze_placement.py joins each annotation to its PANTHER family / subfamily
/ graft node and writes
treegrafter_family_hotspots.tsv;
classify_failure_modes.py assigns every down-graded annotation a failure
mode and writes
treegrafter_failure_modes.tsv
(see the failure-modes page).

Results (computed at commit f81b9f300, 2026-10-03)

Provenance. Every number on this page and its sub-page comes from the
sidecars regenerated on 2026-10-03 at commit f81b9f300 with the
commands above (the genes/ tree was clean at that commit). The corpus keeps
growing; re-run the commands rather than trusting these figures on a later
tree, and re-curate failure_mode_curated.tsv whenever rows cross into or out
of the down-graded set.

5,549 review files were scanned, yielding 1,074 reviewed TreeGrafter
annotations (GO_REF:0000118) across 577 review files (557 distinct gene
symbols). No row is PENDING/NEW.

Relative to the previous refresh (2026-10-01 at 943b98815; 998 annotations /
560 files), 80 annotations were added, 4 dropped and 75 actions changed, and
the down-graded set went from 299 to 283 (66 rows left it, 50 entered,
all 50 of them newly added rows). Three events account for all of it:

Drift since the 2026-09-06 snapshot

An earlier version of this page was frozen at a 2026-09-06 snapshot (898
annotations / 510 files, on main at e3350f43d).
snapshot_drift.py diffs the two
(treegrafter_snapshot_drift.tsv):

count
annotations added (PSEPK 76, SALRS 41, HETGA 29, CAPO3 19, OSCPE 5, 9AVES 4, XENLA 2, CAUVC, HELPJ, SHIFL and YEREN 1 each) 180
annotations dropped (three retired viral rows, one merged duplicate folder) 4
actions changed on already-counted annotations 131
down-graded (REMOVE+MODIFY+OVER) set 306 → 283
… rows that left the down-graded set 98 (57 → KEEP_AS_NON_CORE, 23 → ACCEPT, 16 → UNDECIDED, 2 dropped)
… rows that entered it 75 (73 newly added, 2 changed: PSEPK pgm)

Most of the drift comes from two audits: the 2026-09-20 full-gene
re-review
recorded in TREEGRAFTER/rereview-2026-09-20/
(below), plus the follow-up reviews of its awaiting genes, and the
2026-09-24 rejection re-review. Of the
131 changed actions, 57 are on genes in the 2026-09-20 folder and 71 on rows
audited on 2026-09-24 (the other three are IRE1 GO:0051082, fabF
GO:0005829 and fruA GO:0090563); of the 98 rows that left the
down-graded set, 37 are on 2026-09-20 genes and 61 on 2026-09-24 rows. The
most common transitions are MARK_AS_OVER_ANNOTATED → KEEP_AS_NON_CORE
(53 rows), REMOVE → MARK_AS_OVER_ANNOTATED (14),
MARK_AS_OVER_ANNOTATED → ACCEPT (11), REMOVE → UNDECIDED (10) and
MODIFY → ACCEPT (10). fogD illustrates the 2026-09-20 path: the re-review moved its six
REMOVE rows to UNDECIDED rather than reject on pathway context alone, and
the later follow-up review settled them as MODIFY / MARK_AS_OVER_ANNOTATED
(four rows) and KEEP_AS_NON_CORE (two), so in the snapshot diff those four
stay down-graded.

Headline

Reviewer action TreeGrafter (IEA) PAINT/IBA (corpus-wide contrast; different genes)
ACCEPT 464 43.2% 9,714 73.1%
KEEP_AS_NON_CORE 277 25.8% 2,102 15.8%
MODIFY 78 7.3% 530 4.0%
REMOVE 119 11.1% 280 2.1%
MARK_AS_OVER_ANNOTATED 86 8.0% 377 2.8%
UNDECIDED 50 4.7% 252 1.9%
NEW / PENDING 0 0% 32 0.2%
n (review files) 1,074 (577) 13,287 (3,394)

Three rates, reported side by side because they answer different questions
(all from the headline rates block of the summary sidecar):

Rate Definition TreeGrafter PAINT/IBA (corpus-wide)
accepted ACCEPT 43.2% 73.1%
retained ACCEPT + KEEP_AS_NON_CORE + MARK_AS_OVER_ANNOTATED — the term stays, possibly flagged 77.0% 91.8%
rejected REMOVE only 11.1% 2.1%
down-graded REMOVE + MODIFY + MARK_AS_OVER_ANNOTATED 26.4% 8.9%

MARK_AS_OVER_ANNOTATED sits in both retained and down-graded on
purpose: the term is not wrong, but it is flagged as over-reaching. Read
together: roughly one TreeGrafter inference in ten is judged wrong outright,
about three in four survive in some form, and fewer than half are accepted
as-is. The accept rate was 41.0% at an earlier 415-annotation snapshot,
41.3% at the 2026-09-06 snapshot, 45.1% at the 2026-09-27 refresh and 44.6%
at the 2026-10-01 refresh; the rise since the snapshot is mostly the
2026-09-20 re-review above, not new data. The fall to 43.2% since 2026-10-01
is the 80 added rows (15 accepted, 50 down-graded), mostly holozoan. The
rejection re-review barely moves the accept rate (5 rows to ACCEPT); what it
moves is the split between MARK_AS_OVER_ANNOTATED (11.5% → 8.0%) and
KEEP_AS_NON_CORE (21.0% → 25.8%), so the down-graded rate falls (30.0% →
26.4%) while the retained rate is almost unchanged (77.2% → 77.0%).

The PAINT/IBA column is not a like-for-like comparison. It is every IBA row
in the corpus (3,394 review files, dominated by human and model-organism
genes), while TreeGrafter by construction annotates sequences that are not
in the PANTHER reference tree — so the two populations barely share genes.
Restricted to the same 577 review files, there are only 20 IBA rows on 9
files (16 ACCEPT, 3 KEEP_AS_NON_CORE, 1 UNDECIDED): too few to say
anything. The contrast shows that curated IBA on well-studied genes fares
better than automated grafting on non-model genes; it does not isolate the
effect of the pipeline from the effect of the gene set. The
corroboration contrast
below, which is on the same files, is the better-controlled comparison.

By GO aspect

Molecular-function propagations are the worst category by a wide margin (one
in five MF rows is removed outright); CC terms are rarely wrong but are
often parked as non-core.

Aspect n ACCEPT KEEP_AS_NON_CORE REMOVE down-graded (REMOVE+MODIFY+OVER) retained
Molecular function 282 32.3% 20.6% 19.9% 41.5% 59.2%
Biological process 398 43.5% 18.1% 11.1% 32.7% 75.6%
Cellular component 394 50.8% 37.3% 4.8% 9.1% 91.1%

Corroboration: TreeGrafter-only vs multi-method vs InterPro2GO-only

Each population below is restricted to the 577 review files that carry
TreeGrafter rows, but covers only the subset of those files that carry it
(412 and 407 files respectively), so the three are close to — not exactly —
the same proteins:

Population n (files) ACCEPT KEEP_AS_NON_CORE REMOVE down-graded retained
TreeGrafter, uncorroborated (GO_REF:0000118) 1,074 (577) 43% 26% 11.1% 26% 77%
TreeGrafter corroborated by ≥1 other pipeline (GO_REF:0000120, PANTHER:PTN…) 709 (412) 77% 9% 0.8% 12% 92%
InterPro2GO, uncorroborated (GO_REF:0000002) 834 (407) 29% 19% 6.5% 51% 79%

Three things follow:

  1. Corroboration is the strongest single predictor of a good TreeGrafter
    call.
    The same algorithm's output is accepted 77% of the time when another
    pipeline reproduces it and 43% when none does. UniProt's GO_REF:0000120
    merge is, in effect, already a QC gate, and the GO_REF:0000118 residue is
    the part that failed it.

    Caveat — the reviewers were not blind to the label.
    original_reference_id is visible in the review YAML while the annotation
    is being adjudicated, and "combined multiple IEA methods"
    (GO_REF:0000120) reads as visibly stronger provenance than a lone
    GO_REF:0000118. So the 77%-vs-43% gap may be partly caused by the label
    rather than only predicted by it. The direction of the effect is very
    likely real — corroboration by an independent pipeline is genuine evidence
    — but the magnitude should not be taken at face value from this corpus;
    treat it as an upper bound until the provenance-blinded test in Next steps
    is run.

  2. Uncorroborated InterPro2GO is down-graded more often than uncorroborated
    TreeGrafter
    — 51% (54% for MF) — but mostly by MARK_AS_OVER_ANNOTATED
    (32%); its REMOVE rate (6.5%) is lower than TreeGrafter's (11.1%), and
    its retained rate is similar (79% vs 77%). Its down-graded terms are
    dominated by coarse ancestors — catalytic activity (45), membrane (24),
    oxidoreductase activity (21), nucleotide binding (15). So InterPro2GO's
    uncorroborated residue is mostly uninformative, while TreeGrafter's is
    more often wrong. This qualifies the graft-check hypothesis on the
    failure-modes page: InterPro does out-resolve PANTHER for particular
    proteins (AprA, S-crystallin, Mcr1), but the informative InterPro2GO calls
    have mostly already been merged into GO_REF:0000120.

  3. Taxon composition. TreeGrafter's down-grade rate is now lower on the
    P. putida KT2440 rows (21.9%, 154/703) than elsewhere (34.8%, 129/371);
    it was 29.3% vs 31.4% at the 2026-10-01 refresh and 31% vs 42% at the
    2026-09-06 snapshot. The gap reopened for two reasons: 56 of the 66 rows
    that the rejection re-review moved out of the down-graded set since
    2026-10-01 are P. putida rows, and the holozoan rows added outside
    P. putida are mostly down-graded (41 of 65).
    InterPro2GO is down-graded 56.6% on P. putida and 35.3% elsewhere (the
    P. putida reviews were strict about generic MF terms). Computed from the
    PSEPK review files in the review and contrast sidecars.

Where TreeGrafter inferences fail

Deep dive: Failure Modes & Tree Placement
joins every down-graded annotation to the PANTHER family/subfamily it was
grafted onto (and the ancestral PTN graft node), and assigns each one a
failure mode. Short answer: in about three cases out of four (four of five
of those assigned a mode) the placement is fine and the inherited term is the
problem
— too coarse or a sibling term from the family node (47%), or a
generic / out-of-context localization or process (25%). About one in seven
(42 annotations on 29 proteins, e.g. aprA, fcs, mdh, mqo1–3, dapE,
and Capsaspora coWts) is a mis-placement, genuine pseudo-enzymes are
rare (5 annotations, 3 proteins), and 12% are left unclassified (about half
of them the choanoflagellate cadherin over-annotations).

Failure mode annotations share proteins
1 Granularity — right subfamily, family/node-level or sibling term 133 47% 107
3 Generic / out-of-context CC, binding or process term (informativeness policy) 70 25% 55
4 Mis-placement (within a superfamily, or onto the wrong family) 42 15% 29
0 Unclassified — heuristic declines to guess (curation queue) 33 12% 18
2 Pseudo-enzyme / co-opted fold 5 2% 3
total down-graded 283

Mode 3 is not a grafting error. It records a reviewer informativeness
policy
— generic CC terms (cytosol, cytoplasm, membrane), uninformative
binding terms and out-of-context process terms are down-graded because the
review standard prefers specific, core terms, not because the graft landed in
the wrong place or the term is false. 33 of the 70 are cellular-component rows
assigned by aspect alone (34 CC rows in all); the rejection re-review already
moved most redundant cytosol/cytoplasm rows to KEEP_AS_NON_CORE, which
is why mode 3 fell from 93 rows to 70. Mode 3 also now holds host-context
calls on the holozoan proteins (adherens-junction and junction-assembly
processes on choanoflagellate cadherins, regulation of organ growth on
S. rosetta warts, cell fate specification on Capsaspora CoBra,
mannan biosynthesis on couscous). A different review policy would move many
of the CC rows into retained; read the mode-1/2/4 counts (180 annotations,
64% of the down-grades) as the grafting-attributable part.

The five rotary-ATPase rows (fliI ×3, sctN ×2, GO:0046933) are filed as
mode 1 by the operational rule on the sub-page (correct export-ATPase
subfamily, wrong term from a node above it); the
case study traces that term to a PAINT
IBD placed on a duplication node.

Protein counts are distinct review files, not gene symbols — 577 files
carry only 557 symbols (mdh, ALB, dapF and others span more than one
file), so a symbol-keyed count reads mode 4 as 28 (the two mdh proteins
merge) and mode 1 as 104.

The TreeGrafter terms most often down-graded cluster in two patterns:

  1. Over-specific catalytic activity propagated to the wrong paralog/subfamily.
    The grafting node carries a precise enzymatic MF that the query has diverged
    away from: proton-transporting ATP synthase activity, rotational mechanism
    (GO:0046933, 5; the rotary-ATPase case),
    fatty acid synthase activity (GO:0004312, 4),
    phosphotransferase activity, phosphate group as acceptor (GO:0016776, 4),
    carotenoid dioxygenase activity (GO:0010436, 4),
    NADH dehydrogenase activity (GO:0003954, 3; it was 6 before the
    rejection re-review kept three of the complex I rows as non-core),
    spermidine synthase activity (GO:0004766, 3),
    (S)-2-hydroxyglutarate dehydrogenase activity (GO:0047545, 3).
    TreeGrafter places a sequence on a tree node but cannot tell that the
    catalytic residues, or the whole substrate specificity, have changed.
    (triacylglycerol lipase activity on fogD was re-reviewed to
    UNDECIDED on 2026-09-20 — the re-review found that the family source Ayr1
    does have lipase activity — and the later follow-up review marked it
    MARK_AS_OVER_ANNOTATED: the source activity is real, but FogD sits in a
    distinct subfamily with no hydrolase assay.)

  2. Generic / uninformative localization. Before the rejection re-review,
    cytosol (GO:0005829, 18 rows) and cytoplasm (GO:0005737, 9) were the
    two most frequently down-graded TreeGrafter terms. The re-review judged
    most of them true but redundant and moved them to KEEP_AS_NON_CORE, so
    only 2 of each remain down-graded; the generic CC terms now most often
    down-graded are membrane (GO:0016020, 4), plasma membrane (3) and
    nucleus (3). The MF analogue, identical protein binding (GO:0042802),
    is down to 1 row.

  3. Animal-only terms on unicellular holozoans. Each of the three
    S. rosetta cadherins carries the same ten down-graded rows from one
    graft node (PTN000616280, PTHR24027:SF422), so adherens junction,
    catenin complex, beta-catenin binding, cell-cell junction assembly,
    cell morphogenesis, calcium-dependent cell-cell adhesion and others
    each appear three times (see the
    case study).

There are also process-level mis-propagations of two kinds: a mechanistically
wrong sibling process (lipopolysaccharide core region biosynthetic process
on the mcr phosphoethanolamine transferases, which modify lipid A, not the
core oligosaccharide), and pathway terms propagated onto hosts that lack the
pathway (sucrose biosynthetic process on P. putida fbp).

Family hotspots (upstream targets)

treegrafter_family_hotspots.tsv
aggregates the reviewer outcome over all 1,074 TreeGrafter annotations per
PANTHER family, subfamily and graft node. Of the 77 families with at least
four reviewed annotations, 26 have half or more of their propagated terms
down-graded
and 27 have none — the errors are concentrated, not diffuse.
Families with ≥60% down-graded (modes counted from
treegrafter_failure_modes.tsv):

Family n proteins down-graded modes of the down-graded rows Example genes
PTHR24027 cadherin-23 30 3 100% 0 ×15, 3 ×12, 1 ×3 — choanoflagellate cadherins on a node PAINT restricts to Bilateria (case study) PTSG_05882, PTSG_06458, PTSG_11235
PTHR10543 beta-carotene dioxygenase 8 4 100% 4 ×8 — stilbene dioxygenases on the carotenoid-cleavage subfamily Q53353, Saro_0802, Saro_2809, lsdB
PTHR30443 "inner membrane protein" (EptA) 8 4 100% 1 ×8 — EptA node carries LPS core and phosphotransferase mcr-1, mcr2, mcr-3, mcr-4
PTHR15184 ATP synthase 5 5 100% 1 ×5 — F-type ATP-synthase term on FliI/SctN export ATPases (case study) fliI ×3, sctN ×2
PTHR43128 L-2-hydroxycarboxylate DH 4 2 100% 4 ×4 — MDH on the L-LDH subfamily METEA/mdh, PSEPK/mdh
PTHR43775 fatty acid synthase 4 4 100% 1 ×4 — family-level FAS term on PKS subfamilies eryAI–III, Pks1
PTHR43808 acetylornithine deacetylase (M20A) 5 3 80% 4 ×4 dapE, pepV
PTHR11485 transferrin 4 1 75% 3 ×3 — mammalian receptor-recycling localizations on salivary draculin K9IMD0
PTHR42995 acetyl-CoA carboxylase carboxyl transferase 4 2 75% 1 ×3 mdcD
PTHR43137 dihydroorotase 4 1 75% 1 ×2, 3 ×1 — broad pyrimidine-process parents and cytoplasm beside the retained specific terms pyrC
PTHR11558 spermidine synthase 9 3 67% 1 ×6 — spermidine terms on the PMT subfamily NaPMT3, PMT1, PMT2
PTHR24241 neuropeptide receptor-related GPCR 6 3 67% 1 ×4 (heuristic) CTR1, CTR2, OPR
PTHR44169 1-acyl-DHAP reductase (Ayr1) 6 1 67% 1 ×4 — Ayr1 lipid terms on the SrdE secondary-metabolite subfamily fogD
PTHR21047 dTDP-sugar epimerase 10 3 60% 1 ×6 eryBVII, rfbC, rmlC
PTHR22960 molybdopterin cofactor synthesis 5 3 60% 1 ×3 PP_1969, PP_2482, moaA
PTHR24356 serine/threonine-protein kinase (LATS node) 5 1 60% 0 ×2, 3 ×1 — animal-tissue IBDs from the LATS node on S. rosetta Warts warts
PTHR45527 nonribosomal peptide synthetase 5 1 60% 4 ×3 — EntF terms on the PvdD NRPS pvdD

Relative to the 2026-09-06 snapshot, three families are no longer
hotspots
: PTHR48078 (ilvA-I/ilvA-II, 6/6 → 0/6 down-graded) after the
2026-09-20 re-review; PTHR11556 (FBPase, 7/11 → 1/11) and PTHR11632 (SDH
flavoprotein, 71% → 3/7 = 43%, aprA electron-transfer and plasma-membrane
rows now ACCEPT). PTHR44169 (fogD) went 6/6 → 0/6 at the 2026-09-20
re-review and is back at 4/6 after the follow-up review. Since the
2026-10-01 refresh, the rejection re-review took PTHR11271 (guaD/hutF,
3/5 → 1/5) and PTHR30435 (flgE/flgG, 3/4 → 1/4) off the table and moved
PTHR42995 from 4/4 to 3/4 (accD GO:0009329 restored); PTHR21272
(aroQ-III, aroQ1, aroQ2, 3/3) drops below the four-annotation
threshold now that the duplicate aroQ folder is merged. PTHR24027 and
PTHR24356 (holozoan rows) and PTHR43137 (pyrC) are new to the table.

Re-review of 2026-09-20

TREEGRAFTER/rereview-2026-09-20/
holds the audit records of a full-gene re-review of 29 genes carrying
TreeGrafter rows (28 of them in the current TreeGrafter set), done by agent
reviewers (three of the seven records name Codex; the others name no
reviewer), which re-examined every annotation on each gene (not only the
GO_REF:0000118 rows) and wrote the new actions into the gene review YAMLs:

Record Genes Status
exemplars.yaml, exemplars-2.yaml the ten OpenScientist/Falcon exemplars plus NCGR_LOCUS1270 all reviewed
fogd.yaml fogD awaiting_adjudication
metabolic-scope.yaml PP_3394; alg8, purM, ilvA-I, ilvA-II 1 awaiting; 4 reviewed
enzyme-substrate-transfer.yaml K9IJK6, mdr; ydiJ, PoMZ_10221 2 awaiting; 2 reviewed
substrate-and-lineage.yaml Cgas, K9IFT7, K9IMD0, pvdD; moeB, mdcD 4 awaiting; 2 reviewed
fusion-and-toll-scope.yaml NCGR_LOCUS10166, TOLL9 both awaiting

In total 19 genes are reviewed and 10 are awaiting_adjudication in
these records. The awaiting genes' new actions are already in the YAMLs and
therefore in every table above: of the 37 rows on these genes that left the
down-graded set since the 2026-09-06 snapshot, 13 (5 now UNDECIDED, 5
ACCEPT, 3 KEEP_AS_NON_CORE) are on awaiting genes, so those rows are
provisional until a curator adjudicates. Five of the awaiting genes
(fogD, K9IJK6, K9IMD0, K9IFT7, Cgas), and IRE1, have since had
follow-up reviews of focused OpenScientist reports, which changed 16
TreeGrafter actions (see the 2026-10-01 note); the re-review records
themselves were not updated. The
cache-reports/ subfolder preserves six OpenScientist reports reused as
evidence in that pass (see its README; they are evidence inputs, not accepted
conclusions).

Reference standard

Caveats

Rejection re-review (2026-09-24)

The rejection rate is only meaningful if the rejections themselves hold up, so
every TreeGrafter row then marked REMOVE or MARK_AS_OVER_ANNOTATED was
re-examined against a fixed rule set: REMOVE requires positive contrary
evidence, broad-but-true terms are not over-annotations, a too-coarse ancestor
is MODIFY rather than REMOVE, and every term definition is checked in
QuickGO. A term that is true but is a redundant ancestor of a carried term, or
a redundant generic compartment, is KEEP_AS_NON_CORE rather than ACCEPT:
the enum reserves ACCEPT for terms "representing the core function of the
gene", so restoring a bare ancestor as core would assert something the evidence
does not. Rules, per-batch records and a generated summary are in
TREEGRAFTER/rereview-2026-09-24/.
The nine genes already re-audited on 2026-09-20 were left as recorded there.

192 rejected rows across 166 gene entries — 165 proteins, since one protein
had two review folders that this audit merged — of which 117 (61%) stand and
75 (39%) were relaxed
—
56 to KEEP_AS_NON_CORE, 7 REMOVE → MARK_AS_OVER_ANNOTATED, 5 to ACCEPT,
4 to MODIFY, 3 REMOVE → UNDECIDED. Only five rows are restored as core
functions, each one a term the protein itself performs: the MurJ flippase
reaction (GO:0034204), the AccA/AccD carboxyltransferase complex
(GO:0009329), bis-MGD biosynthesis on MobA (GO:1902758), and the two
lymphotoxin-alpha signalling processes on K9IWR0.

This is the largest change to the down-graded population since the
2026-09-06 snapshot, and since the 2026-10-03 refresh it is in every table on
this page and in the failure-mode classification.
Every audited row that is
still live has the same action in treegrafter_review.tsv as in its batch
record (190 of 192; the other two are the retired g022 row and the row on
the duplicate aroQ folder that was merged into aroQ-III), and 126 of them
remain down-graded. Against the 2026-10-01 tables it moved 66 rows out of the
down-graded set and none into it. The relaxations say more about the
first-pass reviews than about TreeGrafter, and they cut unevenly across the
four failure modes:

What survives scrutiny almost intact is mode 4, the paralog /
wrong-subfamily catalytic transfer
(only the two ptxD rows left it, as
UNDECIDED): spermidine synthase on the PMT methyltransferases,
carotenoid dioxygenase on the lignostilbene dioxygenases, LDH on malate
dehydrogenases, cysteine synthase vs. O-acetylhomoserine sulfhydrylase. The
hotspot list is built on exactly these, so it is the part of the analysis the
re-review leaves standing — and the right input to the upstream tickets.

About a third of the 117 retained rejections had their reason strengthened
with the specific evidence (EC numbers, PANTHER subfamily vs. graft node,
cached substrate-panel quotes) rather than left on family-level doubt.

Deeper analyses

There are also two cross-family mis-placements: Capsaspora Warts with the
citron/ROCK kinases, and the S. rosetta yorkie candidate with the MAGI
family. One correct graft still inherits animal-tissue IBDs from LATS node
PTN002390470, including regulation of organ growth on a unicellular
organism. Since the 2026-10-03 refresh its 65 TreeGrafter rows
(S. rosetta 41, Capsaspora 19, Oscarella 5; 41 down-graded) are in
every table on this page. The row-level classifier files the down-graded
ones as mode 3 (16, host context and CC), mode 0 (17: the cadherin
over-annotations the reviews call untested rather than impossible, and two
warts rows), mode 1 (5) and mode 4 (3: coWts ×2, coITGB2 cell-cell
adhesion). The case study reads the cadherin set as a whole as a
taxon-blind graft ("4-like"); row by row, only host-context reasons are
stated explicitly enough to classify.
- Corpus-wide provenance (side query, 2026-10-11). A GO-DB analysis of
PomBase's contribution to TreeGrafter
(brief; the build
scripts are not in this repo) walks every TreeGrafter graft node in
goa_uniprot_all up the PANTHER 19 trees to the nearest same-term IBD. Of
166.8M TreeGrafter annotations, 90.1% trace to a same-term IBA on an
ancestor, usually several steps above the graft: only 4.9M come from an IBD
on the graft node itself. The other 9.9% have no same-term IBA on their
path. For 3.0M of these an ancestor now carries an IBA to a more specific
term, consistent with PAINT refining the IBD after the TreeGrafter run
(dated 2026-07-27) while TreeGrafter still emits the coarser parent. Example:
PTHR28283 root PTN002001416 now has GO:0110034, but 2,350 TreeGrafter
rows still carry the parent GO:1902660 (negative regulation of glucose
mediated signaling pathway), including on bacterial proteins. This
run-lag is a second source of the "too coarse" and out-of-context inherited
terms counted above, separate from IBD placement. It is not measured in
this corpus.
- OpenScientist blinded verification uses a dedicated TreeGrafter prompt
template,
templates/treegrafter_function_hypothesis.md,
which frames each propagated term as a blinded "GENE has " hypothesis
and instructs the agent to actively test the failure modes
(granularity, pseudo-enzyme, mis-placement). Run via
gene-hypothesis-research openscientist <org> <gene> --annotation-term-id <GO> --as-function-hypothesis --template templates/treegrafter_function_hypothesis.md.
See Reference standard for how the ten existing
runs can be compared with the reviews (against the actions recorded at
selection, not the current ones).

What TreeGrafter gets right

Added 2026-10-14.
tg_versus_other_sources.py sets
each reviewed TreeGrafter row beside the other annotations on the same
protein, related by GO is_a/part_of (same term, ancestor, descendant, or a
sibling sharing a direct parent), and records which side the review kept
(tg_versus_other_sources.tsv,
counts in
tg_versus_other_sources_summary.tsv).
"Kept" is ACCEPT or KEEP_AS_NON_CORE; "down-graded" is REMOVE,
MODIFY, MARK_AS_OVER_ANNOTATED or TOO_GENERAL. Recomputed 2026-10-16
from the live reviews, after TOO_GENERAL was first counted as down-graded.

The only source, and kept. 623 rated TreeGrafter rows have no other
annotation on the protein, from any source, to the same term, an ancestor or
a descendant. The reviews kept 439 (70.5%): 232 of 262 CC (89%), 70 of 118 MF
(59%), 137 of 243 BP (56%). TreeGrafter overall was kept 72% of the time in
the pinned f81b9f300 snapshot (this sole-source figure is from the live
reviews, so the two are close rather than a measured gap): the statements it
alone makes are not worse than the rest. Several carry the
protein's defining activity: squid ADAR2 (double-stranded RNA adenosine
deaminase activity), naked mole-rat Cgas (2′,3′-cyclic GMP-AMP synthase
activity), P. putida relA (GTP diphosphokinase activity), hummingbird
TAS1R3 (sweet taste receptor activity), Capsaspora coYki
(transcription coactivator activity), P. putida tig (protein folding
chaperone).

More specific than another pipeline. 159 TreeGrafter rows are
descendants of an InterPro2GO term on the same protein (79 of them kept), 50
of an ARBA term (27 kept), 14 of a UniRule term (11 kept) and 141 of a
combined-IEA term (123 kept). Where the review kept one side of a related
pair and down-graded the other (distinct TreeGrafter rows):

Other pipeline Proteins with both Kept TreeGrafter, down-graded other Kept other, down-graded TreeGrafter
InterPro2GO (GO_REF:0000002) 158 47 35
combined IEA (GO_REF:0000120) 192 33 29
ARBA (GO_REF:0000117) 47 16 6
UniRule (GO_REF:0000104) 25 6 0
UniProt keyword / subcellular location 30 4 5
EC2GO (GO_REF:0000003) 4 0 1

Examples where TreeGrafter is the side kept:

The reverse cases exist and are listed in the same file: 35 TreeGrafter rows
down-graded where InterPro2GO's related term was kept. Most are a specific
TreeGrafter term that is wrong under a coarse InterPro2GO parent that is
still true (mdh, nspC, eryAI–III, the stilbene dioxygenases, the
PMTs, the choanoflagellate cadherins). The combined-IEA call won 13
sibling conflicts against TreeGrafter.

Against ProtNLM2

The ProtNLM2 evaluation and this project barely
overlap, for a structural reason. TreeGrafter annotates only proteins outside
PANTHER's reference genomes; reference-genome proteins get PAINT IBA rows
instead. Most ProtNLM cohorts are reference genomes: the 44 reviewed horse
genes carry 39 IBA rows and no TreeGrafter row, and the same holds for the
fly, fission yeast and Neurospora cohorts. Of the 162 ProtNLM
prediction-review files at the time, 79 were on proteins with IBA rows and 10
on proteins with reviewed TreeGrafter rows (one has both). There are now 202,
the 40 DONKEY40 files carrying TreeGrafter rather than IBA rows; the same 10
are in the TreeGrafter snapshot.
tg_versus_protnlm.py prints these counts
from each protein's GOA file and pairs the two sources on those 10 (tg_versus_protnlm.tsv). The
scales differ: TreeGrafter rows carry a gene-review action, ProtNLM
predictions a VDCL assessment from a prediction review.

Ten proteins is too few for rates. Running ProtNLM2 on the 577 reviewed
proteins is not an option: its output exists only for its published accession
list, which includes 15 of them. So we ran a larger test on a cohort chosen
from that list: the DONKEY40 cohort. It has 40 donkey proteins
with both ProtNLM2 GO output and TreeGrafter rows, each paired with a horse
ortholog carrying PAINT IBA rows, reviewed 2026-10-14 and re-reviewed
2026-10-23.

Propagation rules and graft paths

Added 2026-10-14. Three questions about the 1,074 reviewed rows: can a
mechanical check, run without reading the literature, pick out the rows
reviewers went on to down-grade; which PAINT node does each reviewed term come
from; and how far do the clearest errors reach beyond the corpus?

Every TreeGrafter row is a TreeGrafter-only call. GOA merges identical
calls from several electronic pipelines into GO_REF:0000120, so a
GO_REF:0000118 row is one no other pipeline made. None of the 1,074 shares
its GO term with another electronic annotation on the same protein (9 share
it with an IBA, 10 with an experimental or ISS row). This is why the
corroboration contrast above exists at all, and it means the EC-match control
below is empty by construction.

Rules scored against the reviews

propagation_rules.py scores nine
rules from UniProt records, GOA rows and GO (go-basic.obo, release
2026-07-26) against the actions in
treegrafter_review.tsv. The base
rate is 27.6% down-graded over 1,024 rated rows (UNDECIDED excluded).
Results in propagation_rules.tsv,
every hit in propagation_rule_hits.tsv.

Rule Flagged Down-graded Lift Accepted
MF term's EC contradicts the protein's UniProt EC (ec_contradiction) 53 92.5% 3.35 2
catalytic MF term is a sibling of another catalytic MF term on the protein 25 60.0% 2.17 5
catalytic MF term shares no word with the PANTHER (sub)family name 42 45.2% 1.64 12
≥2 reviewed paralogs in the same species and PANTHER family 301 36.2% 1.31 109
no other GOA source asserts the term or a descendant 929 29.2% 1.06 427
term is an ancestor of another GO term on the protein 102 12.7% 0.46 30
broad compartment (cytoplasm, cytosol, membrane, plasma membrane, nucleus) 289 4.8% 0.18 146

Two more rules flag too few rows to read: a family or subfamily name
containing INACTIVE (3 rows, all eryA, from the PTHR43775:SF51 name rather than
a pseudoenzyme) and animal tissue vocabulary on a non-metazoan protein (1 row,
S. rosetta warts regulation of organ growth); the eukaryote-only-CC on a
prokaryote rule flags nothing.

The rules are scored against actions written by the same agentic review
process, so a high down-grade rate partly measures agreement with the reviews'
own reasoning rather than independent ground truth. The strongest hits do not
simply restate the rule: purM GO:0004637, for example, was argued from
domain architecture (PF00586/PF02769, IPR004733), not from EC numbers. The
independent test is running the EC rule over all of GOA (Next steps) and
checking a sample with a human curator.

How far the EC contradictions reach

ec_contradiction_scale.py takes
each (UniProt EC, GO term) pair behind a corpus EC contradiction, counts the
UniProtKB entries that have that EC and that GO term but not the term's own
EC (which removes fused or multifunctional proteins for which the term may be
right), and samples 40 of them in QuickGO to see where the term comes from
(ec_contradiction_scale.tsv,
44 pairs). Restricted to the 36 pairs from single-EC proteins whose corpus
rows were all down-graded, they add up to about 150,000 protein–term pairs,
and in almost every sample all or nearly all of the annotations are
TreeGrafter's:

Corpus gene Protein (UniProt EC) Inherited term Entries Share of EC TreeGrafter in sample
purM AIR synthetase (6.3.3.1) phosphoribosylamine–glycine ligase 18,719 83% 39/40
trpC IGP synthase (4.1.1.48) phosphoribosylanthranilate isomerase 16,436 80% 36/40
moaA GTP 3′,8-cyclase (4.1.99.22) cPMP synthase 15,840 84% 39/40
pyrC' dihydroorotase (3.5.2.3) allantoinase 13,482 56% 35/40
dapE succinyl-DAP desuccinylase (3.5.1.18) acetylornithine deacetylase 10,950 72% 40/40
moeB MoaD adenylyltransferase (2.7.7.80) thiosulfate–cyanide sulfurtransferase 8,938 95% 32/40
mqo1–3 malate:quinone oxidoreductase (1.1.5.4) (S)-2-hydroxyglutarate dehydrogenase 6,706 95% 40/40
mdh malate dehydrogenase (1.1.1.37) L-lactate dehydrogenase (NAD+) 5,185 18% 37/40
phnX phosphonoacetaldehyde hydrolase (3.11.1.1) phosphoglycolate phosphatase 1,941 94% 40/40
eryAI–III DEBS (2.3.1.94) fatty acid synthase 1,157 95% 40/40

The samples are drawn from the first 500 hits UniProt returns, not uniformly;
the counts use UniProt's own go: search, which covers every evidence code.

Graft paths: which PAINT node the term came from

trace_graft_paths.py fetches the live
PANTHER 19 tree for a family, walks up from the graft node to the nearest
ancestor carrying an IBA for the same GO term, and summarises the clades under
that IBD (graft_paths.yaml for seven
examples). It reproduces the rotary-ATPase case independently: all five
fliI/sctN grafts trace to the duplication node PTN008558586, 3 to 7
steps up. The other examples:

All 1,074 rows, offline. trace_graft_paths.py --all repeats the trace
for every reviewed row against the PANTHER 19 trees (Tree_MSF/*.tree from
PANTHER's TreeGrafter data download), PAINT's current IBD.gaf (PANTHER
v19.0, created 2026-08-28) and PAINT_TreeGrafter_Annotations_TOTAL.txt.gz
(the AN-to-PTN map, and the GO set TreeGrafter assigns at each node today);
the PANTHER API times out on too many families for a full run. It reproduces
the API results for the examples above. Each row's query organism is checked
against the IBD node's clade using the full NCBI lineage from the UniProt
taxonomy API (UniProt's OC lines omit ranks such as Bilateria and
Opisthokonta). Output in
graft_paths_all.tsv, scores in
graft_path_rules.tsv:

Tree rule (rated rows) Flagged Down-graded Lift Accepted
query organism outside the IBD node's clade 45 68.9% 2.49 6
query organism inside the IBD node's clade 795 25.4% 0.92 390
IBD on the graft node itself (0 steps) 28 89.3% 3.23 1
MF term, duplication between IBD and graft 136 49.3% 1.78 44
MF term, no duplication between IBD and graft 87 36.8% 1.33 35
IBD on the family root 529 26.1% 0.94 258
IBD below the family root 374 28.3% 1.03 165
IBD node is a duplication 112 18.8% 0.68 54
no same-term IBD on the path 117 30.8% 1.11 40

NOTES

Controlled OpenScientist batch (2026-10-15)

Sixteen blinded hypotheses ("GENE has TERM") were pre-registered in
openscientist-controls/selection.yaml.
The review's action on each row was frozen at 1b7f8f330, before any report
was read. All 16 reports are written. Five runs timed out at OpenScientist's
7,200 s ceiling with 3 iterations and were retried once with 2 (PP_2482, relA,
PP_4594, metZ, pdxH), which departs from the pre-registered protocol.
Verdicts and their scoring:
openscientist-controls/results.yaml.

Group Runs Supported Partially supported Refuted
accepted sole-source controls 4 3 1 0
rule tests (all accepted) 5 4 0 1
UNDECIDED rows 7 2 5 0

Re-review (2026-10-15). The eight rows in question were re-reviewed with
the reports as evidence, checking each decisive claim against repo data first:

Row Before After
PP_1969, PP_2482 GO:0061798 UNDECIDED UNDECIDED (ACCEPT on 2026-10-15, reverted 2026-10-16)
eryCIV GO:0008483 UNDECIDED MODIFY to GO:0019179
PP_3571 GO:0008777 UNDECIDED MODIFY to GO:0016811
metZ GO:0016846 ACCEPT REMOVE
PP_4594, ptxD, gabD-II UNDECIDED UNDECIDED

The re-review also corrected several of the runs' claims:
- PtxD has no Trp314.
- Human CTH is in PANTHER subfamily SF15, not SF80.
- The PP_2482 UniProt record has no binding-site features.

Sixteen runs give no rates. What they show is how the faults split: where
TreeGrafter errs here, the protein is usually in the right family and the
term is the wrong depth. A wrong reaction class (metZ) is rare.

2026-10-14

2026-10-03

2026-10-01

2026-09-29

2026-09-28

2026-09-27

2026-09-25

2026-09-19

2026-09-07

2026-09-06

Next steps