Revisions are absolute state positions between diffs: the empty initial
state is revision 0 and each change record advances it by one. Snapshots
persist the revision of the state they contain in a new r field, stamped
with a meta format version k (kanta.structs.META_FORMAT, currently 1);
change records carry no revision of their own.
- kanta.rev exposes the current revision (raises before open)
- replay restores the revision, trusting r on k-marked snapshots and
counting change records from the start of the file for legacy (k0) ones
- rotation preserves absolute revisions, counted from record positions
- meta migration k1 rewrites a legacy file in full on writable open:
leading snapshot preserved and re-stamped, all change records kept,
closing snapshot with the total revision; read-only opens compute the
same revision without touching the file
- CLI range selectors accept rN bounds: rN is the record that produced
state N with its state (the change, or the snapshot materializing it);
single indexes must exist, ranges truncate Python-style
- CLI snapshot indicator lines show the snapshot revision
State dict injection now works by parameter name (prev/state, annotation
not checked) with DictPrev/DictState tags taking precedence; DictPre/DictPost
remain as aliases. MigrationResult is renamed to MigrationReport with fields
original/version/applied; the old type alias and a deprecated .migrations
property remain. Old symbols stay covered by the original tests; new-style
tests import from the kanta root. Includes some unrelated ruff formatting.