History

August 21, 2026 · View on GitHub

How the Vera compiler was built, from initial commit through the dual-threaded start of Stages 19 and 20, across 103 active development days.

Vera was developed in an interleaved spiral — each phase added a complete compiler layer with tests, documentation, and working examples before moving to the next. The compiler was built by a single developer working with Claude Code, with CodeRabbit providing AI code review on pull requests from v0.0.80 onwards. The entire project — language design, specification, compiler, test suite, documentation, website — was built from scratch starting 22 February 2026.

Version rows follow one rule: one sentence, at most one issue link. CHANGELOG.md is the per-release log of record; this file is the story.

Stage index

StageDatesThemeVersions
122–23 FebThe core compilerv0.0.1–v0.0.9
224–26 FebCodegen completenessv0.0.10–v0.0.24
326 FebCodegen cleanupv0.0.25–v0.0.30
426–27 FebModule systemv0.0.31–v0.0.39
527 Feb – 4 MarPolish, tooling, and the GCv0.0.40–v0.0.65
65–12 MarStandard library and runtimev0.0.66–v0.0.88
712–20 MarAbilities and the preludev0.0.89–v0.0.93
823–27 MarData types and effectsv0.0.94–v0.0.101
928–31 MarHardening and agent usabilityv0.0.102–v0.0.106
107–11 AprEvaluation and CI qualityv0.0.107–v0.0.111
1116–23 AprStandard library depthv0.0.112–v0.0.119
1226 Apr – 8 MayThe bug-killing campaignv0.0.120–v0.0.142
1310–29 MayStabilisation and memory safetyv0.0.143–v0.0.160
1410–12 JunThe language serverv0.0.161–v0.0.170
1515 Jun – 1 JulThe soundness campaignv0.0.171–v0.0.191
162–3 JulThe server-effects sprintv0.0.192–v0.0.195
174 JulThe v0.1.0 bug burndownv0.1.0
188 JulThe visual documentation passv0.1.1
19 + 209 Jul onwardsVerification completeness + single source (dual-threaded)v0.1.2–

Stage 1: The core compiler (22–23 February)

One day. Five compiler layers. From nothing to a working language.

The first day of development produced the complete compiler pipeline: parser, AST, type checker, contract verifier, and WebAssembly code generator.

VersionDateWhat shipped
22 FebInitial commit: repository structure, licence, empty scaffolding.
v0.0.123 FebParser. Lark LALR(1) grammar with natural-language errors designed for LLM consumption, SKILL.md, 13 example programs, and the veralang.dev domain live the same day.
v0.0.223 FebCI workflow, social preview, domain configuration.
v0.0.323 FebFull parser coverage: 110 tests, 13 examples, specification cleanup.
v0.0.423 FebAST. Typed syntax tree, Lark→AST transformer, vera ast command, 83 new tests.
v0.0.523 FebType checker. Decidable type checking, slot reference resolution, effect tracking, vera typecheck command, 91 new tests.
v0.0.6–v0.0.723 FebHello World example, specification design notes, housekeeping.
v0.0.823 FebContract verifier. Z3 SMT solver integration, refinement types, counterexample generation for failed contracts.
v0.0.923 FebWASM code generator. vera compile and vera run deliver the first end-to-end execution.

66 commits on 23 February alone — from an empty repository to a language that parses, type-checks, verifies contracts, compiles to WebAssembly, and runs. The specification (Chapters 0–7) was written in parallel with the compiler, not after it.


Stage 2: Codegen completeness (24–26 February)

Three days. Every language construct compiles to WASM.

The parser and type checker handled the full language from day one; Stage 2 extended WASM compilation to every construct.

VersionDateWhat shipped
v0.0.1024 FebFloat64: f64 literals, arithmetic, comparisons.
v0.0.1124 FebCallee preconditions: requires() verified at call sites in WASM.
v0.0.1224 FebMatch exhaustiveness: every constructor must be covered.
v0.0.1324 FebState<T> operations: get/put as host imports.
v0.0.1424 FebBump allocator: heap allocation for tagged values.
v0.0.1524 FebADT constructors: heap-allocated tagged unions.
v0.0.1624 FebMatch expressions: tag dispatch, field extraction.
v0.0.1724 FebGenerics: monomorphization of forall<T> functions.
v0.0.1825 FebClosures: closure conversion, call_indirect.
v0.0.1925 FebEffect handlers: handle/resume compilation.
v0.0.2025 FebHousekeeping and test fixes.
v0.0.2126 FebByte type and arrays: linear memory arrays with bounds checking.
v0.0.2226 FebQuantifiers: forall/exists compiled as runtime loops.
v0.0.2326 FebRefinement type alias compilation.
v0.0.2426 FebSpecification Chapters 9 (Standard Library) and 12 (Runtime).

After v0.0.24, all 15 example programs compiled and ran correctly. The language was feature-complete at the syntax level, though the standard library was minimal.


Stage 3: Codegen cleanup (26 February)

One day. Residual gaps closed before starting the module system.

VersionDateWhat shipped
v0.0.2526 Febresume recognised as built-in in handler scope.
v0.0.2626 FebHandler with clause for state updates added to grammar.
v0.0.2726 FebPipe operator (|>) compilation.
v0.0.2826 FebFloat64 modulo: WASM has no f64.rem, so a host-import workaround.
v0.0.2926 FebString and Array types in function signatures.
v0.0.3026 Febold()/new() state expressions in contracts.

Six releases in a day cleared the residue; the module system could start on clean ground.


Stage 4: Module system (26–27 February)

Two days. Cross-file imports, visibility, multi-module compilation.

The module system was built in six sub-phases, each adding one layer: file resolution, cross-module type environment, visibility enforcement, cross-module contract verification, multi-module WASM compilation, and the formal specification (Chapter 8).

VersionDateWhat shipped
v0.0.3126 FebModule resolution: map import paths to source files and parse them.
v0.0.3227 FebCross-module type environment: merge public declarations across files.
v0.0.3327 FebInternal refactoring for visibility.
v0.0.34–v0.0.3527 FebVisibility enforcement: public/private access control in the checker.
v0.0.3627 FebInternal fixes.
v0.0.3727 FebCross-module verification: contracts that reference imported symbols.
v0.0.3827 FebMulti-module codegen: imported functions flattened into the WASM module.
v0.0.3927 FebSpecification Chapter 8: formal module semantics, resolution algorithm, examples.

After v0.0.39, Vera programs could import functions and data types from other files, with visibility enforcement and cross-module contract verification.


Stage 5: Polish, tooling, and the GC (27 February – 4 March)

Six days. Refactoring, tooling, diagnostics, verification depth, and the garbage collector.

The longest early phase: the compiler refactored into subpackages, the canonical formatter, contract-driven testing, stable error codes, and a type system extended with subtyping, effect row unification, and inference. It culminated in the conservative mark-sweep GC that replaced the bump allocator.

VersionDateWhat shipped
v0.0.4027 FebDecompose checker.py (~1,900 lines) into checker/ submodules.
v0.0.4127 FebDecompose wasm.py (~2,300 lines) into wasm/ submodules.
v0.0.4227 FebInformative runtime contract violation error messages.
v0.0.4327 FebStable error code taxonomy (E001–E702).
v0.0.4428 FebLALR grammar fix for module-qualified call syntax.
v0.0.4528 Febvera fmt: the canonical formatter, one textual representation for every construct.
v0.0.461 MarDecompose codegen.py (~2,140 lines) into codegen/ submodules.
v0.0.471 Marvera test: contract-driven testing that generates inputs from contracts via Z3 and runs them through WASM.
v0.0.481 MarImproved test coverage for WASM translation modules.
v0.0.491 MarRegister Diverge as built-in effect.
v0.0.502 MarString built-in operations (length, concat, slice).
v0.0.512 MarExpanded the SMT decidable fragment.
v0.0.522 Mardecreases clause termination verification.
v0.0.532 MarTypeVar subtyping.
v0.0.542 MarEffect row unification and subeffecting.
v0.0.553 MarMinimal type inference.
v0.0.563 MarNested constructor pattern codegen.
v0.0.573 MarName collision detection for flat module compilation.
v0.0.583 MarRecursive generic ADT codegen, fixing the list_ops.vera runtime failure.
v0.0.593 MarInternal fixes.
v0.0.603 Marparse_nat returns Result<Nat, String> per spec.
v0.0.614 MarArrays of compound types in codegen.
v0.0.624 MarExn<E> and custom effect handler compilation.
v0.0.634 MarDynamic string construction.
v0.0.644 MarUniversal to-string conversion.
v0.0.654 MarGarbage collector. Conservative mark-sweep GC for WASM linear memory, so programs can allocate dynamically in loops without exhausting the heap.

After v0.0.65, the compiler was structurally mature: three clean subpackages, a canonical formatter, contract-driven testing, stable error codes, a mark-sweep GC, and a type system with inference, subtyping, and termination verification.


Stage 6: Standard library and runtime completeness (5–12 March)

Eight days. Built-in functions, IO runtime, browser target, Markdown, Async, and the conformance suite.

The standard library grew from a handful of operations to over 100 built-in functions, the full IO runtime landed, and the browser runtime shipped with mandatory parity tests.

VersionDateWhat shipped
v0.0.665 MarIO runtime: read_line, read_file, write_file, args, exit, get_env.
v0.0.675 MarString escape sequences (\n, \t, etc.) in string literals.
v0.0.685 MarConformance test suite: the beginning of systematic spec validation.
v0.0.696 MarInternal fixes.
v0.0.709 MarNumeric math built-ins (abs, min, max, floor, ceil, round, sqrt, pow).
v0.0.719 MarNumeric type conversions (int_to_float, float_to_int, nat_to_int, etc.).
v0.0.729 MarFloat64 special value operations (float_is_nan, float_is_infinite, nan(), infinity()).
v0.0.739 MarString search and transformation built-ins (contains, starts_with, upper, lower, replace, split, join).
v0.0.749 Marstring_from_char_code built-in.
v0.0.7510 Marstring_repeat built-in.
v0.0.7610 MarString interpolation: "\(@Int.0)" with auto-conversion for all primitive types.
v0.0.7710 MarParsing completeness (parse_int, parse_bool, safe parse_float64).
v0.0.7810 MarArray construction built-ins (range, append, concat).
v0.0.7910 MarBase64 encoding and decoding.
v0.0.8010 MarInternal fixes, with CodeRabbit AI code review configured from this point onwards.
v0.0.8110 MarURL parsing and construction built-ins.
v0.0.8211 MarAsync type infrastructure: <Async> marker effect and Future<T>, eager/sequential until WASI 0.3.
v0.0.8311 MarTuple type WASM codegen.
v0.0.8411 MarMarkdown standard library: MdBlock and MdInline ADTs with parse, render, and query built-ins, plus 78 new tests.
v0.0.8511 MarBrowser runtime: vera compile --target browser produces a ready-to-serve bundle backed by runtime.mjs, with 56 parity tests.
v0.0.8611 MarRegex support: regex_match, regex_find, regex_find_all, regex_replace.
v0.0.8711 MarFizzBuzz example, iteration documentation.
v0.0.8812 MarFormatter comment repositioning fix.

11 March was the single most productive day for user-visible features: the Markdown standard library, the browser runtime with parity testing, and regex support all shipped in separate PRs on the same day.


Stage 7: Abilities and the standard prelude (12–20 March)

Eight days. Type constraints, combinators, higher-order array operations, and the standard prelude.

VersionDateWhat shipped
v0.0.8912 MarOption/Result combinators: option_unwrap_or, option_map, option_and_then, result_unwrap_or, result_map, implemented via source injection.
v0.0.9013 MarAbilities: Eq, Ord, Hash, and Show with forall<T where Eq<T>> constraint syntax, ADT auto-derivation, and full WASM codegen.
17 MarTextMate syntax highlighting bundle.
18 MarVS Code extension for Vera syntax highlighting.
v0.0.9119 MarArray operations: array_slice, array_map, array_filter, array_fold, plus six monomorphization and WASM type-inference bug fixes.
v0.0.9219 MarBREAKING naming audit: 14 built-ins renamed to the domain_verb convention, the last intentional breaking change before stabilisation.
20 MarAI discoverability assets on veralang.dev: llms.txt, llms-full.txt, robots.txt, sitemap.xml, ai-plugin.json.
v0.0.9320 MarStandard prelude: Option<T>, Result<T, E>, Ordering, and UrlParts injected automatically into every program.

The abilities release (v0.0.90) was the last major type system feature. After v0.0.93, every Vera program had access to Option, Result, Ordering, combinators, and higher-order array operations without any boilerplate declarations.


Stage 8: Data types and effects (23–27 March)

Five days. Collections, JSON, HTML, HTTP, Decimal, and Inference — the features that make Vera an agent-viable language.

This stage delivered the critical dependency chain that had driven the roadmap from the beginning: Map → JSON → HTTP → Inference, culminating in LLM calls as typed algebraic effects.

VersionDateWhat shipped
v0.0.9423 MarMap<K, V>: eight built-in operations with Eq + Hash ability constraints, backed by opaque i32 handles.
v0.0.9524 MarSet<T>: six built-in operations.
v0.0.9624 MarCollections documentation sweep plus native JavaScript coverage for the browser runtime (#337).
v0.0.9724 MarDecimal: exact decimal arithmetic across 14 built-in operations.
v0.0.9825 MarJSON: the built-in Json ADT and 8 built-in functions to parse, query, and serialise structured data.
v0.0.9925 MarHTTP: the <Http> algebraic effect, with Http.get and Http.post returning Result<String, String>.
v0.0.10026 MarHTML: the built-in HtmlNode ADT with lenient parsing, CSS selector queries, and text extraction.
v0.0.10127 MarInference: LLM calls as typed algebraic effects, dispatching to Anthropic, OpenAI, or Moonshot, impossible to invoke from a pure function.

v0.0.101 completed the chain. A Vera program can fetch data from the web, parse HTML or JSON, call an LLM, verify the response against contracts, and return typed results — all with every side effect tracked in the type system.


Stage 9: Hardening and agent usability (28–31 March)

Four days. Friction removal: the small issues that would bias any benchmark or frustrate any agent.

With the core language complete, this stage cleared the path for honest evaluation while VeraBench began producing initial results in a separate repository.

VersionDateWhat shipped
v0.0.10228 MarBug fixes: the stdin double-read (#335) plus cross-module Option and pipe-into-qualified-call fixes.
28 MarTyped CLI argument passing for vera run --fn f -- arg (String, Float64, Bool, Byte alongside Int).
28 MarAgent discovery metadata: llms-txt link elements and JSON-LD TechArticle entries on veralang.dev.
v0.0.10329 MarCI security hardening (pip-audit, ruff security rules, zizmor, SBOM) plus vera version, --quiet, and conformance additions.
v0.0.10429 MarBare None/Err constructors in generic calls type-check without let workarounds (#293).
v0.0.10530 MarTyped holes: the ? placeholder reports W001 with expected type and slot bindings, and blocks compilation with E614.
v0.0.10631 Marvera test input generation extended to String and Float64 (#169).

By v0.0.106, contract-driven testing covered every primitive parameter type, and the friction list for the first full benchmark sweep was clear.


Stage 10: Evaluation and CI quality (7–11 April)

A week of VeraBench evaluation in parallel, then compiler fixes informed by the results.

VersionDateWhat shipped
v0.0.1077 AprCI validation for examples/README.md run commands (#361).
v0.0.1087 Aprvera check --explain-slots (#445): the slot resolution table addressing the dominant VeraBench failure mode, plus a prescriptive SKILL.md rework.
8 AprMulti-model evaluation (VeraBench v0.0.7): 6 models across 3 providers, with Kimi K2.5 hitting 100% run-correct on Vera against 86% on Python.
9 AprTwo effect-runtime bug fixes: Exn<String> WASM tag encoding (#416) and nested handler isolation.
v0.0.10910 AprClosure i32_pair parameter and return types fixed so String/Array values in closures emit correct two-slot WAT (#359).
v0.0.11010 AprMistral provider for Inference.complete, with the provider registry refactored so new providers are a one-row change (#413).
v0.0.11110 AprSMT translator declares String/Float64 parameters with correct Z3 sorts, promoting the string predicates to Tier 1.

The evaluation verdict: flagship models held Vera even with Python, and the failure modes clustered on missing primitives — which set the agenda for Stage 11.


Stage 11: Standard library depth (16–23 April)

Eight days. The utility built-ins any real program needs.

VeraBench identified missing primitives as the dominant friction: models reaching for array_sort or string_reverse and finding nothing, then hand-rolling fragile implementations. This stage added the math, string, array, and JSON surfaces that real programs assume.

VersionDateWhat shipped
v0.0.11216 AprFix GC shadow stack overflow (#464).
v0.0.11316 AprDecompose calls.py into 8 subsystem mixins (#418).
16 AprCHANGELOG enforcement at pre-push and CI (#478).
17 AprWiden GC object header size field from 16-bit to 31-bit (#484).
17 AprIterative WASM higher-order array ops (#480).
v0.0.11417 AprIO.sleep, IO.time, IO.stderr (#463).
v0.0.11518 AprRandom effect (#465).
v0.0.11620 AprMath built-ins (#467).
22 AprDependabot uv ecosystem + auto-uv-lock (#500).
v0.0.11722 AprArray utility built-ins, phase 1 (#466).
v0.0.11823 AprString utilities + character classification (#470).
v0.0.11923 AprJSON typed accessors (#366).

After v0.0.119 the missing-primitive complaints stopped; what remained was runtime correctness at scale.


Stage 12: The bug-killing campaign (26 April – 8 May)

Thirteen days. Sixteen runtime and codegen bugs, a Game of Life, and the debugging UX to match.

Agent-written programs at real scale — capstone: Conway's Life — drove a sustained campaign through the closure, GC-rooting, and string-interpolation layers. Crash-debugging UX shipped alongside the fixes: trap kinds, source backtraces, fix suggestions, and live stdout.

VersionDateWhat shipped
26 Aprveralang.dev homepage redesign: editorial-research aesthetic with the bilingual reading-path device.
v0.0.12026 AprCrash-debugging UX: trap categorisation + stdout preserved on trap (#522).
v0.0.12127 AprNested closures + ADT capture work end-to-end (#514).
v0.0.12227 AprConservative GC bounds-checked against $heap_ptr (#515).
v0.0.12327 AprIO.print writes flush live to sys.stdout (#543).
v0.0.12427 AprRuntime traps now include a source backtrace (#516).
v0.0.12528 AprRuntime traps now include actionable fix suggestions (#547).
v0.0.12628 AprTail-recursive iteration runs in constant stack space (#517).
v0.0.12729 Apr@Nat subtraction soundness hole closed (#520).
v0.0.1285 MayWASM call translator critical safety fixes (#475).
v0.0.1295 MayWASM call translator major correctness fixes (#475).
v0.0.1305 MayPair-type closure captures preserve their len field (#535).
v0.0.1315 MayGC infrastructure batch (#487).
v0.0.1325 MayOpaque-handle GC-rooting hygiene (#347).
v0.0.1335 MayIterative array builders no longer leak closure return-value root (#570).
v0.0.1346 MayActive reclamation of host-store handles via heap-wrap-as-ADT (#573).
v0.0.1356 MayThree codegen bug fixes (#584).
v0.0.1366 MayTwo host-runtime hygiene fixes (#586).
7 Mayexamples/life.vera: Conway's Game of Life with nested array combinators, a recursive <IO> loop, ANSI rendering, and the formal B3/S23 rule on next_cell.
7 MayVERA_EAGER_GC=1 debug knob: GC on every $alloc so missing-shadow-root bugs surface immediately (documented in ENVIRONMENT.md).
v0.0.1377 MayCaptured-Array<T> indexing inside a closure body (#588).
v0.0.1387 MayClosure-return shadow-push asymmetry (#593).
v0.0.1398 MayClosure codegen pair: f()[i] element-type inference (#614) and capture ordering.
v0.0.1408 MayString-returning FnCall in interpolation (#602).
v0.0.1418 MayInline-refinement return types in interpolation, the third trigger in the same bug class.
v0.0.1428 MayStructural close of the string-interpolation bug class across its four remaining sibling sites (#630).

On 7 May the first agent-written Life ran 200+ generations of Gosper Glider Gun, R-pentomino, and Pentadecathlon with zero corruption; v0.0.142 closed the campaign's last bug class structurally.


Stage 13: Stabilisation and memory safety (10–29 May)

Twenty days. The enforcement infrastructure, then the end of the GC bug class.

First the gates: Windows in CI, walker-completeness enforcement, the stress harness, fail-closed testing. Then the memory-safety arc that ended the conservative-GC retention and host-store reclamation bugs, emptying the runtime-workarounds table by v0.0.160.

VersionDateWhat shipped
v0.0.14310 MayWindows joins the CI matrix fully strict (#640).
v0.0.14411 MayTier A bug burn-down closed four checker and codegen issues (#633).
v0.0.14511 MayMono-suffix bug fix plus template-warning suppression (#604).
v0.0.14612 MayRefinement-of-Array element inference (#655).
v0.0.14712 MayCross-module _fn_ret_type_exprs propagation (#628).
v0.0.14812 MayType-alias arity check E133 (#660).
v0.0.14912 MayCyclic type aliases now produce E132 (#648).
v0.0.15012 MayNested type aliases through Array<...> compile and run (#559).
v0.0.15112 MayWalker-completeness audit with pre-commit enforcement (#597).
v0.0.15213 MayStress-test harness for scale-dependent regression coverage (#596).
v0.0.15313 MaySMT translator covers FloatLit / IndexExpr / ArrayLit in contracts (#667).
v0.0.15413 MayGC-aware tail-call optimization for allocating functions (#549).
v0.0.15513 MayWrapper-handle bit-31 tagging closes the last conservative-GC retention bug (#578).
v0.0.15619 Mayvera test fails closed on verifier-refuted contracts (#674).
v0.0.15719 MayIO.read_char effect operation for single-character input (#618).
v0.0.15819 MayHost-side shadow-stack rooting closes the last GC-during-host-walk corruption bug (#692).
v0.0.15928 MayMap<K, T_heap> and Set<T_heap> no longer drop heap-pointer values under GC pressure on either target (#695).
v0.0.16029 MayCtrl-C-during-host-import handling centralized on wasmtime>=45.0.0, removing the four per-import workaround guards (#599).

After v0.0.160 the known GC bug surface was clear, the runtime-workarounds table was empty, and attention turned to the editor loop.


Stage 14: The language server (10–12 June)

The compiler learns to hold a conversation.

Proof obligations became first-class records with a warm Z3 session, and the LSP server grew from transport skeleton to proof-delta workflows that agents call directly.

VersionDateWhat shipped
v0.0.16110 JunProof obligations reified as first-class records with a warm-Z3 VerificationSession (#222 Phase A).
v0.0.16210 JunIncremental verification: unchanged functions replay cached obligations instead of re-entering Z3 (#222 Phase B).
v0.0.16310 Junvera lsp serves LSP over stdio (#222 Phase C).
v0.0.16410 JunLSP language features: diagnostics, hover, go-to-definition, completion (#222 Phase D).
v0.0.16511 Junvera/speculativeEdit reports whether an edit keeps, breaks, or strengthens the program's proofs (#222 Phase E).
v0.0.16611 Junvera/proposeEdit: edit, verify, and apply in one method, only when the proof delta is non-breaking (#222 Phase F1).
v0.0.16711 Junvera/strengthenContract: contract edits gated by a call-site precondition audit (#222 Phase F2).
v0.0.16811 Junvera/addEffect propagates an effects(...) change across a function and its callers in one verified edit (#222).
v0.0.16911 JunThe language server gets a user manual and a VS Code LSP client (#222 follow-up).
v0.0.17012 JunEditor hovers carry the same Fix: instructions as --json, exactly once per call site (#728).

After v0.0.170 the editor loop was complete, and attention turned to the verifier's soundness gaps.


Stage 15: The soundness campaign (15 June – 1 July)

Closing the gap between what the verifier proves and what the runtime does.

A sustained audit of every place where vera verify could prove a postcondition the runtime then violated — the Tier-0 silent-unsoundness burn-down, then pushing what remained up to Tier 1. Each hole became an auto-synthesised obligation: discharged statically where the value is provably in range, a loud compile error where it provably is not, and a runtime guard otherwise.

VersionDateWhat shipped
v0.0.17115 JunMap and Set host storage moved to bucket-as-truth, ending the dual Python/JS mirror (#706).
v0.0.17216 JunThe @Nat >= 0 invariant is obligation-checked at every binding site, not just @Nat subtractions (#552).
v0.0.17317 JunThe @Nat >= 0 narrowing obligation now reaches projection and instantiation sites (#747).
v0.0.17419 JunGeneral refinement-type predicates ({ @T | P }) are now verified statically (#746).
v0.0.17521 JunGeneric function bodies are statically verified at each concrete instantiation instead of being deferred to runtime (#732).
v0.0.17621 JunA call's precondition is checked even when its result is discarded (#730).
v0.0.17721 JunInteger division/modulo by zero and array-index bounds now carry auto-synthesised obligations (#680).
v0.0.17825 Junvera builtins/effects/errors --json make the compiler the source of truth for its own registries (#539).
v0.0.17926 JunSoundness pass on smt.py: signed division/modulo and assert are modelled correctly for Tier-1 verification (#392).
v0.0.18026 Jun@Float64 contracts are verified against Z3's IEEE-754 sort, so Tier-1 proofs match the runtime (#797).
v0.0.18127 Jun@Int / @Nat arithmetic overflow now traps instead of silently wrapping (#798).
v0.0.18227 Junstring_length is modelled soundly for UTF-8 byte length, deferring non-literals to Tier 3 (#802).
v0.0.18327 JunMore @Float64 built-ins gain Tier-1 modelling, and integer literals are range-checked against their target machine type (#807).
v0.0.18428 JunChapter 8 (modules) gains eight conformance programs with negative-test (expected_error) support (#679).
v0.0.18528 JunRedefining an opaque, verifier-modelled built-in is now a checker error, closing a verify/run soundness hole (#815).
v0.0.18629 Jun@Nat@Int widening is now sound: a value above i64.MAX no longer reinterprets to a negative @Int (#813).
v0.0.18730 JunInteger-overflow runtime traps now carry a precise overflow trap kind instead of the generic unreachable (#808).
v0.0.18830 JunEvery diagnostic is gated for spec-accurate rationale and spec_ref metadata, plus a fix for errors (#682).
v0.0.1891 JulThe UTF-8 "safe decode" invariant is centralised behind one safe_utf8_decode helper, replacing six brittle source-grep tests with behavioural coverage (#592).
v0.0.1901 JulText I/O (files and subprocess captures) is UTF-8 regardless of host locale, gated in pre-commit/CI, letting the PYTHONUTF8 backstop be removed (#645).
v0.0.1911 JulType-check-impossible codegen guards raise CodegenInvariantError ([E699]) instead of silently returning None (#657).

Stage 16: The server-effects sprint (2–3 July)

From concurrent <Async> to a served <HttpServer> — the road to WASI.

Demo-first: each stage ships a working capability, cut as its own release, on the way to Vera programs serving verified HTTP. Groundwork recorded in WASI.md (the executed toolchain spike: component-text instantiation, host threading, wasmtime serve).

VersionDateWhat shipped
v0.0.1922 JulConcurrent <Async>: async(Http.get/post) runs on a host worker thread, await blocks for it, W002 marks the eager remainder (#841); rides with the #420/#419/#839 test-oracle splits.
v0.0.1932 Jul<HttpServer>: total contract-checked handlers served over HTTP by vera serve with instance-per-request isolation (#305).
v0.0.1942 JulExperimental WASI Preview 2 target: --target wasi-p2 emits a binary component that runs IO+Random programs under any stock wasip2 host (#237).
v0.0.1952 JulThe wasi:http serve backend: --world server packages a verified handle(Request -> Response) program as an incoming-handler component that stock wasmtime serve runs unmodified (spec §13.7).
v0.0.1962 JulPost-sprint consolidation: prelude skip-warnings silenced with <prelude> attribution (#851), apply_fn typed as a checker special form (spurious E200 gone, misuse now check-time errors), and a docs/site/examples sweep surfacing HttpServer + WASI.

Stage 17: The v0.1.0 bug burndown (4 July)

Zero known bugs, then the first minor release.

A single integration branch absorbed a fix for every open bug-labelled issue — 37 in all, each on its own adversarially-reviewed PR, the severest being silent wrong results (ADT ordering and non-Eq == compiled to pointer comparisons, now rejected at check). With the tracker empty, v0.1.0 shipped with the literal "No known bugs."

VersionDateWhat shipped
v0.1.04 JulZero known bugs — the first minor release: 37 bug-labelled issues fixed on one integration branch.

Stage 18: The visual documentation pass (8 July)

The language explains itself.

Three external PRs hardened the self-checking machinery, and their adversarial review surfaced a verifier-soundness fix (#957). Then the documentation itself: a 34-figure hand-authored SVG layer across the spec, the compiler README, the top-level docs, and the landing page; a six-auditor consistency sweep; the last bug-era shapes retired from the test suite; and the roadmap reworked into staged sprints that continue this file's numbering.

VersionDateWhat shipped
v0.1.18 JulThe visual documentation release — 34 figures, a six-auditor consistency sweep, three external PRs, and the #957 verifier-soundness fix.

Stage 19 and Stage 20: The dual-threaded start (9 July onwards)

Two sprints at once.

Stages 19 and 20 run dual-threaded: community PRs against the single-source sprint's table landed first — the scheduled limitations-sync workflow (made failure-proof in review), the advisory Linux aarch64 lane, and the diagnostic-fields gate-honesty pair — while the verification-completeness campaign follows. The pre-release sweep also caught an E009 crash, fixed in the release, and retired two CI workarounds whose removal triggers had fired.

VersionDateWhat shipped
v0.1.29 JulThe gate-hardening batch — scheduled limitations-sync, the arm64 advisory lane, the gate-honesty pair (#956), and the E009 crash fix from the pre-release sweep.
v0.1.310 JulMonomorphizer completeness (#769) — registry-complete builtin return tables, recursive type-argument unification, and the scope-aware De Bruijn reindex walker.
v0.1.411 JulThe second burndown — 19 bug fixes across the checker, verifier, and codegen: the fresh-ctor-var family under forall, where-helper scoping, handle[State<T>] clause execution, the @Nat/@Int obligations, and imported-body compilation (#991).
v0.1.517 JulThe third burndown and the first PyPI release — 29 bug-labelled issues fixed across the checker, codegen, and diagnostics, published to PyPI as veralang (#737).
v0.1.620 JulThe comment system — block comments nest, malformed ones get their own E02x diagnostics, annotation labels reach the AST, and vera fmt stops deleting comments it had silently dropped since the formatter was written (#1112).
v0.1.724 JulSQL injection won't compile — the built-in <DB> effect and a literal-provenance checker that makes SQL injection a compile-time error (#309: E207/E208/E209), plus the bare-effect-op routing check (E217) and a Float64 rounding-assertion CI-flake fix.
v0.1.827 JulEditors and toolchain hygiene — the VS Code extension reaches the Marketplace (#1106).
v0.1.94 AugThe declarable-trap purge — the reserved-name family completes under E153 (#1187).
v0.1.1012 AugThe handler-machinery consolidation — 37 bugs fixed by giving each fact one derivation (#1213).
v0.1.1113 AugThe community-PR queue clears — seven third-party contributions reviewed and merged.
v0.1.1215 AugThe twelve-group burndown — refusal rails, the JSON accept domain, throw-payload guards, branch-join monomorphization, and release and spec-drift gates.
v0.1.1321 AugThe inference response-shape fixInference.complete selects text by block type, and every failure names its provider.

By the numbers

Ten releases, chosen for the capability each one unlocked rather than even spacing.

Growth across the ten landmark releases: tests from ~50 to 7,992, conformance programs from 0 to 163, examples from 13 to 39, built-in functions from 0 to 164.

Metricv0.0.1 (23 Feb)v0.0.9 (23 Feb)v0.0.65 (4 Mar)v0.0.101 (27 Mar)v0.0.170 (12 Jun)v0.0.191 (1 Jul)v0.0.193 (2 Jul)v0.0.195 (2 Jul)v0.1.0 (4 Jul)v0.1.5 (17 Jul)
MilestoneFirst releaseRuns end-to-endGC + maturityInference effectLanguage serverSoundness campaignHttpServer effectWASI serve backendZero known bugsFirst PyPI release
Compiler layersParser5 (full pipeline)5 + modules + GC5 + modules + GC + browser5 + modules + GC + browser + LSP5 + modules + GC + browser + LSP5 + modules + GC + browser + LSP5 + modules + GC + browser + LSP + WASI5 + modules + GC + browser + LSP + WASI5 + modules + GC + browser + LSP + WASI
Tests~50~300~1,4003,0954,3425,5595,6155,8086,7797,992
Examples13151830353536363739
Built-in functions00~30122164164164164164164
Conformance programs0006489103104104143163
Spec chapters7101213131313141414
Python coverage90%96%95%95%95%95%95%95%

Total: 2,000+ commits, 211 tagged releases, 103 active development days.