@@ -5,10 +5,66 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline
55
66<!-- changelog -->
77
8- ## [ v0.1.1] ( https://github.com/futhr/ex_maude/compare/v0.1.0...v0.1.1 ) (2026-04-07)
8+ ## [ v0.2.0] ( https://github.com/futhr/ex_maude/compare/v0.1.1...v0.2.0 ) (2026-05-18)
9+
10+ ### Features:
11+
12+ * add ` ai-rules.maude ` template (` priv/maude/ai-rules.maude ` ) — second
13+ bundled Maude module alongside ` iot-rules.maude ` . Targets AI-generated
14+ automation rules over Agents, Capabilities, ToolInvocations, and richer
15+ predicates (capability, budget, jurisdiction, authority). Detects ten
16+ conflict types including tool-call conflict, capability shadowing,
17+ pack-tool composition mismatch, sovereignty violation, authority
18+ escalation, approval-gate bypass, and agent-loop cascade. ~ 570 lines
19+ of algebraic specification.
20+
21+ * add ` ExMaude.AI ` Elixir API parallel to ` ExMaude.IoT ` . Submodules:
22+
23+ - ` ExMaude.AI.Encoder ` — Elixir term → Maude syntax for ai-rules
24+ - ` ExMaude.AI.Validator ` — pre-encode rule validation, including
25+ explicit ` :unverifiable ` returns for ` :contains ` / ` :matches `
26+ regex operators
27+ - ` ExMaude.AI.ConflictParser ` — Maude output → typed conflict maps,
28+ handling both pairwise (` aiConflict ` ) and single-rule
29+ (` aiConflictSingle ` ) constructors
30+
31+ * add ` ExMaude.ai_rules_path/0 ` helper returning the bundled
32+ ` ai-rules.maude ` path under ` priv/ ` .
33+
34+ * add ` [:ex_maude, :ai, :detect_conflicts, :start | :stop] ` telemetry
35+ events with ` template: :ai_rules ` metadata for observability parity
36+ with the IoT path.
37+
38+ * promote ` :nif ` backend to production grade. The Rust crate now uses a
39+ dedicated reader thread feeding a ` crossbeam-channel ` , enforces per-command
40+ timeouts via ` recv_timeout ` , captures both stdout and stderr (matching the
41+ Port backend's ` stderr_to_stdout ` semantics), and returns structured
42+ errors (` {:timeout, ms} ` , ` :eof ` , ` {:io_error, msg} ` , ` {:lock_poisoned, what} ` ).
43+ All blocking entry points run on the ` DirtyIo ` scheduler.
44+
45+ * add ` ExMaude.Parser.parse_backend_response/1 ` as the single source of truth
46+ for turning a Maude command's raw output into ` {:ok, value} | {:error, %Error{}} ` .
47+ Both the Port and NIF backends now share this parser.
48+
49+ * expose a ` nif_loaded/0 ` probe in the NIF native module — a cheap call used
50+ by ` ExMaude.Backend.available?/1 ` to detect whether Rustler has populated
51+ the native function table.
52+
53+ ### Bug Fixes:
954
55+ * fix ` ExMaude.Backend.available?(:nif) ` checking the wrong function name
56+ (` :initialize/1 ` instead of the actual ` :start/1 ` ), which made the backend
57+ appear unavailable even when the precompiled binary loaded correctly.
1058
59+ * fix ` ExMaude.Backend.NIF ` no longer falling back into a "stub mode" when
60+ the NIF fails to load — the GenServer now refuses to start and surfaces
61+ a clear ` :nif_not_loaded ` error pointing at the ` EX_MAUDE_BUILD=1 `
62+ escape hatch.
1163
64+ * fix ` :not_implemented ` error type removed; replaced by ` :nif_not_loaded `
65+ and ` :nif_error ` for genuine NIF failure modes.
66+
67+ ## [ v0.1.1] ( https://github.com/futhr/ex_maude/compare/v0.1.0...v0.1.1 ) (2026-04-07)
1268
1369### Bug Fixes:
1470
@@ -18,9 +74,6 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline
1874
1975## [ v0.1.0] ( https://github.com/futhr/ex_maude/compare/v0.1.0...v0.1.0 ) (2026-04-03)
2076
21-
22-
23-
2477### Features:
2578
2679* add Livebook notebooks for interactive documentation by Tobias Bohwalli
0 commit comments