You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+36-1Lines changed: 36 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -11,6 +11,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
11
11
12
12
---
13
13
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
0 commit comments