Erbgut

Erbgut

Measure the rule. Keep what pays.

In one picture

Any file becomes DNA

Why DNA

DNA is dense and durable

~215PB per gram
1 gram of DNA
~10,000 20 TB hard drives
500+years
SSD
~5 yr
HDD
~8 yr
Tape
~20 yr
DNA
500+ yr

Where that matters

Cold archives

Scientific & genomic records

Compliance records

Disaster-resilient backups

The problem, today

One bad strand is enough

The problem

Rules chosen once, applied to every channel

The rulebook every pipeline copies

×No run of more than 3 identical letters
GCGC content between 40 and 60%
+30%Extra strands, on every channel, just in case

Nanopore

Many insertions and deletions, especially in runs of the same letter

Same rulebookrun 3, GC 40 to 60%, +30%

Illumina

Few errors, mostly single wrong letters

Same rulebookrun 3, GC 40 to 60%, +30%

Real blind spots

Nanopore is error-prone.

substitutions
deletions
insertions

Where the rules come in

The rules give a verdict. The model gives a number.

One diagram

What we actually built

Head to head their model, our clusters, our protocol

Two points off the state of the art

Two points off the state of the art, at a 48th of the size: 88.4 against 90.4 at six reads, 0.8M parameters against 38.5M

Our actual claim

The question nobody else answers

TReconLM, DNAformer, BBS, Trellis BMA, ITR
Given noisy reads, recover the strand
Erbgut, per channel, at a fixed recovery target
Given a channel, does this rule pay for what it costs?
Each standard rule earns its place on exactly one of our two channels

The firewall

Every number is checked on a channel we never tune on

Results

What the audit measured

Measure the rule. Keep what pays.
Each standard rule earns its place on exactly one of our two channels. Now it is measured, not assumed.
HackMIT 2026 github.com/timarnoldev/hackmit2026

Appendix A0

The channel simulator, step by step

What happens to each strand

1
Survives at all? Dropout, higher for unbalanced GC and long storage.
2
How many reads? Negative binomial around the read budget, so some strands get very few.
3
Shared errors Drawn once per strand and position, the same for every read. More reads can't average them away.
4
Each read A read quality factor, optional malformed reads, then each base is deleted, preceded by an insertion, substituted, or copied.

About 250,000 reads per second on a laptop. The same seed always gives the same reads.

p(error at i) = base rate × run multiplier deletions grow with run length × position ramp worse toward the end × context factor 5 letters centered on i × shared factor per strand and position × read quality per read

Fit on real train reads

nanopore_budget, fit on Microsoft train reads: substitutions 1.52%, insertions 1.89%, deletions 2.20% per base, end of strand 1.2 times the start.

illumina_standard, fit on DNAformer Illumina train reads. Errors there are about 100 times rarer and show no context effect worth a table.

Simulator B builds the same channel from different mechanisms (bursty errors, damaged segments, a context table fit on DNAformer) and is never used for optimization.

Appendix A1

Exactly two learned models

Learned polisher

Question
Which letters of the baseline's draft are still wrong?
Input
The draft and its vote columns, 17 features per position
Output
Per position: keep, substitute, or delete, plus insert a letter in the gap in front

Dilated 1D CNN, 8 residual blocks, about 0.8M parameters. The classic baseline aligns the reads and votes the draft; the polisher corrects it, like a Nanopore assembly polisher. It keeps as many insertions as deletions, so the strand length always comes out right.

ReadsBaselinePolished
441.0%56.8%
667.0%82.5%
1690.0%95.1%

Exact strands on real held-out Nanopore clusters. 4.7% of strands stay unrecoverable even with all 27 reads.

Risk model

Question
How likely is this strand to be decoded wrongly on this channel?
Input
Candidate strands
Output
One number in [0, 1] per strand: the predicted failure rate

1D CNN over the letters. Labels: each training strand is simulated 32 times at the channel's read budget and decoded by the frozen decoder chain. Label = the fraction decoded wrongly.

Specific to one channel, one read budget and one decoder. Ranking on real held-out reads:

Appendix A2

Everything heavy runs on one ASUS Ascent GX10

The machine

  • NVIDIA GB10, ARM64
  • 128 GB unified memory
  • 20 CPU cores

One script runs the loops, then the experiments and the decoder benchmark, one after the other.

The code: about 11,000 lines of Python, about 2,500 of them tests.

What it runs

  • Polisher training. Vote features from simulated and real train clusters, weighted toward low coverage, adapted per channel.
  • Risk labels. Every training strand simulated 32 times at the read budget and decoded.
  • Recovery trials. 300 held-out trials of the 20 KB file per final codec, spread across the 20 cores.
  • The loop and the evidence. Rule audit, ablation ladder, crossover matrix, firewall.

Appendix A3

Questions we expect

You have no wet lab. How do you know it's real?

We don't synthesize or sequence anything. The simulator matches real held-out reads within about 3 points at every read count. Every gain must survive Simulator B, and the risk model's ranking is checked on real reads:

Isn't this just DNA Fountain?

The encoder is DNA Fountain style on purpose. We change how it's configured: which rules, how much redundancy, which candidate to keep, per channel. We don't claim a better encoder.

What if the hand rules are already optimal?

Then the tool says so, with measurements, and that's useful. The audit is a measurement, not a bet against the rules.

Isn't the improvement just your learned decoder?

No. The default, system B, already uses the same decoder chain. B to C isolates the rule audit, C to D learned selection. A to B is the polisher, and we report that separately. Both tiers also work with plain majority vote.

Appendix A4

Questions we expect

Couldn't you buy accuracy with more redundancy?

That's what we rule out. Codecs are judged on the Pareto front of bits per base against reads per strand, at a fixed recovery target.

How is this different from DNAformer or adaptive constrained coding?

Those optimize the decoder, the constraints or the redundancy on their own. We close the loop: the decoder's failures on a channel decide what the encoder avoids, measured against a fixed target.

Why not learn the encoder end to end?

Insertions and deletions are hard to differentiate through, and storage needs every bit back. The Fountain code guarantees exact recovery; learning only picks which candidates to use.

What has the risk model actually learned?

The first version rediscovered the run-length rule, and its real-read ranking was weak. So we measured real context errors and put them into the simulator.

Appendix A5

Questions we expect

The Microsoft dataset has known issues. Does that matter?

Yes, and we handle it. Its references aren't uniformly random, so we use it for calibration and benchmarks, never to learn risky motifs. Simulator B uses a context table fit on DNAformer.

Does the polisher beat the baseline?

On real held-out clusters, exact strands go from 41.0% to 56.8% at 4 reads, 67.0% to 82.5% at 6 reads and 90.0% to 95.1% at 16 reads. The room is at low coverage, where reading is cheap. Both claim tiers compare codecs with the same decoder, so they hold either way.

What would a real user do with this?

Describe their channel as a profile, calibrate it on a sample of their own reads, and let the tool say which rules and how much redundancy to use. Cost figures use placeholder prices.

What did the GX10 do?

Decoder training, risk labels (each strand simulated 32 times and decoded), and 300 held-out recovery trials per final codec, spread across its 20 cores. See A3.

Appendix A6

What the model learned, and we did not teach it

Appendix A7

The two models