Phase 0’s goal
Phase 0 has one goal: to build Mzizi as a programming language, measured against the best existing language for each kind of task (RFC-0009, and charter v0.4 §4). The languages it is measured against are TypeScript, Python, Go, C++ and Rust: Rust with Dioxus and Leptos and TypeScript with React for UI components, and TypeScript, Python, Go, C++ and Rust for backend handlers and services. Nothing has been measured against that yet. The pilots below were tests inside Phase 0, on a few registry UI components, against Dioxus (pilots 1 and 2) and React (pilots 3 and 4). They are not its goal, and they showed no advantage. See the benchmark for every arm and whether it exists. The table below is the language’s front end, which lives in its toolchain, themz
compiler. The compiler implements the language; it is not the language.
Checked against mzizi-dev/mzizi at 2b36c8f on
29 October 2026, the merge of mzizi#140, which
released staging to main and is tagged v0.12.0. The release of 20 October,
mzizi#120, is 6f7b096, tagged v0.9.0; v0.11.0 (21 October) is ed5eab8. The release of 8 October,
mzizi#109, is 1d5e578, tagged v0.8.0, the fourth of that
day. The first,
mzizi#91, is be88017, tagged v0.5.0; the
second, mzizi#96, is dc156c5, tagged v0.6.0; the
third, mzizi#104, is 4d0cdc3, tagged v0.7.0. Every row below can be checked
in the repository; that is why it is a table and not a paragraph. The language’s own list of what is missing, against Python, Go,
C++, TypeScript and Rust, is
LANGUAGE-TRACKER.md,
summarised on What still has to be built.
What exists
The compiler source is 33,540 lines across
compiler/src. The workspace has 765 tests in 29 suites,
634 of them in the compiler crate and the rest in the benchmark harness, runner and probe crate
(the counts the language’s README states at 2b36c8f; the suite was not re-run for this update; the last full run, at 6f7b096, was 634 and 765, all passing). CI gates on
cargo fmt --check, cargo clippy --all-targets -D warnings, cargo test, mz check and
mz contract over every primitive and example, and a lowering job that builds, tests and
serves the example service, runs every example program through mz run against its
.expected output, and builds the performance suite and checks that its outputs agree.
The compiler crate is version = "0.0.0" with publish = false. Each release of the
repository to main is tagged (v0.4.0 is 0653903, v0.5.0 is be88017 and v0.6.0 is
dc156c5, both of 8 October 2026, v0.7.0 is 4d0cdc3, the third release of that day, and v0.8.0 is 1d5e578, the fourth, and v0.9.0 is 6f7b096, of 20 October), but that tags the repository, not a
published compiler: there is no cargo install mz and no published crate. You build it from
the repository or you do not have it.
Released to main on 29 October 2026
The release of 29 October 2026 (mzizi#140, staging to main,
merged as 2b36c8f and tagged v0.12.0) adds no language construct, and the language
harness definition is unchanged (the same SHA-256 as at v0.9.0). What it carries, from the
language’s CHANGELOG.md:
- A generated service can listen off loopback.
mz buildservices readHOST(default127.0.0.1) alongsidePORT; a container setsHOST=0.0.0.0, and a value that is not an IP address stops the service with exit 1. Tracker row P11 says so. - Generated services build slim. The generated
Cargo.tomlcarries a[profile.release](lto,codegen-units = 1,panic = "abort",strip,overflow-checks). The language’s changelog measured one example by hand (1,671,144 B to 934,720 B, idle RSS about 3.5 MB to about 1 MB). That is Rust’s output through Mzizi’s lowering, not a Mzizi advantage, and nothing here has met the kill criterion. - The
tokiopin moves to=1.53.3in generated services, for RUSTSEC-2026-0386. Rebuild a service built before this. - Pilots 3 and 4, published on the pilot results page.
- Merging is squash through the merge queue, in the language’s
AGENTS.md,CONTRIBUTING.mdandMIGRATION.md.
Released to main on 20 October 2026
The release of 20 October 2026 (mzizi#120, staging to main,
merged as 6f7b096 and tagged v0.9.0) carries no new language construct. What it carries:
- The
intminimum.-9223372036854775808is read as a value only under a unary-, where it isi64::MINand lowers toi64::MINin Rust (RFC-0013 §3.1). Every other use of that literal isMZ0103. Tested incompiler/tests/program_numbers.rs. - Two diagnostics adjusted.
MZ0710is not reported on areturnwhose declared return type the language cannot build yet; the one diagnostic isMZ0919at the signature.MZ0962names another language’s spelling as written (parseInt(s),toUpperCase), with the same fix. Tested incompiler/tests/program_collections.rsandprogram_text.rs. - Tier 2, as a draft. RFC-0014 (mzizi#111) designs modules and imports across files (P1), the
standard library (P2), lowering and runnable builds (P3, P4), errors mapped back to
.mz(P5), and Rust crates through an exact pin (P6). Nothing in it is implemented:mz checkdoes not acceptimport,module,publicorexterntoday. - Tests. 765 in the workspace, 29 suites, and 634 in the compiler crate, all passing.
compiler/srcis 33,540 lines. The language harness holds 197 entries: 79 distinct diagnostic codes (53MZ09xx, 26 shared) and 49 pending codes. The 8 October page said 80 codes, with 27 shared; the definition does not give that, and the release added and removed no code entry. - The CI and documentation fixes (#113 and #116, the
rust-toolchainpins; #115, the README and the charter without a UI framework’s name; #119, the dated changelog).
Released to main on 8 October 2026
The first release of 8 October 2026 (mzizi#91,
staging to main, merged as be88017, tagged v0.5.0) carries the first work toward
M1, a language that computes. Issue
mzizi#69 tracks it, and the
roadmap gives the plan. No pull request toward M1 is open on the
language today.
The second release, the same day (mzizi#96)
The second release of 8 October 2026 (mzizi#96,staging to main, merged as dc156c5, tagged v0.6.0) moved the tracker’s marks. In
LANGUAGE-TRACKER.md, C1, C2, C3, C4, C5, C9 and C10 are ✅, each with its “done when”
checked on main. C6 (text operations) is 📝, and C7 (collections) and C8 (user types) are
🟡, so M1 is not reached. P4 and H1 stay 🟡: a general program cannot be written yet, and
the plugin host is not built. The same release also:
- registers the four shared codes that a program’s enums raise and that were still pending,
MZ0301,MZ0302,MZ0303andMZ0704. The definition is now 137 entries and 70 codes, with 51 pending; - corrects
saytexts that described C4 and C9 wrongly (MZ0919,MZ0902,MZ0921and others), and adds a test that holdsMZ0919’s list of unbuilt forms to the checker; - takes the workspace to 644 tests, 513 of them in the compiler crate.
The third release, the same day (mzizi#104)
The third release of 8 October 2026 (mzizi#104,staging to main, merged as 4d0cdc3 and tagged v0.7.0) carries the rest of the collections and records work and
the text methods:
- Text methods (C6, mzizi#98).
length,contains,starts_with,ends_with,trim,to_upper,to_lower,replace(old, by = new)andrepeat(n). C6 stayed 🟡 until the fourth release: the methods that return an option or a list came with it. Programs: text methods. - Collections (C7, mzizi#99).
list(T),map(K, V)andset(K)in a program, with bracket literals, indexing that gives an option,otherwise, indexed assignment,in,for eachover a list,rangeas a list, the methods,map,filterand the eight named folds. C7 is ✅. Programs: collections. - Records and methods (C8, mzizi#101 and
mzizi#102). Records with fields,
fnmethods,withandalwaysinvariants. C8 is ✅. Generics and interfaces are a new row, P12, deferred past M1 (RFC-0013 §20 Q21). Programs: records and methods. - The language harness. Prefix
notis listed at its real level, 8, which the checker and the parser already used (mzizi#100). The definition holds 191 entries, 80 diagnostic codes and 49 pending codes. - Tests. 744 in the workspace, 613 of them in the compiler crate, all passing.
The fourth release, the same day (mzizi#109)
The fourth release of 8 October 2026 (mzizi#109,staging to main, merged as 1d5e578 and tagged v0.8.0) carries the rest of the text
operations (mzizi#106). With it, every Tier 1 row is
✅ on main:
- Text operations (C6, mzizi#106).
s[i]ands.slice(a, to = b)returnoption(text),s.find(t)returnsoption(int),s.split(sep)ands.chars()returnlist(text), ands.parse_int()ands.parse_float()returnoption(int)andoption(float). On 8 October 2026 the owner decided RFC-0013 §20 Q20: built-in methods with tests meet C6’s “Done when”. C6 is ✅, and Programs: text methods documents each method. - Diagnostics.
s.split("")isMZ0915, and an empty separator at run time traps (MZ0991, exit 101).t in sstaysMZ0962, with theexactfixs.contains(t). No code is added. - M1 is met on
main. Every Tier 1 row, C1–C10, is ✅ in the tracker, so M1 (“all of Tier 1 ✅”, mzizi#69) is met. The public suites stay blocked, by the standard library (P2) alone. Generics and interfaces (P12) come after M1. - Tests. 760 in the workspace, 629 of them in the compiler crate, all passing, as measured then. The language harness holds 197 entries, with 49 pending codes and 79 distinct diagnostic codes (this page said 80 then; see the 20 October section).
The performance suite is not a result
benchmarks/perf/ builds four foundation-slice programs (fib, ackermann, collatz and
interpolate) three ways: lowered by mz build, and hand-written Rust built with overflow
checks off and on. CI gates output agreement only: all three must print the committed
.expected file. Timings are per machine, are not committed, and are never a claim; the suite
is outside the kill criterion.
Two sets of timings exist, each from a single 4-core virtual machine, and neither is committed
to the language repository or tests the kill criterion:
- An informal
fib(40)timing recorded on mzizi#69, about five noisy runs each: Rust’s release build took about 390 ms, Rust with overflow checks on about 690 ms, and the Rust the foundation slice lowers a Mzizi program to about 730 ms. - One run of the suite, reported in mzizi#85’s description (median of 7 runs). The lowered Mzizi program took 0.97× to 1.45× the time of Rust with the same overflow checks (ackermann 0.97×, collatz 1.03×, fib 1.12×, interpolate 1.45×), and 1.43× to 5.67× the time of Rust’s default build, which does not check overflow.
What mz contract does, and what it does not
mz contract <file> evaluates a component’s own contract block against the component’s
own declarations, and exits 1 if a clause does not hold. Across the nine primitives there are
29 clauses, and every one is evaluated. A variant row that leaves out height takes the
height its h-N or size-N class renders, and a row whose height disagrees with its class
fails mz check with MZ0313.
It checks nothing rendered, and it does not compare a component with a reference
implementation. That comparison is the other half of the Phase 0 defect metric, and it
lives outside the compiler, in the benchmark harness. See the compiler and
RFC-0006.
For a service it runs the service in process instead: each example is one request, and each
ensure is tested over a generated set of requests. examples/registry.mz has 22 clauses,
tested over 61 requests. That is tested, not proven (RFC-0010 C-4).
The kill criterion
The rule is now RFC-0009 §6, the owner’s decision of 29 September 2026: Mzizi against the best existing language for each kind of task. Charter v0.4 §4 states it, superseding the Phase 0 criterion below. It has not been measured.- The kinds of task are RFC-0009’s gating families:
ui-spec(UI components, against Dioxus, Leptos and React) andbackend(handlers and services, against TypeScript, Python, Go, C++ and Rust). - Within each family, and for each metric, the bar is the best value any existing language reached. Mzizi passes the family when it beats that bar on at least two of the three metrics, on the headline ~7B model, on held-out tasks.
- A win counts only if a paired bootstrap gives a 95% interval for the difference that excludes zero.
- Phase 0 passes only when both families pass. A Mzizi
serviceand itsmzizi-bearm now exist, but no backend episode has run: the runner does not score with probes yet, and tasks B2–B5 and the other-language arms do not exist. Until they do, thebackendfamily cannot pass.
A defined benchmark where an LLM agent authors N equivalent components in Mzizi’s syntax vs. raw Dioxus/Leptos, measured on tokens consumed, iterations to a clean compile, and defect rate. If this doesn’t show a measurable advantage, nothing downstream matters — don’t build Phase 1 until Phase 0 has a real number attached to it.RFC-0009 §6.3 argues the change is not moving the goalposts, because it only goes the harder way: beating the best on a metric implies beating Dioxus and Leptos on it. The gate itself is unchanged: Phase 1 waits for a real number. The four pilots are not that run. They used two or three public tasks, one comparison language and a checker that was still growing. Their honest reading is that they did not show an advantage. The second one found concrete fixes to make before the real run, and most of those are now made; see what remains. Every claim on this site about why a design decision is right is a stated rationale, not a measured result.
Results are always published
Every run lands inbenchmarks/results/,
whichever way it falls. That is an owner decision, not a courtesy. When the held-out task set
exists, its scores will be published immediately and its task texts only when the set is
retired.
What has been measured about the IR
Fromcompiler/tests/ir_measured.rs, over the nine primitives and the two component
examples. Services have no IR yet, so the example service is not in it. Eleven files is a tiny
corpus, and the numbers should be read that way.
The sharing figure is smaller than it was when the corpus had ten files, which is what a
small corpus does. RFC-0003 §7 says the ratio should improve at registry scale, and labels
that as a prediction until the registry is lowered.
Where the RFCs and the implementation disagree
Worth knowing before you copy an example out of an RFC and expect it to compile.RFC status headers are behind the code
RFC status headers are behind the code
RFC-0001 and RFC-0002 both say “Status: draft for review — nothing here is
implemented”. That was true when they were written. The front end now exists. Treat the
headers as historical, and read the RFC index for each one’s current state.
View attributes take = in the implemented grammar
View attributes take = in the implemented grammar
RFC-0001 §1 writes view attributes without an equals sign, as in
text state.label. The
parser requires name = value, and every .mz file in the repository is written that
way. Syntax documents the implemented form. A missing = is one MZ0406 on
the line, with the = as its fix.The primitives carry a portal attribute the RFC never mentions
The primitives carry a portal attribute the RFC never mentions
Every primitive sets
portal = "https://mzizi.dev/components/<name>", pointing back at
the registry entry for the component it ports. It is not in RFC-0001’s attribute list.mz refs, mz path, mz patch and mz diff do not exist
mz refs, mz path, mz patch and mz diff do not exist
RFC-0003 §5 lists
refs, path, patch and diff as next in implementation order. The
binary dispatches check, fix, contract, outline, build and run, plus hash and
ir for the IR and harness.
mz fix, which RFC-0001 §4.3 described, now exists. See the compiler.RFC-0003's outline example is illustrative
RFC-0003's outline example is illustrative
RFC-0003 §4 shows a compact outline for
button. The emitter in
compiler/src/outline.rs lists variants one per line. The measured cost in §7 is from
the real emitter; the printed sample is not.The private repository does not exist yet
RFC-0004 specifies a private held-out benchmark repository, and then argues that it should not be created yet. A private runner that exists before the public harness does would shape the harness around itself. The trigger is stated: “the first held-out task. Not before.” The public half of the mechanism is in place and does nothing on purpose:.github/workflows/mzizi-lang-benchmark-dispatch.yml reports “not configured”, because the
variable and secret it needs do not exist.