Richard asked for three things after yesterday’s bridge editor shipped: fix the zero-padding bug at its source, file an audit of every connector against what we know now, and review the whole unbridged worklist for federation candidates, writing down why each pair that stays out stays out.

The padding fix was one line: _ZERO_PAD_WIDTH re-padded HPO and nothing else. Its unit test was the more instructive part. It asserted primekg_curie("MONDO", "5148") == "MONDO:5148", so the test held the bug in place. On prod, 14,504 MONDO, 10,222 UBERON and 33,778 GO entities from PrimeKG have a padded twin from another source. The change pads all four. I proved the new tests could fail by restoring the old table in-process, which failed exactly the 11 new assertions. My first try at that sabotage was a sed plus a git checkout of the file. The guard hook refused the whole command before any of it ran, and it was right to: the file held my uncommitted fix. The fix rewrites no stored row, and that is deliberate. kgia_schema_v2.json, the PRS disease axis, keys 98 of its 109 anchors on today’s unpadded ids, and so does every foundation’s ent2id. Re-keying the store is a decision about when, not a cleanup.

Then a prefix census of every entity on prod, checked against Biolink 4.4.2’s prefix map. Yesterday’s comment on #438 took the code’s word that HPO was handled, and my twin query agreed. It found no short ids under HP:, because PrimeKG’s are stored under HPO:. The store still holds HPO:1, NCBI: and DrugBank:, 14,841 of the HPO ones with a padded HP: twin, because #53’s re-backfill never ran. The code has been right since #53; the data never followed it. The census also found that REACTOME: should be REACT:, and that ClinVar writes MEDGEN: and Orphanet: where Biolink spells them in lower case. The synthetic breakdown had something worse than spelling. The OncoKB connector stores each drug’s NCIt code in metadata and then passes curie_hint=None. CIViC’s gene features get no hint although the connector’s own variant index reads an Entrez id. Real identifiers are being thrown away and replaced with synthetic ones. That is all in the audit (#706).

The worklist review held the finding that matters most. CIViC keeps the evidence direction, Supports or Does Not Support, only in a row’s JSON and never in its predicate. So 565 rows that are evidence against sensitivity or resistance sit in the approved bridges for those claims: 11.6% of CIViC’s rows in them. For variant→disease evidence it drops the significance too, so one Prognostic predicate holds both poor and better outcome. One inverted row is on the patient’s own driver mutation, in her own cancer type. Bridges cannot repair that. The connector has to put CIViC’s own fields into the predicate (#707).

For the candidates I tested meaning against data. If two predicates mean the same thing, they should share pairs. 48% of PrimeKG’s drug→side-effect pairs are also GP-KG’s, since both trace back to SIDER. 60% of GP-KG’s GTEx expression pairs are also PrimeKG’s Bgee pairs. CIViC and ClinVar oncogenicity share one pair, because one source’s diseases are DOID and the other’s are MONDO. Seven proposals and a reason for every other pair went to Richard as #709. One near-slip there. My working numbers came from two queries taken minutes apart, while another session was writing to the same tables: the domain profile said 620 ClinVar pathogenic rows, and --check said 598. I re-counted every pair in a single read before filing, and the issue uses that.