Changelog
View SourceFormat: Keep a Changelog. Versioning: SemVer.
[Unreleased]
[0.4.0] - 2026-07-02
Added
- Optional
store_mode/0service callback —single(default) orcluster. When a service exports it,hecate_om:boot/1auto-starts its reckon-db store in that mode;clusterenables reckon-db discovery + Ra clustering so the store spans every node that starts the samestore_id. Newhecate_om_store:ensure/4+ensure_store/4carry the mode; the/2and/3arities keep defaulting tosingle(backward compatible). Previously the auto-started store was alwayssingle, with no override.
[0.3.4] - 2026-06-24
Fixed
hecate_om_store:ensure/3andensure_store/3were not exported in 0.3.3, sohecate_om:boot/1's cross-module call crashed withundefat boot ({hecate_om_store_failed, ..., undef}). The store-index wiring added in 0.3.3 was therefore dead on arrival. Added both to-export.
[0.3.3] - 2026-06-24
Added
- Optional
store_indexes/0service callback. When a service exports it alongsidestore_id/0+data_dir/0,hecate_om:boot/1installs the returned reckon-db secondary index declarations (e.g.{payload, Key},{payload_hash, [Keys]}) on the auto-started store. Previously the auto-wired store was created with no indexes, so a service that also declared indexes via its ownstart_storecall hit{already_started}and its declarations were silently dropped — CCC payload indexes never got registered.hecate_om_store:ensure/3andensure_store/3carry the index list; the/2arities delegate with[].
Changed
- Bumped the reckon-db stack pins to the current ecosystem:
reckon_db ~> 5.4(was~> 2.3— needed for the#store_config.indexesfield),evoq ~> 1.21(was~> 1.15),reckon_evoq ~> 2.6(was~> 2.1).
[0.3.2] - 2026-06-03
Added
MACULA_STATION_SEEDSenv override for station seeds. When set (comma-separated station URLs), it takes precedence over thestation_seedsapp env inhecate_om_identity:configured_seeds/0; empty/unset falls back to the app env. Lets one deployed image dial a distinct station per instance without a rebuild (e.g. one bot per node, one station each), matching the existing seed-via-env convention.
[0.3.1] - 2026-06-01
Fixed
- Mesh connect no longer gated on the service-principal cert.
hecate_om_identity:attach_client/1 previously short-circuited to
undefined(never calling macula:connect/2) whenever the cert file was absent, leaving every cert-less service permanentlyno_client. The cert was a spurious gate: it is never passed toconnect(the SDK auto-generates an ephemeral peering identity for empty opts), only loaded and held forservice_cert/0/ the v2 realm-membership swap-in. Connect now keys off configuredstation_seeds, not cert presence. - Connect is deferred off the init path and retried. At boot
hecate_omcould start before the macula SDK app was fully up; a single inline connect raced it and lost.init/1now schedulesself() ! connect, retries every?RECONNECT_MSuntil a pool attaches, monitors the pool, and re-attaches if it later dies.
Added
- Optional
identity_key_pathenv: when set + loadable, the service peers under a stable on-disk macula-native keypair (consistent node id across restarts) via#{identity => KeyPair}; otherwise the SDK auto-generates an ephemeral identity. Identity is for peering, not authorization.
[0.3.0] - 2026-05-19
Added
hecate_om_storemodule: canonical reckon-db + evoq wiring helper. Encapsulatesreckon_db_sup:start_store/1+ 30s readiness wait +evoq_store_subscription:start_link/1. The pattern documented as mandatory inhecate-corpus/skills/ANTIPATTERNS_EVENT_SOURCING.mdnow lives in one place.- Optional callbacks on
hecate_om_service:store_id/0anddata_dir/0. When a service module exports both,hecate_om:boot/1auto-runs the canonical wiring beforeServiceMod:start/1. - New template
templates/sys.config.src.tmplwith the canonical reckon_db + evoq blocks. scripts/scaffold-service.shnow rendersconfig/sys.config.srcalongside the service modules.
Changed
_service.erl.tmplincludes the optionalstore_id/0+data_dir/0callbacks by default; producer-only services remove both.rebar.configadds reckon_db, evoq, reckon_evoq as deps so services usinghecate_omget the store-wiring stack for free. Producer-only services inherit the image-size cost but not the runtime cost (nothing starts unless the service module declaresstore_id/0).
Why
Each new CMD/PRJ service was rediscovering the canonical reckon-db
wiring (or, more often, missing pieces of it). The parksim trio
shipped without {evoq, [{event_store_adapter, ...}]} and without
any reckon_db_sup:start_store/1 call, leaving evoq in default
in-memory mode despite being configured as event-sourced. This
release moves the pattern into the library so future services pick
it up just by exporting two callbacks.
[0.2.0]
Added
- Initial scaffold:
hecate_om_servicebehaviour, helpers for identity claim, capability advertise, and/healthendpoint. - Templates for
Containerfile, Quadlet unit,manifest.json, and CI workflow. - Guides: service anatomy, identity model, container deployment.
Planned
- UCAN-delegated identity wiring once
hecate-realmissues service principals - Common Test framework helpers for service test suites
[0.1.0] - YYYY-MM-DD
Not yet released.