v0.6.6
[0.6.6] - 2026-08-22
Added
-
tt-bio weightslists every weight artifact with its status, on-disk size and resolved
path;--download [MODEL...]prefetches,--prunereclaims superseded Hugging Face
revisions and staging leftovers after printing the bytes and asking.TT_BIO_CACHEmoves
both halves of the cache (~/.boltzand the Hugging Face hub cache) in one setting, and
every artifact takes aTT_BIO_<ARTIFACT>override; the olderPROTENIX_CKPT,OF3_CKPT,
RF3_CKPTandOPENDDE_CKPTstill work. Seedocs/weights.md. -
tt-bio predict --model rf3folds with RoseTTAFold3 (AlphaFold3-family: MSA module,
template embedder, 48-block Pairformer, atom diffusion, confidence head), on device.
Proteins, RNA, DNA and ligands, plus non-canonical residues, covalent modifications and
cyclic chains; MSA on by default through the same stage every other model uses. Writes
an mmCIF/PDB with pLDDT in the B-factor column and an AlphaFold3-style
<name>_summary_confidences.json(pTM, ipTM, chain-pair PAE/PDE, ranking score), and
--diffusion_samples Nranks N samples by that score. Weights download from the
Institute for Protein Design on first use, or setRF3_CKPT. -
--partial_t N --partial_structure FILE(rf3): start the diffusion rollout part-way down
the noise schedule so it refines an existing structure instead of building from scratch.
N is a schedule index, 0 for a normal fold and higher to stay closer to the input. -
--early_stop_plddt X(rf3): after the first trunk recycle, score mean pLDDT with the
confidence head and abandon the target if it is below X. No structure is written and the
entry inresults.jsoncarriesearly_stopped: truewith the measured pLDDT, so a
screening run can tell an abandoned target from a failed one. -
tests/test_rf3_featurizer.py: RF3 host-featurizer parity over ten capability classes
from committed captures, with no device and norc-foundryinstall. -
Both release gates honour a card grant.
TT_VISIBLE_DEVICESis the set of cards a run may
open: ask--workersfor a card outside it andfull_parity_gate.pyrefuses in preflight
instead of taking a card another job on the box holds, and a leg needing more cards than the
grant is skipped asSKIPPED-CARD-GRANTand listed underCOVERAGE REDUCEDso a narrowed
gate cannot read as a green full one. Leaving the variable unset means the whole box and is
the unchanged path a release run takes. Both gates also refuse to start when the 1-min
loadavg is above 1.5x nproc (--load-ceiling, 0 disables).
Fixed
-
A weight download killed mid-flight no longer poisons the cache. Re-downloads were gated on
the destination merely existing, so a truncated multi-GB file was treated as present and
reused forever, failing later withPytorchStreamReader ... failed finding central directory. Downloads now stage next to their destination, verify against the source's byte
count and archive structure, and only then rename into place; archives are unpacked into a
staging directory and a source archive that gets discarded after extraction is deleted only
once the output verifies. Affected Boltz-2, Protenix-v2, the RF3 and RFD3 checkpoints, the
CCD molecule library and the RFD3 weight split, where a partial extraction next to a deleted
checkpoint was unrecoverable. Existing caches are adopted, not re-fetched. -
A device open now leases every card it holds, not just the one it computes on. ttnn brings up
every cardTT_VISIBLE_DEVICESmakes visible, so an unpinned run on a four-card box held all
four chips while leasing one, and the next job on that host was told three of them were free.
It then either blocked on a lock or collided at the fd level. All of them are leased now, so
such a run fails immediately, naming the card and the process holding it, instead of quietly
sharing a chip. PinTT_VISIBLE_DEVICESto the card you want and nothing changes, which is
what the worker pool, the multi-card fan-out and every gate leg already do. -
TT_BIO_LOGICAL_DEVICE_IDpast the end ofTT_VISIBLE_DEVICESfails now, naming both values,
instead of silently using the first visible card and leasing one the run never opens. -
Boltz-2 folds inputs that pad to 704 tokens again. 640 aa plus a 20-heavy-atom ligand, and
641 to 704 aa on its own, both died about 6 s in on an on-device memory clash. Every size that
folded before folds bit-identically, and the protein-plus-ligand ladder now passes at every
64-aa rung from 256 to 1024 aa. Seedocs/part-l1-budgets.md. -
The parity gate's delegated legs (
boltzgen,opendde-abag,capacity) run in the gate's own
process and shell out from there, so they inherited an environment with no device restriction:
boltzgen designed on card 0 whatever--workerssaid, and any fan-out from a delegated leg
would have taken every card on the box. They are pinned now, and the pin is restored afterwards
so one leg cannot leak it into the next. -
The
l1-budgetrelease-gate arm crashed before folding anything (L1_BUDGET_PARTSrows
unpacked as 4-tuples after a DRAM field made them 5), and that arm's own tests were dead for
the identical reason, so the arm had neither a working leg nor working tests. Also fixed three
gate tests whose verdict depended on the host's loadavg instead of the logic under test. -
A partial
~/of3_ref_out.pklskips the OpenFold3 device tests that need the keys it
lacks instead of failing them. The tests guarded on the golden's existence while
depending on its contents, so on a host with a partial capture 11 of them died on
KeyErrorand read as a regression in whatever branch was checked out. -
Histidine's ND1 carried no formal charge in the Protenix-v2 and OpenDDE featurizer. The
PDB chemical component dictionary's ideal histidine is the protonated imidazolium, so ND1
is +1, and the reference implementations read the CCD straight through. tt-bio did not, so
any protein with a histidine in it, which is nearly every real target, folded from
slightly the wrong input. Numbers move: on ubiquitin (76 residues, one histidine) the top
structure shifts 0.07-0.38 A depending on seed and plDDT by about 0.0003, and the parity
leg's all-atom RMSD against the official ByteDance Protenix reference improves from
1.790 A to 1.774 A. Larger targets carry proportionally more histidines. Re-run any
Protenix-v2 or OpenDDE prediction you need to compare against a new one. Boltz-2,
ESMFold2, OpenFold3, BoltzGen and RFD3 use different featurizers and are unaffected.The charge table is now taken from the CCD over all 20 standard residues rather than from
a golden feature dump: ARG NH2, LYS NZ and HIS ND1 are the only charged atoms, and nothing
else was missing. -
The live progress view reports real progress for
--model rf3. It announced the trunk phase
once with no iteration count and never announced diffusion at all, so the bar sat empty and a
normal rollout looked like a stall. rf3 now ticks per trunk recycle and per diffusion step like
every other model. Reporting only: no prediction moves.
Changed
- Protenix-v2, OpenDDE and OpenDDE-abag fold more accurately, and slightly faster (+8.6%, +3.6%,
+4.3%). Their Pairformer softmax was losing about 2% of each row's normalisation; it is exact
now. Four parity legs improved on their committed envelopes and none regressed, so predictions
move a little: re-run anything you need to compare against a new result. ESMFold2 and OpenFold3
are unchanged, their sites not having been measured yet. Each site is separately switchable
withTT_BIO_ACCURATE_SOFTMAX_AB, a comma-separated list of<model>.<site>tokens where a
bare token forces the exact chain on and a-prefix forces it off;alland-allcover
every site that has no token of its own, soTT_BIO_ACCURATE_SOFTMAX_AB=-allputs all five
sites that ship on (protenix.trunk,protenix.confidence,opendde.trunk,
opendde.confidence,opendde.refiner) back on the old softmax. RoseTTAFold3 is not on this
switch; its site is exact unconditionally.
See docs/implementation-parity.md.
Performance
- RoseTTAFold3 folds 1024 aa 1.264x faster (52.468 -> 41.508 s per trunk recycle), and the
768 -> 1024 aa scaling exponent drops from 3.63 to 2.82. Bit-exact, so no prediction moves.
Boltz-2, Protenix-v2 and OpenDDE reach the same code only behindBOLTZ2_FP32_SOFTMAX, which
is off by default, so they are unchanged. Seedocs/size-generality.md.
Gates and documentation
- The performance page publishes two readings per row, whole fold and device only, and says what
the NVIDIA cells actually time. Four H200 cells (Boltz-2, OpenFold3, Protenix-v2, OpenDDE)
leave 0.24 to 6.31 s of featurisation and structure writing outside their timer, which made
those ratios larger than a like-for-like comparison. The two readings agree within 0.2x on five
of six rows; RoseTTAFold3 reads 3.556x whole fold and 9.388x device only, because half of that
fold is host featurisation that runs on both sides. No published cell moved. See
site/data/perf-512aa.json. tt-bio predict --model rf3runs from a plainpip install tt-bio. Four packages it imports
at module load were undeclared, so it exited onModuleNotFoundErrorbefore opening a card.
RoseTTAFold3 now has a UX-gate leg and a perf-gate entry, which is what found it.- A parity-gate workdir records the code it scored, and the gate refuses to resume one built from
a different tree. The per-leg resume cache is keyed on the leg id alone, so a second release
gate on the same machine used to replay the previous release's verdicts as its own. packaging_smoke.py --foldinstalls the wheel with--force-reinstall, so the guard cannot
inherit a same-versiontt_biofrom the parent interpreter and silently test nothing.
Known issues
TT_PROTENIX_CONF_DEVICE=1, which keeps Protenix-v2's confidence head on the card, returns
PAE and PDE that track the default path to 0.981 and 0.990 correlation, below the 0.99 a
device path here has to clear; pLDDT is clean at 0.994. The flag ships off and the predicted
structure never depends on it, so leave it off if you read PAE or PDE. 0.6.5 returns the same
numbers: a pre-existing gap now measured, not a new one.