A gene therapy has to switch its cargo on in the right cell type and leave every other one alone, and the part of the DNA that decides this is the promoter. Pick the wrong one and the gene is expressed in the wrong tissue. This project uses an expression model to find promoters that are ON in a chosen cell type and OFF in another, and to design new ones where the genome has nothing good enough: 19,987 protein-coding promoters ranked genome-wide across the 11 cell-type descriptions we have measured end to end1, and 64 designed sequences selected from 832 recorded candidates. Every entry carries the window it was measured in, its noise floor and its verdict.
Research use only. Not for clinical, diagnostic or therapeutic use, and nothing here has been measured in a wet lab. Read the limitations.
Each of the 64 shipped designs travels with the margin, the floor, the verdict and the window it was measured in; so does every natural promoter in the other tree.
Downloads: natural candidates (TSV) · every design candidate with its six checks (TSV) · designs (FASTA) · admitted context strings (JSON) · natural release manifest (JSON) · designed release manifest, including the limitations block (JSON) · not-shipped pairs, with their per-candidate measurements (JSON) · synthesis handoff files (FASTA, order CSV, README). Every file is schema-validated and checksummed.
The model takes a DNA sequence and a free-text description of an experiment, and predicts how strongly a gene at that sequence would be expressed under those conditions. Score one promoter twice — once with the target cell type described, once with the off-target cell type described — and the difference between the two answers is a prediction of selectivity. That difference is the margin.
One sequence, two questions
The strings are quoted, not written. Each one is a row of the model’s own training metadata, reproduced byte for byte — including the places where a string contradicts itself. Those contradictions are kept on purpose and must not be corrected: editing one to make it internally consistent moves predictions by several log units and collapses the model toward a population average that still looks plausible. Every record in both databases carries both of its strings verbatim, so any number here can be re-asked exactly as it was asked. The natural release publishes its context strings with complete SHA-256 digests, and the designed release the same with their measured paraphrase floors.
The answer also depends on where the sequence is placed. Scaffold choice is the largest confound in the design work, which is why every margin on this site is quoted with its window named.
The window decides the answer
The same 600 bp ALB promoter, the same hepatocyte context string, the same checkpoint — dropped into two different quiet genomic windows. Grey bar: that window’s entire OFF-arm dynamic range across every insert tested in it.
The pipeline does two different jobs, in this order. First it searches the genome: every human protein-coding promoter is scored under the target cell type and again under the off-target cell type, and the ones with the widest gap between the two are shortlisted. That is 19,987 promoters under each of the 11 cell-type descriptions we have measured end to end, which yields all 110 ordered on/off combinations of them from a single stored matrix — asking for a new pair costs 0 further model calls, because the ranking is arithmetic over numbers we already have.
Then, where the genome has nothing good enough, it builds one. A genetic algorithm starts from the best natural promoters that search found, cuts and recombines them, and keeps whatever widens the gap — the same evolutionary loop used to breed anything else, with the expression model standing in for the environment that decides who survives. What comes out is a 600 bp sequence that exists in no genome.
Five stages, then. Each links to the published record it produced, so the scale beside a stage is checkable against the data behind it; the machine-readable files are in the downloads above.
What each release was built from — assembly, annotation and MANE releases, model revision, checkpoint, unit and endpoint — is stated on its own page: the natural release · the designed release.
Design here is breeding, not writing. The algorithm never invents a sequence from nothing: it starts from real promoters that already work in the target cell, makes a generation of variants by cutting and recombining them, scores every variant in both cell types, keeps the ones with the widest ON-minus-OFF gap, and repeats. The parent population is called the seeds; one round is a generation. The implementation is gena_expression.optimization.core.SequenceOptimizer, subclassed for this project.
The first population is 25 real human promoters — the best natural candidates the screen found for this pair, each already measured in this window — plus 39 mutated copies of them to fill the 64 slots. Nothing is invented from scratch. For the cardiac pair the strongest starting promoter is TNNT2, at a margin of 4.6801 in the FAM47C window; that number is what every later design has to beat.
Each child is made by 20 edits that swap, duplicate, revcomp whole blocks of 100–200 bp, with a crossover probability of 0.6 between two parents, and total length held constant. The reason is the model, not biology: it reads DNA in multi-base tokens, so a one-letter change is usually swallowed inside a token and the model returns the same answer. The unit of design is a module — an enhancer block, a core promoter, an array of transcription-factor sites. Measured, in this project: DNA is tokenized at ~6.25 bp/token, so a 9,198 bp window is ~1,400-1,500 tokens against ~1,022 usable slots.
Every candidate is rebuilt into the genomic window and scored twice: once under the ON-cell context string, once under the OFF-cell string. Fitness is the difference — the margin. Two rules keep that honest. The off-target arm is aggregated by max, not by an average, because selectivity is a worst-case property; and a candidate whose ON score falls below a floor of 0.0554 — derived from control promoters scored in this same window before any design existed — is penalised, so the margin cannot be won by being quiet in both cells.
64 children per generation, the top 64 survive, 1 elite carried through untouched, for a budget of 40 generations. The run is deterministic given its seed (20260804) and every prediction is cached, so it replays exactly. This one cost 5,207 model calls and 868 seconds.
releases/generated/pairs/*.json.Cardiac run, as configured: population 64 · offspring 64 · generation budget 40 · seeds 25 measured + 39 mutated top-ups · mutations per child 20 · block size 100–200 bp · selection top_k with 1 elite · designed region 600 bp inside a 9,198 bp window.
It did not converge, and no run in this project has. The cardiac run stopped because it ran out of generations (generation_budget_exhausted), not because it stopped improving: the last improvement came at generation 12 of 40, and the plateau rule that would have ended it early — no gain of 0.80 for 30 generations — never fired. In the run’s own words: The run hit its generation budget without plateauing, so it had not converged and a longer run may still improve. Read the shipped designs as the best of a budget, not as the best available.
A 600 bp design cannot be scored on its own. It is dropped into a real genomic window — the scaffold — replacing that gene’s own proximal promoter, and the whole window is scored. The scaffold is not neutral, and it is the largest confound in this half of the project: as the figure above shows, the identical albumin promoter reads as silent in one window and as one of the loudest sequences in the genome in another. Five genomic environments were tried, and four of the five are refusals published with their measurements.
The clearest of those refusals is the one that looked like a success. Re-running both shipped pairs in a safe-harbour integration site raised every raw margin — and lowered the design-over-nature ratio in both, because the window lifted the natural promoters more than it lifted the designs (cardiac 1.351× in FAM47C → 1.168× there; skeletal 2.308× → 1.256×). It was rejected as a design environment and kept as a control panel. This is why the ratio, and never the raw margin, is the number quoted as a headline: a raw margin is a property of the window; a ratio against the best natural promoter measured in that same window is a property of the design. A further 64 candidates were evolved inside a plasmid cassette, which is out of distribution for this model; they are published segregated and never tabulated beside a genomic-window number.
Designs against the best nature could do in the same window
Every mark on each axis was measured in that pair’s own run: the designs, the natural promoter they are compared with, the field-standard controls, the reportable floor and the composition-matched random DNA. Hover any tick for its full construct label and verdict.
A1 — Ventricular cardiomyocyte ON / Hepatocyte (liver parenchymal cell) OFF, every mark measured in FAM47C
Design-over-nature 1.351× — the best design’s margin over the best natural promoter’s, both measured in FAM47C, in the same run, under the same two verbatim context strings. One tick per control promoter, using its 600 bp genomic window where one exists, so it is compared with a 600 bp design like for like; every construct route is on the /designed page.
A2 — Skeletal muscle myofiber ON / Hepatocyte (liver parenchymal cell) OFF, every mark measured in FAM47C
Design-over-nature 2.308× — the best design’s margin over the best natural promoter’s, both measured in FAM47C, in the same run, under the same two verbatim context strings. One tick per control promoter, using its 600 bp genomic window where one exists, so it is compared with a 600 bp design like for like; every construct route is on the /designed page.
releases/generated/pairs/*.json.A candidate is not shipped because it scored well. Six checks run on every candidate, in order, all of them fixed before any design was scored — and since August they are recorded rather than enforced: every candidate is published with which checks it meets and by how much, so a reader can disagree with a threshold and re-select without re-running anything. The ladder below is the shipped cardiac run.
One check does nearly all the work. S4 — the off-arm check — is the only one that removes candidates on quality here: it asks whether a design is louder in the off-target cell than this run’s own random, composition-matched DNA is, and the run’s own negatives set that bar at -0.0091. S5 is not a quality judgement at all — it drops designs that are near-duplicates of ones already selected, which is what caps this run at 17. S6 then reports the shortfall against the target of 50 rather than making it up. Three different counts come out of the pipeline and they are not interchangeable: 832 recorded, 402 clearing the rule across every run, 64 shipped from the two pairs that produced something.
The same pipeline is reachable from an agent session. Three questions, asked in plain language — one it can answer instantly, one it can only answer with a warning attached, and one it refuses.
Three words recur in the answers, and they are what turn a score into a claim. The margin is the ON-cell score minus the OFF-cell score. The floor is how large a margin has to be before it means anything at all in that cell type and at that magnitude — measured, by re-asking the same question in paraphrased wording and seeing how much the answer moves on its own. The verdict compares the two: reportable above the floor, provisional_within_noise beneath it, and not_a_finding below that, published as such rather than quietly dropped.
“Rank promoters that are on in Ventricular cardiomyocyte and off in Primary hepatocyte.” MYL2 7.9666, TTN 7.7686, TNNI3 7.4360 — every one measured in its own native_tss_window, graded against a floor of 1.85 at that magnitude, verdict reportable. No row is ever returned without its window, its floor and its verdict. The answer is immediate because this ranking is a published artifact — all 110 ordered pairs already exist — so it is being read, not recomputed.
Name a cell type that is not one of the admitted contexts and the pipeline still answers, ranked — but first it grades the string it is about to send, on four measurements: the swap test, a paraphrase floor, a prep-metadata probe and the candidate-over-nonsense margin on marker genes. That grade comes back with the answer, and it can never say the context was admitted, because admission is a longer offline procedure. At the lowest grade every margin is reported as not a finding, because a floor means nothing for a context the model cannot see.
A5 (CNS neuron ON / Astrocyte OFF) generated 64 designs, ran to completion, and beat the best natural promoter in its own window 1.943× — every reason to say yes. 0 shipped. Re-scored into the scaffold of record the ordering does not survive: margin rank Spearman 0.0724, and the best design in one scaffold is not the best design in the other. The margin was a property of the Keppel19_minus integration coordinate, not of the designs. A5 is not validated and may never be described as such.
releases/generated/not_shipped.json.Every refusal on this site is reproducible from the files linked beside it — each question above names the artifact it was read from, and the third is written up under what was attempted and not shipped on the designed release page. The per-candidate measurements behind it are in the not-shipped pairs file, linked in the downloads above.
Measured laboratory evidence, produced by other people with no model in the chain, tracks our ranking of natural promoters. There is no corroboration of any kind for the designs: every cross-model gate built to obtain some has failed, and measured evidence gives a sequence nobody has synthesised nothing at all.
A measurement nobody made for us, tracking our ranking
All 19,987 ranked genes split into ten bins by OUR margin (18,114 of them carry a CAGE measurement). Vertical axis: the median FANTOM5 CAGE log2(on-target − off-target) in that bin. No model is involved in the vertical axis.
The check that could have falsified us — lower is better
Share of our top liver-OFF candidates whose window contains an element another laboratory measured as active in HepG2, against the background share across every gene window with a measurement. We claim these promoters are quiet in liver, so a bar to the LEFT of the red line is the good outcome.
Every cross-model gate we built, and what it did
Each was pre-registered with its pass criterion fixed in code before anything was scored. The third column states that criterion; the fourth states the outcome against it.
| gate | date | what would have made it pass | outcome | failure type | what changed |
|---|---|---|---|---|---|
| Borzoi positive-control gate | 2026-08-01 | All three negative controls stay flat AND every named positive marker separates its own cell type in the right direction, by more than its own measured null band. | FAIL | cell-type coverage — the track exists and is mislabelled for the biology, not for the metadata | A cardiac arm and a neuronal arm were withdrawn from this model; no candidate of ours was ever scored against it. This was the second run — the first failed too, and its remediation was applied in full before the re-run. |
| h1_housekeeping=pass, n1_scrambled=pass, n2_gene_desert=pass, n3_wrong_strand=pass, p1_direction=FAIL, p2_magnitude=FAIL, p3_ALB_rank=pass | |||||
| Malinois MPRA reporter gate | 2026-08-04 | Liver markers rank above non-liver housekeeping genes, AND the seed promoters beat their own dinucleotide shuffles at AUROC ≥ 0.70. | FAIL | composition confound — the readout tracked GC content, and the negatives preserved GC exactly | No design was scored, so there is no correlation with our margins and no design distribution to quote. |
| observed AUROC 0.6408 against a floor of 0.70 | |||||
| Liver-arm gate — 3 independent arms | 2026-08-05 | Every hepatocyte marker outranks every non-hepatocyte liver marker, in each arm separately. | FAIL on all 3 arms | the same failure in all three — a sinusoidal-endothelium marker outranking hepatocyte markers, across different assays, corpora, labs and architectures | Cross-model validation is halted. Independent corroboration on this site comes from measured laboratory data instead, and it covers the natural promoters only. |
| arms: borzoi__hepatocyte_cage, borzoi__hepatocyte_rna, malinois__hepg2 — failing assertions: malinois·L2_liver_positives_beat_gc_matched_random; malinois·L4_marker_panel_that_catches_a_pooled_track; borzoi·borzoi__hepatocyte_rna::L4_marker_panel_that_catches_a_pooled_track; borzoi·borzoi__hepatocyte_cage::L4_marker_panel_that_catches_a_pooled_track | |||||
| The contrast — the one threshold change in this project’s history | 2026-08-06 | Not a gate. A reporting threshold was made stricter, and the question was what it would move. | moved nothing | — | No reportable verdict moves anywhere — verified over all 170 published records |
Memorisation, measured
The model was trained on essentially every gene’s TSS window paired with its measured expression, so a natural promoter’s high rank is partly recall. Re-ranking only the 4,053 held-out genes, with no score changed, asks how much.
releases/natural/recall_check.json.Two databases ship, and they are never merged into one ranking. The reason is that a rank means a different thing in each: the model was trained on essentially every gene’s promoter, so a natural promoter’s rank is partly recall of its own training data, while a designed sequence exists in no genome and cannot be recalled at all. Pooling them would put those two kinds of rank in one column.
Each is strong exactly where the other is weak. One quantity is allowed to cross between them — a design’s margin against the best natural promoter measured in the same window — and it has its own comparison view. No table on this site puts rows from the two releases in one ranking.
All 64 designs are 600 bp, inside every vendor's published composition limits, and screened against the design rules the synthesis vendors publish. 0 of 64 trip a hard vendor rule — and 0 of 64 are clean. Every single one carries at least one advisory.
The dominant one is ours: 64 of 64 carry a direct or inverted repeat at or above the length vendors ask you to avoid. That is the design method's own fingerprint — it builds a sequence by swapping, duplicating and reverse-complementing 100–200 bp blocks, which manufactures repeats — and the fix belongs in the next run rather than in a filter over this one.
Nothing here has been synthesised. "Order-ready" means a vendor's intake would accept the file, and nothing more; it does not mean validated. The synthesis handoff files (FASTA, order CSV, README) carry the submittable FASTA, a CSV with every check beside every construct, and a schema-validated sidecar.
We are looking for groups who will test one of these in a cell — not adopt it. The offer is a design hypothesis with its whole provenance attached: both context strings verbatim, the controls from the same run, the noise floor, the window it was measured in, the sequence and its checksum, and an ordered file a vendor would accept. If it fails at the bench, that is a result we want, and it is the only kind of evidence that moves the designs from prediction to fact.
To start by trying to break it, start with the limitations above — what this is, and what it is not — and then read the limitations of the designed release, which carry every one of them with the measurement behind it.
1. The 11 contexts behind this database are the ones whose paraphrase noise floor we measured and whose marker controls we ran, and that measurement is what lets a number here be graded. The model itself is not restricted to them — it reads the cell type as free text and this pipeline will take one in your own words, with a measured grade on the exact string sent, which can be low enough to void every verdict in that answer (what this is, and what it is not). Back