v0.29.0
This release drastically improves compile times for modules that import very
large modules. The compiler tracks what specific names are used from each
import and selectively loads exactly those names, avoiding reading full
imported modules.
Language
- Derive
Eq,OrdandHashablefor tuples whose components implement
them: tuples now support==, the comparison operators andsorted(), and
work as dictionary and set keys. Equality and ordering are componentwise at
a single common type, so comparing tuples of different shapes (positional
vs named, or reordered field names) is a type error. Witness classes are
registered for serialization with preassigned class ids, shifting all
dynamically assigned class ids once. [#3009] - Add a compiler-synthesized
__get_attr__(name: str) -> ?valuereflection
getter on every class, returning boxed instance attributes by their Acton
names while reserving__get_attr__against user definitions. This lets
serializers reflect over attributes without forcing every attribute subtree
to stay reachable in large generated data models. [#2993] - Compute bytes literal lengths correctly when a hex escape is immediately
followed by another hex digit, matching the generated split C string
fragments instead of letting the escape consume too much of the following
text. [#2996] - Use tuple truth values safely in
if,while,not, and conditional
expressions, fixing a panic when tuple__bool__returned an unboxed C
bool. [#3004]
Compiler & Build
- Track what specific names are used from each import and selectively load
exactly those names, avoiding full imported-module reads during type
checking, back passes, final C compilation, and cached implementation-hash
refreshes. Deferred back passes are enabled for normal modules, and tested
large-module cases see 10,000x improvements. [#2930] [#3000] [#3005]
[#3008] - Speed up large generated modules by deduplicating external witnesses within
each protocol/type bucket instead of scanning every accumulated witness.
[#2999] - Generate direct C calls for statically known builtin protocol methods on
builtin types, avoiding witness-table dispatch for those calls while keeping
the existing builtin witness values available to the generated code. [#2935] - Continue primitive unboxing with
bool, one of the most common value types
in Acton programs, representing it as an unboxed Cboolthrough generated
code and builtin/runtime method tables while preserving inherited method
calls that returnbool. [#2976] - Preserve loop-carried locals assigned inside
forloops in optimized release
builds, fixing cases such as explicitly providedargparsesub-command
options being lost under--release=fast. [#2981] - Enable link-time optimization for non-debug Linux builds, including generated
projects, base, std, backend, and bundled runtime dependencies, while keeping
Debug builds fast. [#2982] - Compile local bindings that shadow functions, including assignments inside
branches, without letting the global function name suppress the generated C
local variable declaration. [#2988] - Preserve boxed values for primitives stored across awaited actor calls, so
augmented assignments updateintandfloatlocals safely after an
awaitinstead of corrupting the boxed cell slot. [#2998] - Compile continuation calls that return proc values through closure
conversion, fixing### BAD contArgcrashes inactonc --lliftand other
passes that force the generated continuation type annotations. [#3014] - Initialize module globals in bounded chunks and assign simple top-level
globals directly, avoiding startup stack overflows and oversized temporary
frames in modules with many generated globals. [#3015] - Raise the compiler process open-file limit on startup, reducing
file-descriptor failures during large concurrent builds and cache-heavy
projects. [#3002] - Avoid macOS cached-interface lock exhaustion after interrupted builds by
building vendored LMDB with process-shared mutexes instead of global named
semaphores. [#3007]
CLI & Project Workflow
- Prevent parallel
acton testruns from hanging when a worker or output
reader fails, reporting the runner failure or captured output error instead
of waiting forever for a missing completion event. [#2972]
Runtime & Standard Library
- Add UDP support to
net, withUDPCap, fixed-remoteUDPConnection
sockets, boundUDPListenersockets, peer address and port reporting, and
listener replies to arbitrary peers. [#2989] - Add
serialize(obj) -> bytesanddeserialize(data) -> valuebuiltins for
in-memory object graph round-trips, preserving shared and cyclic references
and rejecting actors that cannot be serialized without a global reference
map. [#2997] - Report missing or empty
process.Processandprocess.RunProcesscommands
throughon_error, and mark failed spawns as not running so follow-up
process operations are safely ignored. [#2986] - Serialize
bigintvalues with their own class id so multi-word integers
round-trip through Acton serialization instead of being decoded as normal
introws. [#2994] - Serialize
bytesvalues with their own class id so they round-trip as
bytesinstead of deserializing asstr. [#2995] - Preserve shared object references during deserialization by using the same
integer key representation for back-reference registration and lookup,
fixing repeated references that previously decoded as missing values. [#3011] - Fix
json.Jsonactor actions sodecode,decode_list,encode, and
encode_listcall the shared JSON implementations instead of recursively
calling themselves. [#3017]
Packages & Distribution
- Speed up macOS CI by reducing the PR test matrix to faster macOS 26 runners,
while release artifacts still target macOS 15 for both the Zig target and
Haskell binary deployment floor and publication stays gated on macOS 15 smoke
tests. [#2992] - Speed up package CI by building Debian and RPM packages from the same
prebuiltdist/tree, avoiding the slow, hard-to-cache Debian package
rebuild while sharing installed-payload validation and package version checks
across both package formats. [#2987] - Expand ecosystem CI coverage with standalone
acton-sshandacton-grpc
test jobs, and drop the stale standalonencurljob now that its source
lives in StratoWeave. [#2974] - Compress RPM payloads with zstd, and check for the
zstdtool before
building RPM packages. [#3001]
Documentation
- Document the type checker's witness environment invariants, active and closed
witness lifetimes, enumeration order, and possible exact-lookup split in the
compiler developer guide. [#2978]