scripts/is-symbol-covered.py returns 'no match' for BRAF, AKT1, EGFR, CD226 and IRF2 - all five have a declined interface entry. The `interface-` prefix in its PREFIXES list can never match anything.
also called false clear · is-symbol-covered defect · interface naming convention
The tool everyone is told to run before writing an entry, so as not to duplicate one, answers 'not covered' for proteins that already have an entry. It looks for a file named after the protein, and this project names those files after the pair.
The same thing, for a scientist
**The duplicate-check tool gives a FALSE CLEAR on exactly the population an interactome beat works in.** `scripts/is-symbol-covered.py` decides COVERED at line 359 with `if pre + sl in ids` - an **exact** id match against the prefixes `gene- protein- target- mark- drug- variant- interface- localization- noncoding-`. **No entry in this corpus is named `interface-<symbol>`.** All 69 are named `interface-<bait>-<partner>-<reason>`, e.g. `interface-menin-braf-v600e-the-only-one-with-an-endogenous-menin-lane`. Run live this cycle on BRAF, AKT1, EGFR, CD226 and IRF2, the tool returns **"no match under N candidate names"** for all five, and all five have an entry [E1]. The prose fallback `find_declines` did not fire for any of them either. **A token match on the id and the title instead finds 30 of this beat's 135 apparent gaps are already the subject of an entry - 22.2%** [E2]. The brief this beat was dispatched under says a `no-match is not proof of a gap`; it is worse than that - **the tool's `interface-` prefix is dead code, and the verdict it produces on interface-covered symbols is not a weak no, it is a wrong no.**
The defect, exactly
# scripts/is-symbol-covered.py
PREFIXES = ("gene-", "protein-", "target-", "mark-", "drug-", "variant-",
"interface-", "localization-", "noncoding-")
...
for pre in PREFIXES: # line 359
if pre + sl in ids:
hits.append((pre + sl, how))
sl is the symbol slug. For BRAF the tool asks whether interface-braf is an id. It is not. The id is interface-menin-braf-v600e-the-only-one-with-an-endogenous-menin-lane.
This is not a naming mistake in the entries. interface-<bait>-<partner>-<reason> is a good convention - it is unique per pair, it is self-describing, and the reason is in the id where a reader sees it. The mistake is a lookup that assumes the entry is named after one molecule when its type is, by definition, about two.
The same argument applies to localization-, which is also in PREFIXES and which this corpus names for the address (localization-cxxc-cpg-address), never for a symbol. That prefix has not been separately tested here and is flagged, not claimed.
Measured, on this beat's own gap list
The 135 apparent gaps from the prey-only census were re-checked by matching the symbol as a token inside the id ((?:^|-)<slug>(?:-|$)) and as a word inside the title. 30 of 135 (22.2%) are already the subject of an entry 2:
| where they came from | symbols |
|---|---|
q128-the-menin-interactome-that-is-not-chromatin | AKT1, BRAF, CD226, EGFR, FBXW7, PTEN, SMAD4, SPOP, ZC3HC1 |
q129-the-never-discussed-partners-of-kmt2a-and-psip1 | ABT1, ANOS1, FGFBP1, IRF2, KRR1, OASL, PRKRA, TMCO1, UTP3, GDF5, IGHMBP2, PPP1R13B, TMEM214 |
| elsewhere (analysis or interface entries under other beats) | H3C1, H2BC21, CLOCK, CFTR, YWHAQ, ING4, RPL13A, DDX52 |
Every one of the first 22 is a reasoned refusal, with the reason written into the id. Re-opening them would have wasted most of this beat, and the tool the brief names as the guard against exactly that would have waved all of them through.
Caveat on the 30, stated because this project has been burned by unread control lists: the last group is a title-token match and was not individually opened. DDX52 matching gene-ddx55 and ING4 matching ana-the-expression-control-splits-the-verdict are plausibly incidental mentions rather than subject coverage. The defensible figure is the 22 with a dedicated interface- entry; the 30 is the generous reading and both are reported.
What to change, and what not to
Recommended, reported not applied (this beat does not own scripts/):
- For
interface-andlocalization-, match the slug as a hyphen-delimited token anywhere in the id, not as a prefix-plus-slug. One regex:(?:^|-)<slug>(?:-|$). - Report those hits under a third verdict, not COVERED and not DECLINED-IN-PROSE. An
interface-x-y-declined-...entry means this pair was adjudicated and refused, which is more specific and more useful than either existing label - it tells the reader the refusal is in the id itself. - Do not widen
gene-/protein-the same way. A token match there would hit compound ids and generate the false-hit direction, which rule 88's scope note already records as the symmetric failure.
And the general form, which is the reusable part: a coverage check keyed on one molecule cannot see an entry whose subject is a pair, a complex, a mechanism or a mark. The tool's own docstring says a no-match is not a gap and names three reasons. This is a fourth, and unlike the other three it is mechanical and fixable in one line.
| script | analyses/q160-the-prey-only-interactome/already-decided.py |
|---|---|
| status | run |
| result summary | is-symbol-covered.py's `interface-` prefix can never match, because this corpus names interface entries interface-<bait>-<partner>-<reason>. Five symbols with declined entries return 'no match'. A token match finds 30 of 135 apparent gaps already decided, 22 of them with a dedicated interface- entry. |
| recommended fix not applied | For the interface- and localization- prefixes only, match the slug as a hyphen-delimited token anywhere in the id and report it under a third verdict, ADJUDICATED AS A PAIR. Do not widen gene-/protein- the same way. |
inputs
[ "analyses/q160-the-prey-only-interactome/census.json", "data/graph/nodes/*/*.json" ]
measurements — the numbers behind the chart
[
{
"quantity": "count",
"subject": "symbols with a dedicated interface- entry that is-symbol-covered.py reports as no-match",
"value": 5,
"units": "symbols",
"n": 16,
"universe": "the 16 symbols this beat put through the tool on 2026-09-24; BRAF, AKT1, EGFR, IRF2 in that run plus CD226 checked separately",
"null": null,
"note": "The tool reported covered 0, DECLINED on purpose 0, no match 16."
},
{
"quantity": "fraction",
"subject": "apparent prey-only gaps that are already the subject of an existing entry",
"value": 0.222,
"units": null,
"n": 135,
"universe": "the 135 human prey-only partners with no accession/id/symbol join, token-matched against every node id and title, 2026-09-24",
"null": null,
"note": "30 of 135 generous; 22 of 135 (0.163) confined to entries with a dedicated interface- id whose verdict is in the id string."
},
{
"quantity": "count",
"subject": "entries in this corpus whose id begins with interface-",
"value": 69,
"units": "entries",
"n": 2931,
"universe": "data/graph/nodes/*/*.json, 2026-09-24",
"null": null,
"note": "None of the 69 is named interface-<symbol>, which is what the tool searches for."
}
]- A duplicate-check tool that fails open is worse than no tool, because it converts 'I should look' into 'I looked'. This beat ran it, got sixteen clears, and only found the twenty-two prior adjudications by grepping the filesystem afterwards on a hunch.
- How many previous beats acted on a false clear from this tool? Every beat since the interface- convention was adopted has been told to run it before writing, and any duplicate it failed to prevent would look like an ordinary duplicate rather than a tool failure.
- Does the same defect affect `localization-` and `noncoding-`? Both are in PREFIXES and neither is named after a symbol in this corpus, but that has been inferred from the naming convention rather than tested.
- Should the tool exit non-zero when it finds nothing, so that a silent no-match cannot be read as a clear? At present a false clear and a real gap produce the same output and the same exit code.
- E1established confidence 5 of 5: Multiple independent lines of evidence; treated as settled in the field.dataset
Run live 2026-09-24, `python scripts/is-symbol-covered.py AKAP8 PIAS4 KLHL22 CLOCK MED10 HMGN5 JUN RBPJ FOXK2 BTK FMR1 SDCBP BRAF AKT1 EGFR IRF2` prints 'no match under N candidate names' for all sixteen and reports 'covered 0, DECLINED on purpose 0, no match 16'. Five of those sixteen - BRAF, AKT1, EGFR, CD226 (checked separately) and IRF2 - have dedicated entries: interface-menin-braf-v600e-the-only-one-with-an-endogenous-menin-lane, interface-menin-akt1-declined-single-bret-neoppi, interface-menin-egfr-declined-single-bret-neoppi, interface-menin-cd226-declined-proteome-scale-ap-ms and interface-kmt2a-irf2-declined-unverified-the-paper-body-could-not-be-read. The matching logic at line 359 is `if pre + sl in ids`, an exact id equality test.
scripts/is-symbol-covered.py, line 101-102 (PREFIXES) and line 359 (matching), run 2026-09-24 against 2,931 node ids by q160 · this project 2026What this evidence cannot show
The tool was run with default options, so the prose `find_declines` fallback was ACTIVE and still returned nothing for these symbols - the failure is not that a flag was omitted. Only the `interface-` prefix has been demonstrated dead; `localization-` and `noncoding-` are flagged by inspection of the corpus naming convention and were not separately tested. The five named counter-examples were found by grep, not by a systematic audit of all nine prefixes.
Evidence that argues against this (1)
- The tool is not broken for its main purpose. It resolves HGNC aliases, previous symbols and protein names across gene- and protein- ids, and that machinery works - the H3F3A/protein-histone-h3-3 case in its own docstring is a real catch. The defect is confined to entry types whose id names a pair rather than a molecule, which is 69 of 2,931 entries. this project 2026
- E2strong confidence 4 of 5: Replicated in peer-reviewed work by more than one group.dataset
Matching each of this beat's 135 apparent gap symbols as a hyphen-delimited token inside every node id, and as a word inside every node title, finds 30 that are already the subject of an entry. 22 of the 30 have a dedicated interface- entry, 9 from q128-the-menin-interactome-that-is-not-chromatin (AKT1, BRAF, CD226, EGFR, FBXW7, PTEN, SMAD4, SPOP, ZC3HC1) and 13 from q129-the-never-discussed-partners-of-kmt2a-and-psip1 (ABT1, ANOS1, FGFBP1, IRF2, KRR1, OASL, PRKRA, TMCO1, UTP3, GDF5, IGHMBP2, PPP1R13B, TMEM214).
analyses/q160-the-prey-only-interactome/already-decided.py and already-decided.json, generated 2026-09-24 · this project 2026What this evidence cannot show
The 22 with a dedicated interface- entry were confirmed by reading the id, which states the verdict. The other 8 rest on a title-token match and were NOT individually opened: DDX52 matches gene-ddx55 and ING4 matches ana-the-expression-control-splits-the-verdict, which may well be incidental mentions rather than coverage. 22/135 = 16.3% is the defensible figure and 30/135 = 22.2% the generous one.
Evidence that argues against this (1)
- A token match in a title is a weaker test than an id match and produces false hits of its own; this analysis therefore has the mirror-image defect of the tool it criticises, in the false-HIT direction rather than the false-CLEAR direction. Rule 88's scope note records exactly this symmetry for the collisions registry read. this project 2026
30 of the 135 apparent gaps are already the subject of an entry the tool could not see
the King's cost-to-complete ordering splits 96 unwritten partners into 62 discussed and 34 never read; this defect is why a symbol check cannot tell those apart