Change Log
View SourceAll notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.
v0.3.0 (2026-06-10)
Breaking Changes:
package: stop bundling GPL Maude binaries in the hex tarball by futhr
port: default to plain pipes with -interactive, PTY opt-in by futhr
Upgrade notes:
- Install Maude separately. The hex package no longer ships Maude
binaries (they are GPL-licensed; the package is MIT). Run
mix maude.installonce after updating, keepmaudeon yourPATH, or setconfig :ex_maude, maude_path: "...". The tarball shrinks from ~15 MB to ~110 KB. - Workers restart after a command timeout. A timed-out worker is in
an indeterminate state (Maude cannot cancel an in-flight computation),
so all three backends now stop it with
{:shutdown, _}and the pool starts a replacement. Worker pids are therefore not stable across timeouts, and a[:ex_maude, :server, :timeout]telemetry event is followed by a fresh[:ex_maude, :server, :start]. - Port backend uses pipes by default. Maude is launched with
-interactiveover plain pipes — the mode the C-Node and NIF backends always used. Setuse_pty: trueto restore thescript/unbufferwrapper. verify_safety/3andverify_liveness/3surface real errors. Encoding bugs, missing modules, and Maude syntax errors now return{:error, _}instead of being absorbed into{:ok, :unverified};:unverifiedremains the result for timeouts and an unavailable pool.Pool.broadcast/2no longer exits the caller when a worker is slow; slow workers yield{:error, _}entries in the result list.Pool.transaction/2accepts:checkout_timeout(the old:timeoutkey remains as an alias).ExMaude.version/0returns the real interpreter version (e.g.{:ok, "3.5.1"}frommaude --version) instead of a placeholder string, and works without a started pool.
Features:
add parse, show_module and list_modules to the ExMaude facade by futhr
maude: detect the real Maude version by futhr
add bounded LTL safety and liveness verification by futhr
Bug Fixes:
nif: keep building the NIF once a local artifact exists by futhr
pool: make broadcast survive slow workers and always return them by futhr
iot: surface encoding and infrastructure bugs from verify functions by futhr
iot: escape quotes and backslashes when encoding strings by futhr
parser: accept kind-level sorts in result lines by futhr
cnode: correlate bridge replies with refs and restart on failure by futhr
nif: restart worker after native timeout, eof, or io error by futhr
port: stop poisoned workers on timeout and fail fast at startup by futhr
check: run the quality tools that deps: [:compiler] silently skipped by futhr
iot: drop unreachable error clause in build_world by futhr
v0.2.0 (2026-05-18)
Features:
add
ai-rules.maudetemplate (priv/maude/ai-rules.maude) — second bundled Maude module alongsideiot-rules.maude. Targets AI-generated automation rules over Agents, Capabilities, ToolInvocations, and richer predicates (capability, budget, jurisdiction, authority). Detects ten conflict types including tool-call conflict, capability shadowing, pack-tool composition mismatch, sovereignty violation, authority escalation, approval-gate bypass, and agent-loop cascade. ~570 lines of algebraic specification.add
ExMaude.AIElixir API parallel toExMaude.IoT. Submodules:ExMaude.AI.Encoder— Elixir term → Maude syntax for ai-rulesExMaude.AI.Validator— pre-encode rule validation, including explicit:unverifiablereturns for:contains/:matchesregex operatorsExMaude.AI.ConflictParser— Maude output → typed conflict maps, handling both pairwise (aiConflict) and single-rule (aiConflictSingle) constructors
add
ExMaude.ai_rules_path/0helper returning the bundledai-rules.maudepath underpriv/.add
[:ex_maude, :ai, :detect_conflicts, :start | :stop]telemetry events withtemplate: :ai_rulesmetadata for observability parity with the IoT path.promote
:nifbackend to production grade. The Rust crate now uses a dedicated reader thread feeding acrossbeam-channel, enforces per-command timeouts viarecv_timeout, captures both stdout and stderr (matching the Port backend'sstderr_to_stdoutsemantics), and returns structured errors ({:timeout, ms},:eof,{:io_error, msg},{:lock_poisoned, what}). All blocking entry points run on theDirtyIoscheduler.add
ExMaude.Parser.parse_backend_response/1as the single source of truth for turning a Maude command's raw output into{:ok, value} | {:error, %Error{}}. Both the Port and NIF backends now share this parser.expose a
nif_loaded/0probe in the NIF native module — a cheap call used byExMaude.Backend.available?/1to detect whether Rustler has populated the native function table.
Bug Fixes:
fix
ExMaude.Backend.available?(:nif)checking the wrong function name (:initialize/1instead of the actual:start/1), which made the backend appear unavailable even when the precompiled binary loaded correctly.fix
ExMaude.Backend.NIFno longer falling back into a "stub mode" when the NIF fails to load — the GenServer now refuses to start and surfaces a clear:nif_not_loadederror pointing at theEX_MAUDE_BUILD=1escape hatch.fix
:not_implementederror type removed; replaced by:nif_not_loadedand:nif_errorfor genuine NIF failure modes.
v0.1.1 (2026-04-07)
Bug Fixes:
align NIF precompiled build config with production patterns by Tobias Bohwalli
switch NIF to RustlerPrecompiled for proper Hex packaging by Tobias Bohwalli
v0.1.0 (2026-04-03)
Features:
add Livebook notebooks for interactive documentation by Tobias Bohwalli
add bundled Maude binaries and IoT rules module by Tobias Bohwalli
add NIF backend stub with Rustler scaffolding by Tobias Bohwalli
add C-Node backend with maude_bridge by Tobias Bohwalli
add mix maude.install task for binary installation by Tobias Bohwalli
add IoT rule conflict detection module by Tobias Bohwalli
add Maude binary management, server, pool, and public API by Tobias Bohwalli
add backend behaviour and Port backend implementation by Tobias Bohwalli
add parser and telemetry modules by Tobias Bohwalli
add core types (Error, Term, Result structs) by Tobias Bohwalli
Bug Fixes:
remove HTML div wrapper and pre-release notice for hex.pm rendering by Tobias Bohwalli
suppress noisy make output when binary is up-to-date by Tobias Bohwalli
handle missing Location header in redirect safely by Tobias Bohwalli
tighten encoder specs to resolve dialyzer contract_supertype warning by Tobias Bohwalli
make CNode backend fully functional by Tobias Bohwalli
split telemetry tests to use MaudeCase for integration tests by Tobias Bohwalli
handle write() return values in maude_bridge.c by Tobias Bohwalli
add ex_doc and doctor to test env for CI by Tobias Bohwalli
suppress unused alias warnings in conditional test blocks by Tobias Bohwalli
replace deprecated Exception.exception?/1 with is_exception/1 by Tobias Bohwalli
convert @platform_patterns to function for compile-time compatibility by Tobias Bohwalli
Performance Improvements:
- add benchmark suite by Tobias Bohwalli