write_all_unlocked now refuses any snapshot holding a key twice (SchemaConflictError for two types), so insert_entry_if_absent, the compare-and-swap family, compare_exchange and the snapshot exchanges cannot bypass it; push and push_all lose their private copies.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A single-file store holds one record per key. push and push_all now refuse (SchemaConflictError) a write that would put another type under a key, leaving file and cache unchanged, within one batch too; the legacy envelope-array decoder refuses a duplicate key like v1. Retyping is remove-then-add.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The legacy envelope-array decoder refuses a duplicate key as v1 does. The single-file writer
refuses (SchemaConflictError, C# Retyped wording) a put/push_all that would land a second type
under a key the store holds or the batch already names; file unchanged. Replace-by-key stays
for the same type. Retyping is remove-then-add.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
decode_store_snapshot refuses a repeated key (Undecodable). SingleFile push and push_all
replaced by (type,key), so a write of another type to an existing key left two records
under one key, which the reader now refuses; they now replace by key alone.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The reader owns the verdict; the writer replaces an arrived record by key alone so it cannot emit a store the reader refuses. Store-file tests no longer pin one key under two types.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Three dup-key vectors (same schema, other schema, different payload) refuse in all
four runtimes; case and NFC/NFD distinct-key vectors read. Runtimes not yet cut: the
dup rows are red until the runtime cuts land.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>