write-receipt: one unreadable text, one blank-field rule (both servers) #64
Loading…
Reference in a new issue
No description provided.
Delete branch "libby/write-receipt-text-blank-rules"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes the two Heimdall low follow-ups
heimdall-low-unreadable-textandheimdall-low-blank-field-rule(libby-body).A. One unreadable text.
message_invalid: the message could not be read(the servers' wording, kept over the vectors'unreadable frame: it is what both servers already send, so no wire change). Added to the spec's Fixed texts; the two vectors that carry it (error_v1_unreadable_frame_has_null_message_id,error_v1_empty_schema_id_is_unreadable_and_names_the_write) are re-encoded. The Rust wire never carried decoder text (only the local rejection Display does); a test pins the exact string on a receipt connection. C# has one owner now,CultNetErrorMessage.ForUnreadableMessage.B. One blank-field rule. Read and run before deciding: Rust refused blank
storedAt, empty payload, blank present source ids and blank tags (decodervalidate_raw_document_record, every connection); C# refused only blankschemaId/recordKey. No product fork: a MessagePack value is at least one byte, so an empty payload is no document. Rule (spec, Required fields): a put that names nothing is refused as unreadable (message_invalid, fieldmessage, the write's id) on every connection, never applied. C# now follows Rust. Absent/nil source ids and tags and an empty tag list stay valid. New vectors sectionblankFields(15 cases) is replayed by both servers' tests (Rust: receipt and legacy; C#: receipt and legacy, plus a nil payload).Checks: cultnet-rs
write_receipt6/6, cultmesh-rs targeted tests, C#GameCult.Networking.Tests639 passed / 4 skipped (before the last test), cultnet-ts vector replay 33/33 andwrite-receipt.test.js21/21.Mutants (hand-rolled, under
prlimit --as=4294967296 --cpu=300; cargo-mutants and Stryker not used): Rust 9/9 killed (decoder rules in contracts.rs and the fixed text); C# 13 on the diff, 13 killed after one survivor (nil payload) got its own test, plus a no-op control that survived as it should.🤖 Generated with Claude Code
Update: blank means Unicode White_Space (Heimdall's ruling)
Spec states the exact White_Space list; vectors add whiteSpaceCodePoints (25), notWhiteSpaceCodePoints (U+200B/C/D, U+2060, U+FEFF, U+180E, U+001C-001F) and named cases. Rust (cultmesh-rs rudp_document_server) and C# (CultNetWriteReceiptServerTests) test every code point in every covered field. C# now checks the listed set in one place (IsBlank), not IsNullOrWhiteSpace. TS: no server, replay runner does not use blankFields; passes unchanged. Python/Kotlin not touched.
Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com