all going well here! slow day. The roadmap is solidifying - in particular
0.10 - Index v2 (we had is_fixed_size = true, and that basically made it huge, padded, and not scalable)
0.11 - data integrity - versioned schemas, data validity guarantees.
For more information please check GitHub - dragginzgame/icydb: ic database @kristofer tagging you as I believe we need an IC- native database layer
[0.9.0] – 2026-02-15 - Strengthening Release
Summary
-
0.9.0ships the strengthening scope: delete-time strong relation protection, explicit opt-in batch transaction lanes, pagination efficiency upgrades, and execution-boundary hardening. -
The
0.8.xbehavioral contract remains preserved: no cursor token format change, no implicit transaction upgrades, and no storage-format redesign. -
Scope references: 0.9 plan, 0.9 status, transaction semantics, and atomicity.
Changed
-
Delete-time strong relation validation now blocks target deletes that would leave dangling references, with reverse-index-backed lookup paths for predictable scaling.
-
Added explicit batch write lanes:
*_many_atomicfor single-entity-type all-or-nothing writes, and*_many_non_atomicfor fail-fast prefix-commit behavior. -
Ordered pagination execution now uses bounded work paths (including PK-ordered streaming and bounded ordered windows) while keeping continuation semantics unchanged.
-
Planner and executor boundaries now share stricter invariant guardrails, including explicit cursor-boundary validation and post-access phase ordering checks.
Fixed
-
Hardened commit-marker replay and recovery behavior for interrupted atomic batch flows, including idempotent replays for mixed row/index mutation sequences.
-
Standardized RI boundary classification and diagnostics so unsupported user input, persisted corruption, and internal invariant failures stay explicitly separated.
-
Expanded trace and metrics coverage for access/post-access phases, reverse-index deltas, and relation-validation outcomes across success and failure paths.
-
Storage diagnostics now distinguish user/system index footprint and report malformed key/entry corruption counters without leaking invalid rows into rollups.
[0.8.5] – 2026-02-15 - Transaction Semantics Hardening
Summary
-
Hardened the
0.8.4explicit transaction milestone with additional API-level regression coverage and clearer operator-facing wording around batch semantics. -
Reconfirmed and documented that
_many_atomicprovides single-entity-type batch atomicity only, while_many_non_atomicpreserves fail-fast partial-commit behavior. -
Completed Step 2 hardening scope for the 0.9 explicit transaction milestone.
Testing
-
Added conflict-path regressions for
update_many_atomic,replace_many_atomic,update_many_non_atomic, andreplace_many_non_atomicto lock all-or-nothing vs prefix-commit behavior. -
Added atomic strong-relation batch regressions for
insert_many_atomic,update_many_atomic, andreplace_many_atomicso one invalid relation fails the full single-entity batch with no persisted partial rows. -
Added empty-batch no-op regression coverage for atomic and non-atomic lanes.
-
Added observability assertions for batch lanes to distinguish atomic success, atomic pre-commit failure, and non-atomic partial-prefix failure metrics.
-
Added recovery dispatch regression coverage that rejects unknown marker entity paths with explicit
Unsupportederrors and no partial replay apply. -
Added hook-integrity recovery regression coverage proving miswired entity dispatch fails as explicit
Corruptionand does not partially apply marker rows. -
Expanded reserved-namespace compile-fail coverage to reject index names where a non-leading
|segment enters the reserved~namespace. -
Added storage-snapshot corruption regressions to ensure malformed data/index keys increment corruption counters and never leak into entity/user/system rollups.
-
Added delete post-access structural regression coverage to lock that delete
limitapplies through delete-limit semantics (not load-style paging) after ordering/filtering.
Changed
-
Added a beginner-friendly lane-selection snippet in
README.mdshowing when to use_many_atomicvs_many_non_atomic. -
Load post-access execution now uses bounded top-k ordering for first-page ordered pagination (
offset=0withlimit) so small pages avoid full in-memory sort work while preserving cursor and ordering semantics. -
Added a PK-ordered streaming load path for
order_by(primary_key ASC)full scans, including cursor pagination continuation, with early stop atoffset + limit + 1for bounded page execution. -
Extended the PK-ordered streaming path to key-range access (
start..=end) so ordered cursor pages within primary-key ranges also avoid full materialization and sort.
[0.8.4] – 2026-02-15 - Explicit Transaction Semantics Milestone
Summary
-
Completed the Step 2 milestone for explicit transaction semantics in the 0.9 track by shipping opt-in atomic batch APIs:
insert_many_atomic,update_many_atomic, andreplace_many_atomic. -
These APIs are single-entity-type batch atomicity only. They are not multi-entity transactions.
-
Existing
*_many_non_atomichelpers remain fail-fast and non-atomic; no implicit behavior change was introduced. -
Added explicit semantics and recovery wording in docs, plus replay/idempotency coverage for interrupted atomic batch markers.
-
Progress and scope references: transaction semantics, atomicity, 0.9 status, 0.9 plan, and roadmap.
Changed
-
Added opt-in
_many_atomicbatch APIs for single-entity-type writes, with all-or-nothing behavior per batch. -
Added explicit API/docs language that this surface does not provide multi-entity transaction coordination.
_many_atomic usage example (single entity type only):
// Single-entity-type atomic batch:
// all User rows commit, or none do.
let users = vec![
User { id: user_a, email: "a@example.com".into() },
User { id: user_b, email: "b@example.com".into() },
];
let saved = db
.session()
.insert_many_atomic(users)?;
assert_eq!(saved.len(), 2);
// Not allowed as one atomic batch:
// mixing User + Order would require a separate multi-entity transaction model.
[0.8.3] – 2026-02-15 - Strong RI Milestone
Summary
-
Completed the 0.9 Strong Referential Integrity milestone (delete-time strong relation protection, reverse-index replay coverage, deterministic pre-commit validation, RI error-class standardization, operator diagnostics, and metrics delta validation).
-
Progress and scope references: 0.9 status, 0.9 plan, and roadmap.
[0.8.2] – 2026-02-15 - Reverse Index Integrity
Changed
-
Strong-relation delete validation now uses reverse index entries instead of scanning source rows, and reverse index mutations are applied through the same commit/recovery path as row writes.
-
Save/delete observability now emits
MetricsEvent::ReverseIndexDeltaandMetricsEvent::RelationValidationas operation-level deltas, so totals reflect exact applied lookup/insert/remove/block actions. -
Storage snapshots now split index usage into
IndexStoreSnapshot.user_entriesandIndexStoreSnapshot.system_entries, making system index footprint visible in diagnostics. -
Added compile-fail coverage for reserved index namespace enforcement so invalid schema changes fail during derive-time checks.
Cleanup
- Unified per-entity runtime dispatch into
EntityRuntimeHooks, removed generatedprepare_row_commit/delete-validator wrapper functions, and replaced parallel hook tables with one generated registry built in a single entity pass.
Breaking
- User-defined index names in the reserved
~namespace are now rejected during schema derive validation.

