Change Log

View Source

All notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.

v0.2.0 (2026-05-18)

Features:

  • add ai-rules.maude template (priv/maude/ai-rules.maude) — second bundled Maude module alongside iot-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.AI Elixir API parallel to ExMaude.IoT. Submodules:

    • ExMaude.AI.Encoder — Elixir term → Maude syntax for ai-rules
    • ExMaude.AI.Validator — pre-encode rule validation, including explicit :unverifiable returns for :contains / :matches regex operators
    • ExMaude.AI.ConflictParser — Maude output → typed conflict maps, handling both pairwise (aiConflict) and single-rule (aiConflictSingle) constructors
  • add ExMaude.ai_rules_path/0 helper returning the bundled ai-rules.maude path under priv/.

  • add [:ex_maude, :ai, :detect_conflicts, :start | :stop] telemetry events with template: :ai_rules metadata for observability parity with the IoT path.

  • promote :nif backend to production grade. The Rust crate now uses a dedicated reader thread feeding a crossbeam-channel, enforces per-command timeouts via recv_timeout, captures both stdout and stderr (matching the Port backend's stderr_to_stdout semantics), and returns structured errors ({:timeout, ms}, :eof, {:io_error, msg}, {:lock_poisoned, what}). All blocking entry points run on the DirtyIo scheduler.

  • add ExMaude.Parser.parse_backend_response/1 as 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/0 probe in the NIF native module — a cheap call used by ExMaude.Backend.available?/1 to detect whether Rustler has populated the native function table.

Bug Fixes:

  • fix ExMaude.Backend.available?(:nif) checking the wrong function name (:initialize/1 instead of the actual :start/1), which made the backend appear unavailable even when the precompiled binary loaded correctly.

  • fix ExMaude.Backend.NIF no 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_loaded error pointing at the EX_MAUDE_BUILD=1 escape hatch.

  • fix :not_implemented error type removed; replaced by :nif_not_loaded and :nif_error for 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