A promoter neighbour goes missing two ways - absent from the table, or present under a different one of its own TSSs - and both return the same clean negative
also called one row per symbol is the promoter table's second blind spot · the two blind spots of a one-row-per-symbol window table · multi-TSS genes in a promoter window table
If you keep a list of where every gene starts, two different mistakes make a neighbouring gene invisible: the gene is missing from your list, or it is on your list under a different one of its own start sites. Both make your check report 'nothing nearby', and you cannot tell which one happened, or that either did.
The same thing, for a scientist
Q153 established that **a promoter window is not a gene** and that a within-table neighbour check is blind to neighbours the table excludes. This entry adds the second blind spot, found at the index fusion's own partner, and the point is that **the two are different bugs with identical symptoms**. | | **blind spot 1: absent** | **blind spot 2: one row per symbol** | |---|---|---| | worked case | `AFF1-AS1` beside `AFF1` | `C4orf36` beside `AFF1` | | why | the table is one `NM_`-derived row per symbol; AFF1-AS1 has only `NR_038841` | C4orf36 has **three** current curated TSSs spanning **43,782 bp** - 86,892,422 (13 transcripts), 86,934,732 (4), 86,936,204 (3) - and the table records one | | does the symbol have a row? | **no** | **yes** | | where does the row point? | nowhere | `chr4:86,891,422-86,893,422`, at the **distal** TSS, 42,579 bp from AFF1 | | is the row wrong? | n/a | **no** - `d_nearest = 0`; it is one of three right answers | | what a within-table check reports | no neighbour | no neighbour | | remedy | audit against the **full** annotation (Q153) | keep **all** of a symbol's TSSs; refreshing the annotation does **not** help | | measured rate | **7.2 percentage points** (Q153) | **14.69%** of symbols (Q156) | 🔴 **This entry's first version said blind spot 2 was annotation drift and that the C4orf36 row was displaced by 42,310 bp. Both were wrong, and a whole-table audit run immediately afterwards said so** [E3]. Genuine drift is **1.83%** of rows (355 of 19,404 with a disjoint window), **81.63%** of rows sit on a TSS-identical coordinate, and **no row has moved chromosome**. The real second blind spot is **one row per symbol at 14.69%** - 2,851 symbols with multiple non-overlapping TSSs, median span **21,291 bp**, 1,939 of them with an alternate TSS more than 10 kb from the scored one. **It is 8x the drift rate and it is not fixable by re-downloading an annotation.** A third face of the same problem, at the same locus: the symbol `C4orf36` resolves to **two Ensembl gene ids** whose TSSs are 43,365 bp apart - `ENSG00000163633` (HGNC-sourced) and `ENSG00000285458` (NCBI-sourced). **A pipeline resolving the symbol through HGNC and one resolving it through NCBI Gene get non-overlapping promoter windows, with no error and no warning.** That is a coordinate-level instance of the family this project already logs as accession-level identifier traps. 🟢 **And the reassuring half, which must be reported with the rest:** the promoter table is **81.63% TSS-identical** to the current release. Annotation drift is a small, bounded problem, and Q156's independent reproduction of Q153's sharing census (14.19% vs 14.37% within-table, 22.63% vs 21.60% full-annotation, two releases and two implementations) says that census is not a snapshot artefact either.
What to actually do
- Keep all of a symbol's TSSs, or say which one you kept and why. This is the fix for the blind spot that actually dominates. 2,851 symbols (14.69%) have multiple non-overlapping TSSs; keeping the 5'-most, keeping all, or keeping the most-supported are three different tables and nobody has compared them.
- Record the annotation release with every coordinate table, the way this project records a DepMap release.
promoters.tsvcarries an accession per row and no release stamp. This is worth doing even though drift turned out to be small - it is what makes the smallness checkable. - Ask the full annotation for neighbours, and ask the current one. Q153's rule and this one are both necessary; neither is sufficient.
- When a symbol resolves to more than one gene model, say which one you used and why. Not which accession - which interval. The accession-level rules in this brief (62, 63, 65, 66) all assume the ambiguity is about which protein; here it is about which piece of DNA, and a length check cannot see it.
- Widen the window as a diagnostic, not as a fix. At this locus the strongest fusion-biased signal sits 249 bp outside a 2 kb window and would be inside a 2.5 kb one. That is a reason to look at base resolution, not a reason to switch to 2.5 kb - a wider window shares more sequence with more neighbours and makes attribution worse.
- And the meta-rule this entry earned the hard way: check the SPAN of the query you measure a displacement against. My 42,310 bp figure came from a 30 kb track query that could not contain the matching transcript. The query ran perfectly and the filter that defined it produced the answer.
Why the symptom is the dangerous part
Both failures produce a clean, confident negative from a check that ran correctly. Nothing errors, nothing warns, and the answer is the one the analyst hoped for. This graph already documents that shape repeatedly - an esearch returning a well-formed count: 0, a supplementary archive that is valid and empty, a CAPTCHA page that parses, a coverage metric that counts a link near the thing instead of the thing.
The specific cost measured here: the project's promoter table reports C4orf36 occupied in 0 of 27 samples, while a 400 bp window on the C4orf36 TSS that sits beside AFF1 is occupied in 23 of 27 and carries the highest KMT2A-N-over-KMT2A-C ratio anywhere in 6 kb. The table is not merely silent about the neighbour; it actively reports the symbol as empty - and it does so while pointing at a perfectly valid TSS of that same symbol.
blind spot 1
{
"name": "absent from the table",
"cause": "one NM_-derived row per symbol",
"worked_case": "AFF1-AS1",
"remedy": "audit against the full annotation (Q153)",
"bounded_at": "7.2 percentage points, from Q153's 14.37% within-table vs 21.60% full-annotation censuses"
}blind spot 2
{
"name": "one row per symbol, where the symbol has several non-overlapping TSSs",
"cause": "the table schema keeps one TSS per gene symbol",
"worked_case": "C4orf36, three current curated TSSs spanning 43,782 bp, table keeps the distal one",
"remedy": "keep all of a symbol's TSSs, or state which one and why; refreshing the annotation does NOT help",
"bounded_at": "14.69% of symbols (2,851 of 19,404), median span 21,291 bp, 1,939 with an alternate TSS >10 kb away (Q156)"
}blind spot 3
{
"name": "one symbol, two gene models",
"cause": "HGNC-anchored and NCBI-anchored models coexist under one display name",
"worked_case": "C4orf36 ENSG00000163633 vs ENSG00000285458, TSSs 43,365 bp apart",
"remedy": "state which source resolved the symbol to coordinates",
"bounded_at": "unmeasured; this repository currently resolves from a fixed table, so it is prophylaxis"
}measurements — the numbers behind the chart
[
{
"quantity": "pct_symbols_with_multiple_non_overlapping_tss",
"subject": "rows of this project's promoter table whose symbol has more than one non-overlapping current TSS",
"value": 14.69,
"units": "percent of rows",
"n": 19404,
"universe": "promoters.tsv joined against the current UCSC hg38 ncbiRefSeqCurated, NM_-only comparison (Q156)",
"null": 1.83,
"note": "the null is the genuine-displacement rate from the same audit; the schema blind spot is 8x the drift blind spot"
},
{
"quantity": "pct_rows_displaced",
"subject": "rows whose 2 kb window is disjoint from every current window for the same symbol",
"value": 1.83,
"units": "percent of rows",
"n": 19404,
"universe": "same audit, NM_-only; 355 rows, 81.63% TSS-identical, 0 moved chromosome (Q156)",
"null": 7.2,
"note": "the null is Q153's blind spot 1 (neighbours with no row) at 7.2 percentage points; drift is four times smaller"
},
{
"quantity": "multi_tss_span_median",
"subject": "median distance between the most distal and most proximal current TSS, among multi-TSS symbols",
"value": 21291,
"units": "bp",
"n": 2851,
"universe": "the 2,851 multi-TSS symbols of the promoter table (Q156)",
"null": 2000,
"note": "the null is the window width: the median multi-TSS gene's own start sites are ten window-widths apart"
},
{
"quantity": "tss_separation_between_two_ensembl_models_of_one_symbol",
"subject": "ENSG00000163633 against ENSG00000285458, both displayed as C4orf36",
"value": 43365,
"units": "bp",
"n": 2,
"universe": "Ensembl REST GRCh38 lookup/id, minus-strand TSSs 86,892,813 and 86,936,178",
"null": 0,
"note": "0 is what two ids for the same gene should differ by if a symbol-keyed lookup is to be safe"
}
]blind spot 2 superseded
{
"name": "annotation drift (WITHDRAWN as the second blind spot)",
"why_withdrawn": "This entry first named drift as blind spot 2 on the strength of a 42,310 bp C4orf36 displacement that does not exist. Q156's whole-table audit measures genuine drift at 1.83% of rows, four times SMALLER than Q153's blind spot 1, with 81.63% of rows TSS-identical and no row moved chromosome. Drift is real, bounded and small; it is not the second blind spot.",
"bounded_at": "1.83% of rows (355 of 19,404), Q156"
}- Any target-selection or selectivity argument resting on 'no other gene's promoter is nearby' was made against a table with both blind spots, and the direction of the error is always toward false confidence.
- Fixing this by widening the window makes attribution worse: a wider window shares more sequence with more neighbours. The fix is a narrower measurement, not a wider one.
- And do not read the reassuring half as a clean bill of health. 81.63% TSS-identical says the table is not stale. It says nothing about the 14.69% of symbols whose other TSSs the table cannot represent at all.
- Which TSS should a one-row-per-symbol table keep - the 5'-most, the most-transcript-supported, or the one with the most expression evidence? Q156 measures 2,851 affected symbols; nobody has compared the three tables.
- How many of this project's occupancy NEGATIVES are at multi-TSS symbols where an unscored TSS would have called positive? C4orf36 is 0/27 at its scored window and 23/27 at another of its own TSSs. The whole-table version of that re-scoring has not been run.
- Does the same one-row-per-symbol problem affect the gene-body intervals used in q145/q147? Those were hand-typed and two of ten hand-typed intervals were already found wrong in an earlier beat.
- E1established confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.dataset
At the AFF1 locus, AFF1-AS1 has no row in this project's 19,404-symbol promoter table because the table is NM_-derived, while C4orf36 has a row at one of its three current curated TSSs - the distal one, 42,579 bp from AFF1 - and a within-table neighbour check returns 'no neighbour' in both cases.
Q155 geometry re-derivation: the project's promoters.tsv against UCSC hg38 refGene, ncbiRefSeq, knownGene and Ensembl REST · Iqbal Lab oncofusion knowledge graph, beat Q155 · this project 2026What this evidence cannot show
One worked locus. Q153 bounded blind spot 1 at 7.2 percentage points and Q156 has since bounded blind spot 2 at 14.69% of symbols; this entry's own contribution is the demonstration that the two failures are distinct and share a symptom, not the rates. The C4orf36 row's d_nearest is 0 - it is NOT displaced, and this entry's first version wrongly said it was.
Evidence that argues against this (1)
- The project's C4orf36 row is not an error in any sense: 86,892,422 is a current, curated TSS carrying 13 of the gene's 20 curated transcripts. Calling this a defect in the table overstates it; the defect is in treating one-row-per-symbol as a description of a locus. UCSC Genome Browser et al. 2026
- E2established confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.database
Ensembl carries two gene ids under the symbol C4orf36 whose TSSs are 43,365 bp apart - ENSG00000163633 sourced from HGNC at chr4:86,876,205-86,892,813 and ENSG00000285458 sourced from NCBI Gene 132989 at chr4:86,886,472-86,936,178 - so a symbol-keyed coordinate lookup can return either with no error.
Ensembl REST lookup/id for ENSG00000163633 and ENSG00000285458, GRCh38 · Ensembl REST API, rest.ensembl.org · Ensembl 2026What this evidence cannot show
Two Ensembl gene ids carrying the same display name is ordinary when a locus has both an HGNC-anchored and an NCBI-anchored model; it is not a database bug. The hazard is only for code that resolves a symbol to coordinates without stating which source it took. Ensembl REST returned HTTP 500 and 503 several times this session; both lookups quoted here are responses that were received and saved.
Evidence that argues against this (1)
- This project's own practice already avoids the live-resolution hazard: the standing rule prefers a hardcoded, hand-verified symbol-to-coordinate dictionary over run-time resolution, and promoters.tsv is exactly that. So the two-model trap does not currently bite anywhere in this repository. It is prophylaxis for the moment someone resolves a symbol live, and the reason to record it is that the failure is invisible. HUGO Gene Nomenclature Committee et al. 2026
- E3moderate confidence 3 of 5: One strong study, or several smaller consistent ones.dataset
The measured cost at this locus: the project's C4orf36 promoter row is occupied in 0 of 27 GSE252378 samples while a 400 bp window on the current-RefSeq C4orf36 TSS beside AFF1 is occupied in 23 of 27 with the highest KMT2A-N-over-KMT2A-C ratio in the surrounding 6 kb.
Q155 per-sample peak scoring and promoter-matrix occupancy at the AFF1/C4orf36 locus, GSE252378 · Iqbal Lab oncofusion knowledge graph, beat Q155 · this project 2026What this evidence cannot show
The two numbers use the same rule and floor construction but different window widths (2,000 bp and 400 bp), so they are not a like-for-like subtraction; the direction of the difference is far larger than the width effect but the pair should be quoted as two measurements, not as a delta. No spike-in exists in this deposit.
Evidence that argues against this (1)
- An IgG hotspot sits 300 bp from that window and an interval centred on it scores an even higher N/C median (2.53 against 2.32). So part of what the displaced window catches is generic accessibility, and the displacement finding is about what the table can SEE rather than about what is biologically there. Iqbal Lab oncofusion knowledge graph et al. 2026
- E4strong confidence 4 of 5: Replicated in peer-reviewed work by more than one group.dataset
A whole-table audit of all 19,404 rows of this project's promoter table against the current UCSC hg38 ncbiRefSeqCurated finds 81.63% TSS-identical, 1.83% (355 rows) genuinely displaced with a disjoint window, 0 rows moved to another chromosome, and 14.69% (2,851) of symbols carrying multiple non-overlapping TSSs with a median span of 21,291 bp; the C4orf36 row that motivated the question has d_nearest = 0 and is not displaced.
The promoter table's second blind spot is not annotation drift at 1.8% - it is one row per symbol at 14.7%, and the case that motivated the question is not displaced at all · Iqbal Lab oncofusion knowledge graph, beat Q156 (coordinator) · this project 2026What this evidence cannot show
Q156's whole-table figures were run by the coordinator and are QUOTED here, not re-derived; only its C4orf36 result was independently re-checked by this beat, against UCSC ncbiRefSeqCurated over a 200 kb window. The 1.83% and 14.69% should be re-run before being used as load-bearing quantities elsewhere.
Evidence that argues against this (1)
- That the C4orf36 row is not displaced makes the situation WORSE, not better. A displaced row can be fixed by refreshing the annotation; a symbol with three legitimate TSSs and a one-row-per-symbol schema cannot be, and Q156 measures that class at eight times the displacement rate. UCSC Genome Browser et al. 2026
adds the second blind spot - a row present at a displaced coordinate - which Q153's remedy does not fix
the worked case for displacement and for one-symbol-two-gene-models
generalises the second blind spot from one locus to the whole table
the geometry that the concept generalises
renames blind spot 2 from annotation drift (1.83%) to one row per symbol (14.69%)