The worklist row is human,Q6UWT4,C5orf46, and a C#orf# placeholder is often renamed, so
the current approved symbol was established from three independent sources rather than
assumed:
| source | symbol | id | location | length | note |
|---|---|---|---|---|---|
| HGNC | C5orf46 | HGNC:33768 | 5q32 | — | status: Approved, prev_symbol: null, date_symbol_changed: null |
| UniProt | C5orf46 | Q6UWT4 (CE046_HUMAN) |
— | 87 aa | reviewed (Swiss-Prot), Uncharacterized protein C5orf46 |
| NCBI Gene | C5orf46 | 389336 | 5q32 | — | chromosome 5 open reading frame 46 |
All three agree; the symbol has never been changed. HGNC records the aliases
MGC23985, SSSP1 and AP-64, and the alias name skin and saliva secreted protein 1 —
which matters below, because it independently corroborates the tissue distribution that the
only functional paper derives from a database rather than measuring.
Q6UWT4 was verified live: primaryAccession == Q6UWT4, so no merged-accession
substitution. (The committed analysis script asserts this on every UniProt fetch, and
break-tests it against O15507, which returns HTTP 200 and a complete reviewed record for
GFRA1.)
This gene is not ADISSP. ADISSP is HGNC:15873 / Q9GZN8 / formerly C20orf27 / 20p13 /
174 aa, a separate row in the same worklist, already reviewed. The two share nothing but the
C#orf# naming convention.
The worklist is human-no-IBA-simple.csv and is known to be stale. Queried directly:
Q6UWT4 has 16 GOA annotations, evidence codes IPI 14, IEA 1, HDA 1, and zero IBA.
Positive controls in the identical call pattern returned ADGRA2 6 IBA and ACTB 11, so
the zero is a genuine absence rather than a rejected query. UniProt's own
DR PAN-GO; Q6UWT4; 0 GO annotations based on evolutionary models agrees. There is no PAINT
propagation on this gene to adjudicate, and no propagation_review is owed.
GOA row reconciliation, done before reviewing anything: the TSV has 16 data lines, all
distinct; the fetch-gene stub seeded 5 entries. Twelve GO:0005515 rows differing only
in their WITH/FROM partner had been collapsed into one — the documented
seed_missing_annotations behaviour, whose key omits WITH/FROM. All twelve were restored so
each partner gets its own verdict, giving 16 review entries for 16 TSV rows.
PMID:33804835 is the sole functional characterisation of this gene. It purified the mature
peptide, measured bactericidal activity against four Gram-negative species with a dose
response and MICs, imaged the killed bacteria by SEM, showed no activity against two
Gram-positive species or yeast, and protected mice against a lethal E. coli O157:H7
challenge.
GOA contains zero annotations citing that paper, for any gene in any organism. Positive
control from the same endpoint: PMID:19199708 returns 396. So the endpoint works and the
absence is real.
The family is uncurated in the same way. PANTHER PTHR37864 holds 153 proteins across 426
taxa; three are reviewed. The mouse orthologue Q3V2D2 (Gm94, 93 aa) carries MGI's
ND — "no biological data available" root-term annotation in all three aspects
(GO:0003674, GO:0008150, GO:0005575, GO_REF:0000015), despite the same paper reporting
that Gm94 is itself bactericidal and protective in vivo PMID:33804835. Bovine Q3T146 has
one IEA localisation row. So across the whole reviewed family there is not one functional
annotation.
The coverage gap looked at first like GO simply not covering this class. It is not that, and
finding out inverted the framing.
The same laboratory had previously characterised C10orf99 as AP-57, "Antimicrobial Peptide
with 57 amino acid residues", and the AP-64 paper cites that work as its own predecessor
PMID:33804835. That gene was
curated. Q6UWK7 (GPR15LG) carries four IDA rows from PMID:25585381, including
GO:0050830 defense response to Gram-positive bacterium and GO:0050832 defense response to
fungus, all assigned by UniProt — and UniProt took "Antimicrobial peptide with 57 amino acid
residues" into the entry as an alternative name.
And the two peptides are near-mirror images, so the comparison is sharp rather than loose:
AP-57 is basic (net +14, pI 11.28) with four cysteines and kills Gram-positives and a fungus
PMID:25585381; AP-64 is anionic (pI 4.54) with no cysteines and kills
Gram-negatives while leaving Gram-positives and yeast alone. GO:0050829 is therefore the
exact counterpart of the GO:0050830 the sibling already holds. That converts "please curate
this" into "you applied this treatment to the sibling from an equivalent paper and missed this
one", which is a much better-founded request.
An accession error of mine that nearly inverted the conclusion. I first looked C10orf99 up
as Q6UWT2 — reasoning from accession proximity to Q6UWT4, which is not reasoning at all.
Q6UWT2 is adropin (ENHO), 76 aa, an entirely different protein, and its record (7
annotations, none antibacterial) would have supported precisely the wrong conclusion: that GO
does not curate this class. The correct accession is Q6UWK7, confirmed by primaryAccession
and by the entry's gene synonyms including C10orf99. Same failure shape as the merged-accession
trap the analysis script guards against, arrived at from a different direction — a plausible
accession that resolves to a real, reviewed, wrong protein.
Checked rather than assumed, because "three independent reviews gave one identical row three
different answers" is a known campaign defect. Across the 1,769 merged human reviews on main,
excluding this one, 803 GO:0005515 rows cite HuRI (PMID:32296183):
| action | rows | share | genes |
|---|---|---|---|
MARK_AS_OVER_ANNOTATED |
554 | 69% | 465 |
KEEP_AS_NON_CORE |
142 | 18% | 142 |
REMOVE |
87 | 11% | 85 |
MODIFY |
12 | 1% | 9 |
ACCEPT |
6 | 1% | 6 |
UNDECIDED / PENDING |
1 / 1 | — | 2 |
The 14 MARK_AS_OVER_ANNOTATED verdicts here follow the dominant convention. Note this is a
convention check, not an argument: it would not justify the verdict on its own, and it is
recorded separately from the evidence for exactly that reason.
Recorded so the next reviewer knows the checks were run rather than skipped.
IPR027950PF15144) is the gene's only InterPro signature and has no interpro2goInterPro: lines of the currentexternal2go/interpro2go, with IPR001879 as a positive control proving the lookupGO_REF:0000117 (ARBA) or GO_REF:0000120 (combinatorial) row, soGO_REF:0000044 (UniProt SubCell), whose liveness was confirmed at 139,714 humanGO_REF:0000043 at 0 — the retired keyword route.The standing hazard with a named peptide (AP-64) derived from a larger ORF is that
pharmacology on a synthetic fragment gets attributed to the parent gene — the ADNP/NAPVSIPQ
pattern. Here it is not a fragment. Recomputing from UniProt's annotated CHAIN 24..87:
64 residues, 7.22 kDa, pI 4.54, zero cysteines, against the paper's stated
"antimicrobial peptide with 64 amino acid residues (AP-64)", MW = 7.2, PI = 4.54 and
"AP-64 contains no cysteines". Positive control on the instrument: the same routine
reproduces UniProt's stated 9693 Da for the 87-residue precursor. So AP-64 is this gene's
physiological mature secreted product, and the paper's evidence is evidence about this gene.
The construct was recombinant, made in E. coli as a SUMO fusion and cleaved. Worth noting
because the paper's own control is informative: "SUMO-AP-64 was expressed in a soluble form
but failed to inhibit the growth of DH5α cells. After removal of the SUMO tag, AP-64
exhibited strong antibacterial effects." An N-terminal blocking group abolishes the activity,
which argues the activity is a property of the free peptide rather than of the preparation.
Every functional experiment on this gene is exogenous addition of purified peptide:
All three establish sufficiency: the peptide can kill Gram-negative bacteria and can
protect an animal when administered. Nothing establishes requirement. No knockout,
knockdown or patient loss-of-function has ever been challenged with a pathogen in either
species, so no claim that endogenous C5orf46 is needed for antibacterial defence is
available. GO's evidence codes do not distinguish the two, so the proposed rows say which
they have in their reason, and the gap is filed under knowledge_gaps.
The one loss-of-function experiment that exists is unrelated to bacteria: siRNA knockdown in
two renal-carcinoma lines reduces proliferation and migration and raises apoptosis
PMID:35504177. That is a cancer-cell-line dependency, in a paper whose own title says
"Preliminary study", with no mechanism and no rescue. It is deliberately not turned
into a proliferation or apoptosis GO term — the brief's phenotype-read-as-function trap. It
is recorded in knowledge_gaps and suggested_experiments instead.
The record passed its gates (gates_passed: True, faith_pct: 100.0, 3 citations, all
numeric PMIDs, no bioRxiv-in-a-PMID-field). Retraction/erratum status of all seven PMIDs
used here is clean by two independent routes — PubMed PublicationType plus
CommentsCorrections/RefType on each record, and Crossref relation/update-to/updated-by
on each DOI (all HTTP 200; two records returned non-empty relation keys, so the field is
genuinely being read).
Two problems with the record all the same, neither of them a fabricated quote:
Recall, separately from precision: the record returned 3 of the papers, and missed the
three GOA interaction references entirely. It also did not surface PMID:19199708, the
reference behind an existing annotation. gates_passed: True is a floor on precision and
says nothing about recall.
Full analysis in C5orf46-bioinformatics/RESULTS.md. The short version:
anti tag coip method in two releases, not two independent assays.PMID:32296183), logged under threetwo hybrid array, two hybrid prey pooling
approach, validated two hybrid). That is why UniProt reads NbExp=3 for twelve partnersNbExp=5 for SLC30A2, where two of the three sub-methods are logged twice. ThirdFUNCTION: "bindingFUNCTION is "Co-chaperone that binds directly to HSC70 and HSP70 and regulates theirQ0VAB0, annotated as TBXA2R, is an unreviewed 259-aa TrEMBL clone; canonical TBXA2R isP21731, reviewed, 343 aa. The named partner is not the canonical protein.Verdict per partner rather than per gene, as the brief requires — but the evidence is uniform
across the twelve HuRI rows, so they resolve the same way: MARK_AS_OVER_ANNOTATED, not
REMOVE. These are real database records from a real screen; what they are not is replicated,
orthogonally validated, or informative about function. REMOVE would need a positive argument
that the interaction is false, and I do not have one — the honest statement is that the set
looks like the screen's design rather than the peptide's biology.
PMID:19199708 (the exosome HDA): fully paginated, 396GO:0070062 alone, all HDA, allVSP_031115), which no cited experimentGO:0005576 arrives by IEA from GO_REF:0000044 with UniProtKB-SubCell:SL-0243, i.e. from
UniProt's SUBCELLULAR LOCATION: Secreted {ECO:0000305} — a curator inference from the
predicted signal peptide (SIGNAL 1..23 /evidence="ECO:0000255", also a prediction). On its own
that is a prediction chain, and would deserve caution.
But the conclusion is independently measured three ways, none of which is in the annotation's
own evidence path: the protein is identified in human plasma by mass spectrometry
[PMID:31308252 abstract, "we identify C5ORF46 as a previously uncharacterized human plasma
protein" — abstract-only cache, so nothing beyond the abstract is claimed]; it is catalogued in
the parotid saliva exosome fraction [PMID:19199708, the GO:0070062 HDA row]; and UniProt
records PE 1: Evidence at protein level with a Proteomics identification keyword. HGNC's
alias name for the gene is literally skin and saliva secreted protein 1, and HPA calls the
expression Group enriched (blood vessel, salivary gland, skin). So both CC rows are accepted
as core, with the caveat that the route by which GO:0005576 was asserted is weaker than the
conclusion it reached.
Note the tissue claim in PMID:33804835 — "AP-64 is mainly expressed in the salivary glands
and skin" — is derived from a database, not measured there; the paper says so in its own
limitations: "the mRNA expression of AP-64 in the skin and salivary gland was discovered using
the TCGA database". It is used here only as agreement with HPA and the HGNC alias, never as
primary evidence.
The blocking point was right, and it found a hole in a guard I had written for exactly this
class of defect.
GO:0070062 was ACCEPT and appeared in core_functions.locations. The evidence is a single
HDA detection in one shotgun-proteomics inventory, and the row's own summary conceded it was
"not strong evidence on its own" while the structured field asserted it as a core location.
That is precisely the hedge-versus-structured-field defect my check_document sweep exists to
catch — and it missed, because the sweep covered only molecular_function,
contributes_to_molecular_function, substrates and in_complex. locations was outside
its scope. A guard scoped to the failure I had thought of, run against a document with a
different one.
The substantive argument is the reviewer's, and it is the better one: core_functions.locations
asserts a compartment of action, and nothing shows the peptide acting in an exosome lumen.
Every activity measurement used free peptide added to a culture or injected into an animal, and
the paper's own SUMO-fusion control — activity abolished by an N-terminal tag and restored on
cleavage — argues the functional species is free soluble peptide, not vesicle cargo.
I verified the convention numbers before conceding rather than after. The reviewer said
GO:0070062 gets KEEP_AS_NON_CORE 342×, MARK_AS_OVER_ANNOTATED 158× and ACCEPT 43× across
merged human reviews; I measure 346 / 161 / 42 excluding this gene, so the claim holds.
And there is a sharper version of it that the reviewer did not use: GO:0070062 appears in
core_functions.locations in only 2 of 1,769 merged reviews — GAPDH and PDCD6IP, both with
genuine exosome biology. That is a much stronger statement than the row-action ratio, and it
settled the question.
Fixes: the row is KEEP_AS_NON_CORE, it is out of core_functions.locations (leaving
GO:0005576 alone), the summary no longer calls it core or "more informative", the
core_function description states positively that the core location is the extracellular region
and not the exosome, and the guard now has a second hedge sweep — any term whose row is
KEEP_AS_NON_CORE, MARK_AS_OVER_ANNOTATED, REMOVE or UNDECIDED must not appear in
locations, anatomical_locations or directly_involved_in. Two new break-tests run it against
the shape that actually shipped.
One of the existing break-tests then failed, for the right reason: drop_cf_term removed
GO:0070062 from core_functions.locations to test direction 1, and once that term was
legitimately gone the mutation became a silent no-op, so the guard correctly did not fire and
the break-test reported it as broken. Fixed by dropping whatever the first location actually is
and asserting the mutation changed something. Third time today that "assert the target is present
before mutating" earned its place.
The reviewer's formulation is the one to keep: "The claim is right; the evidence for it left with
the projection."
Commit 98c086d corrected the SGTA-versus-SGTB claim — the hydrophobic-client function is curated
for SGTA only — and the same body of work had narrowed the cached UniProt projection to the fields
the analysis read. FUNCTION was not among them. So the correction was right, was stated in
fourteen places, and could not be verified from the committed tree at all: only 1 of 18 cached
UniProt records retained a FUNCTION comment, and neither SGT entry was that one.
This is a failure mode worth naming, because it is the inverse of the usual one. The usual defect
is a claim without evidence. Here the evidence existed, was correct, was checked interactively —
and was then removed by a separate, individually justified optimisation whose interaction with
the claim nobody looked for. Narrowing a projection is a reduction of a set, and this brief's own
no-silent-caps rule says every stage that reduces a set must state what it dropped. A cache
projection is such a stage, and I did not apply the rule to it.
Fixes: cc_function and cc_similarity are retained in the projection (cache 588K → 604K, so the
cost was nothing), and the asymmetry is now computed as check H rather than asserted — it scans
both entries' FUNCTION comments for hydrophobic-client cues and their SIMILARITY statements for
SGT-family membership. Four directions are break-tested, and the first of them reproduces the
defect that shipped: stripping FUNCTION from the cache must raise "no FUNCTION comment cached"
rather than passing quietly. The other three are SGTB gaining the role, SGTA losing it, and the
family statement breaking — because a guard that only checks the direction you happened to fear is
the guard that fails next time.
Result from the cache: SGTA's FUNCTION contains both hydrophobic and transmembrane, SGTB's
contains neither, and both carry Belongs to the SGT family.
Generalisable rule: when you narrow a cached projection, list what each committed claim depends
on and confirm none of it is in the dropped set. The check that enforces it here is the one that
fails loudly when the field is absent, rather than a comment saying which fields matter.
GO:0031640 by InterPro2GO IEA (GO_REF:0000002), not by aGO:0042742 and GO:0140367,NEW proposals would not be new.SET_CONTEXT: the duplicated trailing text falls from 3,066 to 1,946 characters per rowGO:0019731 andGO:0061844 require the response to occur in a body fluid, and every assay was in cultureGO:0050829file:PMID:file: quotes here are single physical lines andgrep -F.The remaining item was one word — "…of the body surfaces.surfaces. The core location is…" in the
curator-facing core_functions description. The cause is Python's implicit concatenation of
adjacent string literals: correcting the exosome call, I added the new sentence as a fresh
literal without removing the "surfaces." it was meant to extend, so the two joined and doubled
the word.
It reached the shipped artifact because it is invisible in the builder source — two adjacent
string literals look exactly like two lines of one paragraph. This was the third instance of the
class in one PR: the dangling "That role" antecedent, this one, and one more that nobody had
reported.
Scripting the check found the unreported one. Re-reading the tree caught surfaces.surfaces;
a sweep over the assembled prose then found a second, in suggested_questions[0]: "…there is
none anywhere in the family.and there is none anywhere in the family. What makes…". Same cause,
same edit session, and reading had missed it because it sits 1,400 characters into a long
question. That is the campaign's "anything you can compute, compute — then compare it against
what you wrote", earning its place again: reading found one, computing found two.
The sweep is now committed in check_document, and getting it right took three attempts, each
instructive:
core_functions.locations trips acore_, so the allowance never matched. Replaced with exact-token masking, which cannotsurfaces.surfaces, which is the defect itself. If a new identifier appears"is is", and the regex requires 3+ characters, so it never fired — the guard"peptide peptide", and a companion assertion nowshipped_surfaces andshipped_clause reproduce them by mutating the real document, each asserting its anchor isThe offsets are asserted to survive masking (len(scan) == len(s)), so the excerpt a problem
reports still points at the right place in the unmasked text.
Generalisable rule: when you extend a wrapped string constant, delete the fragment you are
extending — and check the assembled output, not the source, because implicit concatenation is
invisible where you are typing.
Proposed (both as NEW rows, IDA, from PMID:33804835):
GO:0050829 defense response to Gram-negative bacterium. Chosen over its parentGO:0042742 because the Gram-negative/Gram-positive distinction was measured in bothGO:0042742 is in GO:0050829's is_a/part_of closure, so the specific termGO:0031640 killing of cells of another organism. Both closures were fetched:GO:0031640 is not a descendant of GO:0042742 — it sits under GO:0001906 cell
killing — so this is not redundant with the row above but a second, non-overlappingDeclined, each for a stated reason:
GO:0061844 antimicrobial humoral immune response mediated by antimicrobial peptide andGO:0019731 antibacterial humoral response — both require an immune response in a bodyGO:0140367 antibacterial innate immune response — its definition requires components thatcore_functions thereforeknowledge_gaps.PMID:35504177 — see the sufficiency/requirement section above.real[-1], which happens to be P55061 — a duplicate, since thatassert new in t and old not in t cannot pass when old is a prefix of new. The editpageSize=1000 silently dropped 32 of AQP6's 1032 records. The --self-test nowvalidated two hybrid with both partners asneutral component) plus all 3 BioPlex records. The argument only concerns the yeastdescription, the hedge sweep overmolecular_function/substrates/in_complex, summary-opener agreement with action, thecore_functions correspondence in both directions, and reference/tmp. It is now check_document() insidebuild_review.py, with one break-test per advertised direction plus a vacuity test that annew in text and old not in text, which can never pass when old is a prefix of new. TheFUNCTION is HSC70/HSP70 ATPase regulation. NothingQ6UWT2 in RESULTS.md and in the builder, and "That role is curatedQ6UWT2) only matched