Skip to content

Commit 9bd9abc

Browse files
committed
chore: release version v0.2.0
1 parent 69f142a commit 9bd9abc

5 files changed

Lines changed: 66 additions & 11 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ priv/native/
1717
c_src/*.o
1818
c_src/maude_bridge
1919
priv/maude_bridge
20+
.DS_Store

CHANGELOG.md

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Add `ex_maude` to your dependencies in `mix.exs`:
5050
```elixir
5151
def deps do
5252
[
53-
{:ex_maude, "~> 0.3.0"}
53+
{:ex_maude, "~> 0.2.0"}
5454
]
5555
end
5656
```

lib/ex_maude.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ defmodule ExMaude do
6363
|---------|-----------|---------|----------|
6464
| `:port` | Full | Higher | Default, safe, works everywhere |
6565
| `:cnode` | Full | Medium | Production, structured data |
66-
| `:nif` | None | Lowest | Hot paths (Phase 3, not yet implemented) |
66+
| `:nif` | None | Lowest | Hot paths, latency-critical workloads |
6767
6868
"""
6969

mix.exs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
defmodule ExMaude.MixProject do
22
use Mix.Project
33

4-
@version "0.1.1"
4+
@version "0.2.0"
55
@source_url "https://github.com/futhr/ex_maude"
66

77
def project do
@@ -106,10 +106,11 @@ defmodule ExMaude.MixProject do
106106
{:telemetry, "~> 1.2"},
107107
{:jason, "~> 1.4"},
108108

109-
# Security override: decimal < 3.1.0 has a DoS via unbounded
110-
# exponent parsing (GHSA-rhv4-8758-jx7v / elixirforum 75261).
111-
# Pulled transitively; force >= 3.1.
112-
{:decimal, "~> 3.1", override: true},
109+
# decimal < 3.1.0 has a DoS via unbounded exponent parsing
110+
# (GHSA-rhv4-8758-jx7v). Declare it directly so the resolver enforces
111+
# 3.1+ across transitive deps without `override: true` (Hex disallows
112+
# overrides in published packages).
113+
{:decimal, "~> 3.1"},
113114
# Native code compilation
114115
{:elixir_make, "~> 0.8", runtime: false},
115116
# NIF — precompiled binaries downloaded at install time

0 commit comments

Comments
 (0)