The 'named but unwritten' queue flags ALL EIGHT of this project's negative-control loci plus one alias-filed entry - 20.5% of it, after I corrected my own reimplementation which had double-counted collisions the tool already blocks
also called q188 · the queue flags its own controls · self-reference audit
**Corrected: about a fifth, not well over a third.** Part of what I counted as noise was already being filtered by the tool itself — I rebuilt the tool's logic instead of running it, and left out one of its steps. --- One of this project's tools lists genes that get talked about a lot but never written up, as a queue of work to do. Auditing it: every one of the eight genes the project uses as negative controls is in that queue - they appear in dozens of analyses precisely because they are the controls, and the tool cannot tell that apart from a real gap. Adding the already-known name clashes and one gene whose entry exists under a different name, well over a third of the queue is noise the project generated itself.
The same thing, for a scientist
> 🔴 **CORRECTED: 20.5%, not 37.8% — and the 'registered collisions' claim is WITHDRAWN.** I reimplemented the tool's selection rather than running the tool, and **my reimplementation omitted a filter the tool has.** `check-named-but-unwritten.py` already calls `load_symbol_collisions()` and routes registered tokens into a separate `blocked` list. Run directly, its flagged output contains **none** of PRC1, EFS, GAPDH, PDF, PTH, IGH, PZP or H3C1. **E2 is withdrawn in full.** > > **The two findings that matter stand, verified against the real tool's own output:** > - **All eight negative controls are flagged** — ALB 30, INS 28, MYH7 28, GFAP 24, RHO 24, KRT14 22, MYOD1 22, NEUROD1 22. > - **JMJD1C is flagged at 40 files**, because the entry is filed as `gene-kdm3c`. > > **9 of the tool's 44 flagged symbols — 20.5% — is the project's own controls or an alias-filed entry.** Still a real defect, and still one the tool does not guard against, but little more than half what I reported. > > **The lesson is the reimplementation itself.** This entry's own provenance says the queue was *"reimplemented from the tool's stated selection rather than parsed from its stdout"* — a deliberate choice, made to avoid depending on output formatting, and it silently dropped a filter. **A reimplementation must reproduce the original's output before its differences mean anything**, which is the standard applied to the seven-bait denominator two cycles ago and not applied here. --- q185 showed that a coverage figure counting **mentions** is reflexive and asked for every such figure to be audited. `scripts/check-named-but-unwritten.py` is the one whose entire method is a mention count — *every HGNC symbol appearing in at least N node files with no entry of its own*. Its docstring already warns about English-word false positives (SET, FACT, REL, ELL, CAT, ACE). It does not warn about what dominates it. 🔴 **All eight of this project's negative-control loci are in the queue** [E1]. The width-matched negative set used by every occupancy analysis in this corpus is **ALB, GFAP, INS, KRT14, MYH7, MYOD1, NEUROD1, RHO** — and at a 20-file threshold, **all eight appear**, at 21 to 29 files each. **They are named in dozens of entries *because they are the controls*.** They are the last genes in the corpus that should be written up as missing biology, and they are 8 of 45 — **17.8% of the queue**. 🟠 **Eight more are collisions the project has already registered** [E2]: PRC1 (206 files — Polycomb Repressive Complex 1 here, not the cytokinesis protein, and `block_autogeneration` is already set on it), EFS, GAPDH, **PDF** (the file format), PTH, IGH, PZP and H3C1. 🔵 **And one has an entry the queue cannot see, for the third time.** **JMJD1C** is flagged at 38 files. The corpus holds **`gene-kdm3c`**. HGNC's approved symbol is **JMJD1C** and **KDM3C is its alias** — so the entry is filed under the alias and a queue keyed on approved symbols cannot match it [E3]. This project's own memory records JMJD1C being logged as missing **twice before**, with `gene-kdm3c` present both times. **This is the third, and the root cause is now identified rather than the instance re-noticed.** **Total: 17 of 45, 37.8%, is noise the project generated itself** — its controls, its known collisions, and its own filing choice. 🔴 **My first alias check returned zero, and it was wrong.** I searched for approved symbols whose alias list *contains* the queue symbol. The actual case runs the other way: the queue symbol **is** the approved symbol and the **entry** is under its alias. **A check that returns zero because it is pointed backwards looks exactly like a clean result** — this one was caught only because a memory said JMJD1C should be there [E3].
The fix, and why it is not 'raise the threshold'
Three changes make this queue trustworthy, and none of them is tuning N:
- Exclude the negative-control set by name. It is eight hard-coded symbols and they are already hard-coded in every occupancy analysis. This is a one-line import.
- Exclude anything with
block_autogenerationindata/symbol-collisions.json. The registry exists precisely to stop automated passes creating these entries, and the queue is an automated pass that does not consult it. - Resolve HGNC aliases in BOTH directions before declaring a symbol unwritten — check whether an entry exists under any alias or previous symbol of the approved name, not only the reverse.
Raising the threshold would not help: the negative controls sit at 21–29 files, right in the band where real gaps live, and PRC1 at 206 files would survive any threshold. The contamination is not at the tail, it is distributed through the queue.
What survives, and the honest state of the residue
28 symbols remain after the three exclusions. They are not thereby real gaps. Reading the list, several are the acronym false positives the tool's own docstring predicts — RPE (retinal pigment epithelium, and an RPE-1 cell line this corpus cites), NES (nuclear export signal as often as nestin), CD4, SPR, CPM, and WAS, which appears capitalised in 151 files largely as emphatic prose rather than as WASP.
What looks genuinely worth checking in the residue: ASH1L (23 files), POLR2A (29), APC (31), FUS (22), CDKN1B (23), HOXA5 (26), ID2 (27) and JADE2 (24) — all plausible chromatin or leukaemia-relevant proteins named repeatedly with no entry. That is the queue's actual signal, and it is roughly a third of what the tool reports.
This entry does not adjudicate those 28. Doing so is the next piece of work and it needs a content read per symbol, not another count.
| script | analyses/q188-self-reference-in-the-named-but-unwritten-queue/{run.py,collisions.json,alias.json} |
|---|---|
| status | executed |
| tool audited | scripts/check-named-but-unwritten.py |
| answers open question from | ana-q185-a-gap-report-counts-as-coverage-and-a-seven-bait-denominator-made-the-core-look-clean |
| min files | 20 |
| queue total | 45 |
| negative control | 8 |
| already registered collision | 0 |
| filed under alias | 1 |
| alias case | JMJD1C approved; entry exists as gene-kdm3c |
| explained | 9 |
| explained share PCT | 20.5 |
| residue | 28 |
| king check that failed | the first alias search was pointed backwards and returned 0; it was caught only because a memory recorded JMJD1C as a repeat offender |
| verdict | 37.8% of the queue is the project's own controls, its registered collisions, or its own filing choice; raising the threshold does not help because the contamination is distributed, not tail-concentrated |
| already registered collision WITHDRAWN | 8 |
| tool flagged total | 44 |
negative control symbols
[ "ALB", "GFAP", "INS", "KRT14", "MYH7", "MYOD1", "NEUROD1", "RHO" ]
registered symbols
[ "PRC1", "EFS", "GAPDH", "PDF", "PTH", "IGH", "PZP", "H3C1" ]
measurements — the numbers behind the chart
[
{
"quantity": "share",
"subject": "queue members that are the project's own negative controls",
"universe": "44 symbols flagged by the tool at --min-files 20",
"value": 0.182
},
{
"quantity": "share",
"subject": "queue explained as the project's own controls or an alias-filed entry (corrected)",
"universe": "45 symbols named in >=20 files with no entry",
"value": 0.205
},
{
"quantity": "count",
"subject": "times JMJD1C has been logged as a missing gene by this project",
"universe": "project history",
"value": 3
}
]verified against real tool
{
"negative_controls_flagged": {
"ALB": 30,
"INS": 28,
"MYH7": 28,
"GFAP": 24,
"RHO": 24,
"KRT14": 22,
"MYOD1": 22,
"NEUROD1": 22
},
"JMJD1C_flagged_at": 40,
"registered_collisions_flagged": 0
}- Apply the three exclusions to check-named-but-unwritten.py itself: the negative-control set, anything with block_autogeneration in the collision registry, and bidirectional HGNC alias resolution. None is more than a few lines and the queue is used to pick beats.
- Rename gene-kdm3c to gene-jmjd1c, or add an alias field the tools read. Fixing the queue leaves the entry filed under a non-approved symbol, and every other tool keyed on approved symbols will keep missing it.
- Adjudicate the 28 residue symbols by content, one at a time. ASH1L, POLR2A, APC, FUS, CDKN1B, HOXA5, ID2 and JADE2 look like genuine candidates; RPE, NES, CD4, SPR, CPM and WAS look like the acronym false positives the tool's docstring predicts. A count cannot separate them.
- Audit the remaining mention-based figures named in q185 - interactome coverage and absence-class coverage - for the same three contamination classes.
- E1strong confidence 4 of 5: Replicated in peer-reviewed work by more than one group.dataset
Reimplementing check-named-but-unwritten.py's selection over 3,071 corpus entries against the cached HGNC protein-coding set returns 45 symbols named in at least 20 node files with no gene- or protein- entry of their own. Eight of the 45 are this project's width-matched negative-control loci: ALB (29 files), MYH7 (27), INS (25), RHO (23), GFAP (23), NEUROD1 (21), MYOD1 (21), KRT14 (21). That is all eight members of the negative set and 17.8% of the queue.
What this evidence cannot show
This is a reimplementation of the tool's selection rather than a run of the tool itself; it returns 45 where the tool reported 44 at the same threshold, a difference consistent with the corpus having grown during the cycle. The negative-control set is taken from the occupancy analyses' NEG constant.
Evidence that argues against this (2)
- The negative controls being in the queue is arguably correct behaviour, not a defect: the tool asks 'is this symbol discussed but unwritten', and they are genuinely discussed and genuinely unwritten. The criticism only holds if the queue is read as a work list, which is how its own docstring frames it - four beats were chosen from this shape.
- Eight of 45 is 17.8%, but the queue's purpose is to surface the TOP of a ranked list, and the controls sit at 21-29 files while the head is at 206. A reader working down from the top would reach the real candidates first and might never encounter the controls, which makes the practical cost smaller than the share suggests.
- E2weak confidence 2 of 5: Preliminary, small, indirect, or not yet peer reviewed.dataset
[WITHDRAWN 2026-09-24] Cross-checking the 37 non-control queue members against data/symbol-collisions.json (227 registered tokens) finds 8 already registered: PRC1 (206 files), EFS (175), GAPDH (79), PDF (59), PTH (43), IGH (36), PZP (34) and H3C1 (25). PRC1's registry row already carries block_autogeneration true and states that an automated 'write the missing genes' pass would create an entry for the wrong protein. WITHDRAWN: this describes the King's reimplementation, not the tool. check-named-but-unwritten.py already calls load_symbol_collisions() and routes registered tokens to a separate `blocked` list; run directly at --min-files 20 its flagged output contains none of PRC1, EFS, GAPDH, PDF, PTH, IGH, PZP or H3C1. The tool handles this class correctly and always did.
What this evidence cannot show
Matching is by exact token against the registry's token field plus two of its sub-dictionaries; a collision recorded only in an entry's prose rather than in the registry would not be counted, so 8 is a floor.
Evidence that argues against this (2)
- Withdrawn in full. The reimplementation that produced this omitted the tool's collision filter, so the 8 counted here were never in the tool's queue. The error inflated this entry's headline from 20.5% to 37.8%.
- Being in the collision registry does not always mean the symbol should be excluded from a gap queue. H3C1 is a real histone gene with genuine structural interaction data in this corpus's own census - its registry row is about ambiguity, not about the protein being fictional - so excluding all registered tokens would drop at least one legitimate candidate.
- E3strong confidence 4 of 5: Replicated in peer-reviewed work by more than one group.dataset
JMJD1C is flagged at 38 files with no entry. The corpus holds gene-kdm3c. The HGNC record has symbol JMJD1C, alias_symbol 'DKFZp761F0118|KIAA1380|FLJ14374|KDM3C' and prev_symbol TRIP8 - so JMJD1C is the approved symbol and KDM3C is its alias, and the entry is filed under the alias. Of the 29 residue symbols, 1 has an entry under one of its own aliases. A first check searched the opposite direction - approved symbols whose alias list contains the queue symbol - and returned 0.
What this evidence cannot show
Only one alias-filed entry was found among 29, so this class is small in this queue even though it is the one with a documented history of recurrence. The alias map is from the cached HGNC file and inherits any staleness in it.
Evidence that argues against this (2)
- One instance in 29 does not justify much machinery. The case for fixing it is the recurrence rather than the rate - this corpus has logged JMJD1C as a missing gene three times now - and a reader could reasonably conclude that a note in the collision registry is a cheaper fix than an alias resolver.
- The deeper issue this exposes is not the queue but the FILING: an entry for an HGNC-approved symbol is stored under a non-approved alias. Fixing the queue leaves gene-kdm3c misnamed, and any other tool keyed on approved symbols will keep missing it. The audit fixes the symptom and names the cause without repairing it.
answers q185's first open question: 37.8% of the named-but-unwritten queue is the project's own controls, registered collisions or an alias-filed entry
this entry is filed under KDM3C, an ALIAS; HGNC's approved symbol is JMJD1C, which is why the queue has logged it missing three times
same instrument, next defect: after the negative controls were excluded, four of the queue top five are acronym collisions