Skip to content

v0.27.0

Choose a tag to compare

@github-actions github-actions released this 08 May 16:27
23a0103

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
  • 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
  • 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 as acton 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
  • Add acton doc command 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. Use acton doc -t to force text / terminal output.
    • Plain acton doc will show module index in browser - for terminal output, a
      source file must be given, like acton doc src/foo.act -t
    • Text output is colored for output to TTY (terminal), piping output falls
      back to plain ASCII output. Also honors NO_COLOR env 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?.name returns None when any step is None
    • person!.residence!.name raises ValueError when a required step is
      unexpectedly None
    • Both forms support attribute access and method calls via ?. / !., plus
      indexing and slicing via ?[...] / ![...]
  • Add acton sig to inspect inferred type signatures using the same
    project-aware module and dependency resolution as acton build. [#2746]
    • Useful when an error says foo.bar does not have attribute X, since
      acton sig foo.bar resolves names like the compiler does: first as bar
      in module foo, then as module foo.bar
  • Add docstring support throughout compiler and AST [#2282]
    • Parse docstrings in AST declarations [#2269, #2270, #2271, #2565, #2736]
    • Unescape docstrings in NameInfo
    • Allow module docstrings before imports
  • 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}" and f"hello {name}" support interpolation
    • 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 for s = "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() and type() accept optional values [#2373]
    • repr(None) returns "None" and type(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), or Acton.toml (existing)
    • Check for src/ directory presence for robustness
  • Allow any expression after after [#2342]
    • Previously limited to local functions, now supports method calls, actor methods, etc.
    • after 1.5: obj.method() and after 0.1: remote_actor.action() are now valid
  • Add utils/update-changelog.sh script 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] to dict[str, ?value]
    • Enables structured logging with None values like {"user": None, "count": 42}
  • Add acton build FILE for file-oriented builds through the main CLI. [#2471,
    #2592]
  • Add acton build --watch for fast edit/build feedback loops. [#2571]
    • Watch mode performs an initial project build and then keeps running,
      rebuilding automatically when source files change
    • Ordinary .act file 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 --watch or
      acton FILE --watch
    • acton test --watch uses the same machinery and reruns affected test
      modules after successful rebuilds
  • Add acton spec commands for inspecting and updating Build.act as JSON.
    [#2534]
  • Expand acton pkg package management [#2534, #2554, #2586, #2596]
    • acton pkg update downloads the package index
    • acton pkg search searches the local package index
    • acton pkg add can add packages by package name, archive URL, or GitHub
      repository URL
    • acton pkg upgrade updates dependencies with stored repository metadata
    • acton zig-pkg add/remove manages Zig package dependencies in Build.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
  • Add local dependency overrides with --dep NAME=PATH. [#2555]
  • Add release mode aliases [#2708, #2761]
    • --release and --optimize=release select ReleaseFast
    • --release=safe, --release=small, and --release=fast select
      ReleaseSafe, ReleaseSmall, and ReleaseFast
  • Add --jobs, --tty, --no-progress, and --timing controls to the main
    acton CLI. [#2478, #2526, #2628]
  • Add --parse-ast for compiler debugging. [#2541]
  • Add JSON output for acton test and acton 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-cache to bypass the cache and force selected tests to
      rerun
  • Add acton test --show-log to always print captured test logs. [#2408]
  • Add acton test --accept as an alias for accepting snapshot / golden
    output. [#2584]
  • Add acton test stress mode for repeated concurrent test execution.
    [#2683, #2691, #2692, #2694]
    • --stress-workers controls the worker count
    • Stress output shows mixed outcomes and phase coverage while running
  • Add test capability tags with testing.require() and acton test --tag.
    [#2655]
  • Add --min-time, --max-time, --min-iter, and --max-iter controls for
    test runs. [#2467, #2408]
  • Add u1, u8, i8, and builtin i64 support. [#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() and unquote() 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, and acton 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
  • Add container image builds for Acton Debian packages. [#1404]
  • Add PROFILE build option to the Makefile. [#2664]
  • re.match() now accepts an optional start_pos to 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-example to docs/acton-guide [#2313]
  • Adopt Zig optimization levels in Acton [#2362]
    • Replace --dev flag with --optimize accepting: Debug, ReleaseSafe, ReleaseSmall, ReleaseFast
    • Change default from ReleaseFast to Debug (matching Zig's default)
    • --dev maps to Debug for backward compatibility, new --release maps to ReleaseFast
  • Simplify command-line parser structure [#2367]
  • Remove deprecated --dev option [#2366]
  • Revamp actonc debug / verbose mode [#2354]
  • Avoid writing .ty files 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
    the acton executable directly. [#2607]
    • acton, package management, testing, LSP, and compiler scheduling now use
      shared compiler code
    • The old actonc implementation has been renamed to the acton compiler
      package
  • Require Build.act for projects and require name and fingerprint in
    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 .ty files 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.zon files 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-compiler to --ignore-compiler-version and 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 new project template. [#2589]
  • Track build cache growth with periodic checks. [#2475]
  • Make snapshot testing use snapshots/expected and snapshots/output
    directories instead of the older golden layout. [#2620]
  • Make acton test --name regex based. [#2616]
  • Store discovered test metadata in .ty headers 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.Handler in HTTP server actors. [#2698]
  • Set empty XML node text and tail values to None. [#2509]
  • Make file.mkdir() and file.rmdir() idempotent. [#2477]
  • Use mkdtemp semantics 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.act CLI 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}"
  • 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 StringDecoder and explicit aliased imports
  • Fix .endswith() for strings shorter than needle [#2348]
    • Prevent out-of-bounds memory access when haystack is shorter than needle
  • Fix acton version command structure [#2363]
  • Avoid superfluous rebuilds for actonc [#2349]
  • Replace $FORMAT macro 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 negative i64 value. [#2492, #2543]
  • Infer bigint for integer literals outside the i64 range. [#2519]
  • Fix argparse defaults for list arguments and preserve rest arguments after
    --. [#2473, #2580]
  • Fix boolean singleton use and None checks in arbitrary boolean contexts.
    [#2485, #2491]
  • Fix bytes.startswith() end-bound checks. [#2410]
  • Fix bytes.split() and bytearray.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 XmlParseError instead 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 None lowering and optional narrowing through comprehension head
    expressions. [#2412, #2402, #2720]
  • Fix sequential flow analysis around $RAISE. [#2401]
  • Fix while ... else handling and reevaluate effectful loop conditions each
    iteration. [#2464, #2466]
  • Fix and / or expressions 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 Self in 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 self checks 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 --syspath changes.
    [#2510]
  • Fix dependency override handling for declared dependencies. [#2555]
  • Validate local --dep paths 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.act null handling and unused dependency builds. [#2539, #2557]
  • Force recompilation when an alternate output directory is selected. [#2513]
  • Fix acton --parse output. [#2536]
  • Fix acton build handling 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/null for 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.act project 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]