# Storage — Spec Delta (storage-set-partial) ## ADDED Requirements ### STORAGE-PARTIAL-WRITE-01 — `setPartial` is part of the abstract surface `AbstractStorage` MUST declare `abstract setPartial(key: string, offset: number, bytes: Uint8Array, signal?: AbortSignal): Promise`. Every concrete subclass MUST provide an implementation. A protected `defaultSetPartial` helper MUST exist as the read-modify-write reference fallback. **Verified by:** `src/abstract/abstract.spec-conformance.test.ts` (`STORAGE-PARTIAL-WRITE-01`). ### STORAGE-PARTIAL-WRITE-02 — sparse extension semantics When `setPartial(key, offset, bytes)` is called on a non-existent key or on an existing object shorter than `offset + bytes.byteLength`, the storage object MUST be created/extended to length `max(currentLength, offset + bytes.byteLength)`. Bytes in the gap `[currentLength, offset)` MUST be zero (`0x00`) on subsequent reads. **Verified by:** `src/abstract/abstract.spec-conformance.test.ts` (`STORAGE-PARTIAL-WRITE-02`). ### STORAGE-PARTIAL-WRITE-03 — overlap is in-place overwrite When `setPartial(key, offset, bytes)` is called on a key whose existing object overlaps the written range, bytes within `[offset, offset + bytes.byteLength)` MUST be overwritten with `bytes`. Bytes outside that range MUST be preserved exactly. **Verified by:** `src/abstract/abstract.spec-conformance.test.ts` (`STORAGE-PARTIAL-WRITE-03`). ### STORAGE-PARTIAL-WRITE-04 — capabilities are explicit `AbstractStorage` MUST expose a readonly `capabilities` property of shape `{ partialReads: boolean; partialWrites: boolean; nativeStreams: boolean; atomicWrites: boolean; contentAddressable: boolean }`. Defaults MUST be all `false`. Subclasses MUST override per native support. `MemoryStorage.capabilities.partialWrites` MUST be `true`. **Verified by:** `src/abstract/abstract.spec-conformance.test.ts` (`STORAGE-PARTIAL-WRITE-04`); `src/memory/memory.spec-conformance.test.ts` (`STORAGE-PARTIAL-WRITE-04`).