Skip to main content

daily-progress

11 parts

01
Part 1 · · 7 min read

Deleting the Send Operator to Make the Actor Model Honest

First day of the v0.5 rewrite. I tore out the `<-` send operator and the spawn-lambda form, and spent the rest of the day deciding what the actor and machine surface should look like before a single line of it lowers to a binary.

02
Part 2 · · 8 min read

Making integers honest and making failure loud: widths, records, and trap-on-overflow

Today the value layer stops being vague. I gave integers real widths and platform-sized isize/usize, wired records all the way through with auto-derived markers, and made arithmetic that overflows trap instead of silently lying.

03
Part 3 · · 8 min read

Retiring the C++ Backend and Teaching the Compiler to Monomorphise

The day the pipeline became Rust top to bottom — over fifteen hundred C++/MLIR files deleted, and generics finally grew a spine through the IR ladder.

04
Part 4 · · 8 min read

From Parse Tree to Running Actor

Actors stopped being syntax today. I wired actor method calls down to spawn/send/ask, made init and the on(start)/on(stop) hooks fire at the right moments, and threaded an execution context through the whole thing so the reply channel has somewhere to live.

05
Part 5 · · 7 min read

State Machines Reach Codegen and Closures Become First-Class Values

Machine declarations used to type-check and then stop — no runtime behaviour. Now they lower all the way through to native code. Plus pipe-form closures, a canonical pointer spelling, and a TCP-as-Stream bridge.

06
Part 6 · · 7 min read

Generic Enums End-to-End and the Day for and while Finally Lower

Generic enum values now make it all the way to LLVM, so I get to delete the not-yet-supported guard that's been standing in for them. Match over payload-bearing variants works, and for and while loops lower to real control flow for the first time.

07
Part 7 · · 8 min read

Generators get a state machine, the cluster learns to gossip, and the wire format flips to CBOR

Two dense days grouped together — generator lowering finally has a state record and cross-yield liveness, the SWIM detector goes phi-accrual, and I delete the 2498-line hand-built wire format in favour of a CBOR envelope with a CDDL schema.

08
Part 8 · · 8 min read

Hardening the Seams Instead of Adding Surface

Two days of making the compiler refuse to lie — fail-closed gates that reject unsupported shapes at compile time, a memory-safety sweep through the runtime, and a `hew check` that finally runs the real pipeline.

09
Part 9 · · 9 min read

Collections get a real ABI, closures get capture inference, and dispatch goes through one authority

Two days on the substrate under generic data structures — what a layout descriptor actually carries, why the closure checker now infers move vs borrow, and the moment I noticed three different pieces of the compiler each had their own opinion about how a method call lowers.

10
Part 10 · · 8 min read

String Becomes Copy-on-Write and the Last Legacy Dispatch Path Is Retired

Two days on ownership — retiring the old HashMap/HashSet dual-dispatch, turning `string` into a copy-on-write refcounted value, and adding `&T` borrow markers that fail closed when you try to clone the wrong way.

11
Part 11 · · 7 min read

Abstract type parameters with value witnesses, and a receive ABI that can borrow

Generics that lower without a concrete type yet, an actor receive path that takes a non-owning borrow of the message, and the smaller control-flow pieces — const globals, bare loop, break/continue — I'd been putting off.