Halfway Through OSRE'26: CauST Meets Real Tissue
A midterm update โ from a synthetic proof of concept to a held-out-donor benchmark on human cortex
Cortical layers on the held-out donor (slice 151673): manual annotation vs. the HVG baseline vs. CauST-selected genes.Hi again! It’s been almost two months since my intro post about CauST, my OSRE'26 project with UC Santa Cruz OSPO under the mentorship of Lijinghua Zhang. As laid out in my proposal, CauST asks a causal question about spatial transcriptomics: which genes cause a spot to belong to a spatial domain, rather than merely being associated with it through some confounder? The halfway mark is a good time to take stock โ the short version is that the idea now survives contact with real tissue, and the code is public: github.com/land-saas/CauSt.
๐ Achievements
โ An end-to-end pipeline: knockout โ invariance โ selection
The core loop is implemented and tested. CauST trains a frozen spatial backbone per tissue slice, silences each gene in silico, and measures how much the embedding shifts. Genes are then scored by mean effect minus ฮป times the cross-slice standard deviation โ rewarding genes whose effect is large and stable across donors. On a synthetic multi-donor cohort built to embarrass variance-based selection, CauST recovers 8/8 planted causal genes where the highly-variable-genes (HVG) baseline finds 1/8, and clustering on the selected genes hits ARI 1.000 on a held-out donor vs. 0.537 ยฑ 0.133 for HVG at the same gene budget.
โ The same claim on real tissue
The synthetic trap is engineered, so the honest question was whether the story survives real data. CauST now loads the spatialLIBD human DLPFC cohort โ 10x Visium slices of dorsolateral prefrontal cortex with manual cortical-layer annotations, the standard benchmark for spatial domain identification. The setup mirrors the causal claim: genes are selected using two donors (two slices each), and the third donor is evaluated exactly once, after all tuning.
On that never-seen donor, 25 CauST-selected genes reach ARI 0.459 ยฑ 0.069, beating both the HVG baseline at the same budget (0.351 ยฑ 0.034) and the full 2,000-gene candidate pool (0.378 ยฑ 0.026). Selecting 1.25% of the candidate genes improves generalization to a new donor โ exactly the robustness CauST was designed for. The selected set is biologically legible, too: it includes MBP (myelin / white matter), CLU and SPARCL1 (astrocytic genes with laminar expression), and NRGN (neurogranin), alongside metabolic and ribosomal genes whose laminar gradients happen to be donor-stable.

โ Reproducibility as a feature, not an afterthought
Every experiment is config-driven and writes a content-addressed results
directory with the resolved config, metrics, and a provenance manifest (git
commit, package versions, seed, BLAS thread counts, artifact checksums).
caust verify re-runs any recorded run and fails if a number moved; CI proves
two separate processes produce byte-identical artifacts on every push. The
project moved to a uv-managed environment โ one
committed lockfile backs local dev, CI, and a hermetic Docker image โ and the
DLPFC downloads are pinned to SHA-256 checksums, so the inputs of a run are as
fixed as its code. The test suite now sits at 98 tests with ~94% coverage.
โ Making 2,000 knockouts cost seconds
Scoring a knockout per gene naively means a full forward pass per gene. Because the reference backbone is linear after standardization, silencing one gene shifts the embedding by a smoothed rank-1 update โ O(Nยทd) per gene instead of O(NยทGยทd). Scoring the full 2,000-gene candidate pool across five slices takes seconds on a laptop, which is what makes the real-data benchmark (and a five-minute demo of the whole project) practical.
๐ง Challenges
- The first real-data attempt lost. With the settings carried over from the synthetic benchmark (ฮป=2, a 50-gene budget), CauST scored below HVG on the held-out donor. The fix was methodological, not cosmetic: sweep ฮป and the gene budget on the training donors only, and use two slices per training donor so the cross-slice variance in the score is estimated from four slices rather than two. The held-out donor stayed untouched until a single final run.
- Real data is messier than any simulation. R-exported annotation files with shifted headers, duplicate gene symbols, one donor annotated with five layers instead of seven โ each needed an explicit, tested decision in the loader rather than a silent workaround.
- Honesty about markers. Only one of the eight canonical layer markers in the candidate pool makes CauST’s top-25 (HVG keeps two). CauST optimizes cross-donor predictive stability, not agreement with a curated panel โ so the pipeline now reports marker recovery alongside ARI instead of hiding it.
๐ What’s Next
- ๐งฌ Swap the linear reference backbone for a STAGATE-class graph attention autoencoder through the existing model interface, and see whether the CauST-vs-HVG gap widens with a stronger embedding.
- ๐ Scale the evaluation: more DLPFC slices per donor, rotating the held-out donor, and a second tissue/platform to test transfer beyond cortex.
- ๐ A ฮป-sensitivity study and the soft-reweighting variant of gene selection.
- ๐ฆ A tagged release on PyPI plus the final report and blog.
๐งพ Deliverables Progress
| Deliverable | Status |
|---|---|
| Core pipeline (knockout, invariance scoring, selection) | โ Completed |
| Synthetic multi-donor benchmark with HVG baseline | โ Completed |
Reproducibility harness (config-driven runs, caust verify, determinism CI) | โ Completed |
| uv-managed environment, Docker image, 90%+ coverage gate | โ Completed |
| Real-data loader + held-out-donor benchmark (spatialLIBD DLPFC) | โ Completed |
| GNN backbone (STAGATE adapter) | ๐ก In Progress |
| Extended evaluation (more donors, second dataset, ฮป study) | โณ Planned |
| PyPI release, final report and blog | โณ Planned |
๐ Closing Thoughts
The first half of the program turned CauST from a proposal into a working, tested, reproducible package โ and the midterm result I’m happiest about is not a number but a property: every claim above can be re-earned with one command from a fresh clone. Huge thanks to Lijinghua Zhang for steering the evaluation design toward the honest version of every experiment, and to the UC Santa Cruz OSPO and the OSRE program for making this work possible. The repository and its demo walkthrough are open โ stay tuned for the final report!