v0.0.32
v0.0.32 — the book was unreachable, and the pages were fine
Atur, testing v0.0.31 on Windows and on a phone: "the book of QR code for Core
mode is not available!!! that book where is it!!"
It was not — and none of the three causes was in the pages, which is why
every test of them passed, and kept passing, the whole time.
Fixed
The window showed the art only while a model was loaded. The mark and the
reader were routes on the child chaos-serve, so the book was a feature of
inference: turn the dial to CORE, press the button before pressing LOAD, and the
browser reports that the site cannot be reached. Nothing about a QR code needs
7 GiB of weights. The window now serves the same assembled bytes itself, on
loopback, needing no model.
The reader could not open a camera even with a model loaded. getUserMedia
is refused outside a secure context — https:// counts and 127.0.0.1 counts,
a LAN address does not. CORE mode handed the reader its own LAN address, which
is right for the mark and fatal for a camera, so the page loaded, drew its
circle, and explained that it could not do the one thing it exists for. It is
served from loopback now; the mark still encodes the LAN address, because
the page prefers an injected endpoint over the origin it was served from.
On Android it was present and unfindable: the bottom of the SETTINGS tab,
inside a scroll view, behind a button labelled MARK. The mode badge is now the
door, matching the desktop, where the badge at the foot of the rail is already
the CHAOS page's only entrance.
Changed
grimoire is its own crate. It is string assembly over two include_str!d
HTML files with no ggml reference and no dependencies, and while it lived in
chaos-arch — the one crate that cannot build without a compiled ggml — the two
tiers that most want to show the art could not, because the window deliberately
links no engine crate. chaos_arch::grimoire is a pub use of it, so the server
is untouched. CLAUDE.md had recommended this move for weeks.
The Android release no longer compiles a host llama.cpp to write two HTML
files. chaos-qr --emit-pages emits them with no C toolchain, deleting a
second full cmake from every release — the step that failed the first time it
ever ran, on v0.0.22, for exactly this reason.
Thirteen of the fourteen CI-checked crates now build with no ggml, up from
twelve of thirteen, and CI enforces the new one too.
Added
scripts/make-release-keystore.sh — one command for the one step that cannot be
automated. Android still refuses to install this release over the previous
one, and the cause is not the app: gradle assembleDebug on a fresh runner
has no persistent debug keystore, so Gradle makes a new key every run and every
release has had a different identity. Uninstall the old version first. The
build has accepted a real keystore since v0.0.31; what is missing is the key,
and it cannot live in a public repository, because a committed signing key lets
anyone build an APK Android will accept as an upgrade over your install.
One more, found by tagging
Every release APK build was broken and no release had run the code yet. The
keystore support merged after v0.0.31 was tagged, so this release's workflow was
the first ever to evaluate it — and it died at configuration time with
Cannot convert '' to File. An undefined repository secret exports an empty
string, not nothing, so the guard against a missing keystore saw a non-null
value and called file(""). The no-secret path was the one case that code
existed to handle gracefully, and it was the only one that could not work.
Five of six platforms had already built cleanly; the Android job was the
failure, and the release was withheld rather than published incomplete.
Documentation
STATUS.md's release ladder read 40/55/35/6% while the README's
machine-checked copy read 100/100/100/100/80/70/100, and three items in its
open list had been done for two releases: chaos-run has 16 tests not 8,
chaos-serve binds the port before opening the container, and finish_reason
is surfaced. Each was re-checked against the code rather than against the note.
What is still open
- V4-Flash generation disagrees with its own prefill. The divergence appears
exactly when a compressed block completes — three tokens, the only length that
closes none, agree to cosine 0.99987; four tokens are ten times worse. This
release eliminates the ring alignment as the cause by hand; the next step is a
diff against llama.cpp at a boundary length. Generation always takes the
stepwise path, so this affects every token read from that model. - The Android change is unbuilt here. There is no gradle and no NDK on the
machine this was written on, so CI is the only build; the badge is one tap
nobody here can make. - macOS is still untested, the GPU tier still fails 1 of 8 parity prompts, and
no real camera has yet seen the mark or the reader.
Verified for this release: 1003 tests passing (0 failed, 49 ignored), clippy
-D warnings clean, fmt clean, all 30 surface checks against the built
binaries, and the ggml-free half of the build proved in both directions.