← CHANGELOG

Two thirds of our network is generic. We deleted it and ran the sweep again.

16 August 2026·7 min read·Onkydra · Faith Ogundimu

Our in-silico knockouts run over a base gene regulatory network that is a union: DMG chromatin accessibility rows unioned with CellOracle's published human promoter network. For a long time we described it as the first half only, which was not an adequate description of it and was live on eighteen surfaces.

Counting the provenance column before it is dropped: 56,637 rows, of which 37,003 come from the promoter network and 19,634 from the DMG chromatin data. So 65.33% of the network is generic and not derived from this disease at all. That raises an obvious question about every ordering we have published off it, and until this month we had an argument about it rather than a measurement.

Three arms, one shared front end

The design deliberately shares one reference dataset, one dimensionality reduction and one imputation across all three arms, so that the pipeline's own run-to-run drift is removed from the arm-to-arm difference instead of added to it. Each arm then refits the network and sweeps all 94 perturbable candidates.

  • union: every row, as served. 56,637 rows.
  • scatac: every promoter row dropped. 19,634 rows.
  • union_repeat: every row again, on byte-identical input. This is the drift control, and it is the arm that makes the comparison mean anything.

The filter drops rows rather than columns, so all three arms see the same 1,095 transcription-factor columns and the same 94 candidates. A target that loses its signal lost its edges, not its column. The whole sweep took 5 hours and 9 minutes.

The ordering survives

arm            rows     OLIG2       FOS      JUNB     OLIG1
union        56,637  -0.27519  -0.23276  -0.17473  -0.16405
union_repeat 56,637  -0.27519  -0.23276  -0.17473  -0.16405
scatac       19,634  -0.26772  -0.25758  -0.17595  -0.16405

The top four are identical in order in all three arms, and 9 of the top 10 are shared between union and scatac. Over the 47 shared targets, Spearman is 0.9803 on magnitude and 0.9878 on the signed value. Quote the magnitude one, since that is the quantity our run comparison ranks, and say which you mean, because the two do not always move together: on a different comparison in the same file the signed correlation is the lower of the two.

Only 1 of the 1,095 transcription-factor columns empties when the promoter rows go. So the generic majority supplies edge density rather than the vocabulary of regulators, and this arm tests whether the ordering depends on the extra edges, not whether it depends on having the regulators at all.

The control arm is the more interesting result, and it is narrow

union_repeat reproduced all 564 compared cells exactly. Spearman 1.0000, mean absolute difference 0, no sign flips. Within this run, then, the difference between arms is attributable to the network, because the only other thing that varied measures at zero.

That is one repeat, in one process, on a shared imputation, with BLAS threading left unpinned. It does not show the pipeline reproducible across machines, and it does not retire our standing observation that two builds of this artefact on the same inputs disagree on individual values. That observation reproduced here, against the served artefact: 239 of 516 cells identical, mean absolute difference 0.003751, 12 sign flips, Spearman 0.9153. Combined with an earlier check showing the simulation step bit-identical on a fixed model, the drift is not in the simulation and not in a same-process refit. It is upstream of the fit or across processes, and this run does not separate those two.

That gives two floors, and they matter in different directions. The cross-machine floor is looser than the arm difference, 0.9153 against 0.9803, so no per-target value delta between the arms may be quoted as a measured effect of removing the promoter rows. The ordering claim clears both floors. The value claims clear only the in-process one.

The two qualifications that travel with it

First, and this is the one that stops the headline reading as progress: FOS gets stronger without the promoter rows, from -0.23276 to -0.25758, while OLIG2 weakens slightly, from -0.27519 to -0.26772. The immediate-early comparator is second in both arms and the gap narrows. Removing the generic half does not make the effect more lineage-specific. It moves it the wrong way, and no specificity claim is supported before or after.

Second, zero is the modal outcome. 26 of 47 targets in the union arm and 26 of 48 in scatac return exactly zero on this readout. A target reading zero in both arms has not been shown to be unaffected by the change; it was zero before and after, which is what most targets do.

This is a sensitivity result. It says whether the ordering depends on the promoter half of the network, and nothing about whether either ordering is correct. Neither arm has been compared against a measured outcome. The score is an uncalibrated ordering signal and not a probability.

Making the qualification unskippable

A headline that survives and a qualification that reverses its meaning will not stay together on their own. The guard for this result fails the build if any listed surface states the ordering claim without naming FOS, and it server-renders the workspace page and requires the full text of every qualification in the markup.

The weaker version of that check was written first and measured not to work: asking whether the page contained the string FOS passed even with the entire qualification block deleted, because the effect table elsewhere on the same page names FOS anyway. A guard you have not tried to defeat is a guard you have not tested.

Reproduce with ./co-env/bin/python3 backend/services/celloracle/base_grn_sensitivity.py, reduce with npx tsx backend/scripts/analyse-base-grn-sensitivity.ts, and check the qualifications with npx tsx backend/scripts/smoke-base-grn-sensitivity.ts. The reduced result is backend/data/registry/base-grn-sensitivity.json. The raw sweep carries per-marker atoms for three arms and is too large to check in.