v0.11.1: internal cleanup, no behaviour change
A structural pass over everything merged since the repo went public. No user-facing behaviour changes — the byte-identity gates pass unchanged, and the engine produces the same numbers it did in 0.11.0.
Engine
The per-token metrics block moved out of the middle of Session::generate() into a GenTally that owns the streaming cursors and the run totals. generate() loses ten measurement locals and about fifty lines of inline bookkeeping; what a token costs is now written down in one place, while what it says stays with the generation loop.
Android example
- Download tracking is a stream, not a poll.
ModelDownloader.events()exposes progress and outcomes over WorkManager's own flow, finalizing a landed.partbefore reporting it. The add-model card used to own a 700 ms polling loop, do its own finalization, and re-seed its state by hand after every enqueue and cancel — all of that is gone, and a download started before the app was killed is picked back up on the first emission. - The telemetry breakdown is a pure function. The live-vs-average choice, the wall-additive residual, and the CPU-occupancy arithmetic moved out of the panel into
breakdown(), next to the contract it implements.
Documentation
Stale references corrected: the model catalog and the add-model section still named the system DownloadManager, retired when in-app downloads moved to WorkManager, and one KDoc link pointed at a field that had been renamed. RunInfo::dense_weights no longer advertises a "warm" default the engine stopped defaulting to.
Install
app-dev-release.apk below is signed with the same key as every release since 0.9.1, so it installs over an existing build without uninstalling — your downloaded models stay put.