A delta layer's `through_shard_sequence` states that every frame from its shard through that sequence is accounted for in the index. Skipping the layer when the delta was empty left a group that introduced no objects advancing the committed sequence without advancing coverage, so the next checkpoint refused: it read the highest layer stamp as the reach of the index and concluded that pruning would drop objects that never existed. Any transaction introducing no objects reached it. An empty layer is the smallest honest way to record that the sequence happened and carried nothing, so `with_subtree` now installs one whenever the publication advances the shard's committed sequence. A maintenance publication appends no frame and still owes nothing. `coverable_through` had the same gap from the other side: it stopped at the first layer whose entries did not resolve as a segment or an active tail, which excluded adopted projection artifacts. Those are the most durable entries in the index -- not in the journal at all, and carried forward by every successor generation -- and were read as the least. The empty layer counts toward layer fan-out and may seal into a zero-entry run. That is the bounded-run model working as designed and is the failure-safe direction: a stamped empty layer costs a run slot, an unstamped one costs the ability to checkpoint at all. Asserted with a plain object-less transaction rather than through the adopting path that found it, so the regression names what actually broke. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JGdH5V43XWnj1PdHqiPktQ |
||
|---|---|---|
| .. | ||
| levcs-cli | ||
| levcs-client | ||
| levcs-core | ||
| levcs-identity | ||
| levcs-instance | ||
| levcs-merge | ||
| levcs-protocol | ||
| levcs-store | ||
| levcs-tui | ||