All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
AccountId gains a subaccount leg ({ id, sub }), so several
independent balances live under one owner, each individually addressable,
drained, and closed. Aggregate reads take a base id plus an optional
subaccount filter; exact operations take the full AccountId; balances are
never summed across subaccounts. (ADR-0012)AccountId has a fixed 20-character
Display/FromStr form (a base-36 body plus two mod-97 check digits) for
presentation and routing, while storage keeps the two integer legs. (ADR-0015)SagaStore::get_saga, a keyed read for a single write-ahead record, so
recovery no longer scans every pending record.FOR UPDATE and ON CONFLICT paths)
and runs the test suite with the i128 Cent backing.Store write method returns the number of
affected rows and makes no domain decision. The saga interprets counts and
owns idempotency and compensation, with a phase-tracked write-ahead record and
roll-forward crash recovery in place of a monolithic commit transaction.
(ADR-0003) (breaking for Store implementors)DEBIT_MUST_NOT_EXCEED_CREDIT flag; overdraft is allowed by default. (ADR-0018)Ledger was split into concern-named submodules; the
commit-safety invariant is documented and its double-spend guard named
(ADR-0021); the write-ahead recovery record was concentrated into one
pending module; balance computation was consolidated into one module.UserData type and the orphaned withdraw saga step. (breaking)doc/journaling.md and ADR-0013, and notes it in the README overview.kuatia-dashboard: a server-rendered dashboard and REST API for observing a
Kuatia ledger over HTTP. Browse accounts, postings, transfers, and the event
log; inspect per-account balances computed in Rust.001_init.sql.Initial release.
sum(consumed) ==
sum(created)).pay, deposit, withdraw) resolved into concrete
postings by the core, committed through a single reserve → finalize saga
with automatic retry and LIFO compensation.NoOverdraft, CappedOverdraft, UncappedOverdraft,
SystemAccount, ExternalAccount, with append-only versioned accounts and
snapshot pinning to guard against TOCTOU races.Ledger::recover() (roll-forward, not rollback).Store trait split into focused sub-traits, with an in-memory
backend and a SQLite/PostgreSQL backend (kuatia-storage-sql).store_tests!) applied to every storage backend.i64 IDs generated in Rust; the database never assigns IDs.i64 default, i128 via the
i128 feature).kuatia-money — monetary Cent type with swappable integer backing.kuatia-types — domain types: accounts, postings, transfers, books.kuatia-core — pure, sans-IO logic: validation, hashing, posting selection.kuatia-storage — storage abstraction and conformance suite.kuatia-storage-sql — SQLite/PostgreSQL backend.kuatia — async Ledger resource and saga commit pipeline.