The GPU was losing to WebAssembly; sessions, kernels and v0.0.19
v0.0.19 was held because the README promised more of torch.compile than it did; four tracks made it true - protocol-v2 capture, resident GPU sessions, native kernels, a second pass over the Python hot paths - and the release shipped with the two longest gate jobs run locally.
The 0.0.19 tag had been sitting unpublished since the 16th: a README saying torch.compile captured gelu, softmax, cross-entropy and Adam when the capture still recorded dense layers, relu, MSE and plain SGD. A browser benchmark made the same point from the other side - the WebAssembly kernels beat an RTX 5090 on a 784-256-10 Adam step, 3.3 ms to 7.5 ms. Measured rather than reasoned about, the GPU step was 0.4 ms of GPU work inside 6.6 ms of validating and copying the graph in, recording, reading 2.4 MB of weights back and waiting on Chrome's ~2.6 ms submit-to-map round trip.
Four tracks, two or three agents at a time. bc9ce154 taught the capture what protocol version 2 carries - activations, softmax, fused cross-entropy, SGD with momentum, Adam and AdamW with state round-tripped through optimizer.state - verified against PyTorch 2.11 to float32 rounding. 71dab087 added prepared sessions: validate once, feed inputs per step, carry weights and moments on the device, several steps per submission; 0.79 ms per step at eight per run, bit-identical to chained executes. 65468539 ran version-2 graphs on the tensor kernels natively, 939 s to 2.9 s per step, and surfaced a last-bit rounding difference in the JavaScript reference's cross-entropy gradient. 18961128 took the Python frontend to 0.89x on top of the earlier 0.59x. 431b7177 put compiled.prepare() on top of all of it: from Python, 74 ms per compiled call became 1.8 ms per step.
An outside review of the branch found two real things before the tag moved: a generic session that failed after device work began was left with its carries at no particular step and would happily run the wrong Adam step on a retry, and the hosted Python dispose() skipped the host request for exactly such a poisoned session, leaking it until the engine generation died. 819eadf3 and 2e6a39c3 fix both, each pinned by tests that fail on the old code. The two longest gate jobs - the native workspace suite (308 binaries, 2,453 tests) and Test262 (95,680 of 95,680 corrected) - ran locally on the tagged tree, the release workflow ran everything else, and v0.0.19 is published.