Oncofusion

start / graph / ana-q128-not-mentioned-anywhere-in-the-corpus-reads-only-ids-titles-and-aliases

Analysisestablished confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.Q128-the-menin-interactome-that-is-not-chromatin

The gap instrument's 'not mentioned anywhere in the corpus' reads only ids, titles and aliases - it was wrong about 9 of 9 this cycle

also called Q128 load_graph defect · union_absent_entirely is a title scan

A script tells us which of menin's partners the project has never discussed, and it was wrong about all nine it named. It only looks at entry names, so anything discussed inside an entry is invisible to it.

The same thing, for a scientist

`analyses/core-complex-interactome-gap/run.py` reports a field `union_absent_entirely` and a per-row flag `mentioned`, and the dispatch brief for this beat quoted them as *'these nine have NO entry and are not mentioned anywhere in the corpus'*. **The first half is true; the second is false for 9 of 9** [E1]. The cause is `load_graph()`, which tokenises **only** each node's `id`, `title` and `aliases`: `for t in [nid, n.get('title','')] + list(n.get('aliases') or [])`. It never reads `summary_lay`, `summary_expert`, `sections[].body_md`, `evidence` or `data` [E1]. Every one of the nine is named in the body of `ana-menin-neoppi-trap-ten-intact-partners-from-one-mutation-screen` (cycle 72), `ana-menin-interactome-enumeration-and-bounded-rejections` and `ana-the-interactome-read-queue-is-empty-and-the-instrument-was-discarding-the-only-list-anyone-would-act-on` [E1]. **Cycle 72 adjudicated seven of these nine and the instrument cannot see that it did.** The consequence is not academic: this beat was dispatched to discover something the corpus already held, and would have rediscovered it from scratch had the first inventory step been skipped.

Go deeper
The defect, in four lines of the source
def load_graph():
    mentioned, own_entry = set(), {}
    for path in ...:
        n = json.load(...)
        nid = str(n.get("id", ""))
        for t in [nid, n.get("title", "")] + list(n.get("aliases") or []):
            for tok in re.findall(r"[A-Za-z0-9]{2,}", str(t).upper()):
                mentioned.add(tok)

mentioned is therefore a set of tokens drawn from ids, titles and aliases only. The field it feeds is called union_absent_entirely and the printed line is [mentioned somewhere]. Both names promise a corpus-wide read, and the code does a metadata read.

This is rule 89's shape exactly, one layer down. Rule 89 caught a coverage metric that counted a link near a thing as the thing. This counts a title mentioning a thing as the corpus mentioning it, and - because a title is a much narrower surface than a body - it errs in the opposite direction, reporting absence where there is presence. Rule 89's errors were inflationary; this one is deflationary, which is worse for a project that dispatches beats against gap lists, because it manufactures work rather than hiding it.

Measured

Word-boundary search of the full serialised text of all 2,412 node files, 2026-09-23:

symbolinstrument saysfiles containing the tokennamed in MEN1-interaction context
AKT1not mentioned anywhere3yes, all 3
BRAFnot mentioned anywhere18yes, 3 of 18
CD226not mentioned anywhere8yes, 6 of 8
EGFRnot mentioned anywhere13yes, 3 of 13
FBXW7not mentioned anywhere4yes, 3 of 4
PTENnot mentioned anywhere16yes, 2 of 16
SMAD4not mentioned anywhere4yes, 3 of 4
SPOPnot mentioned anywhere3yes, all 3
ZC3HC1not mentioned anywhere5yes, 3 of 5

9 of 9 wrong. The raw file counts are given alongside the in-context counts deliberately: BRAF at 18 files and PTEN at 16 are mostly unrelated oncology prose, and quoting those totals as 'menin coverage' would be the mirror error. What refutes the premise is the third column.

The fix, and the fix that would be wrong

The wrong fix is to make mentioned a full-text scan and leave the name alone. That would swing the metric from too narrow to too broad: PTEN appearing in an unrelated comutation entry would then count as menin-partner coverage, which is rule 89's original failure re-created.

Two fields, both named for what they measure:

  • named_in_id_or_title - the current computation, renamed. It is a real and useful signal: it tells you whether anything in the corpus is about the symbol.
  • named_anywhere_in_a_node - a full serialised-text word-boundary scan, reported separately and never merged into the first.

And the field currently called union_absent_entirely should be renamed to something the code can honour, e.g. union_no_entry_and_not_in_any_title. A name that promises more than the computation delivers is how this cost a cycle.

This is reported, not fixed: the file belongs to the coordinator and rule says report, do not edit.

Facts and figures
scriptanalyses/core-complex-interactome-gap/run.py (read, not run by this beat); corpus scan run 2026-09-23
statusrun
result summaryload_graph() reads ids, titles and aliases only. The brief's premise 'not mentioned anywhere in the corpus' was wrong for 9 of 9 symbols. Seven of the nine were already adjudicated in cycle 72 by ana-menin-neoppi-trap-ten-intact-partners-from-one-mutation-screen, which the instrument cannot see.
wrong9
n9
reported not editedtrue
absence classmeasured-not-searched
absence class noteThe corpus's own knowledge of these nine partners was present, deposited and public - in three node files in this repository - and was unfindable because the search space was ids, titles and aliases. Closing it is a scan over a field the tool already opens, with no new data of any kind. NOTE ON THE CHECKER WARNING, WHICH IS DELIBERATE: scripts/check-absence-class.py flags 'measured-not-searched' entries that name no deposited accession. This one names none because the archive is THIS REPOSITORY, not a public one. The location is exact and is given instead of an accession: data/graph/nodes/menin-interactome/ana-menin-neoppi-trap-ten-intact-partners-from-one-mutation-screen.json, data/graph/nodes/menin-interactome/ana-menin-interactome-enumeration-and-bounded-rejections.json and data/graph/nodes/king/ana-the-interactome-read-queue-is-empty-and-the-instrument-was-discarding-the-only-list-anyone-would-act-on.json. Pasting a PMC id here to silence the checker would be a fallback constructing the value it looks for, which rule 69b forbids.
accession warning is deliberatetrue
per symbol
AKT13.000AKT1: 3SPOP3.000SPOP: 3FBXW74.000FBXW7: 4SMAD44.000SMAD4: 4ZC3HC15.000ZC3HC1: 5CD2268.000CD226: 8EGFR13.0EGFR: 13PTEN16.0PTEN: 16BRAF18.0BRAF: 18
inputs
[
  "analyses/core-complex-interactome-gap/run.py",
  "analyses/core-complex-interactome-gap/results.json",
  "data/graph/nodes/*/*.json"
]
per symbol — the numbers behind the chart
{
  "AKT1": 3,
  "BRAF": 18,
  "CD226": 8,
  "EGFR": 13,
  "FBXW7": 4,
  "PTEN": 16,
  "SMAD4": 4,
  "SPOP": 3,
  "ZC3HC1": 5
}
proposed fields
[
  "named_in_id_or_title (the current computation, renamed)",
  "named_anywhere_in_a_node (full serialised-text word-boundary scan, reported separately)",
  "union_no_entry_and_not_in_any_title (rename of union_absent_entirely)"
]
How this could bite us back
  • A gap list that manufactures work is expensive in a way a gap list that hides work is not: the wasted cycle is invisible, because the beat comes back with a full set of entries and everyone is satisfied. The only signal is the duplication, and duplication is exactly what a title-only scan cannot detect.
  • Correcting this makes the interactome coverage figure look better without any entry being written, which is the kind of improvement that should be announced as an instrument change carrying both numbers, not as progress.
Still open
  1. How many beats have been dispatched against a gap that the corpus already held? This is answerable by re-running every historical union_absent_entirely list against a full-text scan, and the answer would say whether this cost one cycle or many.
  2. Does check-pi-dimensions.py or any other reporter share the id/title/alias-only read? The pattern is easy to copy and this beat only checked one script.
  3. Should a beat's first mandatory step be scripts/beat-inventory.py, which does read more than titles? It found the cycle-72 entry in this beat's first minute, and the brief mentions it only as an option.
Every source behind this entry (1)
  1. E1established confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.dataset

    load_graph() in analyses/core-complex-interactome-gap/run.py builds its `mentioned` token set from each node's id, title and aliases only, and does not read summary_lay, summary_expert, sections[].body_md, evidence or data. A word-boundary search of the full serialised text of all 2,412 node files finds all nine symbols the brief named as unmentioned: AKT1 3 files, BRAF 18, CD226 8, EGFR 13, FBXW7 4, PTEN 16, SMAD4 4, SPOP 3, ZC3HC1 5. All nine are named in explicit MEN1-interaction context in at least three entries, including ana-menin-neoppi-trap-ten-intact-partners-from-one-mutation-screen, which adjudicated seven of the nine in cycle 72.

    What this evidence cannot show

    The scan is a regex over raw serialised JSON, so a file 'containing the token' may use it in an unrelated context; that is why the in-context column exists and why the three entries named were opened and read rather than counted. The claim that seven of nine were adjudicated in cycle 72 comes from reading that entry, whose own table lists ten partners of which seven are in this beat's nine. The citation URL points at the IntAct endpoint because this repository has no public URL; the source is the named file.

    Evidence that argues against this (1)
    • The instrument is not broken in the part that matters most. `union_absent` - partners with no entry of their own - is computed from a separate, correct regex on node ids and was right about all nine. Only the `mentioned` overlay is wrong, and an over-correction that counted any body mention as coverage would recreate the inflation rule 89 documents. IntAct (EMBL-EBI) 2026
Connected to