The mid-occupancy floor was computed by three consecutive beats, stored in two committed results files for every contrast, and read as data by none of them - because it was introduced as a normaliser, so no criterion was ever written about it and no verdict ever mentioned it
also called a normaliser is still a measurement · why the floor sat unread for three beats · write a criterion about every quantity you compute
A number was invented to divide other numbers by, so that results could be compared to their own background. Three rounds of analysis computed it, saved it, and never looked at it - because its job was to be a denominator. When somebody finally read it, it showed the two drugs doing opposite things.
The same thing, for a scientist
**The mechanism, stated so it generalises past this case.** A quantity introduced as a **normaliser** acquires a role - it goes in a denominator - and a role is not a question. No criterion gets written about it, so no verdict mentions it, so no summary quotes it, so nobody reads it. **It is computed every cycle and is invisible every cycle.** **The instance, measured.** Q118 defined the mid-occupancy floor in its own DEVIATION 2 - the aggregate within-sample share ratio over bins in DMSO percentile 50-90 of the same track - as a denominator, so a share ratio could be expressed against its own track's background. Q120 adopted it. Q122 adopted it and **stored `floor_pct50to90` in its committed `results.json` for all eight of its murine contrasts.** Q124 adopted it and pre-registered it in section 3 [E1]. **Four beats, one definition, and the numbers say something none of them reported**: H3K79me2's floor is **0.6947-0.7804 under VTP-50469** and **1.8905-2.0094 under SGC0946** across four cultures, with no overlap, while the FLAG and MLL1-N channels sit at **0.9051-0.9288 under both drugs.** **Two of those eight values have been in this repository since cycle 82, and reading them required no computation.** **The practical rule, and it is one line of work per quantity.** **If you compute it, write a criterion about it** - even a criterion with no threshold, of the form *'reported, no threshold'*, which this corpus already uses for Q122's criterion D3. A quantity with a criterion attached appears in the verdict table; a quantity without one appears only in a JSON field that nobody greps. **The cost is a row in a table and it is the difference between a measurement and a field.** **And a second-order rule.** The floor is the second time this project has found a measurement hiding inside an instrument. The first was rule 90's finding that an interactome analysis **built the list of bait-supported partners and wrote only its length**, discarding the identities one line before the write. **Both are the same shape: a computed object treated as scaffolding for the thing that was going to be reported.** The remedy for both is to persist and to report, not to compute more.
How to find the others, and what it would cost
This corpus's analyses/*/results.json files are a searchable inventory of every quantity any beat has computed. A quantity that appears in those files and appears in no criteria block and in no entry's prose is a candidate for exactly this defect. The scan is:
- Enumerate every leaf key across
analyses/*/results.json. - Drop the ones that appear inside a
criteriablock, which are reported by construction. - Drop the ones whose key or value appears anywhere in
data/graph/nodes/**. - What is left is computed, committed and unread.
It is pure text analysis over files already on disk - an afternoon, no download, no wet work - and it was not run by this beat, which is recorded here rather than claimed. The floor was found by accident, because ARM 2's output printed it beside every ratio and the SGC0946 values were implausibly far from 1.
The prior for what such a scan would return is not low. This project's analyses print extensive diagnostics by design - track totals, zero fractions, non-zero medians, per-chromosome extents, blacklist loads - and a diagnostic is a normaliser's sibling: computed to qualify something else, never asked a question of. This beat's own DEVIATION 1 is a second instance found in the same cycle: the non-zero bin count per track has been printed by every beat since Q117 and its inverse relationship to the reported share ratio was never checked.
| defect shape | a quantity introduced as a normaliser is assigned a role rather than a question, so no criterion is written about it and it is computed-but-unread every cycle |
|---|---|
| instance | the mid-occupancy floor (DMSO percentile 50-90 aggregate share ratio), defined by Q118, adopted by Q120, Q122 and Q124, stored for eight contrasts in Q122's committed results.json, first read as data in cycle 83 |
| second instance same cycle | the non-zero bin count per track, printed by every beat since Q117, whose inverse relationship to the reported share ratio was first checked in this beat's DEVIATION 1 and came back at Spearman -1.000 over four timepoints |
| prior instance of the same shape | rule 90 - analyses/interactome-bait-versus-prey/run.py built the list of bait-supported partners and wrote only len(), discarding the identities one line before the write |
| proposed rule | if you compute it, write a criterion about it - even one with no threshold, of the form 'reported, no threshold', which this corpus already uses for Q122's criterion D3. Narrowed: a criterion for every intermediate that is ITSELF a comparison between conditions, not for every intermediate |
| absence class | measured-not-analysed |
| absence class note | The scan described above is pure text analysis over files already in this repository - an afternoon, no download, no wet work - and it WAS NOT RUN by this beat. The floor was found by accident when ARM 2's output printed it beside every ratio. Filed measured-not-analysed because every input exists on disk and nothing but the reading is missing. |
| absence class assigned | 2026-09-23 (Q124) |
how to find the others
[ "enumerate every leaf key across analyses/*/results.json", "drop keys appearing inside a criteria block", "drop keys or values appearing anywhere in data/graph/nodes/**", "what remains is computed, committed and unread" ]
- The finding this defect concealed is now load-bearing: the floor's sign reversal is one of three statistics behind the qualification this cycle placed on cycle 82's F. So a quantity that sat unread for three beats turned out to change how a committed headline should be read, which is an argument that the scan for other instances is worth an afternoon.
- It also cuts at this cycle's own output. If a normaliser can hide a result, then this beat's own diagnostics - fourteen tracks' totals, zero fractions, non-zero medians, per-chromosome extents and blacklist loads, all printed and none carrying a criterion - are the same shape and the same risk. Two of them turned out to matter in this cycle alone.
- How many other quantities in this corpus's analyses/*/results.json are computed, committed and unread? The scan is four steps over files already on disk and this beat did not run it. The prior is not low: these analyses print extensive diagnostics by design, and a diagnostic is a normaliser's sibling.
- Should the pre-registration template require a 'reported, no threshold' row for every quantity that compares two conditions? Q122's criterion D3 already uses that form, so the convention exists and is not documented anywhere.
- Is the floor itself reliable enough to build on? It is batch-sensitive in the timecourse arm of the same series, where the VTP floors rise against all four 48 h cultures' falling. A measurement that was hiding is not automatically a measurement that holds.
- E1strong confidence 4 of 5: Replicated in peer-reviewed work by more than one group.dataset
The mid-occupancy floor - the aggregate within-sample share ratio over bins in DMSO percentile 50-90 of the same track - was defined by Q118 in its DEVIATION 2 as a normaliser, adopted by Q120, Q122 and Q124, and stored under the key floor_pct50to90 in Q122's committed results.json for all eight of its murine contrasts; no criterion in any of those four beats' pre-registrations is about the floor's own value, no verdict in any of their results files mentions it, and no entry in this graph quoted it before cycle 83. Its values are H3K79me2 0.7804 and 1.9918 (F3), 0.6947 and 2.0094 (F3_NT) under VTP-50469 48 h and SGC0946 72 h respectively, with FLAG at 0.9288 and 0.9051 and MLL1-N at 0.9151 and 0.9226 - all four of the latter within 0.10 of unity under both drugs.
Q124 re-analysis of GSE260742: the floor read as data for the first time, with two of its eight H3K79me2 values taken from Q122's committed results.json without recomputation. analyses/q124-the-timecourse-and-the-pcgf1-knockout/run.py, deviation1_enrichment_null.py, deviation2_common_support.py, deviation3_four_statistic_steps.py and results.json, run 2026-09-23 · Iqbal Lab oncofusion knowledge graph 2026What this evidence cannot show
'No entry quoted it before cycle 83' is a claim about this repository, checked by grepping the node corpus for floor_pct50to90 and for the four Q122 floor values; a paraphrase that named the percentile-50-90 band without those strings would have been missed. The floor's own reliability is separately questionable - this beat measured that it is batch-sensitive in the timecourse arm of the same series, where the VTP floors RISE against all four 48 h cultures' falling - so 'a measurement was hiding here' is not the same as 'a reliable measurement was hiding here'. The generalising scan that would find other instances WAS NOT RUN and is priced in the sections rather than claimed.
Evidence that argues against this (1)
the instance and its payoff: the floor was stored for eight contrasts in Q122's committed results.json and its VTP-against-SGC sign reversal required no computation to see
the second instance found in the same cycle: the non-zero bin count per track has been printed by every beat since Q117 and its inverse relationship to the reported share ratio was never checked until now
two criterion-design defects from one beat that point the same way: a quantity with no criterion is never read, and a criterion with the wrong sign convention is read wrongly - both are fixed at pre-registration time and neither is caught by any checker