AFP (human, P02771) — review notes

Working journal for the PAINT + affinage review. Provenance is recorded inline as
[PMID:xxxxx "verbatim"].

The framing problem: a biomarker is not a function

AFP is one of the most-measured proteins in clinical medicine — second-trimester maternal
serum screening, hepatocellular carcinoma surveillance, germ-cell tumour staging. Almost all
of that literature measures concentration as a readout. None of it establishes a molecular
function or a biological process. The review keeps three things apart:

  1. what the protein does — reversible binding of small hydrophobic and metal ligands, the
    albumin-fold carrier activity;
  2. where/when it is expressed — yolk sac and fetal liver, re-expressed in HCC and
    AFP-producing gastric cancer. Expression is not function;
  3. what clinicians use it for — not annotatable at all.

The affinage record is almost entirely category (2) and (3). Of its 17 citations, a large
block (FOXM1, HBP1/HBx, gp96/NR5A2, the −119 HNF1 promoter variant) is about the transcriptional
regulation of the AFP gene
, which is a function of those regulators, not of AFP.

Family and PANTHER node — verified, not assumed

The ALB check the brief asked for: yes, ALB's accession is in the WITH/FROM

Both IBA rows cite PANTHER:PTN000147344 with human serum albumin UniProtKB:P02768 among
the seeds. Resolved every token:

token identity status
UniProtKB:P02768 ALB, Homo sapiens, 609 aa Swiss-Prot
UniProtKB:P02769 ALB, Bos taurus, 607 aa Swiss-Prot
UniProtKB:P08835 ALB, Sus scrofa, 607 aa Swiss-Prot
UniProtKB:P19121 ALB, Gallus gallus, 615 aa Swiss-Prot
UniProtKB:P02774 GC / vitamin D-binding protein, human, 474 aa Swiss-Prot
UniProtKB:P43652 AFM / afamin, human, 599 aa Swiss-Prot
RGD:2085 rat Alb (REST API: "symbol":"Alb") —
RGD:2667 rat Gc (REST API: "symbol":"Gc") —
PANTHER:PTN000147344 internal tree node, not a protein —

Zero AFP-subfamily proteins are seeds on either row. Not one AFP from any species. So
everything AFP inherits phylogenetically is inherited from albumin, vitamin-D-binding protein
and afamin.

(RGD tokens return HTTP 400 from QuickGO's geneProductId; resolved instead through the RGD
REST API for identity and through the rat UniProt accessions P02770/P04276 for evidence.)

The whole PAINT picture for PTHR11385 is seven IBD assignments

From interpro/panther/PTHR11385/PTHR11385-paint.tsv:

node term seeds
PTN000147344 (family root) GO:0036094 small molecule binding (F) 8
PTN000147344 (family root) GO:0031667 response to nutrient levels (P) 4
PTN000147369 GO:0008431 vitamin E binding (F) AFM
PTN000147369 GO:0051180 vitamin transport (P) AFM
PTN002604574 GO:0005499 vitamin D binding (F) GC + rat Gc
PTN002604574 GO:0042359 vitamin D metabolic process (P) mouse Gc
PTN008319942 GO:1903981 enterobactin binding (F) human + bovine ALB

The design is coherent and, for the MF branch, correct: the LCA goes at the root, the
specific ligand goes at the subfamily node
. Afamin's node gets vitamin E, GC's node gets
vitamin D, albumin's node gets enterobactin.

The reciprocal half of the check (the brief's "which node's reach is exactly my gene set?"):
PTHR11385:SF7, the alpha-fetoprotein subfamily, carries nothing at all.
AFP is the one human
member of this family with no subfamily-level PAINT assignment, so it inherits the general
parent and no ligand term — while its three paralogs each got theirs. And GO:0005504 fatty acid binding — the one ligand demonstrated for ALB (2 IDAs), for human AFP (below) and for
mouse Afp — sits at no node at all.

This is the AADACL2/3/4 "right term, wrong node" shape in a new guise: not a misplaced term,
but a missing one at a node that exists.

What has actually been measured on human AFP (as opposed to inherited from ALB)

This is the question the brief asked, and the answer is: more than GOA records.

Copper. [PMID:80265](https://pubmed.ncbi.nlm.nih.gov/80265 "Alpha-fetoprotein bound 1 mol of copper(II) ion per mol of protein above pH 6.0"), by equilibrium dialysis and gel filtration on AFP purified from human
umbilical cord serum and from hepatoma ascites
— not recombinant, not a family inference.
The site was mapped by chemistry: [PMID:80265](https://pubmed.ncbi.nlm.nih.gov/80265 "Photooxidation of alpha-fetoprotein in the presence of methylene blue resulted in the loss of the copper(II)-binding ability of the protein in parallel with the destruction of the histidyl residues.") and reconstituted:
[PMID:80265](https://pubmed.ncbi.nlm.nih.gov/80265 "A synthetic amino-terminal undecapeptide of alpha-fetoprotein also bound copper(II) ion.") UniProt encodes exactly this as FT BINDING 22 /ligand="Cu(2+)" /evidence="ECO:0000269|PubMed:80265". GOA has no copper term.

Bilirubin. [PMID:89900](https://pubmed.ncbi.nlm.nih.gov/89900 "1 mol of each alpha-fetoprotein bound 1 mol of bilirubin at pH 8.3") with Kd 2.6–7.4 × 10⁻⁷ M by two independent methods (difference spectrum and the
Jacobsen peroxidase assay), again on cord-serum and hepatoma-ascites AFP. GO has no
bilirubin binding MF term at all
— see the proposed term below.

Fatty acids and metal ions — the paper nobody cited. PMID:38678117 (Commun Biol 2024, PDB
8X1N) is the first structure of human AFP and it is the single most function-relevant paper
on this gene. [PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "We observed and identified certain structural features of AFP, including N-glycosylation at Asn251, four natural fatty acids bound to distinct domains, and the coordination of metal ions by residues His22, His264, His268, and Asp280.") The fatty
acids were identified chemically, not modelled from shape: [PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "According the results of GC-MS, it was identified that palmitic acid (C16:0) was the most abundant FA bound to AFP") — 57.42% of total FA, with stearate the other major peak — at four sites,
[PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "These FA binding sites are located in AFP substructures IIA, IIA/IIB, IIIA, and IIIB, respectively"). The metal was not supplied by the experimenters:
[PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "the presence of metal ions was not intentionally introduced during the protein extraction process"), and His22 is the same residue UniProt already annotates as the Cu(2+)
ligand from the 1978 paper.

Round 2 — the metal is NOT zinc-specific, and I missed the experiment that says so. I first
proposed GO:0008270 zinc ion binding, disclosing only the authors' averaging caveat
([PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "This could be due to the presence of multiple metal ions at this binding site, and the metal ion density being obtained through an averaging algorithm")) and arguing that "the
deposited structure commits to zinc". The reviewer pointed to the decisive experiment in the
same full text I already had
: the authors mutated all four residues
([PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "We mutated four amino acids of AFP to alanine, obtaining the mutant AFP-4mut (H22A, H264A, H268A, and D280A).")) and measured metal content by ICP-MS —
[PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "The findings indicated a reduction in the molar ratio of metal to protein in the mutant AFP-4mut, specifically for elements such as magnesium, aluminum, nickel and zinc"),
concluding [PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "This implies that the identified four amino acids in AFP possess the capacity to bind to different types of metal ions"). And zinc entered the model by choice, not by
identification: [PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "After we selected Zn2+ fit into the density map").

So the one piece of direct wet-lab metal data in the paper is positive evidence for promiscuity,
not merely an absence of evidence for specificity. Changed to GO:0046872 metal ion binding.
This is the ACBD3 lesson landing on me: I had the full text, quoted from it five times, and did not
read the Results paragraph that tested the very site I was annotating. An empty stretch of a paper
you are already quoting is where the answer hides.

Two things this strengthens rather than weakens:
- The copper row is untouched. GO:0005507 rests on PMID:80265 — equilibrium-dialysis
stoichiometry on protein from human tissue, site mapped chemically to histidine. Specific where a
specific metal was measured; general where only "a metal" was. That asymmetry is now stated in the
review rather than left implicit.

Round 4 sharpens this further, and corrects an inaccuracy I introduced in round 3. Defending
the parent/child pair, I wrote that the general row "carries the structure's finding that the
same site
binds several metals". The reviewer noticed that cannot be right: PMID:80265
reconstitutes copper binding with a synthetic amino-terminal undecapeptide — eleven residues,
spanning roughly 19–29 on a mature chain beginning at 19 — which contains His22 but cannot
contain His264, His268 or Asp280. So copper binding does not require three of the four
residues of the tetrahedral site. And PMID:38678117 points the same way from its own data:
[PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "Moreover, the molar ratio of some metal elements with AFP exceeds 1, it suggests the potential for AFP to bind to metal ions at multiple locations.")

So the two rows are not a general and a specific statement about one site; they are plausibly
two separable sites sharing His22. That is a stronger answer to the redundancy objection than
the one I gave. Stated with the limit made explicit: sufficiency of a peptide does not prove the
sites are disjoint in the full-length protein, so the claim is separability and a shared His22,
not independence.
- UniProt's unsourced nickel claim gains support. Nickel is among the four metals lost in the
4mut — the first independent measurement on the human protein bearing on it. My own
suggested_questions entry asking where the nickel assertion came from is now partly answered by
a paper I was already citing, which the reviewer also spotted.

(One reviewer premise I checked and did not concede: it stated that "no prior affinity comparison
is cited anywhere" and that the paper says only "This motif provides AFP with strong metal-ion
binding capabilities". The paper does state the comparison, twice —
[PMID:38678117](https://pubmed.ncbi.nlm.nih.gov/38678117 "Previous studies have demonstrated that AFP exhibits a higher affinity for Zn2+ than HSA") and again in the introduction. The fair half of the criticism was that my review
asserted it without quoting it, so the quote is now in core_functions rather than the claim
being dropped.)

This paper is absent from GOA and absent from the affinage report. It is the campaign's
recall lesson exactly: gates_passed: True certifies precision, never recall.

Measured rather than asserted (computed in AFP-bioinformatics/audit_afp_claims.py's sibling
step and recorded in references[].reference_review): affinage returned 17 citations, of
which 0 appear in AFP's GOA record and 1 (PMID:33009373) is cited in this review. It
missed PMID:38678117 and both 1970s ligand papers. Its gates passed and all 17 ids are numeric
PubMed identifiers with no bioRxiv DOIs in PMID-shaped fields, so its precision is fine — the
failure is entirely one of recall and of framing. A large part of its narrative is the
transcriptional regulation of the AFP gene by FOXM1, HBP1/HBx, gp96/NR5A2 and the −119 HNF1
promoter variant, which are functions of those regulators and not of alpha-fetoprotein, and the
remainder is HCC cell biology in which AFP concentration is the readout. Ligand binding — what
the protein actually does — is absent from the record entirely.

GO:0031667 response to nutrient levels — the row that does not survive reading its sources

The productive technique from the brief ("go one level deeper than the donor") pays off here.
The IBA reaches AFP from four non-node donors (human/rat/chicken ALB, rat Gc). Querying each
donor's own evidence under the term:

So the apparent breadth is one experiment re-counted. Reading the three primary papers:

  1. PMID:16245148 — Production of human serum albumin by sugar starvation induced promoter and
    rice cell culture.
    ["Mature form of HSA was expressed under the control of the sucrose starvation-inducible rice alpha Amy3 promoter"]. The starvation response belongs to the
    rice αAmy3 promoter; albumin is the recombinant cargo protein.
    A biotechnology yield paper
    has become a cellular response to starvation IDA on the cargo.
  2. PMID:16153637 — ["In serum-free medium, albumin (29 or 49 mg/ml) fully prevented the apoptotic effects of dotarizine, flunarizine and cyclopiazonic acid."] Exogenous albumin at
    29–49 mg/ml as a culture-medium supplement, against drug-induced ER Ca²⁺ release. That is
    not a nutrient level.
  3. PMID:20227002 — ["there was a restoration of serum glucose, total protein, and albumin concentrations, which were reduced by fetal malnutrition"]. Albumin concentration as a
    nutritional-status readout
    . This is the biomarker fallacy in the donor set itself.

Add AFP's own biology: two independent human families carry null AFP alleles and
[PMID:15280901](https://pubmed.ncbi.nlm.nih.gov/15280901 "The affected individuals were asymptomatic and presented normal development."),
[PMID:18854864](https://pubmed.ncbi.nlm.nih.gov/18854864 "Despite this, fetal development and birth were normal.")

Verdict: REMOVE, with a PAINT recommendation stated once at the node level — the term reaches
every member of PTHR11385 from PTN000147344, so the fix belongs upstream, not on AFP alone.

GO:0036094 small molecule binding — general because the node is heterogeneous, i.e. correct

The AADACL4 corrective applies. Before calling a broad term "too general", check whether the
donors agree. They do not: ALB holds GO:0005504 fatty acid (IDA ×2), GO:0030170 pyridoxal
phosphate (IDA), GO:0019825 oxygen (IDA), GO:1903981 enterobactin (IDA), GO:0005507
copper (NAS); GC holds vitamin D; AFM holds vitamin E. The LCA of {fatty acid, pyridoxal
phosphate, oxygen, enterobactin, copper, vitamin D, vitamin E} is GO:0036094. Verified via
QuickGO ancestry that both GO:0005504 and GO:0005507 are descendants of GO:0036094
(ion binding sits under small molecule binding in current GO — I had this wrong from memory and
checked it).

So GO:0036094 is the ontology and PAINT working correctly. ACCEPT, and make the review
additive rather than corrective: supply AFP's own measured ligands as NEW.

The rodent function that must NOT be transferred — and the check that came back negative

Mouse Afp is the textbook case of an AFP function, and it is estrogen-driven:
[PMID:12297623](https://pubmed.ncbi.nlm.nih.gov/12297623 "Whereas mutant homozygous adult males are viable and fertile, AFP null females are infertile."), [PMID:12297623](https://pubmed.ncbi.nlm.nih.gov/12297623 "It is most likely that AFP acts by virtue of its capacity to bind estrogen, because the infertility phenotype of the Afp knockout mice resembles that of female animals exposed perinatally to estrogens"); extended by PMID:16388309 to protection of
the developing female brain from masculinization. Mouse UniProt P02772 FUNCTION is literally
Binds estrogens, fatty acids and metals.

Human AFP does not have this property — UniProt states that only a small percentage (less than
2%) of human AFP shows estrogen-binding properties — and human AFP nulls are asymptomatic.

Predicted defect: the rodent reproductive phenotype leaking into human AFP by ISO/IBA.
Checked: it has not happened.
Mouse Afp carries five IMP BP rows (GO:0001542 ovulation from
ovarian follicle, GO:0006915, GO:0006955, GO:0042448 progesterone metabolic process,
GO:0048872) and none of them appears on human AFP. Mouse Afp also carries no estrogen-binding
MF, so there is nothing to transfer. Reporting this as a non-confirmation per the ADAMTSL5
precedent — the check was run and is negative, which is a real distinction between the two species'
records.

Per-partner judgement on the three GO:0005515 rows

Queried IntAct directly (21 interaction records over 16 distinct partners) rather than trusting
NbExp.

(Correction to myself: I first wrote "12 distinct partners" and "the other nine", both by eye and
both wrong. The correct figures are 16 and 14, and they are now
computed by
AFP-bioinformatics/audit_afp_claims.py --partners rather than counted by hand. Recorded rather
than silently fixed, because this is the campaign's most-confirmed lesson arriving on schedule:
a number I could not reproduce was the defect.)

GPC3 (P51654), PMID:39822733 — real, and the ACRV1 "one screen counted three ways" check is
negative.
The three IntAct records are not sub-methods of one experiment: anti bait coip
in HepG2 cells, plus pull down typed direct interaction, host In vitro, plus an in
vitro anti bait coip. MI-score 0.59, the highest of any AFP interaction. The cached file
said full_text_available: false; the flag was stale — PMC11737099 has the full text, and
re-fetching with --force got it. The full text settles the term choice:
[PMID:39822733](https://pubmed.ncbi.nlm.nih.gov/39822733 "The results show that AFP pulls down GPC3, but not MUC16, a control protein")
(purified Fc-tagged AFP against GPC3-His, with a negative control), and crucially
[PMID:39822733](https://pubmed.ncbi.nlm.nih.gov/39822733 "The results show that the GPC3-ΔHS also precipitates AFP, suggesting that the GPC3 core protein might bind AFP").

Round 2 — I got the term wrong here, and the reviewer caught it. I first argued that because
the ΔHS mutant still binds, the contact is with the core protein and GO:0043394 proteoglycan binding would misdescribe it, so bare GO:0005515 was the correct ceiling. That confuses two
different objects. GO:0043394 is "Binding to a proteoglycan, any glycoprotein in which the
carbohydrate units are glycosaminoglycans"
— the object is the glycoprotein, and GO has
separate terms for the sugar moiety (GO:0008201 heparin binding, GO:1904399 heparan sulfate
binding). Checked against QuickGO rather than read off the label. So the ΔHS result rules out a
glycosaminoglycan-binding term and leaves GO:0043394 untouched: it shows the HS chains are
not required, not that the partner is not a proteoglycan. GPC3 is a GPI-anchored heparan
sulfate proteoglycan, and both the HepG2 co-IP and the membrane colocalisation used native,
glycanated protein. Action changed to MODIFY → GO:0043394. The row stays non-core in
substance — still no measured functional consequence — but a strictly more informative term does
exist, which is exactly what CLAUDE.md's "avoid protein binding" rule is for.

The generalisable error: I let an experiment about which part of a partner is contacted decide a
term that is about what the partner is. Same shape as the campaign's other label-versus-definition
failures — I reasoned from "core protein, not sugar" to "not a proteoglycan" without reading the
definition.

HCV E2, PMID:26808496 (two rows, IntAct + AgBase). UniProtKB:Q99IB8-PRO_0000045596
resolves to Envelope glycoprotein E2, residues 384–750 of the HCV genotype 2a JFH-1
polyprotein — i.e. a different species' protein. [PMID:26808496](https://pubmed.ncbi.nlm.nih.gov/26808496 "85 cellular proteins and three viral proteins were successfully identified in three independent trials, among which alphafetoprotein (AFP), UDP-glucose: glycoprotein glucosyltransferase 1 (UGT1) and HCV NS4B were further validated as novel E2 binding partners.") Validation was co-IP of over-expressed
Flag-AFP with E2 in 293T [PMID:26808496](https://pubmed.ncbi.nlm.nih.gov/26808496 "To this end, we subcloned AFP, UDP-glucose:glycoprotein glucosyltransferase 1 (UGT1), and Cdc2 in a Flag-tagged expression plasmid and co-transfected with a HCV E2 expression plasmid into 293T cells.") — weaker than the GPC3 purified-protein
pull-down, and the paper's functional follow-up was on UGT1, not AFP.

GO:0140272 exogenous protein binding ("Binding to a protein or protein complex from a different
species") is the exact term, and the paralog ALB already carries it by IDA — so this is a
precedented, informative replacement for bare protein binding. MODIFY both rows.

The other 14 IntAct partners are not in GOA, and should not be. Two yeast two-hybrid screens
supply eight of them: PMID:21988832 (a two hybrid array) contributes seven — AP4S1, PIDD1,
MED27, EHD4, PHB2, PSMB7, GNB1 — and PMID:16169070 (two hybrid pooling) contributes SGSM2.
Every one is cytosolic, nuclear or proteasomal, i.e. topologically inaccessible to a
signal-peptide protein that is constitutively secreted, and all were assayed in a S. cerevisiae
host that forces both partners into the yeast nucleus. The remaining six (DCUN1D4, KIAA1191,
MAPT, FGG, STAMBP, HLA-B) come from large-scale AP-MS with intracellular baits.

GOA imported exactly the two partners whose own papers validated them outside the screen.
That is good curation, and the check that could have found a defect here came back negative —
worth saying so explicitly rather than only reporting hits.

GO:0005737 cytoplasm — right term, wrong provenance

The recorded route is Ensembl Compara (GO_REF:0000107) from mouse Afp P02772, whose whole
basis is a single MGI IDA, PMID:8607965. That paper's own abstract reports the opposite of
what the annotation needs: [PMID:8607965](https://pubmed.ncbi.nlm.nih.gov/8607965 "antibodies to SA gave a positive reaction in embryos of 7 days, while AFP was not detected during this period") and, in the teratocarcinomas,
[PMID:8607965](https://pubmed.ncbi.nlm.nih.gov/8607965 "Only SA protein was detectable by immunostaining.") — AFP was detected only as
mRNA. The "intracellular presence of AFP" in that abstract is a background citation to earlier
work
, not this paper's result. (Abstract only; I have not read the full text, so this is stated
as "cannot be verified from the available record", not as a curator error.)

The term nevertheless survives on independent human evidence: [PMID:33009373](https://pubmed.ncbi.nlm.nih.gov/33009373 "Moreover, partial colocalization of AFP and HuR was observed in the cytoplasm of HuH7 and HepG2 cells").
So: KEEP_AS_NON_CORE, kept for a reason GOA does not record, with the weak provenance flagged —
and with the context caveat that the cytoplasmic pool is described in AFP-producing hepatoma
lines, not in the fetal plasma protein.

Retraction / erratum / expression-of-concern sweep

All 29 candidate PMIDs checked against PubMed, reading both PublicationTypeList and
CommentsCorrections/RefType (the ACTR8 lesson: a Publisher Correction is invisible to a
pubtype query). All clean — no retraction, no erratum, no expression of concern. Recorded as
a negative result so the next reviewer knows it was run.

Row-count reconciliation (the ADAMTSL5 check)

AFP-goa.tsv has 8 data rows; the fetch-gene stub seeded 7. The stub collapsed the two
GO:0005515 / PMID:26808496 / Q99IB8-PRO_0000045596 rows that differ only by assigner
(IntAct and AgBase). Restored to 8 so each assigner gets its own verdict; they resolve the
same way, but the redundancy is now visible rather than hidden. Plus 3 NEW proposals =
11 existing_annotations entries.

Enforced mechanically by genes/human/AFP/AFP-bioinformatics/audit_afp_claims.py, which rebuilds
supporting_entities straight from the GOA WITH/FROM column, asserts row-for-row coverage,
verifies all 71 supporting_text quotes (including the 5 file: quotes that CI does not
check), requires UniProt quotes to sit inside one physical line, and rejects duplicate YAML keys.
Its guards were each verified by breaking the document on purpose (--self-test), and
RESULTS.md is regenerated by the script so a hand-edit to it cannot survive.

That number was 63 for several rounds after the document had reached 71, and nothing noticed —
a derived figure hardcoded in prose, which is the same defect as the hand-counted partner census
earlier on this page. The script now reconciles this sentence against its own derived count and
fails if they disagree, so the next drift is a build error rather than a stale claim.

Its first run failed with a FileNotFoundError on a mis-resolved repo root — recorded here
because that is the behaviour wanted: a missing input is a loud error naming the path, not a
silently skipped section.

Diagnosis: this is an under-annotation gene, with one over-annotation

Following AFF4's framing. Human AFP's entire GO record is 8 annotations / 6 distinct terms,
with zero experimental molecular-function evidence beyond three protein binding IPI rows and
zero experimental biological-process rows. Meanwhile there are two 1970s ligand-binding papers
on protein purified from human tissue, a 2024 cryo-EM structure with four fatty acids and a metal
ion resolved, six FAM20C phosphosites, and two human null-allele reports — none of which produced
a GO annotation. That is a coverage defect. The single over-annotation is GO:0031667.

What I deliberately did not propose

A transport BP (GO:0015908, GO:0006869) or GO:0140104 molecular carrier activity. The
binding is measured; the delivery step is not. GO:0140104's definition requires
"delivering it either to an acceptor molecule or to a specific location", and the placental
DHA-transfer claim in PMID:38678117's discussion is a citation to other work, not a measurement
in that paper. ALB holds GO:0140104 by EXP; AFP has no equivalent experiment. Raised as a
suggested experiment instead. Noting this explicitly because the temptation to round "binds
fatty acids and circulates in fetal plasma" up to "transports fatty acids to the fetus" is exactly
the kind of join the campaign keeps getting caught by.

Review rounds 5–7: one claim, retracted three times at N−1 sites

Journaled here rather than left in commit messages, because the pattern is the useful part.

Rounds 3–4 established that AFP has at least two separable metal sites sharing His22 — an
amino-terminal one that a synthetic undecapeptide reconstitutes for Cu(II), and the tetrahedral
His22/His264/His268/Asp280 site the structure resolves. Retiring the superseded one-site reading
then took three further rounds, each time because I verified the edits I had made instead of
sweeping the document for the claim I had retracted:

round where the old reading survived why it mattered
5 the metal knowledge_gaps entry still asked "which metal the amino-terminal site prefers"
6 suggested_questions (nickel) and suggested_experiments the experiment named AFP-4mut as the control that "separates the two sites" — but AFP-4mut is H22A/H264A/H268A/D280A and His22 is the shared residue, so it ablates part of the amino-terminal site and cannot distinguish them. The construct that works is a His264A/His268A/Asp280A triple leaving His22 intact. That one would have cost someone a real experiment.
7 the same knowledge_gaps field, internally said the ICP-MS result "belongs to" the tetrahedral site four sentences before explaining that the 4mut cannot localise it, and closed by presuming exactly two sites where the gap_statement deliberately leaves the number open

The fix is mechanical, not resolve. audit_afp_claims.py now gates on a sweep of 13 retracted
phrasings
across both the review and this file, plus 6 required corrections asserted with
minimum occurrence counts, so deleting a correction is as loud as leaving the original error. Each
guard is exercised by its own --self-test mutation. (The count of mutations is deliberately not
stated here: it has already drifted once in this very paragraph, and an unreconciled number in prose
is the defect this section is about. --self-test prints the list.)

And a sub-lesson that recurred three times inside the fix itself: every hand-assigned threshold
in those guards was wrong. "proteoglycan binding" guessed 2, actual 1 (the prose says "binding
to a proteoglycan", which does not contain the phrase); "undecapeptide" guessed 4, actual 12;
the exact string "separable" guessed 4, actual 3 because the text also uses separability.
Three guesses, three misses. The table now prefers GO ids, which cannot be reworded, over prose
fragments, and every count is measured. This is the campaign's "derive the expected number
independently" rule applying to the guard as much as to the claim.

The same defect had already appeared twice on this gene in a different costume: the hand-counted
IntAct partner census (12/9 asserted, 16/14 actual), and the supporting_text quote count
hardcoded in this file as 63 while the document had reached 71. Both are now derived, and
the script reconciles the sentence above against its own count.

Round 8: the guard had the defect it was written to prevent

The round-7 gate allowed this file to quote a retired phrasing while narrating its correction — but
the exemption was keyed on the phrase and the whole file, so once a phrase appeared once inside
quotation marks, every later bare re-assertion of it here was waved through. The single case the
guard existed to catch was the one case it could not see. That is the campaign's "a guard defeatable
by deleting the thing it guards" shape, arriving in the guard I had just committed as the durable fix.

Now adjudicated per occurrence, on that occurrence's own neighbouring characters, reported with a
line number.

Round 9: a guard that punishes the correct behaviour gets routed around

The tightened rule recognised only straight double quotes as narration. This file's house style for
quoting superseded wording is backticks and bold — so a future journal entry written the normal
way would have turned the build red, and the path of least resistance under a red build is to delete
the narration.
A guard that makes honest record-keeping expensive buys silence, not correctness.

Recognises backticks, bold, straight quotes, curly quotes and trailing sentence punctuation now. Two
complementary self-test mutations were added: a bare re-assertion must fire the guard, and the
legitimate narration already in this file must not. (Round 10 replaced the rest of this
sentence's original claim — that the styles were "each verified directly" — with actual mutations.
Verifying by hand at the REPL and calling it verification is how the italics hole below got written.)

Also in round 9: the self-test no longer mutates this tracked file. It wrote to the real
AFP-notes.md and restored in a finally, which leaves residue if the process is killed between the
two; check_all now takes a notes_path so the mutation goes to a temp copy like every other one.

(The pattern across these rounds is written up once, in the closing section below, rather than
restated here.)

Round 10: over-corrected, and the branch nothing broke was the one that broke

Round 9 widened the narration rule by listing openers and closers as two independent sets. That
let two things through:

Replaced by matched delimiter pairs, with single asterisks and single quotes deliberately
excluded.

The rule was not the real defect; the testing was. Round 9 added four narration styles and
exercised exactly one, leaving the rest "verified directly" at the REPL — which is precisely how the
italics hole was written and shipped. The self-test now drives a mutation through every branch,
each reported under its own name so a regression says which style broke rather than collapsing into
one boolean: five narration styles that must be exempt, and three — italics, single quotes, unmatched
delimiters — that must still fire.

What the review rounds actually taught

(Scope note: this section is written to cover every round after the fourth, and is deliberately
not numbered in its heading — an earlier version said "ten rounds" and was stale within two.)

Rounds 1–4 changed the annotation. Every round after the fourth changed nothing a curator would
act on
— verified each round by diffing the review YAML for term, id: GO:, action,
evidence_type, supporting_text and molecular_function lines, which return zero changes
since round 4; the surviving hunks are knowledge_gaps, one suggested_questions entry and one
suggested_experiments entry. Each of those rounds found a defect in the previous round's fix.

Rounds 11–13 were entirely this journal correcting itself: 11 split the self-test so a failure names
its branch, 12 removed a duplicated closing claim that was false, and 13 corrected the statement
that replaced it (below).

What found them does not split cleanly, and the exceptions are the interesting part. Round 12
replaced an overclaim ("the reviewer found everything") with a tidy dichotomy — judgement defects
found by the reviewer, arithmetic defects found by the guard — and round 13 had to correct that,
because it was false in the other direction. The actual tally for the five wrong numbers:

wrong number actual found by
"proteoglycan binding" ×2 1 the guard, on first run
"undecapeptide" ×4 12 the guard
"separable" ×4 3 the guard
12 IntAct partners 16 me, recomputing before the first review
63 supporting_text quotes 71 the reviewer — no guard existed for it yet

Three guard-caught, one self-caught, one reviewer-caught. The last is the one that matters: a
mechanical check only catches what it is pointed at, and someone still has to notice what it is
not.
The 63/71 drift sat in the file through several rounds precisely because nothing was
watching that sentence — which is why the guard now reconciles it. The honest summary is not a
dichotomy but a division of labour with a gap in it, and the gap is where an adversarial reader
earns its place.

A note on how this paragraph itself went: the overclaim, the tidy dichotomy that replaced it, and
this correction were three successive attempts to describe my own process, each one wrong in a
different direction, in the section whose only job is being accurate about that. Reasoning about
what found a defect turns out to be no easier than finding one.

The transferable part is what changed the hit rate, and it was never "be more careful":

  1. Sweep the document, not the diff. Three rounds went to one claim retracted at N−1 sites.
  2. Measure thresholds, never assign them. Five hand-assigned numbers on this gene, five wrong —
    12 partners (actual 16), 63 quotes (71), "proteoglycan binding" ×2 (1), "undecapeptide" ×4
    (12), "separable" ×4 (3).
  3. A branch nothing breaks is a branch nothing tests. Both guard defects lived in branches
    covered by reasoning rather than a mutation.
  4. A guard that punishes correct behaviour buys silence. The strict-quotes rule would have made
    writing this journal a red build.

An honest coda: items 2 and 3 are both restatements of the campaign brief's own rules, which I had
read before starting. Knowing a rule and having a mechanism that enforces it are different things,
and only the second one held.