v0.6.1
[0.6.1] - 2026-08-07
Design gets one verb: tt-bio design INPUT --model boltzgen|rfd3, mirroring tt-bio predict --model .... tt-bio gen still works unchanged and is now a hidden deprecated alias for
tt-bio design --model boltzgen. ESMC-300M/600M single-sequence embedding is trace-captured,
and RFD3 multi-card design no longer strangles itself on host threads: four cards aggregated
0.68x of a single card before, 3.48x after. --devices N is honoured on the single-card embed
and RFD3 design paths, where it had been ignored, and predict now says so out loud when a run
finishes on fewer cards than you asked for instead of quietly returning a slower result.
This release also merges back the v0.6.0 release commits, which were tagged but never landed on
main. For five days main reported version 0.5.0, shipped no 0.6.0 changelog entry, and
carried a tests/ file that aborted pytest collection so the host suite never ran.
Changed
- Unified design CLI —
tt-bio design INPUT --model boltzgen|rfd3is now the single design
command, mirroringtt-bio predict --model .... BoltzGen pipeline options (--steps,
--config STEP key=val,--num_designs,--budget,--devices,--out_dir) moved onto the
shared command as boltzgen-scoped flags (boltzgenis the default model, so existing
single-model invocations need only swap the verb). The RFD3 checkpoint flag is renamed
--golden_dirto--checkpoint, with the old spelling kept as a hidden deprecated alias for
one release. The RFD3 engine modules moved from flattt_bio/rfd3*.pyfiles into a
self-containedtt_bio/rfd3/package mirroringtt_bio/boltzgen/;import tt_bio.rfd3
resolves to the package. Numerics are bit-identical: this is a CLI, layout and docs change
only. BoltzGen user documentation moved from the README todocs/boltzgen-design.md, and the
README now has one Design section covering both models. (26cf293a) fa77e884predict: warn loudly when a run completes on fewer cards than requested, rather
than silently returning the slower result.7bee7292embed andef0265efrfd3: honour--devices Non the single-card path.
Deprecated
tt-bio gen— hidden from--helpand prints a deprecation warning on stderr, then
forwards every argument to BoltzGen unchanged. It still works; it will be removed in a future
release. Usett-bio design INPUT --model boltzgeninstead (gen run X --output outbecomes
design X --model boltzgen --out_dir out).
Fixed
280de387tenstorrent: restore the bf16 construction defaults in fast mode. This was the root
cause of ESMFold2 returning NaN confidence.a657a636boltz2: use one sample-chunk width for the whole diffusion trajectory and pad the
short tail. Chunk width is not bit-inert, so a trajectory that changed width partway changed
its own numbers.46b641e3protenix:--tracewas a silent no-op for--model protenix-v2; the predict
worker now forwards it.c7313862worker: self-terminate when the spawning dispatcher dies, instead of outliving it
and holding a card.69649a0estderr filter: kill the nanobind-filter grandchild together with its parent.13107362find_mmseqs: pair mmseqs with thecolabfold_searchactually in use.176fc85bembed: clean up the co-location nonce on failure, and stop accepting a missing
shared file.
Performance
3bb206e7,11cbb13aESMC-300M/600M: the single-sequence embed forward is captured as a ttnn
trace, and the trace region is guaranteed at fleet load time. Measured 1.47x host-relative and
bit-exact (2584548d).75fe28b3rfd3: cap host thread pools in the design fan-out. Four co-resident single-card
designs aggregated 0.68x before the fix and 3.48x after, the same thread-oversubscription
class that--host_threadsaddressed for folds in 0.6.0.67786544,78e1ebecembed: pin single-card visibility before the ttnn import, and raise the
parallel npz writers to 32 threads.719807ef,114f4b4dembed: co-located workers hand back result paths instead of pushing
base64 through the controller.
Gates and documentation
cd891272parity gate: pin the in-process harness legs to one card instead of the whole mesh.81128ae7parity gate: derive worker locality from the real hostname.$HOSTNAMEis not
exported to non-interactive shells, so every non-pc host classified itself as remote and
tried to ssh to itself.cca9e030parity: make the esmfold2-trpcage leg runnable on Wormhole.e50f285eperf gate: seed the p300c baselines for opendde-abag and rfd3.3d6239eeparity docs: record the BoltzGen sampling bound and SaProt-1.3B near-pass.- Restored from the unmerged v0.6.0 release commits: the README documentation for
--host_threadsand--max_parallel_samples, the re-synced RELEASING.md accuracy floors, the
qb1 p150a opendde-abag perf baseline, and the fix that stopped atests/script aborting
pytest collection.
Release gate (Blackhole P150a on tt-quietbox, card 0)
Host suite: 241 tests collect and run (on main before the v0.6.0 merge-back, collection aborted
at 220 and no test executed). Full run 7 failed, 212 passed, 22 skipped; re-run one file per
process, six of the seven pass alone, the one-device-context-per-process false-failure class
from 0.6.0. The seventh, test_confidence_device_resident_parity, fails at PCC
0.9807124853748275, bit-identical at v0.6.0 and v0.5.0: pre-existing, not a regression in this
range. Packaging guard: 15/15 data files and 31/31 declared dependencies in the wheel and
sdist. UX gate: PASS on all 11 surfaces plus the CLI leg, including the deprecated gen alias
warning.
Accuracy gate — every shipped fold architecture folded end-to-end with production sampling
and checked against a per-model ground-truth floor, not self-consistency:
| model | RMSD (A) | TM | floor | result |
|---|---|---|---|---|
| boltz2 | 1.555 | 0.942 | <=3.0 / >=0.75 | PASS |
| esmfold2 | 1.834 | 0.906 | <=8.0 / >=0.40 | PASS |
| esmfold2-fast | 1.811 | 0.909 | <=4.5 / >=0.60 | PASS |
| protenix-v2 | 1.458 | 0.945 | <=6.0 / >=0.50 | PASS |
| opendde | 1.350 | 0.953 | <=6.0 / >=0.50 | PASS |
BoltzGen scRMSD 0.849 A at a 75% pass rate (floor <=2.0 A, >=50%); OpenDDE-abag DockQ 0.854
with fnat 0.922 (floor >=0.50); capacity leg peaked at 5.97 GiB against a 7.0 GiB budget,
writing all 50 samples. ESMC-300m/600m per-residue PCC 0.99961 / 0.99964, trace bit-exact.
Parity gate (scripts/full_parity_gate.py, 23 legs): 20 PASS, 3 GAP, 0 DRIFT, every leg
reproducing its committed verdict. boltz2-prot-nomsa and boltz2-affinity-fkbp12-nomsa reproduce
their committed GAP-evidenced verdicts. The third, protenix-ubq-msa, is newly accepted
GAP-evidenced (cf35cc15): the in-range MSA row-chunking for large MSAs changes bf16
summation order on exactly the one leg whose MSA crosses the 0.25 GiB chunk budget, and the
observed 2.015 A sits inside both the chunking commit's own measured envelope (mean 0.738 /
max 3.98 A) and this target's committed noise floor (max 2.993 A). Root cause and evidence are in
docs/implementation-parity.md.
Performance gate: PASS on a quiet host, 13 of 14 models within the +/-15% threshold —
boltz2 +0.2%, esmfold2 -1.7%, esmfold2-fast -1.5%, protenix-v2 -8.6%, opendde +2.0%,
opendde-abag +0.9%, esmc-300m +0.3%, esmc-600m +0.2%, esmc-6b +1.7%, saprot-650m -0.3%,
boltzgen -0.4%, boltz2-affinity -3.7%, rfd3 +2.9%. esmc-300m-single is a first seeded
tt-quietbox machine baseline at 14.62 seq/s, not a compared number: its only prior baseline
was seeded on pc, and qb1's p150a reads ~30-36% slower on that leg from within-p150a machine
variance, which the machine-id baseline layer exists to absorb. A first run co-resident with a
CPU-only campaign read -10..-28% on every host-dispatch-heavy leg while the dispatch-light
control held +0.3%; the quiet re-run recovered all of them.