Skip to content

Commit fe55cc4

Browse files
docs(meta): 📝 v0.7.3 changelog and README update (#128)
## Summary Adds the v0.7.3 changelog entry and updates README status ahead of tagging. Covers all 8 performance fixes from #127 and the pointer-before-manifest safety protocol. ## Highlights - **CHANGELOG.md**: Full `[0.7.3]` section with Fixed, Added, Upgrade Notes, and References - **README.md**: Status updated from v0.7.2 → v0.7.3 with performance callout - **Upgrade Notes**: Explicit "no migration required" — pre-v0.7.3 data self-heals on first write ## Test plan - [ ] CHANGELOG link references resolve correctly - [ ] README status section reads accurately - [ ] No code changes — docs only 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent bb6c361 commit fe55cc4

2 files changed

Lines changed: 41 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
---
1313

14+
## [0.7.3] - 2026-02-12
15+
16+
### Fixed
17+
18+
- **O(N) cold-start `Latest()` on remote stores**: `Latest()` previously downloaded every manifest in the dataset to find the most recent snapshot. On Cloudflare R2 with ~5,800 manifests this took ~30 minutes. A persistent `latest` pointer file now provides O(1) resolution: 1 Get (pointer) + 1 Get (manifest). ([#127](https://github.com/pithecene-io/lode/pull/127), closes [#118](https://github.com/pithecene-io/lode/issues/118), [#119](https://github.com/pithecene-io/lode/issues/119))
19+
- **O(N) `Snapshot(ctx, id)` on HiveLayout**: `Snapshot()` scanned all partition directories to find a manifest matching the given ID. A canonical manifest is now written at the non-partitioned path for O(1) lookup, with scan fallback for pre-v0.7.3 data. ([#127](https://github.com/pithecene-io/lode/pull/127), closes [#121](https://github.com/pithecene-io/lode/issues/121))
20+
- **O(N) `latestByScan` downloaded ALL manifests**: Even the scan fallback path loaded every manifest. It now sorts paths lexicographically and loads only the last one: 1 List + 1 Get. ([#127](https://github.com/pithecene-io/lode/pull/127), closes [#122](https://github.com/pithecene-io/lode/issues/122))
21+
- **O(B) `Volume.ReadAt` block lookup**: `findCoveringBlocks` used linear scan over all blocks. Now uses binary search on sorted blocks for O(log B) start-index lookup. Blocks are sorted at commit time via a merge-insert algorithm. ([#127](https://github.com/pithecene-io/lode/pull/127), closes [#123](https://github.com/pithecene-io/lode/issues/123))
22+
- **O(N) `ListManifests` / `ListPartitions`**: Both methods downloaded every manifest to extract IDs and partition paths. Snapshot IDs and partition paths are now extracted from store listing paths. ([#127](https://github.com/pithecene-io/lode/pull/127), closes [#124](https://github.com/pithecene-io/lode/issues/124), [#125](https://github.com/pithecene-io/lode/issues/125))
23+
- **O(N log N) `validateNoOverlaps` on pre-sorted blocks**: Skips redundant sort when blocks are already sorted (the common case after `mergeBlocks`). ([#127](https://github.com/pithecene-io/lode/pull/127), closes [#126](https://github.com/pithecene-io/lode/issues/126))
24+
25+
### Added
26+
27+
- **Persistent latest pointer**: Datasets and Volumes write a `latest` file containing the most recent snapshot ID. Cold-start `Latest()` reads this pointer (1 Get) instead of scanning all manifests. The pointer is written before the manifest (pointer-before-manifest protocol) to ensure cross-process correctness.
28+
- **Pointer-before-manifest protocol**: Pointer write failure aborts the commit — no manifest is written. A pointer ahead of reality is harmless (Exists verification falls through to scan). This eliminates stale-but-existing pointer bugs across process restarts.
29+
- **Canonical manifest for HiveLayout**: `Snapshot(ctx, id)` is now O(1) via a canonical manifest at the non-partitioned path, alongside the partition-specific copies.
30+
- **Binary search for Volume block lookup**: Blocks are stored sorted by offset in the manifest. `findCoveringBlocks` uses `sort.Search` for O(log B) lookup instead of O(B) linear scan.
31+
- **Merge-insert for cumulative blocks**: `mergeBlocks` merges pre-sorted existing blocks with new blocks in O(N + K log K) instead of re-sorting the entire set.
32+
- **Benchmarks**: `BenchmarkFindCoveringBlocks` (O(log B) at 10–10K blocks), `BenchmarkMergeBlocks` (O(N + K log K) at 10–10K existing blocks)
33+
34+
### Upgrade Notes
35+
36+
- **No API changes**: All improvements are internal and transparent
37+
- **No migration required**: Pre-v0.7.3 datasets and volumes work without modification
38+
- **Automatic self-healing**: On first write after upgrade, the `latest` pointer is created. On first `Snapshot(ctx, id)` for HiveLayout, scan fallback works for pre-v0.7.3 data; the canonical manifest is created on the next write.
39+
- **Safe to upgrade from v0.7.2**
40+
41+
### References
42+
43+
- [docs/BENCHMARKS.md](docs/BENCHMARKS.md) — Benchmark inventory and results
44+
- [docs/contracts/CONTRACT_TEST_MATRIX.md](docs/contracts/CONTRACT_TEST_MATRIX.md) — Performance test coverage
45+
46+
---
47+
1448
## [0.7.2] - 2026-02-09
1549

1650
### Changed
@@ -346,7 +380,8 @@ Post-v0.3.0 improvements planned:
346380

347381
---
348382

349-
[Unreleased]: https://github.com/pithecene-io/lode/compare/v0.7.2...HEAD
383+
[Unreleased]: https://github.com/pithecene-io/lode/compare/v0.7.3...HEAD
384+
[0.7.3]: https://github.com/pithecene-io/lode/compare/v0.7.2...v0.7.3
350385
[0.7.2]: https://github.com/pithecene-io/lode/compare/v0.7.1...v0.7.2
351386
[0.7.1]: https://github.com/pithecene-io/lode/compare/v0.7.0...v0.7.1
352387
[0.7.0]: https://github.com/pithecene-io/lode/compare/v0.6.0...v0.7.0

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,13 @@ Each example is self-contained and runnable. See the example source for detailed
309309

310310
## Status
311311

312-
Lode is at **v0.7.2** and under active development.
312+
Lode is at **v0.7.3** and under active development.
313313
APIs are stabilizing; some changes are possible before v1.0.
314314

315+
v0.7.3 introduces O(1) snapshot resolution (persistent latest pointer),
316+
O(log B) volume block lookups, and eliminates all known O(N) hotspots on remote stores.
317+
No API changes; existing data is compatible without migration.
318+
315319
If you are evaluating Lode, focus on:
316320
- snapshot semantics (Dataset and Volume)
317321
- metadata visibility

0 commit comments

Comments
 (0)