Skip to content

Building Burroughs: a development story

Work in progress

This page is a draft. It describes Burroughs as of its latest release and may change. Where it disagrees with the engine's own documentation or CHANGELOG, those win.

This series was drafted on 2026-10-26, and extended to v0.12.0 on 2026-10-29, from the repository's own records: the git history, CHANGELOG.md, the decision docs, the law corpus, and the GitHub issues. Figures are quoted from those sources. Where a source was not checked, the text says so or leaves the claim out.

The B5000 favored ALGOL. Burroughs favors Go.

Burroughs (burroughs.run) is a WebAssembly runtime written in pure Go, with no cgo and no dependencies outside the standard library. Its design is built around one guest language, Go. It runs any spec-conforming module correctly, and where a design tradeoff exists, Go wins. The name comes from the Burroughs Large Systems (the B5000, 1961), which were stack machines designed so that one high-level language would run best on them. Wasm is a stack machine too.

These posts cover how it was built, from an empty repository on 2026-07-30 to v0.12.0 on 2026-10-28: the engine, and also the unusual process wrapped around it. Three actors appear throughout:

  • Scott (Scott Friedman), the owner, who makes the decisions.
  • chat-Claude, who wrote the host contract and reviews the architecture, reached through Scott. When it issues rulings it is often called "the chair".
  • CC (Claude Code), the implementation agent, which writes the code and the reports.

The posts

# Post What it covers
1 The contract came first Why a Go-partisan engine, and why its promises were written before its code
2 The suite is the oracle The board, its five verdicts, and how v0's interpreter went green
3 Graves, stamps and laws The governance experiment: decision docs, graves, controls that must be watched failing
4 The process that built itself, and the pruning Where the rules over-grew, and how Scott cut them back
5 Threads without a bell v1: OS threads, futexes, safepoints and a stop-the-world
6 A battery that grades itself The §4 litmus battery, written before the mechanism, and what "v1.0.0" honestly requires
7 Components, async and two oracles The first real Go program, WASI 0.3, the component model, and a wasmtime bug
8 Three hangs and a witness that lied #1106's lost wakeup, #896's contention-versus-ARM experiment, grave #1118
9 The flip and the correction gate:threads goes on in v0.10.0, and v0.11.0 says what that did not mean
10 What's next The later rungs, the contract clauses not yet built, and the distance to v1.0.0
11 Guest-started threads v0.12.0: a fork-built Go program runs with real threads through burroughs run, and four Wasm 3.0 flips

The timeline at a glance

Dates are the dated blocks in CHANGELOG.md. Three git tags carry a date one day earlier than their block: v0.7.0 (tagged 2026-10-08), v0.8.0 (tagged 2026-10-17) and v0.12.0 (tagged 2026-10-27).

Release Date Headline
v0.0.1 2026-07-30 Genesis: the contract, a section-level decoder, the dispatch measurements
v0.3.0 2026-08-11 gate:simd flips on, the first change to default behaviour
v0.4.0 2026-08-28 The MVP core suite is green and v0's twelve closure conditions are discharged
v0.5.0 2026-09-07 The v1 thread mechanisms land behind an off gate
v0.6.0 2026-09-18 The component model and the async ABI are on by default; WASI 0.3 guests run
v0.7.0 2026-10-09 Component values cross the public API in both directions
v0.8.0 2026-10-18 gate:cm-threads (component-model threads, phase 1) is on
v0.9.0 2026-10-21 A trap locks a component instance; Stop reaches threads inside long instructions
v0.10.0 2026-10-25 gate:threads flips on: core Wasm threads are admitted by default
v0.11.0 2026-10-26 The litmus battery reaches 19 of 19, and the v0.10.0 threads claim is corrected
v0.12.0 2026-10-28 A WASI preview-1 guest starts its own threads through the public paths; four Wasm 3.0 proposals are on by default

There is no v0.1.0 or v0.2.0. Post 2 explains why.

Some numbers, as of 2026-10-29

These are counted from the v0.12.0 tag and from the tracker on the day of writing, not taken from a status file (the project keeps none).

  • 595 commits reachable from the v0.12.0 tag (git rev-list --count v0.12.0), most of them squash-merged PRs.
  • 110 decision records in docs/decisions/ at v0.12.0.
  • 11 law families in docs/laws/ at v0.12.0, about 5,600 lines.
  • 168 issues labelled type:grave, plus 4 PRs carrying the same label.
  • A CHANGELOG.md of about 19,700 lines at v0.12.0.
  • The core spec board at v0.12.0: 63769 pass, 0 fail, 0 unsupported, 1368 gated, 0 unimplemented over 256 files.

11. Guest-started threads

A dated record

A dated record, written 2026-10-29. It is not updated as the project moves; the docs track the current release.

Drafted 2026-10-29 from the v0.12.0 tag, its CHANGELOG.md block, and the contract at that tag. Issue states are as read on that day and will move. Corrections welcome.

Post 10 described v0.12.0 as the next milestone, built around #1122 and Scott's goal: "Go->Wasm->Burroughs runs a Go program in all its glory on an engine that can." It shipped on 2026-10-28, the date of its CHANGELOG.md block (the tag itself is dated 2026-10-27 in Pacific time). The tag message names both halves: "guest-started threads, and four Wasm 3.0 proposals on by default."

6. A battery that grades itself

A dated record

A dated record, written 2026-10-26. It is not updated as the project moves; the docs track the current release.

Drafted 2026-10-26 from the repository's records. Corrections welcome.

The oracle problem

In v0, every green had an outside judge. The upstream spec suite was written by people who had never heard of Burroughs, and it could disagree with the engine. That is contract §0's neutrality guarantee.

8. Three hangs and a witness that lied

A dated record

A dated record, written 2026-10-26. It is not updated as the project moves; the docs track the current release.

Drafted 2026-10-26 from the repository's records. Corrections welcome.

Concurrent code produces a particular kind of evidence: one red run in a few hundred, which doesn't come back when you re-run it. The cheap response is to push again and read the green as a refutation. Burroughs has a law against that ("A re-run green doesn't refute a fail — explaining the fail does"), and in the last week of October three investigations showed why.

9. The flip and the correction

A dated record

A dated record, written 2026-10-26. It is not updated as the project moves; the docs track the current release.

Drafted 2026-10-26 from the repository's records. Corrections welcome.

A condition, quoted

For most of the threads phase, gate:threads sat behind a condition Scott had set, which the brief quoted word for word: the default flips when #586 is resolved and the §4 battery covers what the default would then promise. The brief adds that "is a condition, not a deferral — the difference being that a reader can check whether it holds."

10. What's next

A dated record

A dated record, written 2026-10-29. It is not updated as the project moves; the docs track the current release.

Drafted 2026-10-26 from the repository's records, and revised 2026-10-29 after v0.12.0 shipped: its section is cut down to a pointer to post 11, and the sentences v0.12.0 overtook are changed. Issue states are as read on the day each says and will move. Corrections welcome.

v0.12.0, shipped

When this post was drafted, the next milestone was v0.12.0 guest-started threads, built around #1122 and Scott's goal that "Go->Wasm->Burroughs runs a Go program in all its glory on an engine that can." It shipped on 2026-10-28, and post 11 covers what it delivered and what it did not.

5. Threads without a bell

A dated record

A dated record, written 2026-10-26. It is not updated as the project moves; the docs track the current release.

Drafted 2026-10-26 from the repository's records. Corrections welcome.

The phase changes, quietly

v0.4.0 (2026-08-28) closed v0, and its release note said firmly: "it is not v1. … v0 closing means v0's conditions are discharged, not that the next phase has begun." That was true when written: none of the §§2–5 threads work had started. Two days later it had.

4. The process that built itself, and the pruning

A dated record

A dated record, written 2026-10-26. It is not updated as the project moves; the docs track the current release.

Drafted 2026-10-26 from the repository's records. Corrections welcome.

Post 3 described the governance machinery at its best. This one is about its tendency to grow. Every grave produced a law, every law could fail, and every way a law could fail looked like it needed a control. Left alone, a process built on "check the checker" will happily spend its time checking.

3. Graves, stamps and laws

A dated record

A dated record, written 2026-10-26. It is not updated as the project moves; the docs track the current release.

Drafted 2026-10-26 from the repository's records. Corrections welcome.

Most of Burroughs' record is not code. On 2026-10-26 the tree held 106 decision records, eleven "law" families of about 5,600 lines, and a changelog of about 19,500 lines. The tracker held 168 issues labelled type:grave, plus 4 PRs carrying the same label. This post is about why an engine project produced that much text. Some of it is very good practice. Some of it, as the next post shows, got out of hand.