Oncofusion

start / graph / ana-a-fusion-denominator-was-polluted-by-an-analogy-node-and-the-percentage-hid-it

Analysisestablished confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.

check-pi-dimensions.py selected fusion entries by id prefix and swept in an analogy node, reporting 50/51 where the truth is 49/50 - identical to one decimal, which is why it survived - and the one genuinely unlinked fusion has no analogue in this corpus, so no edge was written

also called the 98.0% that was two different fractions · why fusion-ccdc32-cbx3 still has no analogous_to edge · prefix versus type

A script that measures how complete the knowledge graph is was counting fusion records by looking at whether their name started with "fusion-", and one record that starts that way is not a fusion at all - it is a note about a family resemblance between fusions - so it was being counted as both a fusion and a completed one, inflating the top and bottom of the fraction equally. The reported score and the true score were both 98.0% after rounding, so nothing looked wrong until a different tool counted 50 fusions where this one counted 51; the fix changes no conclusion, and the single fusion that genuinely lacks a link still lacks one because there is nothing in this graph it is honestly analogous to.

The same thing, for a scientist

**Statement.** `scripts/check-pi-dimensions.py` selected fusion entries with `gid.startswith("fusion-")`. That prefix matches `fusion-family-mllt1-yeats-wilms-tumour`, whose `type` is **`analogy`**, not `fusion`. Because that node carries an `analogous_to` edge, it inflated **numerator and denominator alike**: | | numerator | denominator | printed | |---|---:|---:|---| | as reported (prefix) | 50 | 51 | 98.04% -> "98.0%" | | true (type) | 49 | 50 | 98.00% -> "98.0%" | **The two fractions print the same string.** The substantive output - `UNLINKED: fusion-ccdc32-cbx3` - is also identical. So no reader of this script could have detected the defect from its output, and no conclusion in this corpus changes. It surfaced only because `validate-graph.mjs` types **50** fusion nodes while this script said **51**, and I reconciled the two. **The general form, which is the reason to record a defect that changed nothing.** An id prefix is a **naming convention**; a `type` is a **claim**. This corpus has 51 ids beginning `fusion-` and 50 fusions, and the difference is a node that describes a *resemblance between* fusions. A selector built on the convention answers "what is this called", and every population statistic in this project needs "what is this". Fixed to `d.get("type") == "fusion"`. **And an error of this shape is undetectable by its own output whenever the polluting member shares the property being measured.** Here the analogy node *has* an `analogous_to` edge - of course it does, it is an analogy - so it entered as a success. A contaminant that fails the test shows up as a drop in the percentage; a contaminant that passes it is invisible. **The only reliable detector is two instruments disagreeing on the population size**, which is what happened. **No edge was written for `fusion-ccdc32-cbx3`, deliberately.** It is the only genuinely unlinked fusion, and closing PI dimension 5 to 50/50 would have taken one line. I checked for an honest analogue and there is none: it is the **only** fusion entry in the corpus carrying a `co_occurring_lesion` (it is a secondary fusion found beside the driver `fusion-kmt2a-afdn`), and the **only** CBX/HP1-family fusion. An `analogous_to` edge to any other fusion would assert a resemblance I cannot source. A 98.0% with a named, explained exception is worth more than a fabricated 100%.

Go deeper
Two dimensions this project measures and never publishes

Re-running check-pi-dimensions.py to verify the three figures quoted in every docs/coverage.md head confirmed all three exactly - localization 81.6% (399/489), subnuclear 72.6% (355/489), cell type/state 62.4% (305/489). They are correct and reproduce.

But the script measures five PI dimensions and the coverage head has been publishing three, and the two omitted are among the weakest:

  • Epigenetics (PI dimension 3): 35.8% by a dedicated field (175/489), 56.0% by a mark named in the body, 63.2% either way. In a disease defined by a histone mark, the dimension with a dedicated field on barely a third of gene entries is the one that has never appeared in the ledger head.
  • Analogous families (PI dimension 5): 49/50, the subject of this entry.
  • Interactors (PI dimension 4) is cached at 94.3% of IntAct bait-supported partners, as of 2026-09-21, and is stale by definition between refreshes.

Publishing the three strongest of five measured dimensions is not a decision anyone made; it is what the head happened to say at cycle 52 and has said since. All five are now in the head.

What was checked before declining to write the edge

Stated so that a later cycle does not re-open this as an oversight - a gap list cannot see a deliberate refusal, which this project has already paid for once when 0 of 15 "cleanest gaps" turned out to be gaps.

  1. Every analogous_to edge in data/graph/edges/*.json was collected (305 nodes touch one). fusion-ccdc32-cbx3 touches none.
  2. All 50 type: fusion entries were scanned for a co_occurring_lesion field. Exactly one has it: this entry, naming fusion-kmt2a-afdn. There is no second secondary-fusion case to be analogous to.
  3. All 50 were scanned for a CBX or HP1 family member. Exactly one: this entry.

The entry is confidence: weak, n=1, from a single case report of a relapsing AML. The honest analogy class - other secondary fusions co-occurring with a KMT2A driver - has exactly one member, and a class of one has no analogy. If a second such case is ever entered, the edge becomes writable and this is the note that says so.

Facts and figures
IDS beginning fusion prefix51
nodes of type fusion50
the polluting nodefusion-family-mllt1-yeats-wilms-tumour
its actual typeanalogy
why it was invisibleit carries an analogous_to edge, so it entered the statistic as a SUCCESS - inflating numerator and denominator together and leaving the percentage unchanged to one decimal
reported fraction50/51 = 98.04%
true fraction49/50 = 98.00%
printed string in both cases98.0%
how it was detectedvalidate-graph.mjs types 50 fusion nodes; check-pi-dimensions.py reported a denominator of 51. Two instruments disagreeing on a population size was the ONLY available signal.
conclusions changed by the fix0
the one unlinked fusionfusion-ccdc32-cbx3
edge deliberately not writtentrue
why notit is the only fusion entry in the corpus with a co_occurring_lesion and the only CBX/HP1-family fusion, so its honest analogy class has exactly one member; an analogous_to edge to any other fusion would assert a resemblance with no source
note on the published setthe coverage.md head published three of these five dimensions from cycle 52 until cycle 77, and the omitted two include the weakest (epigenetics at 35.8% by field, in a disease defined by a histone mark). Not a decision anyone made - it is what the head happened to say and kept saying.
absence classmeasured-not-analysed
absence class noteThe epigenetics dimension has been MEASURED by this script every cycle since 52 and was never carried into the ledger head, so no cycle acted on it. That is measured-not-analysed in the strict sense: the number existed, in this repository, printed by a script the coordinator runs, and no downstream artefact consumed it. Not never-measured and not literature-bounded - the failure is entirely internal.
pi dimensions re derived cycle 77
{
  "localization_field": "399/489 = 81.6%",
  "subnuclear_localization": "355/489 = 72.6%",
  "cell_type_or_state": "305/489 = 62.4%",
  "epigenetics_by_dedicated_field": "175/489 = 35.8%",
  "epigenetics_either_field_or_body": "309/489 = 63.2%",
  "analogous_families": "49/50 = 98.0%",
  "interactors_vs_intact_bait_supported": "50/53 = 94.3%, CACHED as of 2026-09-21"
}
Still open
  1. Grep `startswith(` across scripts/ and check every id-prefix selector that feeds a population statistic. This entry found one instance because two instruments disagreed; no claim is made that it is the only one.
  2. Epigenetics carries a dedicated field on 175 of 489 gene entries (35.8%) in a disease defined by a histone mark. Is the right response a field-population beat, or is 'a mark named in the body' (56.0%) the more honest measure and the dedicated field the wrong instrument?
  3. If a second secondary-fusion case beside a KMT2A driver is ever entered, fusion-ccdc32-cbx3 becomes legitimately linkable. Nothing currently watches for that.
Every source behind this entry (1)
  1. E1established confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.analysis

    check-pi-dimensions.py selected fusion nodes by the id prefix 'fusion-', which matches fusion-family-mllt1-yeats-wilms-tumour (type: analogy). That node carries an analogous_to edge, so it raised both numerator and denominator by one: 50/51 reported against 49/50 true, both rendering as '98.0%'. The corpus holds 51 ids beginning 'fusion-' and 50 nodes of type fusion.

    scripts/check-pi-dimensions.py before and after the cycle-77 fix, reconciled against scripts/validate-graph.mjs type counts; this repository · Oncofusion knowledge graph, coordinator · internal instrument audit, reproducible from the repository 2026
    What this evidence cannot show

    This fix changes NO conclusion anywhere in the corpus: the printed percentage is identical to one decimal and the named unlinked entry is unchanged. Recording it is justified by the shape, not the effect. The audit was also narrow - I reconciled ONE denominator in ONE script because two instruments happened to disagree, and I did not systematically check whether other selectors in this script or elsewhere use an id prefix where they mean a type. A grep for `startswith(` across scripts/ would be the obvious next pass and was not run, so no claim is made that this was the only instance.

    Evidence that argues against this (2)
    • A reasonable objection is that this is not worth an entry: one node, no changed conclusion, a rounding-invisible difference. The counter to that is the detectability argument - a contaminant that PASSES the property being measured cannot be seen in the output at all, so the class of error is systematically under-reported, and the only instances that ever surface are the ones where two instruments happen to be cross-checked. Recording the ones that are found is the only way the rate is ever estimable.
    • The decision not to write an analogous_to edge for fusion-ccdc32-cbx3 is a judgement, not a measurement. Someone could argue that CCDC32::CBX3 is analogous to any other passenger lesion in a KMT2A-rearranged leukaemia at the level of 'secondary event', and that the graph's analogous_to vocabulary is loose enough to carry that. I judged the resemblance too generic to be informative and the entry too weak (n=1, confidence weak) to anchor one, but a later cycle may legitimately disagree - the reasoning is recorded here precisely so that it can be.
Connected to