The 297 absence-bearing entries that are not named absence-* split cleanly by entry type: the 109 gene and protein entries are bounded by title/abstract search (7 of 7 hand-read), the analyses are bounded by deposited data (0 of 6), and the weighted abstract-level share is 60% - indistinguishable from the 59% measured on the 39 named ones
also called Q115 unclassified absence census · the other 297
Last cycle sorted thirty-nine write-ups of things nobody has measured and found that most rested on a search of titles and summaries only. Reading a random sample of the several hundred similar claims that were never sorted shows the same picture, so the problem is about five times bigger than the first count suggested.
The same thing, for a scientist
Counted on disk 2026-09-22 over 2,206 pre-existing node files: **336** contain `absence_class`, `never-measured` or `measured-not-analysed`; **39** are named `absence-*` and were the subject of the cycle-65 census; **297** are not. Of those 297, **182 carry a real `data.absence_class` field** and **115 carry the token only** (in prose, a note, or a different field) and are therefore not absence records at all. A signature-based classifier over the 182 returned 0.5% abstract-level, and **a hand-read of a random sample of 14 (seed 115) scored it wrong on 7 of 14 and wrong on every single abstract-level entry** - it fires on any accession, UniProt lookup or NCT number anywhere in the entry and lets that outrank the `[tiab]` query that actually bounds the headline. The hand-read answer is **7 of 14 = 50.0% (95% Wilson 26.8-73.2%)**, against **23 of 39 = 59.0% (43.4-72.9%)** for the named population; Fisher exact p = 0.754. The informative result is not that pooled number but the decomposition: **all 7 sampled `gene`/`protein` entries are abstract-level (7/7, Wilson 64.6-100%) and all 6 sampled `analysis`/`hypothesis`/`experiment` entries are not (0/6, Wilson 0-39.0%)**. The 182 are 109 gene/protein and 73 other, so the type-weighted projection is **~60% abstract-level**, i.e. roughly **131 of 221** bounded absences corpus-wide rather than 23 of 39.
The denominator, and it closes
node files on disk (excluding this beat's own) 2206
contain absence_class / never-measured /
measured-not-analysed 336
basename starts absence- (cycle-65 census) 39
does not 297
carries a real data.absence_class field 182
token only, no field 115
182 = 143 in-vocabulary + 39 free-text
39 + 182 + 115 = 336 checked 14 + not read 168 + failed 0 = 182
The brief said 332 and 293; the live counts are 336 and 297, four higher in each, because four entries have been added since that scan. The 115 token-only files are the part nobody had separated, and they matter: an entry whose prose contains the string never-measured is not a bounded absence and should not be in the denominator of any statement about this corpus's absences.
The classifier was wrong seven times out of fourteen and always in the same direction
Per rule 92, the heuristic's answer is left in the record. It classified the 182 as 42.3% archive-accession-named, 24.7% database-entity-enumeration, 18.7% full-text-read, 7.7% registry, 2.7% thresholded, 2.2% filtered, 1.1% no-signature and 0.5% abstract-level.
That last figure is nonsense and the hand-read says why. gene-elp4 and gene-tmprss13 were called registry-query because an NCT number appears somewhere in the entry; both are bounded by a list of [tiab] queries and nothing else. gene-med19 and gene-ilf3 were called database-entity-enumeration because they carry a UniProt accession resolution; both bound their cell-type absence with a single SYMBOL[tiab] AND leukemia[tiab] = 0. gene-rrp12, gene-tcof1 and gene-eif4g1 were called archive-accession-named because each mentions PXD009338 - correctly, as a negative PRIDE check - while the headline absence is a [tiab] zero.
The failure is one-directional: the classifier never wrongly called something abstract-level, and it missed every entry that was. A reader who trusted it would conclude this population has no exposure at all.
What the hand-read actually found
| id | type | bounded at the headline by | abstract-level? |
|---|---|---|---|
gene-rrp12 | gene | (RRP12[tiab] OR KIAA0690[tiab]) AND (KMT2A OR MLL OR ...) = 0, plus a heatmap read | yes |
gene-med19 | protein | MED19[tiab] AND leukemia[tiab] = 0 | yes |
gene-ilf3 | protein | [tiab] alias queries under ILF3 / NF90 / NF110 | yes |
gene-tcof1 | gene | (TCOF1 OR treacle OR "Treacher Collins")[tiab] AND ... = 0 | yes |
gene-elp4 | gene | eleven [tiab] counts | yes |
gene-tmprss13 | gene | ten [tiab] counts | yes |
gene-eif4g1 | gene | EIF4G1[tiab] AND ... = 0 (PRIDE checked separately) | yes |
gene-psat1 | gene | a compound-selectivity comparison in deposited data | no - archive |
ana-gse210480-h3k9me3-at-the-kmt2a-bcr | analysis | GSE210480 files | no - archive |
ana-q108-h3k9me3-at-the-kmt2a-bcr-measured | analysis | GSE210480 bigWigs, run | no - archive |
ana-kmt2a-bcr-ctcf-site-coordinate-overlap | analysis | GSE210480 CTCF samples | no - archive |
hyp-the-serine-arm-has-a-second-chromatin-proximal-menin-input-that-is-not-atf4 | hypothesis | data deposited 2019 | no - archive |
ana-the-two-silent-failure-classes-did-not-propagate... | analysis | a corpus self-audit script | no |
exp-bleximenib-versus-revumenib-hr-and-gammah2ax-readout | experiment | nothing - it is a proposal | no - unbounded |
Not one of the 14 carries an absence_class_basis field, which the named population mostly does. The class was asserted and the reason was not recorded.
A second defect the count exposed: the enforcing checker cannot see this population
scripts/check-absence-class.py globs data/graph/nodes/*/absence-*.json. It therefore walks 39 files and never touches the other 297. The consequence is measurable: of the 182 entries in the unwalked population that carry the field, 143 are in the controlled vocabulary and 39 are free text - including values such as "literature - bounded with counts, querytranslations, warninglists, re-runs, an operand control and an ID-set comparison" and several that run to multiple sentences. The vocabulary the checker exists to enforce is violated by 21% of the field's uses, all of them outside what the checker reads.
This is the same shape as the localization-coverage failure of cycle 45: the reporter was right about what it measured and the thing it was named after was somewhere else.
| script | no committed script; counts from scratchpad q115_population.json and q115_classified.json, reproduced in full below |
|---|---|
| status | run |
| run date | 2026-09-22 |
| run by | Q115-absence-rebound |
| absence class | measured-not-analysed |
| absence class basis | This entry is itself the analysis of a population that was on disk the whole time; nothing new was measured, the corpus was read. No external accession applies. |
denominator
{
"node_files_excluding_this_beat": 2206,
"containing_absence_tokens": 336,
"named_absence_star": 39,
"not_named_absence_star": 297,
"of_those_with_a_real_absence_class_field": 182,
"of_those_token_only_no_field": 115,
"closes": "39 named + 182 unnamed-with-field + 115 token-only == 336 matched",
"hand_read": 14,
"not_read": 168,
"failed": 0,
"sample_closes": "14 read + 168 not read + 0 failed == 182"
}sampling
{
"method": "random.sample over the 182 ids",
"seed": 115,
"n": 14
}heuristic answer left in per rule 92
{
"archive-accession-named": 77,
"database-entity-enumeration": 45,
"full-text-or-archive-record-read": 34,
"registry-query": 14,
"thresholded-peak-set": 5,
"filtered-database-query": 4,
"no-instrument-signature": 2,
"abstract-level-literature-search": 1,
"binary_accuracy_against_hand_read": "7 of 14",
"direction_of_error": "one-directional: 0 of 7 true abstract-level entries were identified; 7 of 7 non-abstract-level entries were"
}hand read result
{
"abstract_level": 7,
"not_abstract_level": 7,
"n": 14,
"point_pct": 50,
"wilson95": [
26.8,
73.2
],
"gene_or_protein_subset": {
"k": 7,
"n": 7,
"wilson95": [
64.6,
100
]
},
"analysis_hyp_exp_subset": {
"k": 0,
"n": 6,
"wilson95": [
0,
39
],
"rule_of_three_upper_pct": 50
}
}comparison to named population
{
"named": {
"k": 23,
"n": 39,
"pct": 59,
"wilson95": [
43.4,
72.9
]
},
"fisher_exact_two_sided_p": 0.754,
"verdict": "not distinguishable; the 59% figure generalises"
}type weighted projection
{
"gene_or_protein_in_the_182": 109,
"other_in_the_182": 73,
"projected_abstract_level_pct": 60,
"projected_abstract_level_entries_corpus_wide": 131,
"denominator_used": 221,
"denominator_note": "39 named + 182 unnamed-with-field. The 115 token-only files are EXCLUDED because they are not absence records."
}absence class field hygiene
{
"in_vocabulary": 143,
"free_text": 39,
"checker_coverage": "scripts/check-absence-class.py walks 39 of 336 files",
"entries_in_the_sample_carrying_absence_class_basis": 0
}- Should `absence_class` become a validated field on every entry that carries it, not only on files named absence-*? Widening the glob in check-absence-class.py would fail 39 entries today; the right sequence is probably to add a second free-text `absence_class_note` and reserve `absence_class` for the vocabulary.
- The 115 token-only files were never separated from the absence population before. How many of them are entries that SHOULD carry the field and do not - i.e. real bounded absences hiding in prose with no class at all?
- None of the 14 sampled entries carries `absence_class_basis`. Is that field effectively confined to the named absence-* population, and if so is an unexplained class assignment worth anything?
- The type split is so clean (7/7 versus 0/6) that it predicts the instrument from the entry type alone. Does that hold at n = 50, and if it does, is the right remediation to re-bound the gene tranches at full text in bulk rather than one absence at a time?
- E1established confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.dataset
2,206 pre-existing node files, 336 containing the absence tokens, 39 named absence-*, 297 not, of which 182 carry a real data.absence_class field and 115 carry the token only; among the 182 the field takes 143 in-vocabulary and 39 free-text values.
Direct count over data/graph/nodes/*/*.json in the oncofusion-knowledge-graph repository, 2026-09-22 (scratchpad script q115_population.json) · Iqbal Lab oncofusion knowledge graph 2026What this evidence cannot show
Counted by loading each file as JSON and reading `data.absence_class` as a field, not by regex over the serialised blob - the corpus has twice manufactured numbers by windowed regex across record boundaries. The token scan itself IS a regex over the file text and is deliberately generous: it is used only to define the candidate set, never to assign a class.
Evidence that argues against this (1)
- The 336 is sensitive to the token list. Adding `measured-not-reported`, `measured-not-searched` and `measured-not-curated` to the regex would raise it; the three tokens used here are the ones the brief specified, so the figure is comparable to the cycle-65 one and is a FLOOR on the true absence-bearing population. Iqbal Lab oncofusion knowledge graph 2026
- E2moderate confidence 3 of 5: One strong study, or several smaller consistent ones.dataset
A hand-read of a random sample of 14 of the 182 (seed 115) finds 7 bounded at the headline by an abstract-level literature search; the split is entirely by entry type, 7 of 7 gene/protein versus 0 of 6 analysis/hypothesis/experiment.
Hand-read of 14 sampled entries in data/graph/nodes/, 2026-09-22, seed recorded (random.seed(115)) · Iqbal Lab oncofusion knowledge graph 2026What this evidence cannot show
n = 14. The pooled proportion 7/14 has a 95% Wilson interval of 26.8-73.2%, which is wide enough that it cannot by itself distinguish this population from the named one - and that is the honest statement, not a defect of the sampling. The per-type figures are the ones to quote: 7/7 (Wilson 64.6-100%) and 0/6 (Wilson 0-39.0%). The reading was done by one person in one sitting with no second scorer.
Evidence that argues against this (1)
- Assigning ONE primary instrument to an entry that ran several is a judgement, and five of the seven 'yes' entries also record an archive check (PRIDE, usually a negative on PXD009338). Scored the other way - crediting any archive check as the primary bound - the count falls to 2 of 14 and the conclusion reverses. The rule applied here is the cycle-65 one: the primary instrument is the one whose output the HEADLINE claim rests on, and in all seven the headline is a literature zero. Iqbal Lab oncofusion knowledge graph 2026
- E3established confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.dataset
scripts/check-absence-class.py globs only data/graph/nodes/*/absence-*.json, so the 297 non-absence-named files carrying absence_class - including all 39 free-text values of the field - have never been checked against the vocabulary it enforces.
scripts/check-absence-class.py, main(): glob.glob(os.path.join('data','graph','nodes','*','absence-*.json')) · Iqbal Lab oncofusion knowledge graph 2026What this evidence cannot show
Read directly from the script on 2026-09-22. This is a scope statement about the checker, not a claim that the 39 free-text values are wrong - several are informative prose that a one-word vocabulary cannot carry, which is an argument for a second field rather than for deleting them.
Evidence that argues against this (1)
- Widening the glob would immediately fail the build for 39 entries and would be the wrong first move. The free-text values encode a real distinction the vocabulary lacks - MEASURED-AND-NULL, BOUNDED-UNPUBLISHED - which is a finding about the vocabulary, not about the entries. Iqbal Lab oncofusion knowledge graph 2026
the cycle-66 beat estimated the unwalked population and reported the glob defect; this fixes it and measures the result
closes the largest gap that census named in itself: the 297 entries outside the absence-* naming convention have the same instrument profile, so the 59% generalises
answers this entry's own open question - how many unbounded absence assertions sit in data fields rather than evidence claims - with 182 carrying the field and 115 carrying only the token