Skip to content
This repository was archived by the owner on Oct 14, 2026. It is now read-only.

v0.19.0

Choose a tag to compare

@tompassarelli tompassarelli released this 27 Jul 08:31
· 1793 commits to main since this release

Beagle v0.19.0

Highlights

  • Beagle now has a self-hosted compiler with a minted seed, byte-fixpoint remint gate, oracle ladder, and a native stage0 distribution. The self-hosted pipeline covers Clojure, JavaScript, and Nix emission, module resolution, macros, reader support, and checker parity.
  • Differential fuzzing and conformance ratchets now exercise the oracle and self-hosted compiler across targets. New reproducibility, downstream-consumer, and behavioral-emission gates make release verification fail closed.
  • The reader accepts additional Clojure-compatible forms: #_ discard, #js, ##Inf, ##-Inf, ##NaN, #^ metadata shorthand, bare-dot interop, Clojure-valid string escapes, and primed symbols.
  • JavaScript emission fixes preserve authored property names and underscores, avoid reserved-word mangling in property/method positions, lower effect-position if/cond idiomatically, freshen shadowed let bindings, and accept scoped npm requires.
  • Beagle is now dual-licensed under Apache-2.0 or MIT.

Language

  • Annotation-directed Atom construction allows a fresh (atom init) to adopt an expected (Atom T) element type while continuing to enforce invariance for aliased references. This enables nullable, explicitly annotated cells such as (Atom (U (Map String Any) Nil)) to start empty.
  • Purity checking now follows indirect purity boundaries, with tests covering the boundary behavior.
  • Added the case-to-match rewrite: literal case dispatch becomes match; grouped literal keys become or patterns, and unsupported constants are left unchanged for manual review.
  • The Nix target rejects free dotted names with diagnostic E021.

Self-host & remint

  • Added the Beagle self-hosted compiler source, official seed, bin/beagle-remint, and verification rungs for AST/check/emission parity and byte-stable bootstrap fixpoints.
  • The seed now includes the Atom-constructor checker update, resolving the remint divergence introduced by annotation-directed Atom construction.
  • Self-hosting gained Clojure, JavaScript, and Nix backends; --target dispatch; module resolution and extern imports; user macros; canonical character handling; deterministic lowering names; and parity fixes for unions, destructuring, JS quote, threading, parse failures, and macro expansion errors.
  • A GraalVM native stage0 package and CI verification/release-artifact workflow were added. Stage0 is preferred for verification when available, with babashka retained as a development fallback.

Tooling & CI

  • Added grammar-driven differential fuzzing, nightly fuzz CI, preserved minimized repros, and checker-precision parity coverage.
  • Added per-backend conformance oracle ratchets, a certification command, in-process batch compilation, deterministic byte-compare gates, and active JavaScript behavioral-emission coverage.
  • Added a hermetic downstream-consumer registry and release gate, including byte-clean compilation receipts, drift detection, sensitivity proofs, and crash-safe scratch containment. Test execution now drains subprocess streams concurrently and schedules the active tier with bounded parallelism.
  • Daemon runtime files are discoverable from a workspace, mirror repo-local state, and use TCP-ping liveness. Bun discovery is portable and package scope is worktree-aware.
  • Nix import emits structural (ms ...) / (s ...) forms; the Nix import roundtrip now self-bootstraps in the suite.
  • Tooling that rents fram's resolver now discovers it across fram's layout move (chartroom → codegraph, resolver at the repo root), and the cascade/callgraph gates fail loudly on empty graph output instead of silently passing.
  • Added regression coverage for declared unknown JVM statics.

Breaking changes

  • The ClojureScript target has been removed from the compiler, self-hosted compiler, test/conformance tiers, tooling, and editor integration. Projects targeting ClojureScript must migrate to a supported target.
  • The case surface is removed from self-host parsing. Use match; beagle rewrite case-to-match migrates literal dispatch automatically where safe.