crier
This Week in Modus — № 18 · 4–10 July 2026 · 233 commits · 11 of 42 repos

Two things
deleted


Modus removed the tree-walking evaluator it wrote in April, having proved with an instrumented build that nothing was using it. And OpenSSL left the stack, five days after the library that replaces it existed at all.

233Commits
11Repos moved
3New repos
−15kLines removed
RepoCommitsLinesFocus
weft92+4,719−909web fonts, script itemization, calc()
modus61+16,314−13,248one evaluator, and two GC roots
loom31+1,730−263a raster web service, and an inspector
cl-tor22+2,152−406hosting a v3 onion service
cl-consensus9+1,355−136a Bitcoin node behind an .onion
seal7+4,355−212born; TLS 1.3, then 1.2 as fallback
scribe5+267−24Noto fallback; gamma out of the loop
webp-pure3+8,409−9born; a VP8 key-frame decoder
…and 3 more3  cl-transport (born), shuttle, stencil
modus  /  9–10 July  /  WS3

One evaluator

№ 6 built a tree-walking interpreter as one of the layers of a Common Lisp, in a week that also produced the reader, the printer, the conditions and CLOS. № 17 made the bytecode path the default for production evaluation, behind a switch that could be flipped back. This week the walker was removed, and the way it was removed is the point.

It was first extracted into a file only the fork builds loaded. Then quarantined rather than deleted — the fallback restored, and a counter added to record every time anything reached for it. Only when that counter had stayed at zero across the full ANSI corpus and the library gauntlet was the file dropped.

Every consumer ported: the x64-Linux gate, the gauntlet build, bare-metal x64, Linux/AArch64 verified natively on a Pi 5, and bare-metal AArch64. The deletion is census-gated — zero walker fallbacks, instrumented, across everything.

modus — 2257554

That is the same discipline as the pre-stamps in № 10, where a range of tests could only stop being marked failed once the wedge inside it had been root-caused: do not remove the bandage because you believe it is unnecessary, remove it because you measured that it is. Two regressions surfaced on the way, both about what an unresolved name emits — a function reference that could not be resolved was emitting a live but misaligned code pointer, and a duplicate defun re-triggered a whole crash class.

Two more roots the collector could not see

№ 14 found four things the garbage collector was not scanning — the keyword and package tables, the multiple-value area, and two bounds bugs. This week found two more of the same family, and they are worth stating together because the shape recurs:

With one evaluator, the CLOS and ASDF work could finally proceed against a single target: initialisation methods honouring &allow-other-keys, accessor methods on generic functions, runtime defvar specials, CLOS class objects usable as type specifiers, and handler frames transparent to non-local exit. The register allocator learned to spill on overflow rather than fail, and the four bare-metal and hosted ANSI builds were re-forked from a common ancestor so a fix in one is a fix in all.

seal  cl-tor  cl-consensus  /  38 commits

OpenSSL leaves the building

On Saturday seal was created: a pure Common Lisp TLS 1.3 client with fail-closed certificate chain validation across RSA, ECDSA and Ed25519. By Tuesday it had a TLS 1.2 fallback for servers that decline 1.3, post-handshake key updates, and signature verification using Jacobian coordinates and Shamir’s trick — the same two optimisations that made secp256k1-fast eleven times faster in № 15, arriving in a second implementation because the curve is different.

By Thursday cl-tor had used seal to delete cl+ssl — which is OpenSSL behind a foreign-function interface — from its link layer, and cl-consensus had vendored seal to follow. Five days from “this library does not exist” to “the C dependency is gone”. That is what the no-FFI claim costs and what it buys.

The rest of cl-tor’s week is an onion service built from the bottom up: ed25519 group arithmetic and key blinding, the directory hash ring with its timing inputs and index formulas, fetching and decrypting a descriptor over a circuit, the rendezvous handshake, and an end-to-end connection to somebody else’s .onion. Then the same thing from the other side — building, signing and publishing a descriptor, establishing introduction points, accepting inbound connections. The cross-certificate work names its own acceptance criterion: descriptors valid for stock Tor clients, not merely for ours. Which is the differential-oracle instinct again, applied to a protocol rather than a test suite.

cl-consensus put it to work immediately — outbound peers routed through cl-transport, a v3 onion peer directory collected and persisted, its own .onion for inbound connections, and self-advertisement. A Bitcoin node reachable without a public address, four weeks after the node itself existed.

loom  weft  /  123 commits

The Opera Mini approach

The neatest idea of the week is about 180 lines. The engine renders a page to a full-height PNG on the server; a minimal HTML client shows that raster in an image element so the browser scrolls it natively, and posts clicks back as coordinates. The server hit-tests, dispatches the DOM click or follows the link through the page’s navigation hook, re-renders, and serves the new raster. Click-through navigation verified over real TLS — which is to say over seal, four days old.

From there it became a service: a supervisor, a thread per connection so one crash cannot take the server down, rasters cached per generation, rendering at each request’s own viewport width so the result is readable on a phone, navigation driven from the URL hash so Back and Forward work, and an inspector panel streaming fine-grained navigation phases with the network broken down by resource kind. Two robustness rules arrived that any real browser needs: a script error degrades to a render instead of blanking the page, and if scripts collapse the render entirely, fall back to the static markup.

In weft, web fonts landed — @font-face downloaded and rendered, plus a replay of the Web Font Loader convention that a great many real sites still use — along with script itemization for font fallback, area-averaged downscaling, inline background painting, object-fit and calc(). scribe supported that from underneath with a comprehensive Noto set and Unicode-block script fallback, and lifted two gamma transfers out of a per-pixel exponentiation into tables.

also this week

Two more repositories, and one fewer binding