navier-stokes — v7.6 answer-first 4B, epoch 5
Predicts whether a genetic perturbation moves a queried pathway up, down, or leaves it unchanged, from a text prompt plus a STATE cell embedding.
Trained on sft_gene_pathway_v7_6_full100k_holdlines_answerfirst: the holdlines corpus with the
assistant turn reordered so the label is stated before the reasoning rather than after it. That
ordering is the point of the run — it removes the copy path that let the trace arm satisfy its loss
without learning the prompt-to-label mapping.
Reading the output — take the LAST boxed value
Every generation contains two \boxed{} spans:
My initial call is \boxed{downregulated}, but let me work through it. <- NOT the prediction
... reasoning ...
\boxed{upregulated} <- the prediction
Parse the last one. The first is the answer-first prefix and is part of the format, not the answer. On greedy decoding the two agree on 45,208 of 45,209 benchmark rows, so a first-box parser looks correct and silently reports the wrong number the moment sampling makes them disagree — which is exactly what RL does.
Results
Per-perturbation committed accuracy on benchmark_genetic_v1, greedy at epoch 5:
| set | committed | commit rate |
|---|---|---|
| xaira_orion | 80.4 | 94% |
| xaira_pisces | 77.6 | — |
| kaufman | 72.3 | 40% |
| nadig | 70.5 | — |
| marson | 55.2 | 42% |
| pooled | 72.9 | 76% |
| iPSC (zero-shot) | 73.4 | 95% |
| HEPG2 (zero-shot) | 63.4 | 80% |
Against the 9B trace arm (sft_gene_pathway_v7_6_100k_a256bs32_9b, 60.9 pooled greedy) that is
+12.1 ± 1.7 paired.
Loading
cell_projection.pt maps the 2058-d STATE embedding into the LLM's hidden space and is not in
model.safetensors. Load it separately; without it the model is unconditioned on the cell.
The prompt must be rendered with the template this checkpoint trained under — a different template is a different model as far as the numbers are concerned.