The epigenetics coverage test inspects data{} KEY NAMES and never a field's value, so 71 entries that state a histone mark INSIDE a data field score zero - and four more are missed by one character
also called q181 key-versus-value · _EPI_KEY audit
The tool that scores epigenetics coverage looks only at the NAMES of the fields in an entry, never at what those fields say. So an entry with a field called 'mechanism' whose text reads 'deposits H3K4me3 at target promoters' counts as having no epigenetics at all.
The same thing, for a scientist
check-pi-dimensions.py computes epi_field as any(_EPI_KEY.search(k) for k in dat) - a regex over the KEY NAMES of the data payload. The value side is never examined. Measured over the 134 stratum-B entries (a mark named somewhere, no epigenetics-named key), 71 carry a mark token inside a data{} VALUE, under keys the regex does not match. These are structured, machine-readable statements sitting in exactly the place the metric is supposed to reward, scoring zero because of the field's name. A second, smaller defect is adjacent: four entries carry keys that are epigenetic by any reading but miss _EPI_KEY by one character - gene-kmt2e 'chromatin_binding', gene-rbm15b 'chromatin_link', gene-kat8 'h3k79_zone_link', gene-mme 'silencing_mechanism'. The regex has 'chromatin_mark' but not bare 'chromat'; it has 'eraser' but 'marks_erased' matches neither '^mark$' nor '^mark_'. Both defects are reported, not fixed: scripts/check-pi-dimensions.py was NOT modified.
The test, and the asymmetry inside it
"epi_field": any(_EPI_KEY.search(k) for k in dat), # KEYS only
"epi_text": bool(_EPI_MARK.search(json.dumps(d, ...))), # WHOLE entry
The two tests read completely different surfaces 1. epi_field is strict in the right way -- it demands a named field, which is what makes a dimension filterable -- but it is strict about the wrong thing: the name, not the content. epi_text is the opposite, so generous it sweeps the entire serialised entry including citation titles and URLs.
There is no test in between, and the thing a reader actually wants -- a structured field whose value names a mark -- falls in the gap.
71 entries state a mark inside a data value and get nothing
Of the 134 stratum-B entries, 71 (53.0%) carry a mark token inside data{} itself, under a key _EPI_KEY does not match 1. These are not prose. They are payload fields -- the exact structured form the measurements[] rule and the dashboard's filters are built on.
The count by where the mark lives across stratum B:
| location of the mark token | entries |
|---|---|
in a data{} value | 71 |
in sections[] or summary_* | (overlapping) |
in evidence[] ONLY -- citation titles and claims | 17 |
in data, summary or sections (substantive body) | 110 |
The 17 evidence-only entries are the ones the current test is right about and a value-reading test would also have to exclude, because a mark appearing solely in a cited paper's title says nothing about the entry's subject. Any fix has to read data{} values and not the whole serialisation, or it re-creates the epi_text problem.
The four near-misses, and the pattern in them
Enumerating every data{} key over the 541-entry population gives 24 distinct keys _EPI_KEY matches (led by epigenetic_readout on 182 entries, epigenetic_mark_named on 23, mark_written on 22, epigenetic_role on 19) and 1,179 it does not 2. Four of the 1,179 are epigenetic by any reading:
| entry | key | why it is missed |
|---|---|---|
gene-kmt2e | chromatin_binding | regex has chromatin_mark, not bare chromat |
gene-rbm15b | chromatin_link | same |
gene-kat8 | h3k79_zone_link | no mark names in _EPI_KEY at all |
gene-mme | silencing_mechanism | no repression vocabulary in _EPI_KEY |
And one near-miss with no instance yet, worth recording because it will happen: marks_erased matches neither ^mark$ nor ^mark_ nor eraser. The plural breaks the anchor and 'erased' is not 'eraser'. mark_erased (singular) is matched; marks_erased is not. One entry in the corpus already uses the plural form.
Four entries is 0.7% of the population and does not move the headline. It is recorded because the failure mode -- a convention introduced to satisfy a reporter, in a spelling the reporter was never told about -- is the same one documented three times already in this file's own comments, most recently localization_shown_for_fusion, which left 27 entries invisible.
Proposed fix, NOT APPLIED
Reported as a finding per the dispatch instruction; scripts/check-pi-dimensions.py is unmodified.
- Add a third line between the two existing ones:
epi_value--_EPI_MARKover the serialiseddata{}payload only, not the whole entry. Print it alongsideepi_field, do not merge them. On this population that line reads at least 71/541 = 13.1% aboveepi_field, and it would have to be computed fresh because stratum A entries may also qualify. - Widen
_EPI_KEYminimally:chromat(notchromatin_mark),^marks?[_$],silenc, and the mark names themselves (h3k,h4k,h2a). - Print the near-miss list. The most useful thing this reporter could do is name the keys it ALMOST matched, so a new spelling is caught the cycle it appears rather than three cycles later. The enumeration is fifteen lines.
Point 3 is the one that matters. Points 1 and 2 fix today's four entries; point 3 stops the fourth recurrence of a failure this file has already logged three times.
| script | analyses/q181-is-the-epigenetics-gap-real/{keys,run}.py |
|---|---|
| status | run |
| generated | 2026-09-24 |
| tool modified | false |
| proposed fix applied | false |
near miss keys
{
"gene-kmt2e": "chromatin_binding",
"gene-rbm15b": "chromatin_link",
"gene-kat8": "h3k79_zone_link",
"gene-mme": "silencing_mechanism"
}epi key spellings in use — the numbers behind the chart
{
"epigenetic_readout": 182,
"epigenetic_mark_named": 23,
"mark_written": 22,
"epigenetic_role": 19,
"non_histone_substrate": 16,
"epigenetic_bounded_absence": 10,
"writer_of_that_mark": 6,
"reader_of_that_mark": 6,
"eraser_of_that_mark": 5
}measurements — the numbers behind the chart
[
{
"quantity": "entries naming a mark inside a data{} VALUE under a key the detector does not match",
"value": 71,
"units": "entries",
"n": 134,
"subject": "stratum B - no _EPI_KEY-matching key, mark named somewhere in the entry",
"universe": "541 gene/protein entries at commit ac2aeab; stratum B is 134 of them",
"null": null,
"note": "53.0% of stratum B; 13.1% of the whole population"
},
{
"quantity": "entries whose mark token appears ONLY inside evidence[]",
"value": 17,
"units": "entries",
"n": 134,
"subject": "stratum B entries where the mark is in a citation title or claim and nowhere else",
"universe": "same 134-entry stratum B",
"null": null,
"note": "the subset the current strict test is RIGHT to exclude, and which any fix must keep excluding"
},
{
"quantity": "data{} keys that are epigenetic in substance but miss _EPI_KEY",
"value": 4,
"units": "entries",
"n": 541,
"subject": "chromatin_binding, chromatin_link, h3k79_zone_link, silencing_mechanism",
"universe": "1,179 distinct unmatched top-level data keys across 541 entries",
"null": null,
"note": "0.7% - too small to move the headline; recorded for the recurrence pattern, not the count"
}
]- How many stratum-A entries would also gain an epi_value credit, and how many would LOSE credit if the test required a non-empty, non-hedged value? Nobody has audited the 212 covered entries for empty fields.
- Does the key enumeration need to descend into nested data objects? Four complex entries carry subunit-level maps, and a mark recorded one level down is invisible to the reporter and to this audit alike.
- Is gene-mme's 'silencing_mechanism' about chromatin silencing or about transcriptional downregulation of a surface peptidase? If the latter, the near-miss count is three and this entry overstates by one.
- E1established confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.dataset
check-pi-dimensions.py computes epi_field by iterating data{} key names only (any(_EPI_KEY.search(k) for k in dat)) and never inspects a field's value; of the 134 entries that name a mark but carry no matching key, 71 carry that mark token inside a data{} value, 110 carry it in data, summary_* or sections, and 17 carry it only inside evidence[].
What this evidence cannot show
The location buckets overlap by construction - an entry with the mark in both data and sections appears in both counts - so 71, 110 and 17 do not sum to 134. 'In a data value' was tested by serialising data{} alone and matching _EPI_MARK, which cannot distinguish a mark in a field meant to record it from a mark inside a free-text note that happens to live under data{}.
Evidence that argues against this (1)
- The 71 figure overstates the fix's benefit. The same objection that sinks epi_text applies inside data{}: a mark named in a data field can be a statement about KMT2A rather than about the entry's subject, and this count does not separate the two. The stratum-B hand-read put subject-relevance at 15/20 (Wilson 53.1-88.8) across the whole stratum, not specifically among the 71, so the number of entries a value-reading test would CORRECTLY newly credit could be as low as ~38.
- E2established confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.dataset
Enumerating every data{} key across the 541-entry gene/protein population yields 24 distinct keys matched by _EPI_KEY - epigenetic_readout on 182 entries, epigenetic_mark_named on 23, mark_written on 22, epigenetic_role on 19, non_histone_substrate on 16, epigenetic_bounded_absence on 10, and eighteen one-to-six-instance variants - against 1,179 unmatched keys, of which exactly four are epigenetic in substance: chromatin_binding (gene-kmt2e), chromatin_link (gene-rbm15b), h3k79_zone_link (gene-kat8) and silencing_mechanism (gene-mme).
What this evidence cannot show
The four near-misses were selected by a second regex of my own over the 1,179 unmatched keys and then hand-read; a key that is epigenetic in substance under a name neither regex anticipated would be missed by this audit exactly as it is missed by the reporter. The enumeration covers top-level data{} keys only and does not descend into nested objects, so a mark-named key one level down is invisible to both the reporter and this audit.
Evidence that argues against this (1)
- Calling these four a defect assumes the value behind each key is a real epigenetic statement, which was not checked for all four. gene-mme's 'silencing_mechanism' in particular is most likely about gene silencing in the transcriptional sense on a cell-surface peptidase, which would make it a category error rather than a missed field - so the true near-miss count may be three, not four.
king verification of the q181 beat: stratum A audited and clean, three further regex blind spots, and one king correction withdrawn
the key-versus-value asymmetry is the mechanism behind the schema-artefact share of the shortfall
variant V1 minus V0 scores the key-versus-value finding directly
MEPCE is the worked case: over-credited by the key test on 'methylat', under-credited by the mark test