Astralang
A gilded and silver celestial globe from 1579, driven by clockwork and carried on a winged horse.

Progress tracker

This page mirrors the tracker maintained inside the repository. Every "shipped" claim below is backed by a passing test; the suite stands at 907 passed, 0 failed, 0 ignored for the v0.13.11-alpha release.

v0.13.11-alpha
Released, with 907 tests, for macOS and WebAssembly (Linux and Windows follow)
907 tests
Released: functions as values and sized integers (v0.13.11); richer enums, patterns and generic structs (v0.13.10); @derive(Eq, Show) (v0.13.9)
Trait objects
Next (dyn Trait), then Set, slicing and comprehensions

Where each version stands

Every release from v0.6 to v0.12 is complete, v0.13 is shipping in small releases, and v1.0 has not started.

v0.6
100%
v0.7
100%
v0.8
100%
v0.9
100%
v0.10
100%
v0.11
100%
v0.12
100%
v0.13
100%
v1.0
0%
ReleaseScopeStatus
v0.6 alphaNative core, JSON diagnostics, verify modedone
v0.7Source spans, semantic core native, REPL, closures, dyn, ARC scaffolding, rich diagnostics, Mifa registry protocol + publishreleased 2026-07-06
v0.8True LLVM-IR default backend, async/await (sync lowering), end-to-end regression suite, ignored-test burn-down 10 → 0released 2026-07-07
v0.9Soundness & hardening: nominal structs, enums with payload variants, ? operator + try/catch, tuples, impl blocks, bitwise ops, callable closures, ARC scope-based reclamation, compiler-never-panics on malformed input, CI gates (fmt / clippy / audit / llc corpus), cross-platform release binaries (Linux, macOS ×2, Windows)v0.9.1-alpha released 2026-07-15
v0.10 – v0.11Tree-walking interpreter behind astra run with parity tests and differential fuzzing against native; modules (import, pub, util::f(), E0013); mifa build/run with path dependencies as modules; runtime traps for overflow, division by zero, bad shifts, out-of-bounds and runaway recursion on both engines; def alias (A4); type inference for omitted parameter/return types (A3); Python-style indentation is the canonical syntax (braces still accepted) and astra fmt converts to it; functions may be called before they are defined; a match that misses an enum variant is a compile error (E0021); s.split(); Cargo-style astra.toml and mifa test; structs/lists are values, mut parameters + E0022, read-only bindings (A8); a[i] = v; headered string literals (E0); nominal traits (trait Shape: + impl Shape for Circle:, E0020) and trait bounds fn f<T: Shape> with static dispatch; v0.11.1: released binaries compile natively (C runtime embedded)v0.11.1-alpha released 2026-11-02
v0.11.2Trait bounds checked at the call site and impl signatures checked against the trait (E0020); while-loop locals, list copies and struct list fields freed (loops stay ~1.3 MB); tuples holding structs compile; 712 testsv0.11.2-alpha released 2026-11-02
v0.12Every type error in the main file carries the line and column of its statement, a function reports all its independent errors in one run, and E0014 points at the offending built-in call; machine-applicable fix edits on E0002/E0003 (misspelt names) and E0022 (missing or extra mut) plus astra fix <file>; single-owner locals freed on every exit, strings returned from functions, lists of fresh strings and template-literal intermediates freed (the measured cases drop from 20–231 MB to 1.3 MB peak); bools print true/false on both engines; ==/!= only on int/float/bool/str; native crash on let b = a for strings fixed; mifa --version; mifa search says the registry is not deployed; a 55-check black-box release suite; 754 testsv0.12.0-alpha released 2026-11-04
v0.13astra mcp for AI agents, runtime error codes, Astra as WebAssembly and the browser playground; string methods; Map<K, V> and list sorting; any value in Result / Option; calling C and a static Mifa registry; eight correctness fixes from probe programs; elif, default arguments, sqrt; the Python habits models write first and trait default methods; @derive(Eq, Show); multi-field enum variants, struct / tuple / range / | patterns, tail-expression returns, generic structs; functions as values (map, filter, fold, fn(..) parameters) and sized integers with as; 907 testsv0.13.11-alpha released 2026-11-12
NextTrait objects (dyn Trait); storing and returning functions; Set, slicing, comprehensions and a math module; @derive on enums and the other standard traits; fixes for E0021 and E0020; the remaining memory leaks; LSP alpha, stdlib core; then tool / agent / prompt / memory keywords, agent SDK, sandboxplanned
v1.0GPU target (NVPTX), production tooling, hosted Mifa registryplanned

Language feature matrix

The globe shows every feature by status; the table gives each one's evidence.

FeatureStatusNotes
Lexer / parser / ASTworkingFull token + column tracking; returns diagnostics instead of panicking on malformed input (v0.9)
Type checking + inferenceworkingAd-hoc inference + checking for the core language; omitted parameter/return types are inferred (call sites + body operators). Since v0.13.11 the checker records every expression's type, and a pass after checking uses it (the range checks of sized integers); a full Hindley-Milner solver is still unwired
Native compilation (LLVM IR → binary)workingDefault path since v0.8: IR → opt → llc → link; release binaries built for Linux x64, macOS x64/ARM64, Windows x64 (v0.9.1)
--emit-ir / --target cross-compilev0.8Prints LLVM IR; --target emits target object files (llc -mtriple); astra build -O and mifa build --release optimise at -O3
Functions, recursion, control flowworkingif/else, while, do/while, for-range, switch, ternary
Arrays + .push()workingBounds-checked; iteration, membership (in), honest .length(); push-then-read in statement position fixed v0.9
Structs (nominal, typed field access)workingNamed literals typed nominally, same-shape structs are distinct types; mutable fields; native GEP loads, nested access
Enums + matchv0.13.10Unit variants and variants with one or several values (Rect(float, float), v0.13.10), match in expression and statement position, exhaustive (E0021); patterns: literals, variants, guards, and since v0.13.10 structs (Point { x: 0, y, .. }), tuples, ranges (0..10, 0..=9) and |. Not yet: a variant pattern nested inside a struct or tuple pattern, struct-style variants
Result<T,E> + match + ?workingOk/Err paths, match binding; ? unwraps Ok/Some or early-returns Err/None (v0.9); since v0.13.2 any payload (structs, floats, lists); unwrap / unwrap_or / is_some / is_ok since v0.13.8
try / catchv0.9 (local)Lowered as function-local control flow, no unwinder, so a throw in a called function still aborts; use Result + ? across functions
Closures (defined and called)v0.13.11Lambda-lifted before type checking, for both engines; captures copied at definition; |x| x * 2 needs no braces. Since v0.13.11 lists take closures and function names (map, filter, any, all, count, find, fold, sum, enumerate, zip) and functions take fn(int) -> int parameters. Not yet: storing or returning functions, closures inside closures
Interpreter (astra run)v0.10Tree-walking, no LLVM needed; parity-tested and fuzzed against native, same stdout and exit code
Modules (import, pub, util::f())v0.10v0: enum variant names are global; programs from stdin/REPL cannot import
Runtime safety trapsv0.10Overflow, division by zero, shifts outside 0..63, out-of-bounds and runaway recursion stop with Runtime error, exit 1, on both engines; since v0.13.11 also a sized integer leaving its range (integer overflow: 300 does not fit in u8)
Tuples + destructuringv0.9(a, b), t.0, let (a, b) = e, tuple types; arity mismatches rejected (E0017)
impl blocksv0.9Instance methods and associated functions (Type::new())
Generics (monomorphized fns)v0.13.10Generic functions specialize per concrete type; generic structs (struct Stack<T> with impl<T> methods) since v0.13.10, one concrete struct per type in native builds. Not yet: methods with their own type parameters on a generic struct (native)
Vec<int> (minimal)v0.9 sliceVec::new() + push/read over the array runtime; typed Vec<T> annotations don't parse yet
String interpolation ${}workingRuntime-value interpolation, .length(), .to_string(), concat, string-method suite
String methods and charactersv0.13.1split, trim, substring, contains, index_of, and since v0.13.1 starts_with/ends_with, replace, char_at(i) (byte-indexed; out of range is R0004), chars() and for c in s (one str per UTF-8 character), < <= > >= on strings (byte order). Both engines, same output
Bitwise + compound operatorsv0.9& | ^ ~ << >> with Python-parity precedence; += family, **, radix literals
Float arithmetic / comparev0.7Native fadd/fcmp; an int becomes a float with .to_float() (no automatic promotion yet: int * float is a type error); sqrt since v0.13.6
Sized integers + asv0.13.11u8, u16, u32, i8, i16, i32 beside 64-bit int; every result range-checked on both engines, as in Rust; a literal takes the other side's type and must fit; mixing types needs as (x as u8 wraps, f as int truncates). Not yet: u64/usize
elif, default arguments, sqrtv0.13.6elif in both syntaxes; literal default values for trailing parameters, filled in at the call on both engines (no keyword arguments yet); sqrt of an int or float. Linux binaries of v0.13.6-alpha fail to link a sqrt of a run-time value; fixed in v0.13.7
JSON diagnostics with line + columnworkingSince v0.12: every type error in the main file carries the line and column of the statement that raised it (human output (line N, column M)), a function reports all its independent errors in one run, and E0014 points at the offending built-in call; errors in imported modules and function signatures still have no line
Machine-applicable fixes + astra fixv0.12Diagnostics carry "fix": {"edits": [...]} when the repair is unambiguous: misspelt variable/function names (E0002/E0003, did you mean 'total'?) and a missing or extra mut at a call (E0022). astra fix <file> applies them, re-verifies, repeats and writes the file. Fixes for E0021 and E0020 are next
Rich diagnostics: error_code, suggestion, astra explainv0.7Stable E0001–E0022 codes
astra replalphaWhole-program re-compile model
dyn gradual typingv0.7First milestone: boundary typecheck + boxed lowering
ARC memory reclamationworking, partialSingle-owner structs, strings, tuples, arrays freed at loop-body + function scope with retain-on-alias; 2M-iteration loops ~1.3 MB (were 98–194 MB), in for and while loops, including list copies and struct list fields. String-aliased values, lists of heap values and some non-loop scopes still leak, bounded and safe, never a double-free. Since v0.12, single-owner locals are freed on every exit (fall-through, return, break, continue), strings returned from functions, lists of fresh strings and template-literal intermediates are freed; peak RSS 231 MB → 1.3 MB for a helper building a struct/list/tuple called 1M times, 47 MB → 1.3 MB for a returned str bound in a loop ×1M, 20 MB → 1.3 MB for a list of fresh strings or a template literal ×200k, with identical output on both engines. Still leaking: locals inside if/match branches, locals passed to calls, stored or reassigned, exits via ?/throw, str fields of structs
async / awaitv0.8Parses + compiles natively; synchronous lowering, real task runtime still ahead
Printing and equalityv0.13.9Bools print true/false on both engines; ==/!=, print and ${} work on int/float/bool/str, and on structs with @derive(Eq, Show) (v0.13.9); on enums, tuples, lists, Option and Result they are a type error (native compared pointers), and xs.pop() is refused
Traits + generic structsv0.13.10Nominal traits (trait Shape: + impl Shape for Circle:) with E0020 conformance; trait bounds fn f<T: Shape> checked at the call site, static dispatch; trait default methods (v0.13.8); @derive(Eq, Show) on structs (v0.13.9); generic structs (v0.13.10). Next: trait objects (dyn Trait), derive on enums, the other standard traits
Not implemented yetplannedTrait objects (dyn Trait), storing or returning functions, Set, comprehensions, list pop/slicing, math beyond sqrt (pow, floor, trig), int * float without .to_float(), u64/usize, indented try:/catch e:, @derive on enums, await in the interpreter, spawn, tool/agent keywords
WASM targetplanned--target=wasm32-wasi emits a wasm object today; a WASI runtime build (for runnable .wasm) is next. The compiler itself already runs as WebAssembly: the browser playground and a Node runner (v0.13.0)
Python interopplannedEmbedded CPython, ratified decision
tool/agent/prompt/memoryplannedAgent-native keywords
GPU kernels (NVPTX)v1.0

Ignored-test burn-down

A release KPI: tests stay ignored until the feature truly works end-to-end, and the count must shrink every release. It is complete: 10 → 0 and has stayed at 0 since 2026-07-07. The end-to-end regression suite (tests/regression_tests.rs) has grown from 14 to 108 tests, each locking a shipped feature through compile → IR → native run → stdout/exit-code assertions. CI also gates every commit on cargo fmt, clippy -D warnings, cargo audit, and an llc IR-validity corpus.

Release testing v0.12

A black-box release suite tests the downloaded binaries, not the source tree: 69 checks covering programs on the interpreter and native, modules, calling C, error codes and lines, astra fmt, astra fix and the Mifa flow, workspaces included. It runs on every platform before a release publishes, and a failure on any platform stops the release. v0.13.11-alpha scores 69/69 on macOS (Apple Silicon); v0.13.5-alpha scored 63/63; v0.13.2-alpha scored 60/60. v0.12.0-alpha's Windows run found that programs compiled but did not link there; v0.12.1 fixed it. v0.11.2-alpha scored 52/55 (mifa search failed).

The work queue, in priority order

v0.8 and v0.9 are closed, and the narrow & harden phase (rows 1–8) is done. The current phase is parity: Rust's language features first, then Python's, each on both engines with parity tests. The order of attack:

#AstraStatus / why it's next
1Robustness: compiler never panicsdone 2026-07-13, lexer/parser return diagnostics instead of crashing on malformed input; CI gates every commit on fmt, clippy -D warnings, cargo-audit, and an llc IR-validity corpus
2Callable closuresdone 2026-07-13, root cause was pipeline order (closure-lift now runs before typecheck); v0 is int-typed closures on the default path
3ARC scope-based reclamationdone 2026-07-15, single-owner structs, strings, tuples, arrays freed at loop-body and function scope; retain-on-alias; 2M-iteration loops now run in ~1.3 MB (were 98–194 MB). String-aliased values still leak (bounded, safe)
4Interpreter with native paritydone 2026-10-27, astra run interprets (no LLVM needed; the slot-resolving redesign landed 2026-10-30, so it now beats CPython on loops, floats and arrays and is close on branches); every feature is tested for identical stdout and exit code against the native binary, and a fuzzer generates programs that must agree on both. Overflow, division by zero, bad shifts, out-of-bounds and runaway recursion now stop with a runtime error on both engines
5Modules v0done 2026-10-28, import util;, pub items, util::f() names; resolved before type checking so both engines get them; cycles, missing modules and private items are E0013 at the import line
6Program input and outputv0.10 Command-line arguments, stdin, files and environment variables, with capabilities
7Consolidate the two codegen pathsDone 2026-11-01: the legacy backends (--llvm-native, --legacy-c) were removed; ir.rs is the only code generator
8Machine-applicable fixesv0.12 Diagnostics carry fix edits for misspelt names (E0002/E0003) and a missing or extra mut (E0022), and astra fix applies them; fixes for a missing match arm (E0021) and a missing trait method (E0020) are next
9Rust parity: traits, generics, functions, integersTrait bounds (v0.11), trait default methods (v0.13.8), @derive(Eq, Show) (v0.13.9), multi-field variants, richer patterns and generic structs (v0.13.10), functions as values and sized integers (v0.13.11) are done; next is trait objects (dyn Trait), then Python parity: Set, slicing, comprehensions, math
10Remaining memory leaksLocals inside if/match branches, locals passed to calls, stored or reassigned, exits via ?/throw, and str fields of structs still leak (bounded, safe)
11LSP alpha + stdlib core (astra fmt shipped)Diagnostics-on-save first (reuses the JSON pipeline); collections/string/fs surface
#MifaWhy it's next
Donemifa build / run with path dependenciesdone 2026-10-28, builds target/<name>, dependency src/ folders are module folders, build --json reports the binary path; add --path validates the package
1Real mifa test discovery + project-wide mifa verifyThe last gaps in the agent-native local story: verify checks only the manifest and layout today
DoneStatic package registry + real mifa publishv0.13.3, a registry is a folder or any static web host: mifa publish writes a version into a folder, mifa add <name>, mifa yank, mifa search; web registries are read-only
2Central hosted registryAccounts and uploads over HTTP, so publishing no longer means uploading a folder yourself; --dry-run stays as the local pre-flight

Guiding rule: no hosted registry before the local --json story is complete. Stretch items, WASM target, Python-interop alpha, real async runtime, follow the big rocks.

From the first lexer to v0.13

Each release on one line, oldest first. Test counts are the suite at the time of the release.

  1. Oct 2025 v0.1

    The idea becomes code: a language as easy as Python, as safe and fast as Rust, built for agentic coding. Lexer, parser and the first AST.

  2. Oct 2025 v0.4

    The package manager gets its name: Mifa.

  3. Nov 2025 v0.5

    Native compilation, Docker CI, first pre-built binaries.

  4. Jun 2026 v0.6 alpha

    Honest alpha reset: JSON diagnostics, verify mode, the AI-first verify-repair-compile loop.

  5. Jul 6, 2026 v0.7

    Source spans, structs / Result / closures native, REPL, dyn, ARC scaffolding, rich diagnostics with astra explain; Mifa lockfile and registry protocol.

  6. Jul 7, 2026 v0.8.0-alpha

    The true LLVM-IR backend becomes the default; async/await (synchronous lowering); ignored tests 10 → 0. 285 tests

  7. Jul 7, 2026 v0.8.0.1-alpha

    Rust and Go join the cross-language benchmark suite, with every program's output checked.

  8. Jul 9, 2026 v0.9.0-alpha

    Soundness: nominal structs, enums with payloads, ? and try/catch, tuples, impl blocks, bitwise operators.

  9. Jul 15, 2026 v0.9.1-alpha

    First cross-platform binary release (Linux, macOS ×2, Windows); callable closures; ARC memory reclamation; the compiler never panics on malformed input. 449 tests

  10. Oct 30, 2026 v0.10.0-alpha

    Interpreter behind astra run with native parity and differential fuzzing; modules; program I/O with capabilities; runtime traps on both engines; mifa build / run. 609 tests

  11. Nov 2, 2026 v0.11.0-alpha

    Value semantics (structs and lists are values, mut parameters, E0022, a[i] = v), Python-style indentation and astra fmt, type inference, nominal traits and trait bounds with static dispatch. 695 tests

  12. Nov 2, 2026 v0.11.1-alpha

    Released binaries compile natively: the C runtime is embedded in the compiler, and macOS links for the compiler's own architecture. 699 tests

  13. Nov 2, 2026 v0.11.2-alpha

    Trait bounds checked at the call site and impl signatures checked against the trait (E0020); loops no longer leak memory (while bodies, list copies, struct list fields); every release binary is smoke-tested before publishing. 712 tests

  14. Nov 4, 2026 v0.12.0-alpha

    Every type error in the main file carries its line and column; machine-applicable fixes and astra fix; single-owner locals freed on every exit (a helper building a struct/list/tuple, called 1M times: 231 MB → 1.3 MB peak); bools print true/false; == only where it compares by value; mifa --version and an honest mifa search; a 55-check black-box release suite on every platform. 754 tests

  15. Nov 5, 2026 v0.12.1-alpha

    Native builds on Windows; print and ${} refuse values that native code printed as heap addresses; xs.pop() refused until it returns an Option; the release check now blocks a release on any platform. 756 tests

  16. Nov 5, 2026 v0.12.2-alpha

    Three native wrong answers fixed, all found by writing real programs: nested structs that share a field name, a f(mut x)? statement, a bool inside a Result. 20 showcase and 8 real-world examples, each checked against a Python version on both engines. 760 tests

  17. Nov 5, 2026 v0.13.0-alpha

    astra mcp: a Model Context Protocol server, so any AI agent can verify, fix, run, build and test Astra, whatever the model. Runtime errors carry stable codes (R0001–R0007). Astra as WebAssembly, with a Node runner, and the browser playground. 777 tests

  18. Nov 6, 2026 v0.13.1-alpha

    The string methods of a first hour with Astra: char_at, chars(), for c in s, starts_with, ends_with, replace, and < / > on strings, on both engines. Mifa version requirements follow Cargo's rules and pick the newest version by semver. 796 tests

  19. Nov 6, 2026 v0.13.2-alpha

    Everyday programs without workarounds: Map<K, V>, list sort and sort_by_key, and any value in Result / Option. All eight real-world programs were rewritten to use them. Mifa fetches git dependencies, solves versions across the whole graph and builds workspaces. 831 tests

  20. Nov 6, 2026 v0.13.3-alpha

    Calling C: extern "c" fn with int, float, bool and str, and @link for libraries. Mifa reads a static, self-hosted package registry (a folder or any static web host): mifa publish, mifa add <name>, mifa yank, mifa search, SHA-256 checksums pinned in the lockfile. 847 tests

  21. Nov 10, 2026 v0.13.5-alpha

    No new language features: about 74 probe programs, run on both engines, found eight bugs, now fixed. Struct literals are typed by their name, a range loop's end is evaluated once, xs.push(v) is type-checked, and assignment evaluates the value first. astra --version reads Cargo.toml, and the release build checks that tag, Cargo.toml and binaries agree. 856 tests

  22. Nov 11, 2026 v0.13.6-alpha

    elif in both syntaxes, default arguments (literal, trailing; a call may leave them off) and sqrt, on both engines. A compound assignment's index runs once. The agent benchmark runs against any model provider, hosted or local, with keys kept out of files and logs. Known issue: on Linux, a sqrt of a value computed at run time fails to link; v0.13.7-alpha fixes it. 868 tests

  23. Nov 11, 2026 v0.13.7-alpha

    Linux fixes: native builds link the C math library, so a sqrt of a run-time value links, and every NaN prints as nan. Windows stays on v0.13.6-alpha (same language). 868 tests

  24. Nov 11, 2026 v0.13.8-alpha

    The Python habits a model writes first: and / or / not / not in, single-quoted strings, trailing commas, if as a value (a if c else b), statements continued on the next line, unwrap / unwrap_or / is_some / is_ok, clearer errors for import std, and trait default methods. 877 tests

  25. Nov 11, 2026 v0.13.9-alpha

    @derive(Eq, Show) on structs: == compares field by field and print shows Point { x: 1, y: 2 }. A struct field whose type ends with > no longer breaks parsing. Linux and Windows builds follow. 880 tests

  26. Nov 11, 2026 v0.13.10-alpha

    Enum variants with several values (Rect(float, float)); struct, tuple, range (0..10, 0..=9) and | patterns in match; a function's last expression is its return value; generic structs (struct Stack<T>) with impl<T> methods. A native fn main() without a return type exits 0. Linux and Windows builds follow. 893 tests

  27. Nov 12, 2026 v0.13.11-alpha current

    Functions as values: lists take functions (map, filter, fold, sum, ...), enumerate / zip, and functions take fn(int) -> int parameters. Sized integers (u8 to i32) with every result range-checked, as in Rust, and as conversions. Linux and Windows builds follow. 907 tests

  28. Next Trait objects and collections planned

    Trait objects (dyn Trait); storing and returning functions; Set, slicing, comprehensions and a math module; @derive(Hash, Ord) and derive on enums; fixes for E0021 and E0020; the remaining memory leaks.

  29. v1.0 v1.0 planned

    GPU target, production tooling, hosted Mifa registry; the source opens at v1.0-beta.

Release scope table ↓ · Project story

Every release, in three dimensions

Each column is a release, as tall as its test suite; the latest is darkest. Drag to turn it, or use the arrow keys to step through the releases.

VersionDateTestsWhat changed
v0.13.11-alpha2026-11-12907Functions as values: list map, filter, any, all, count, find, fold and sum with closures or function names, enumerate and zip, for (i, x) in, and fn(..) parameters; sized integers (u8, u16, u32, i8, i16, i32) with every result range-checked, as in Rust, and `as` conversions. Linux and Windows builds follow.
v0.13.10-alpha2026-11-11893Enum variants with several values (Rect(float, float)); struct, tuple, range (0..10, 0..=9) and | patterns in match; a function's last expression is its return value; generic structs (struct Stack<T>) with impl<T> methods; a native fn main() without a return type exits 0. Linux and Windows builds follow.
v0.13.9-alpha2026-11-11880@derive(Eq, Show) on structs: == compares field by field and print shows Point { x: 1, y: 2 }; a struct field whose type ends with > no longer breaks parsing. Linux and Windows builds follow.
v0.13.8-alpha2026-11-11877The Python habits a model writes first: and/or/not and not in, single-quoted strings, trailing commas, if as a value (a if c else b), statements continued on the next line, unwrap / unwrap_or / is_some / is_ok; trait default methods; clearer errors for import std. Linux and Windows builds follow.
v0.13.7-alpha2026-11-11868Linux fixes: native builds link the C math library (sqrt of a run-time value failed to link with v0.13.6-alpha) and every NaN prints as nan. Windows stays on v0.13.6-alpha.
v0.13.6-alpha2026-11-11868elif in both syntaxes, default arguments (literal, trailing) and sqrt, on both engines; a compound assignment such as shelf[find(k)].qty -= n runs its index once; the agent benchmark runs against any model provider with keys kept out of files and logs.
v0.13.5-alpha2026-11-10856Eight correctness fixes found by about 74 probe programs on both engines: struct literals typed by name, range end evaluated once, xs.push(v) type-checked, assignment evaluates the value first. No new language features; astra --version reads Cargo.toml and the release build checks tag = Cargo.toml = binary.
v0.13.3-alpha2026-11-06847C FFI + static package registry: Calling C with int/float/bool/str; @link for custom libraries; Static registry with mifa publish/add and SHA-256 checksums.
v0.13.2-alpha2026-11-06831Map<K, V>, list sort and sort_by_key, any value in Result and Option: the 8 real-world programs need no workarounds. Mifa: git dependencies, whole-graph version solving, workspaces.
v0.13.1-alpha2026-11-06796String methods: char_at, chars, for c in s, starts_with/ends_with, replace, < and > on strings; Mifa version requirements with Cargo's rules and semver ordering.
v0.13.0-alpha2026-11-05777astra mcp: a Model Context Protocol server any AI agent can use; runtime error codes; Astra as WebAssembly with a Node runner, and the browser playground.
v0.12.2-alpha2026-11-05760Three native wrong answers fixed, found by writing real programs; 20 showcase and 8 real-world examples checked against Python.
v0.12.1-alpha2026-11-05756Native builds on Windows; print and ${} refuse values that native printed as addresses; release check passes on every platform.
v0.12.0-alpha2026-11-04754Every type error has a line; machine fixes and astra fix; memory freed on every exit; bools print true/false; a 55-check release suite.
v0.11.2-alpha2026-11-02712Trait bounds checked at call sites, impl signatures checked (E0020); loops no longer leak.
v0.11.1-alpha2026-11-02699Released binaries compile natively: the C runtime is embedded in the compiler.
v0.11.0-alpha2026-11-02695Value semantics, indentation syntax and astra fmt, type inference, nominal traits and trait bounds.
v0.10.0-alpha2026-10-30609Interpreter with native parity and fuzzing; modules; program I/O with capabilities; runtime traps; mifa build and run.
v0.9.1-alpha2026-07-15449First binaries for four platforms; callable closures; ARC memory reclamation; the compiler never panics on bad input.
v0.9.0-alpha2026-07-09—Nominal structs, enums with payloads, ? and try/catch, tuples, impl blocks, bitwise operators.
v0.8.0.1-alpha2026-07-07—Rust and Go join the cross-language benchmark suite, with every program output checked.
v0.8.0-alpha2026-07-07285The LLVM-IR backend becomes the default; async/await; ignored tests 10 to 0.
v0.72026-07-06—Source spans, structs, Result and closures native, REPL, dyn, astra explain; Mifa lockfile and registry protocol.
v0.62026-06—Honest alpha reset: JSON diagnostics, verify mode, the verify-repair-compile loop.
v0.52025-11—Native compilation, Docker CI, first pre-built binaries.
v0.42025-10—The package manager gets its name: Mifa.
v0.12025-10—The idea becomes code: easy like Python, safe and fast like Rust, built for agents. Lexer, parser, first AST.

Memory, before and after

Peak memory of four programs that used to leak, built natively. The tall columns are before; the short ones are after memory was freed on every exit (v0.12).

CaseBeforeAfter
Helper called 1M times building a struct, list and tuple231 MB peak1.3 MB peak
A function returning a new string, 1M calls47 MB peak1.3 MB peak
A list of fresh strings per iteration, 200k20 MB peak1.3 MB peak
A template literal per iteration, 200k20 MB peak1.3 MB peak

Package manager progress

Mifa's five local milestones are complete, and a static, self-hosted registry works; only a central hosted registry is still to come.

M1 local
100%
M2 lock
100%
M5 json
100%
M3 registry
100%
M4 publish
100%
CapabilityStatusEvidence
mifa init: project scaffoldingshippedIntegration-tested manifest + src layout
mifa add: dependency managementshippedManifest round-trip tests; validates the package; --path (v0.10), --git (v0.13.2) or a registry package by name (v0.13.3)
mifa verify: manifest + layout validationshipped7 failure modes + success path tested; type-checking the project is planned
mifa build / run with importable path dependenciesv0.10End-to-end test drives the real binary: init → add --path → build → run
mifa lock: reproducible lockfileshippedsha256-stable across runs (validated)
Path dependenciesshippedResolve from local astra.toml
Cache (~/.mifa/cache)shippedMIFA_CACHE_DIR override supported
mifa clean [--cache]shipped
mifa --versionv0.12Prints the Mifa version
mifa searchv0.13.3Searches a registry folder (a static web host cannot list); v0.12 said no registry was deployed, and v0.11.2-alpha and earlier listed packages that do not exist
M5-basics: --json on local commandsshippedStable JSON envelope (command, success, diagnostics[]) on init/add/verify/test/lock/login/publish; JSON error envelope on failure
M3: Registry protocolshipped/v1/packages v1 API (RegistryApi trait), SHA-256 checksums with verification, yanked-version handling, stable REG4xx error codes; 34 tests
M4: Publish + authshippedmifa login (per-registry tokens, 0600 credentials file), publish --dry-run (semver/license validation, deterministic archive, 10 MiB limit, checksum report)
Static registry (folder or static web host)v0.13.3mifa publish into a folder (versions never change), mifa add <name>, mifa yank; SHA-256 checked on download and pinned in astra.lock; --offline from the cache
mifa.dev hosted registryv1.0A central public registry with accounts and uploads is pending; static self-hosted registries work today. Checksummed packages; lockfile contract goes global

90+ tests cover the package manager: manifest parsing, version requirements, resolution (direct + transitive), lockfile stability, JSON envelopes, the registry protocol, and publish/auth flows.

Design investment, tracked like a feature

Astra's thesis is that when code generation is free, the strategic layer, the design investment Ousterhout says tactical programming skips, must live in the language and be enforced by the compiler. That claim is only honest if each piece of the strategic layer is tracked and tested like any other feature. This table is that commitment:

Strategic guaranteeMechanismStatus
Interfaces can't drift silentlyStatic types + inferenceshipped v0.6
Errors are values, not surprisesResult<T,E> + exhaustive match + ? operatorshipped v0.6 · ? v0.9
Feedback is a machine contractJSON diagnostics, stable E-codes, suggestion, astra explain; machine-applicable fix edits and astra fix (v0.12)shipped v0.7
Flexibility is explicit, never accidentaldyn gradual-typing boundaryshipped v0.7
Builds are reproducibleMifa sha256-stable astra.lockshipped M2
Memory correctness without generator burdenARC + escape analysis (no GC, no lifetimes)reclaiming since v0.9; every exit and owned strings since v0.12
Generated code runs in a cageWASM sandbox targetplanned
Tool schemas can't lietool keyword, signature is the schemaplanned
Agent state is typed, prompts are checkedagent / memory / prompt keywordsplanned
Delegation graphs typecheck end-to-endAgent-to-agent contracts, verified at compile timeplanned
One strategic layer, every targetSingle compiler → native / WASM / GPUv1.0

Scorecard: 5 of 11 strategic guarantees shipped, 1 in progress, 5 planned. The paradigm behind this table is on the home page; the release plan that delivers the rest is on the vision page.

Validated performance claims

Numbers on this site come from a scripted validation harness in the repo (scripts/validate_metrics.sh, 12/12 checks passing), not from marketing copy:

  • 115 ms: Astra compile and run of a 5M-iteration loop (Python: 959 ms run-only)
  • 113 ms: astra verify full typecheck of a program, no codegen
  • 4/4: classes of agent mistakes (undefined vars, type errors, arity, bad returns) rejected before execution
  • sha256-stable: astra.lock byte-identical across repeated resolutions

Ratified architecture decisions

Five foundational bets were debated and locked on 2026-07-02. They set the direction through v1.0 and can only change through a documented amendment process.

BetDecision
1, Memory modelARC + escape analysis + region (no GC, no borrow checker)
2, Typing disciplineStatic by default; gradual via explicit dyn boundaries
3, BackendOne LLVM compiler, three targets: native, WASM, GPU
4, AI primitivestool/agent/prompt/memory as language keywords
5, Python interopEmbedded CPython in the standard library