Research

Papers, packages,
and one correction.

Four records on Zenodo, three packages a reader can run, the causal method they share — and a plain account of the platform whose figures I withdrew, audited myself, and have since re-measured.

01 — Papers

Four records.

All four are under revision and the corrected records are in preparation. Each one states, on its own page, exactly which claims the audit withdrew and which stand.

Zenodo (v1) · Mar 2026

Rule-based biological intelligence layers that distinguish disease drivers from symptom markers in computational target identification: a disease-type-aware target classifier with curated blocklists across nine gene families, a tissue expression filter over the Human Protein Atlas, and a known-target validator. The layers reclassify GABRD as a symptom marker in malaria, and block TNF and IL-6 in infectious contexts while preserving them for autoimmune disease.

Revision status in full

Zenodo (v1) · Source-available on GitHub · Mar 2026

A pipeline for drug-target identification over integrated biomedical knowledge graphs, combining a SMILES BiGRU VAE (4.1M params), hierarchical reinforcement learning (UCB1 + CEM) and AutoDock Vina docking. The identification step has since been rewritten and published separately as CausalPhylo.

Revision status in full
02 — Research software

Packages, not blog posts.

An install line appears only where the package is actually published. Where it is not, the repository and the command that reproduces the paper stand in its place — a fictional install line fails in front of precisely the reader who tries it.

Research Software · 2026

A published Python library implementing Pearl's backdoor criterion over knowledge graphs, separating edges that can carry a causal claim from those asserting only co-occurrence. Single dependency, typed, documented, on PyPI.

Install
pip install causalphylo

causalphylo 0.1.0 on PyPI since 2026-10-17. One dependency, networkx>=3.3. Correctness verified on the four cases that separate a right implementation from a wrong one: confounder recovered, collider not adjusted for, mediator not adjusted for, trivial case identified.

Licence — LicenseRef-CausalPhylo-NonCommercial, source-available, not open source

SAWA

Active

Bioinformatics

Antiretroviral-resistance surveillance for sub-Saharan Africa: version-pinned HIVdb Sierra resistance calls, HXB2 K03455 alignment, per-subtype phylogenies and transmission clustering, with every figure emitted from a notebook. No clinical claims.

Reproduce the paper
docker compose up && make paper1

Alignment via mappy at ~700 seq/s; a ~25k-sequence East Africa cohort aligns in under a minute on a laptop. Transmission clusters via tn93 at the 0.015 convention, with parity against HIV-TRACE on simulated ground truth. Benchmarks checked into git and refreshed weekly by CI.

Licence — MIT

ligase

Active

Research Software · 2026

Reads biological dimensions (organism, reference build, coordinate system, sample order, identifier namespace) out of the files, propagates them, and type-checks every edge when the graph is built, before a step runs. A GRCh37 reference meeting a GRCh38 alignment is a DimensionError, not a plausible wrong number.

Install
pip install ligase-bio

ligase-bio v0.4.0 on PyPI, 4 releases, released 2026-10-30. Rust core with Python bindings via PyO3. Consumed by both SAWA and NeoRx.

Licence — MIT OR Apache-2.0

03 — Methodology

Identification before estimation.

The same method runs under both halves of the work. It is worth stating plainly, because it is the step most pipelines assume rather than prove.

CausalPhylo — do-calculus over a knowledge graph

A biomedical knowledge graph gives you edges. Most of them assert co-occurrence, not cause, and an estimator applied to the wrong edge returns a plausible number with nothing behind it. CausalPhylo applies Pearl's backdoor criterion to the graph first and sorts each candidate into one of three outcomes: identifiable with no adjustment, identifiable given an adjustment set the library hands back, or not identifiable at all — which is a refusal rather than a zero, and is reported as one.

Correctness is checked on the four cases that separate a right implementation from a wrong one: a confounder recovered, a collider left alone, a mediator left alone, and the trivial case identified. DoWhy takes over for estimation once identification is settled. Isolating identification as its own library was the point — it is the stage where a pipeline quietly assumes what it should prove, and the stage whose defects forced the correction below.

SAWA — reproducibility as a property of the repository

Resistance calls are pinned to a specific release of the reference database rather than to whatever it served that week. Alignment is to a fixed reference sequence. Transmission clustering is checked for parity against an established tool on simulated ground truth, where the answer is known in advance. Every figure in the paper is emitted from a notebook that runs in one command, so a reviewer regenerates the figures instead of taking them on trust.

Typed dimensions come from ligase: organism, reference build, coordinate system, sample order and identifier namespace are read out of the files and checked when the pipeline is built, before a step runs. A mismatched reference build is an error, not a plausible wrong number. These are research tools; no clinical claims are made for any of them.

04 — Revision status

What I withdrew, and what came after.

This is the part I would want to read first if I were assessing the work, so it is stated here rather than filed somewhere quieter.

I built a drug-target identification platform, audited it myself, and found that the stage deciding whether a causal claim was licensed at all did not hold. I withdrew every quantitative result that depended on it. The benchmark run behind the original numbers had persisted nothing, so there was not even an artifact left to re-examine — which is why the replacement writes a checksummed record for every run.

Re-measured, over four diseases

The identification step is now CausalPhylo, two validator defects are fixed, and the benchmark has been re-run over the four diseases whose baseline comparison is methodologically sound. The figures below are computed from one run whose record is flagged citable, pinned to a commit and checksummed against its rows.

They correct nothing: the withdrawn figures covered a wider set of diseases and the two are not comparable. The Zenodo records still show the old numbers until the correction notices are posted, which is why the four-disease scope is stated on every figure here.

0.667
Lung cancer F₁ (grade B), against a 0.519 correlation-only baseline — six true positives, among them EGFR, KRAS, BRAF and TP53
0.4245
Mean F₁ across all four diseases, beating a correlation-only baseline on three of the four
0.381
Breast cancer F₁ — below its 0.385 baseline, the one of the four that does not beat it
0.364
Alzheimer's F₁, against 0.240 — reproducible, but scored against a target list under revision: its two true positives are APP and PSEN1, and PSEN1 inhibition harmed patients in trials
0.286
Type 2 diabetes F₁, against 0.231 — its identification stage adjusted nothing, so the score describes graph coverage rather than biology

Type 2 diabetes stays in the mean and out of the argument. Its identification stage adjusted nothing — every candidate came back trivially identifiable — so the score there describes how well the graph covers the disease rather than anything biological. Setting the weakest case aside in the narrative is a judgement I will defend; dropping it from the aggregate would flatter the result, so it stays in the number.