Changelog
View SourceThe format is based on Keep a Changelog; this project adheres to Semantic Versioning.
[0.4.0] - 2026-10-07
Changed
- On macula 14 (
~> 14.2, was~> 13.0.1). A service on macula 14 could not use macula_rag 0.3, which pinned macula 13. No code change was needed: no macula function macula_rag calls changed between 13.0.1 and 14.2.0 (macula 14 dropsnode_identity_path, which this library never reads).
[0.3.0] - 2026-10-01
Added
- The RAG service contract (
guides/rag_service_contract.md, canonical, with frozen vectors intest/vectors/): the five procedures a provider serves, provenance on every hit, the corpus hash and the operator's optional signature. macula_rag_corpus, through the facade:corpus_hash/1,sign_corpus/2,verify_corpus/3(signed only by the pinned provider, from the verified key, over the recomputed hash) andverify_hit/1.macula_rag_contract:plain/1is exported: a received payload with text unwrapped and atom keys as binaries.
[0.2.0] - 2026-09-29
Changed
- On macula 13 (
~> 13.0.1, was~> 12.1). A service on macula 13 could not use macula_rag 0.1, which pinned macula 12. No code change was needed: the facade calls it makes (advertise,unadvertise,call,providers,publish,subscribe,unsubscribe,status,provider_authorization) compile, pass xref and dialyzer, and the whole suite passes on 13.0.1. - A test holds the floor: macula 13.0.1 or later.
[0.1.0] - 2026-09-23
The first release. Everything before it was an unreleased scaffold on macula 10, which this replaces.
Added
- Federated query across an org's shards:
macula_rag:query/1,2asks every shard in parallel and merges hits by score, returning{ok, Hits, #{answered, failed}}, where every shard that did not answer is listed with its reason. - The set of shards is macula's trust-checked provider list for
<org>/rag.query_shard_v1(macula:providers/4), so only nodes the org delegated (D25) are asked. Each is called by node id (macula:call/6withprovider). - Embeddings:
configure/3names this node'smodelanddim, summaries carry theirs, and a query asks only shards with the same embedding. Others are reported as{embedding_mismatch, Theirs}. - A shard:
register_responder/1answers the org's queries with a callback;advertise/2publishes this shard's summary and republishes it untilwithdraw/0. A hit's minimum is a binaryidand a numericscore. status/0: whether this node's grant to provide the procedure is in place, with macula's reason when it is not, as mcl_om reports a provider grant. A refused grant is asked for again everygrant_retry_ms.shards/0: the shards this node has a live summary from.- The wire contract (
macula_rag_contract), pinned by tests that read every payload back through macula's codec. - CI: lint, EUnit, xref and Dialyzer on OTP 28.4.3; a tag-driven hex publish that refuses anything but the clean, pushed release tag and checks hex serves the tagged files.
Not in this version
- The summary's bloom filter is carried but not used to choose shards.