This repository was archived by the owner on Oct 14, 2026. It is now read-only.
Repository navigation
v0.19.0
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/condidiomatically, freshen shadowedletbindings, and accept scoped npm requires. - Beagle is now dual-licensed under Apache-2.0 or MIT.
Language
- Annotation-directed
Atomconstruction 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-matchrewrite: literalcasedispatch becomesmatch; grouped literal keys becomeorpatterns, 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;
--targetdispatch; 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
casesurface is removed from self-host parsing. Usematch;beagle rewrite case-to-matchmigrates literal dispatch automatically where safe.