Chapter 1 · 2–11 July
An engine on day one
The repository's first commit landed on 2 July 2026. It was already a working engine and already a compiler: a hand-written lexer, a recursive-descent parser, a tree-walking evaluator, a regex engine, exact big integers, generated Unicode tables, and a code generator that turned Raku into C++. On that day it passed 185 of Roast's 1,464 files completely.
What was there
The first commit's architecture note describes the pieces as they still are:
- A hand-written lexer (740 lines) and a recursive-descent parser with a Pratt core for expressions (1,728).
- A tree-walking evaluator (2,469) and the builtins (1,828). The program's syntax tree is what runs.
- A regex engine of its own (401 lines): a recursive-descent pattern parser feeding a backtracking matcher written in continuation-passing style. It was not a wrapper around a library, and it already knew about grammar subrules.
- A number tower: a big integer in base 109 with a fast path through
long long, and an exactRat. - Unicode tables generated from the Unicode Character Database, 32,046 lines of names alone.
- A code generator (814 lines) behind
--exe, and--bundleand--aotbeside it, all on one runtime library.
That first build already passed some of every area: 40 of the Unicode files in full, 95% of their assertions, and 13 of the regex files.
A harness that runs on what it measures
The Roast harness, tools/run-roast.raku, is in the first commit too. It is written in Raku and run by rakupp itself, so the tool that measures the compiler runs on the compiler. Getting it to work needed process spawning with timeouts, directory listing and argument handling, which then paid off across the rest of the suite.
The first ten days
- 185 files. The status page already quotes two numbers, whole files and single tests, and warns that they measure different things.
- 251 files, 119,645 of 164,029 tests among the files that ran.
- "Call it v0.1.0": the version is bumped at 252 files.
- 300 files. A minimal
NativeCallarrives, throughdlsymand without libffi. - The v0.1.0 tag and a Homebrew tap. 350 files by the end of the day.
- 419 files: Unicode 17 graphemes and normalization, UCA collation, and exact arithmetic fast enough for a Mandelbrot. The numbers chapter has that day.
A principle noticed after the fact
"Rakudo is the reference, not the source" was not declared on the first day. It was simply what happened: there was never a need to open Rakudo's code, so nobody did. Only later was it written down as a rule. On 22 August, with the engine past 90% of Roast's tests, the project began studying other implementations at the design level: Perl 5, Rakudo and MoarVM among nine. Since then the rule has been to read designs and never port code, to take the semantics and implement them another way. Roast is still the only definition of correct.
Who wrote it
The whole of Raku++ was written without its author typing a line of its C++. The author described what was wanted, ran the tests and pointed at what was broken; an AI model wrote the code. The role is director and reviewer rather than typist, and the project is the argument that the role works.
The loop
The method has not changed since the first week, and every later chapter is this loop run on a different source of failures:
Find the failing thing, in Roast, in a real program, in the docs or in a corpus. Work out what Raku actually means. Make the smallest change that is right, not just one that turns a test green. Run the whole suite and diff the set of passing files. Keep the fixes that are correct even when the count dips. Write down what was not obvious.