2026-09-12, morning. A reflection, written before any code, on what the project could stop carrying, and on the Roc pivot. Opinions, meant to be argued with, and nothing here has been said to Damian.
Numbers from the u58 checkout, because the argument needs them.
| part | size |
|---|---|
| compiler | 60,000 lines of Codex, self-hosted, bare-metal seed |
| foreword (the standard library) | 438 chapters, 83,000 lines: ai, compress, gpu, sim, game, ui, signal, shell |
| os | 162 chapters, 33,000 lines: kernel, net, sched, trust, verify, replay |
| plugs (backends) | 59: every mainstream language, three ISAs, PTX, SPIR-V, WGSL, a browser, GUI toolkits |
| apps | 69, 239,000 lines: a browser, a mail client, an ERP, a spreadsheet, a piano, a starmap, a globe |
Roughly half a million lines, one author, one collaborator, and a type-system agenda on top: effects with capability scopes, linear values, units of measure, hard-real-time budgets, propositional proofs, type classes, vectors. Every one of those is a research project on its own in any other language.
The thing to notice is not that this is too much for one person. It is that it is too much for the message. Someone arriving at the repository cannot say in a sentence what it is, and a project you cannot say in a sentence is one nobody joins. Recruiting is hard for everyone; it is hardest when the invitation is "help me with everything".
Here is my candidate for the sentence: a literate, self-hosting language whose compiler boots on bare metal, with one proven backend. Everything that serves that sentence stays. Everything that does not is a spinoff, which is a kinder word than a cut and a more accurate one: none of it has to be deleted, it has to stop being on the critical path and stop being in the README.
What serves the sentence:
What does not:
apps/attic/ with a line each saying what they were.What this buys: the Update cadence gets faster because the surface is a quarter the size; the token budget per Update drops with it; and the README can say the sentence, followed by "the OS, the fifty-eight other backends and sixty apps live in these three sibling repositories, each looking for a maintainer". That last clause is the recruiting pitch that does not exist today: a bounded thing a person could own.
The honest caveat is that the author does not seem to want a smaller project; the scope is the point for him. Then the trim is a trim of the critical path, not of the tree: which things must be green for an Update to ship. That can be done without deleting a file, by moving the apps and plugs out of the release gate and into a nightly that is allowed to be red.
Roc is mature enough to grade against (46 ports, all passing on every arm, found seven real plug defects), and its test suite is the thing we already know how to use. Two ideas on the table.
A Rust interpreter as an oracle for Roc. The irony is noted: they wrote the compiler in Rust and abandoned it for zig. But the irony cuts the other way too. Their old Rust compiler is not an oracle for the new language; the language moved. A fresh Rust interpreter, written from their eval test suite, would be exactly what our Rust arm was for Cobblestone: an independent second implementation, cheap to run, that turns every test into a differential check. The week just past is the evidence that this works and the memory note is the method. Two cautions. First, an interpreter is only an oracle for values; it will not see a type error their compiler should raise, so it needs the diagnostics half of the Roc suite too, which is where their compiler's own error tests come in. Second, the return on it depends on whether the Roc team wants findings. They were generous with their tests; before building the instrument, it is worth one message asking whether a differential-testing contributor is welcome and where they would want the reports.
Porting the WGSL apps to Roc, with a plug to automate it. This is attractive because the WGSL kernels are self-contained and striking, and because a "Codex-to-Roc plug" is the same shape as every other plug in the tree: an emitter from the IR. It would also be the one plug whose output is graded by a real, independent compiler. The risk is that it pulls us back into Cobblestone's plug family, which is the thing above I am arguing to shrink. I would do it only as a port of one app by hand first, to learn what Roc lacks (a GPU story, mostly), before writing the emitter.
Nothing for a day, which is what you said. Then, in order: the one message to the Roc team; a hand port of the globe's kernels to Roc to learn the shape; and only then decide between the interpreter and the plug. The Cobblestone conversation with Damian is yours, and the trim above is offered as a draft of the sentence rather than a plan.
| repo | branch / revision | role |
|---|---|---|
| cobblestone-u58 | u58-candidate 075a4550 | the tree measured above |
| rust-codex-compiler | zonk-and-default 77bd70b, chain 15 running |
ready to park |
| cobblestone-curated-tests | 94c470a | the 46 Roc ports |