v0.27.0
Added
- Add precise content-hash based build output reuse throughout the compiler
pipeline for optimal compilation [#2447, #2497, #2581, #2674]- Acton now decides whether previous typechecking results, generated build
outputs, and downstream work are still valid from source and dependency
content instead of relying on file modification times - Cached module interfaces record source hashes, module-level public and
implementation hashes, and per-name source / public / implementation hashes - Per-name dependency hashes let the compiler track exactly which names a
declaration depends on, so unrelated edits do not force whole modules or
downstream dependents to be rebuilt - Public type-signature changes rerun front passes for affected downstream
modules; implementation-only changes can refresh implementation hashes and
rerun back passes / code generation without forcing unrelated typechecking - When hashes match, cached build output is reused directly instead of
reparsing, re-typechecking, or regenerating work that is already fresh
- Acton now decides whether previous typechecking results, generated build
- Add concurrent module compilation across the build graph. [#2524, #2527]
- The compiler schedules modules as soon as their dependencies are ready,
allowing independent parts of a project to typecheck in parallel - Front passes and back passes are separated, so dependent modules can start
once an interface is available while normalization, C generation, and other
back-end work continue in parallel - Ready modules are prioritized by critical path so large dependency branches
do not leave available workers idle - This keeps project builds, watch mode, and LSP feedback responsive while
still producing the same deterministic build outputs
- The compiler schedules modules as soon as their dependencies are ready,
- Add VS Code editor support through the Acton language server. [#2487, #2753]
- The VS Code extension can now show Acton syntax and type errors inline,
using the same parser and typechecker asacton build - Completion suggests attribute names, function and method argument names,
and other relevant source-level names - Hover shows Acton information for names under the cursor
- Editor state is kept in memory for fast lookups, so completion and
diagnostics stay responsive while typechecking continues
- The VS Code extension can now show Acton syntax and type errors inline,
- Add
acton doccommand for generating documentation [#2274, #2284, #2292,
#2293, #2295]- Supports multiple output formats (text, markdown, HTML)
- Default is to open browser into HTML docs when window environment is
available, in terminal we fall back to colored text output. Useacton doc -tto force text / terminal output. - Plain
acton docwill show module index in browser - for terminal output, a
source file must be given, likeacton doc src/foo.act -t - Text output is colored for output to TTY (terminal), piping output falls
back to plain ASCII output. Also honorsNO_COLORenv var - HTML supports:
- colorized output of types etc
- inter-module links to type definitions
- explanatory tooltips for generic types
- Add optional chaining and forced unwrapping for optional values [#2672, #2726]
person?.residence?.namereturnsNonewhen any step isNoneperson!.residence!.nameraisesValueErrorwhen a required step is
unexpectedlyNone- Both forms support attribute access and method calls via
?./!., plus
indexing and slicing via?[...]/![...]
- Add
acton sigto inspect inferred type signatures using the same
project-aware module and dependency resolution asacton build. [#2746]- Useful when an error says
foo.bardoes not have attributeX, since
acton sig foo.barresolves names like the compiler does: first asbar
in modulefoo, then as modulefoo.bar
- Useful when an error says
- Add docstring support throughout compiler and AST [#2282]
- Add short options support for argparse module [#2289]
- Add global command-line options support to actonc [#2291]
- Add new Hashable protocol and hash() builtin function [#2255]
- Replace hash method with new composable hashing approach
- Types implement
.hash(self, hasher)method to update a stateful hasher object - The hasher accumulates state from multiple fields:
self.x.hash(h); self.y.hash(h) - Use the
hash()function to get hash values:h = hash(my_object) - All built-in types implement Hashable protocol
- Uses fast wyhash algorithm via Zig implementation
- Parser / Syntax errors are now prettier [#2306, #2307, #2309]
- Replace basic error rendering with elegant unicode style using Diagnose library
- Better structured error reporting using Megaparsec's ADT typed error system
- Improve error messages for type variable name violations
- Clear hints explaining that single uppercase letters are reserved for type variables
- Show cases possibilities of new parser error diagnostics
- Plain ASCII example (in terminal is even prettier):
[error Parse error]: Invalid name (reserved for type variables)
+--> test/syntaxerrors/err41.act@1:7-1:8
|
1 | class Z(value):
: ^
: `- invalid name 'Z'
:
| Hint: Single upper case character (optionally followed by digits) are reserved for type variables. Use a longer name.
-----+
- Improve string interpolation parsing [#2321]
- String parsing has been rewritten from scratch
- String interpolation now works by default in all string literals (no f-prefix required)
- Both
"hello {name}"andf"hello {name}"support interpolation
- Both
- The change to interpolate normal strings is backwards incompatible, any
strings containing curly braces now need to be escaped or be converted to
raw strings, i.e. "{" -> "{{" or r"{" - Backwards compatibility for classic
%operator style is currently
maintained, i.e. NO interpolation is performed fors = "hello %s, here is {}" % name, so curly braces are treated literaly- NOTE: %-operator style formatting will be deprecated in the future
- Parser support nested interpolation strings (thought the necessary rewrites
- Properly handle escape sequences in interpolated strings
- Support complex expressions in interpolations including slices (
{arr[1:3]}) - Better error messages for malformed format specifications and many other cases
ERROR: [error Syntax error]: Empty format specifier after ':'
╭──▶ test@1:27-1:27
│
1 │ f"Unbalanced format {name:}:10}"
•
• ╰╸ Empty format specifier after ':'
─────╯
- Let
repr()andtype()accept optional values [#2373]repr(None)returns"None"andtype(None)returns"None"- More convenient than needing wrapper functions for optional values
- Add webex PR merge notification [#2372]
- Recognize projects by
Build.act&build.act.json[#2358]- Accept
Build.act(new ideal),build.act.json(common), orActon.toml(existing) - Check for
src/directory presence for robustness
- Accept
- Allow any expression after
after[#2342]- Previously limited to local functions, now supports method calls, actor methods, etc.
after 1.5: obj.method()andafter 0.1: remote_actor.action()are now valid
- Add
utils/update-changelog.shscript to update this file (CHANGELOG.md) using Claude - it's a good prompt! - Allow logging of optional values [#2382]
- Change logging data parameter type from
dict[str, value]todict[str, ?value] - Enables structured logging with None values like
{"user": None, "count": 42}
- Change logging data parameter type from
- Add
acton build FILEfor file-oriented builds through the main CLI. [#2471,
#2592] - Add
acton build --watchfor fast edit/build feedback loops. [#2571]- Watch mode performs an initial project build and then keeps running,
rebuilding automatically when source files change - Ordinary
.actfile edits use the incremental compiler scheduler, so
unchanged modules, dependencies, and back-end work can be reused instead of
rebuilding the whole project - Adding or removing source files, or changing
Build.act, triggers project
rediscovery so the build graph stays aligned with the project layout and
dependency configuration - New edits supersede older in-flight work, which keeps the compiler
responsive while a user is actively typing - Single-file watch is also supported with
acton build FILE --watchor
acton FILE --watch acton test --watchuses the same machinery and reruns affected test
modules after successful rebuilds
- Watch mode performs an initial project build and then keeps running,
- Add
acton speccommands for inspecting and updatingBuild.actas JSON.
[#2534] - Expand
acton pkgpackage management [#2534, #2554, #2586, #2596]acton pkg updatedownloads the package indexacton pkg searchsearches the local package indexacton pkg addcan add packages by package name, archive URL, or GitHub
repository URLacton pkg upgradeupdates dependencies with stored repository metadataacton zig-pkg add/removemanages Zig package dependencies inBuild.act
- Add project fingerprints to
Build.act[#2634, #2681]- Fingerprints identify project lineage and are validated against the project
name - This makes accidental project renames and dependency identity conflicts
easier to detect
- Fingerprints identify project lineage and are validated against the project
- Add local dependency overrides with
--dep NAME=PATH. [#2555] - Add release mode aliases [#2708, #2761]
--releaseand--optimize=releaseselectReleaseFast--release=safe,--release=small, and--release=fastselect
ReleaseSafe,ReleaseSmall, andReleaseFast
- Add
--jobs,--tty,--no-progress, and--timingcontrols to the main
actonCLI. [#2478, #2526, #2628] - Add
--parse-astfor compiler debugging. [#2541] - Add JSON output for
acton testandacton test list. [#2598] - Add a content-hash based result cache for
acton test. [#2651]- Test results can be reused when the tested module, its dependencies, and
expected snapshot data have not changed - This makes repeated test runs much faster while still invalidating cached
results when relevant source or dependency content changes - Use
acton test --no-cacheto bypass the cache and force selected tests to
rerun
- Test results can be reused when the tested module, its dependencies, and
- Add
acton test --show-logto always print captured test logs. [#2408] - Add
acton test --acceptas an alias for accepting snapshot / golden
output. [#2584] - Add
acton test stressmode for repeated concurrent test execution.
[#2683, #2691, #2692, #2694]--stress-workerscontrols the worker count- Stress output shows mixed outcomes and phase coverage while running
- Add test capability tags with
testing.require()andacton test --tag.
[#2655] - Add
--min-time,--max-time,--min-iter, and--max-itercontrols for
test runs. [#2467, #2408] - Add
u1,u8,i8, and builtini64support. [#2532, #2519] - Add
list.count()method. [#2521] - Add JSON encoding / decoding for list values at the document root. [#2508]
- Add
xml.Node.encode(pretty=True)for pretty XML output. [#2512] - Add URI
quote()andunquote()helpers. [#2719] - Add HTTPS server and TLS listener support. [#2576]
- Add an Acton LLDB plugin for debugging Acton programs. [#2520]
- Adds
acton bt,acton locals,acton demangle, andacton break
commands inside LLDB - Shows filtered, Acton-demangled backtraces with argument values instead of
forcing users to read raw generated C symbol names - Prints locals with Acton names and value summaries, including strings,
boxed values, objects, actors, classes, and generic value slots - Supports Acton source breakpoints like
acton break src/main.act:42
- Adds
- Add container image builds for Acton Debian packages. [#1404]
- Add
PROFILEbuild option to the Makefile. [#2664] re.match()now accepts an optionalstart_posto begin scanning at an
offset. [#2569]
Changed
- Move total build graph construction, dependency builds, and generated
build.zig / build.zig.zon dependency wiring into the compiler. [#2550,
#2551] - Use f-strings throughout standard library [#2297, #2290]
- Improve process environment handling [#2298]
- Inherit PATH when custom environment is provided
- Enhance ecosystem lift process with additional documentation [#2272, #2288]
- Extend QuickType with effect output for better comprehension translation [#2267]
- Improve acton.rts.sleep platform coverage [#2303]
- Switch to use new hash() function instead of hash [#2255]
- Remove hash special method in favor of hash() builtin [#2304]
- Rename
docs/acton-by-exampletodocs/acton-guide[#2313] - Adopt Zig optimization levels in Acton [#2362]
- Replace
--devflag with--optimizeaccepting: Debug, ReleaseSafe, ReleaseSmall, ReleaseFast - Change default from ReleaseFast to Debug (matching Zig's default)
--devmaps to Debug for backward compatibility, new--releasemaps to ReleaseFast
- Replace
- Simplify command-line parser structure [#2367]
- Remove deprecated
--devoption [#2366] - Revamp
actoncdebug / verbose mode [#2354] - Avoid writing
.tyfiles in Types.reconstruct [#2357] - Remove unused sysLib & projLib fields from compiler Paths [#2385]
- Cleanup remnants from pre-Zig build system migration
- Simplify Webex PR merge notification & handle escapes [#2376, #2384, #2507]
- Improve message formatting and environment variable handling
- Retire the Acton-written CLI and make the Haskell compiler package provide
theactonexecutable directly. [#2607]acton, package management, testing, LSP, and compiler scheduling now use
shared compiler code- The old
actoncimplementation has been renamed to theactoncompiler
package
- Require
Build.actfor projects and requirenameandfingerprintin
root project build files. [#2643, #2644] - Stabilize public interface hashes, include qualified free names in name
hashing, and preserve full source locations in cached interfaces. [#2578,
#2747, #2752] - Validate cached
.tyfiles with source metadata and treat version, compiler,
and dependency mismatches as recoverable stale cache entries. [#2440, #2717,
#2718] - Defer full parsing until after project discovery. [#2742]
- Pass explicit module selections into generated Zig builds so dependency builds
only build the modules selected by the compiler. [#2666] - Use canonical dependency roots in generated
build.zig.zonfiles and isolate
transitive Zig dependency names. [#2690, #2696] - Upgrade the bundled Zig toolchain to 0.15.2. [#2590, #2594]
- Use architecture-based default CPU settings for Zig targets. [#2574]
- Rename
--ignore-compilerto--ignore-compiler-versionand make compiler
version / mtime mismatches explicit stale-cache checks. [#2568, #2573,
#2608, #2609] - Move generated C line directives behind
--dbg-no-lines. [#2518] - Enable larger parallel GHC nurseries for compiler builds. [#2522]
- Use HashMaps for imported type environments. [#2517]
- Update the
acton newproject template. [#2589] - Track build cache growth with periodic checks. [#2475]
- Make snapshot testing use
snapshots/expectedandsnapshots/output
directories instead of the older golden layout. [#2620] - Make
acton test --nameregex based. [#2616] - Store discovered test metadata in
.tyheaders so test discovery can reuse
cached interfaces. [#2636] - Show cached test failures by default while keeping cached successes hidden.
[#2557] - Align test progress with build progress, use project-qualified module names
in progress output, and adapt progress width/timer fields to terminal width.
[#2618, #2619, #2628, #2665, #2667, #2682, #2731] - Use the provided
logging.Handlerin HTTP server actors. [#2698] - Set empty XML node
textandtailvalues toNone. [#2509] - Make
file.mkdir()andfile.rmdir()idempotent. [#2477] - Use
mkdtempsemantics for temporary directory creation. [#2693] - Prebuild one-byte ASCII strings to reduce allocation churn. [#2705]
- Use common dependency builds to avoid redundant rebuilds and guard root-pin
warnings behind--quiet. [#2649, #2653]
Removed
- Remove numpy support from the compiler, parser, stdlib, and tests. [#2413]
- Remove the old explicit stub compilation mode. [#2414]
- Remove the old Acton-written
acton.actCLI implementation after moving CLI
functionality into the compiler package. [#2607]
Fixed
- Fix string 'in' operator for substrings found at position 0 [#2280]
- Fix unintended dependency on complete scope when scanning init for attributes [#2285]
- Ensure lambda-bound variables are in scope when comprehensions are translated [#2267]
- Default print diff for testing.assertEqual failure [#2260]
- Fix VERSION substitution in Homebrew PR creation [#2266]
- Fix escaped braces in strings at position 0 [#2370]
- Escaped braces
{{and}}at start of strings were incorrectly parsed as interpolation - Now correctly converts
"{{a}}"to"{a}"and handles mixed cases like"{{hello}} {world}"
- Escaped braces
- Fix actor constructor alias resolution [#2365]
- Aliased actors from imports (
from worker import Worker) now correctly generate module-prefixed constructors - Fixes issues with builtin actors like
StringDecoderand explicit aliased imports
- Aliased actors from imports (
- Fix
.endswith()for strings shorter than needle [#2348]- Prevent out-of-bounds memory access when haystack is shorter than needle
- Fix
acton versioncommand structure [#2363] - Avoid superfluous rebuilds for actonc [#2349]
- Replace
$FORMATmacro with C function [#2327] - Fix "2320" error [#2323]
- Fix Hashable protocol implementation [#2255]
- Correct zig bytes definition
- Fix issues with bytes containing NUL character
- Fix solver handling of generic tuples, top-level constraint solving,
skolemized type variables, scoped constraints, optional bounds, and coerced
index targets. [#2319, #2332, #2339, #2438, #2564, #2570, #2587, #2603,
#2624, #2661, #2675] - Accept four or five quotes at the end of triple-quoted strings. [#2388]
- Improve
str.__repr__()to escape braces correctly and handle quoted
strings. [#2386] - Fix unclosed string parser diagnostics. [#2486]
- Escape generated C identifiers that became keywords in C23. [#2480]
- Fix Unicode handling in regular expressions. [#2540, #2553]
- Fix parsing, inference, and code generation for negative integer literals,
including the most negativei64value. [#2492, #2543] - Infer
bigintfor integer literals outside thei64range. [#2519] - Fix
argparsedefaults for list arguments and preserve rest arguments after
--. [#2473, #2580] - Fix boolean singleton use and
Nonechecks in arbitrary boolean contexts.
[#2485, #2491] - Fix
bytes.startswith()end-bound checks. [#2410] - Fix
bytes.split()andbytearray.split()for empty separator edge cases.
[#2453] - Fix tuple printing when tuple values contain
None. [#2430] - Implement
__repr__()for exceptions. [#2421] - Fix printing lists that contain optional elements. [#2613]
- Fix violations of the UTF-8 invariant when creating strings. [#2455]
- Fix UTF-8 character / byte offset handling in string partitioning. [#2676]
- Fix
process.pid()after the process has exited. [#2405] - Fix process and build output handling for paths containing spaces. [#2516]
- Fix UTF-8 handling in accepted golden test output. [#2593]
- Fix JSON encoding of fixed-size integer values. [#2530]
- Fix XML parse errors to use
XmlParseErrorinstead of generic runtime
errors. [#2420] - Fix XML special character escaping, CDATA decoding, UTF-8 handling, and
prefixed attribute decoding. [#2422, #2433] - Fix HTTP response callbacks to pass headers and treat header defaults
case-insensitively. [#2448] - Validate malformed HTTP requests and responses instead of accepting invalid
input or crashing during decode. [#2454, #2457] - Fix
is not Nonelowering and optional narrowing through comprehension head
expressions. [#2412, #2402, #2720] - Fix sequential flow analysis around
$RAISE. [#2401] - Fix
while ... elsehandling and reevaluate effectful loop conditions each
iteration. [#2464, #2466] - Fix
and/orexpressions when unboxing is involved. [#2465] - Fix type casts to unboxable values during code generation. [#2479]
- Fix conversion of dot selections with partially aliased import chains. [#2700]
- Fix term substitution when the substitution range and domain overlap. [#2701]
- Fix lambda lifting and CPS edge cases around converted closure types and
nested control flow. [#2709, #2735, #2737] - Fix class attribute initialization checks and improve diagnostics for
uninitialized attributes. [#2391] - Fix class-level and cyclic protocol witness handling. [#2484, #2488, #2556]
- Fix class instance handling of type-parameter witnesses and prevent static
methods from being invoked on instances. [#2623] - Fix conversion of
Selfin protocol methods after moving protocol conversion
before constraint solving. [#2632] - Fix optional equality and optional-chain type inference edge cases. [#2716,
#2672, #2726] - Fix private imported names leaking through interfaces. [#2567, #2752]
- Fix actor
selfchecks and discovered actor test wrappers. [#2514, #2535] - Fix malformed module top-level statements by restricting modules to
declarations, imports, and assignments. [#2728] - Fix generated name collisions by prefixing generated names with the top-level
name. [#2729] - Fix stale transitive dependencies after import renames. [#2727]
- Fix transitive imports for cached modules. [#2677]
- Fix missing dependency name hashes by treating them as stale cache entries.
[#2637] - Fix dependency cache invalidation when a path from
--syspathchanges.
[#2510] - Fix dependency override handling for declared dependencies. [#2555]
- Validate local
--deppaths as Acton project roots. [#2638] - Rework dependency downloads and honor
http_proxy. [#2640] - Fetch transitive remote dependencies reachable through path dependencies
before project discovery. [#2668] - Fix stale implementation refreshes when an interface hash is missing. [#2674]
- Fix orphaned module artifacts after modules are removed. [#2633]
- Preserve normal and test root stubs and prune orphaned binary executables.
[#2265, #2505, #2538] - Fix relative / absolute path handling for build files and build.zig.zon
syspath entries. [#2493, #2495] - Skip Zig builds for dependency projects when only Acton interface artifacts
are needed. [#2496] - Fix
Build.actnull handling and unused dependency builds. [#2539, #2557] - Force recompilation when an alternate output directory is selected. [#2513]
- Fix
acton --parseoutput. [#2536] - Fix
acton buildhandling after Zig toolchain upgrades. [#2595] - Improve error handling for compiler back passes. [#2597]
- Fix LSP stdout framing corruption. [#2629]
- Fix RTS message waiting so actors are not missed between waiting states and
message delivery. [#2689] - Clean up libuv file requests to avoid stale request state. [#2695]
- Work around macOS 26.4 command-line tools breaking Zig and set
DEVELOPER_DIR=/dev/nullfor actondb on macOS. [#2715, #2756] - Restore the Zig dist target. [#2745]
- Delete an accidental root-level copy of
Types.hs. [#2739]
Documentation
- Add ecosystem lift process documentation
- Add Hashable protocol documentation to Acton Guide. [#2310]
- Add actor
self, collection comprehension, and guide organization updates.
[#2314, #2315, #2316, #2318] - Add Acton developer guide covering repository layout, build flow, compiler
passes, runtime, and testing internals. [#2566] - Reshape the Acton Guide around task-oriented language, project, testing, and
stdlib documentation. [#2734, #2740, #2750] - Document optional chaining and forced unwrapping. [#2722, #2732]
- Document class initialization rules and improved uninitialized attribute
diagnostics. [#2391] - Document project fingerprints and the
Build.actproject format. [#2634,
#2644] - Document incremental compilation and content hashing. [#2610]
- Document RTS backtrace debugging arguments. [#2615]
- Explain constraint errors with rendered signatures. [#2751]
- Clarify Acton lock ownership responsibilities. [#2678]
- Update Ask Acton vector store data when the guide changes. [#2748]
Testing / CI
- Support test discovery of actors [#2337]
- Recognize test actors without needing wrapper functions
- Compiler generates wrappers automatically for discovered test actors
- Remove old test types (sync/async/env test functions)
- Update macOS CI to include macos-15 x86_64/aarch64 and macos-26 arm64, and
drop macos-14 to keep the PR matrix small. [#2511, #2583] - Test run MUSL executables on Linux [#2355]
- Test http2, netclics, zlib, netcli applications [#2338, #2331, #2324]
- Add self name check for actors [#2317]
- Add more parser / syntax error test cases [#2308]
- Stop testing Debian 10 [#2352]
- Drop Debian 11 from test-linux CI matrix [#2588]
- this means we do not test / support Debian 11 as a OS dist for developing Acton itself
- Debian 11 is still a valid run time target for Acton programs
- run-linux still covers compiling & running Acton programs on Debian 11
- Support multiple files for compiler testing framework [#2363]
- Accumulate environment from modules to support imports
- Add compiler pass golden tests for parse, kind, type, normalize, deactorize,
CPS, lambda lift, boxing, header generation, C generation, and signatures.
[#2548] - Add incremental rebuild regression tests with stable sanitized hash output.
[#2503, #2506, #2581, #2631] - Add snapshot testing coverage and cache validation for expected snapshot
metadata. [#2639, #2679] - Add stress testing fixtures with racy and crashing FFI examples. [#2683]
- Add TLS stdlib tests and an HTTPS server test fixture. [#2572, #2576]
- Add ecosystem and ACTMF application tests. [#2641, #2548]
- Add more ecosystem applications to CI coverage. [#2641]
- Add Linux container image builds from Debian packages. [#1404]
- Build Debian packages on Ubuntu 22.04 and fix stack usage in build-debs.
[#2647, #2652] - Allow Telemetrify failures while macOS 26 support settles. [#2585]
- Drop the shared Acton cache from CI. [#2605]
- Drop Telemetrify from CI. [#2749]
- Add build.zig generated-file gitignores. [#2656]
- Close golden files after reading them during tests. [#2617]
- Update GitHub Actions dependencies including checkout, cache,
upload/download-artifact, create-pull-request, Docker build actions, and
release-note extraction actions. [#2415, #2429, #2498, #2499, #2537,
#2544, #2558, #2559, #2560, #2561, #2669, #2670, #2684, #2685, #2686,
#2687, #2591, #2754, #2755]