TypeScript: a record with unread slots is held read-only (slot-readonly-ts) #128

Merged
libby merged 5 commits from hands/slot-readonly-ts into main 2026-11-12 05:03:29 +00:00
Member

cultlib-gaps:follow_up:bytes-after-land-and-slot-leaves, spec cultlib-gaps:cut_spec:cut-slot-readonly-ts.r2, rulings slot-mark-consent, slot-unmeasurable-type: cultcache-ts holds a record whose payload carries slots past its reader's declared slots, at any depth, read-only (every write and removal refused, store unchanged). Consent follows the union-parity README: depth-0 mark, arrival id differs from the reader's own and is listed compatible, slot count covered by the stored catalog. One shared #judge decides put, putEnvelope, delete and isWritable; an owner's delete of a key held as another type removes the one record (single store call). Vectors walked: extra-slot-store.cc (minus the variant row, unreadable here), extra-slot-consent.cc, slot-outcomes.msgpack (not grown; outcomes.msgpack still 9 rows).

Semver: Unreleased/Breaking in the cultcache-ts CHANGELOG; implies a minor bump while 0.x (0.16.0).

Soul: verdicts cut-slot-readonly-ts.s1 to .s4 (s1 own-id consent, s2 isWritable as a second judge, s3 delete parity, s4 holds; one surviving mutant, removeEntry registration, is unobservable and stated in the report). Reports h1 to h5. cultcache-ts 243 tests, cultnet-ts 345, cultmesh-ts 266, cultmesh-browser 51; the only failures are the 3 esbuild bundling tests that also fail on main in this sandbox.

🤖 Generated with Claude Code

`cultlib-gaps:follow_up:bytes-after-land-and-slot-leaves`, spec `cultlib-gaps:cut_spec:cut-slot-readonly-ts.r2`, rulings `slot-mark-consent`, `slot-unmeasurable-type`: cultcache-ts holds a record whose payload carries slots past its reader's declared slots, at any depth, read-only (every write and removal refused, store unchanged). Consent follows the union-parity README: depth-0 mark, arrival id differs from the reader's own and is listed compatible, slot count covered by the stored catalog. One shared `#judge` decides put, putEnvelope, delete and `isWritable`; an owner's delete of a key held as another type removes the one record (single store call). Vectors walked: `extra-slot-store.cc` (minus the variant row, unreadable here), `extra-slot-consent.cc`, `slot-outcomes.msgpack` (not grown; `outcomes.msgpack` still 9 rows). Semver: Unreleased/Breaking in the cultcache-ts CHANGELOG; implies a minor bump while 0.x (0.16.0). Soul: verdicts `cut-slot-readonly-ts.s1` to `.s4` (s1 own-id consent, s2 `isWritable` as a second judge, s3 delete parity, s4 holds; one surviving mutant, `removeEntry` registration, is unobservable and stated in the report). Reports h1 to h5. cultcache-ts 243 tests, cultnet-ts 345, cultmesh-ts 266, cultmesh-browser 51; the only failures are the 3 esbuild bundling tests that also fail on main in this sandbox. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
slots() and the unit arm note slots past the reader's declared ones into a
scope the one payload decode entry opens; the hydrated entry carries the mark
and one check in the write and removal paths refuses with SchemaConflictError
carrying unreadSlots. isWritable and unreadSlots are the live queries.
Consent follows the C# reference: depth 0 and explained by the catalog.
Walker: the C# union-parity read-only vectors and the two slot stores.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Soul s1: explainedBy requires the arrived id to differ from the reader's own and be
listed compatible (a wider writer under a hand-written own id stays read-only, real
single-file round trip pinned); isWritable asks the record a restamp would replace;
the refusal carries the id the record arrived under; CHANGELOG says putEnvelope marks.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
#judge (foreign key, global key, retype and its home, unread slots) is thrown by
#writeNow and #deleteNow and asked by isWritable, so the query cannot disagree with
put. A matrix test pins isWritable against put per key state.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The removal form of #judge refuses a held record of a type the deleter does not own and
returns the owned one; #deleteNow removes it with one store call and drops the cache
once the store has. Ported from the Python resolution (cut-slot-readonly-py.h5).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cultcache-ts: pin the removal form (unread check, held record's store, held type's lookups); isWritable doc names the write form
All checks were successful
CultMesh portability and performance / ubuntu-latest reactive semantics and leases (pull_request) Successful in 19m39s
f5d68af0a5
Tests and docs only. The mutant that removes with the deleter's registration still
survives: registered only decides the global key, which is always the same key.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
libby merged commit 676f611c1f into main 2026-11-12 05:03:29 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GameCult/CultLib!128
No description provided.