Replace the single DomainObject/EncryptableList classes with a read/write split
that removes the optional-event ambiguity:
- base.ts: EventReader<P> (static kind; fromEvent(event, signer?) eagerly computes
a generic `plain`, validates leniently, throws-or-passes; lazy method accessors;
group/protect/expires + extraTags carry-over; builder()) and EventBuilder<P>
(chainable setters, buildTags/buildContent, validate-on-emit).
- List.ts: ListReader/ListBuilder for NIP-51 lists (decrypt-on-read into `plain`,
re-encrypt-on-emit, tag mutators).
- Every kind converted to a <Noun> reader + <Noun>Builder pair; membership ops
split into per-kind reader/builder pairs over a shared abstract base.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V67tPYdvh1qCkjEBhJGZUR