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 two pilots below were the first tests inside Phase 0, on a few registry UI components against Dioxus. 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 6da2170 on
4 October 2026. 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 12,644 lines across
compiler/src. The workspace has 425 tests in
18 suites, 294 of them in the compiler crate and the rest in the benchmark harness, runner
and probe crate. 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.
The compiler crate is version = "0.0.0" with publish = false. There is no
cargo install mz, no published crate and no release. You build it from the repository or
you do not have it.
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 two 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 and build, plus hash and ir
for the IR.
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.