Changes touching this path
- day 0: loot hosts loot
f4c30e75 · dbf3dbe6… - evidence: crew minted and verified (#86)
1fada823 · dbf3dbe6…diff - normalize working tree to LF: byte-stable co-located bridge (.gitattributes -text)
e58fdda6 · dbf3dbe6…diff - Workspace accepts its clock; lane flag-gate goes pure so cmd_* tests never touch a real .loot (#322)
20ac82e1 · dbf3dbe6…diff - Slice 4 (#426): author private (sealed) content — visibility + guards
Adds the authorship/sealing side of private content to the in-memory TS SDK,
plus same-session read-back. Cross-session grant delivery stays deferred (#383).
ECIES to wasm (single-sourced, no drift): move the key_seal composition (ECDH
over X25519 + ChaCha20-Poly1305, the "loot grant key wrap 2024" KDF, ed25519→
x25519 derivation, 80-byte wire format) into the wasm-buildable loot-codec.
loot-identity::key_seal now delegates to it, preserving its IdentityError surface
so loot-cli/loot-net callers are untouched. loot-wasm's Identity gains
x25519PublicKey / sealKeyToSelf / unsealKey.
ChangeBuilder::put now seals Restricted content: the content key is ECIES-wrapped
to the author (never rides in the bundle), so the relay stores only ciphertext.
AuthoredChange exposes the private grants (oid → wrapped key) for the SDK's RAM
keyring; read() unwraps via the wasm identity to read own content back.
SDK guard model: edit(path, bytes, { visibility }) inherits the path's current
visibility (new path → public); describe/push take { allowDemote, allowReveal }
and a visibility change without the matching guard is refused (GuardError).
list()/read() report each entry's visibility.
Seams: parity.rs freezes the deterministic x25519 pubkey + a native ECIES
wrapped-key vector and asserts native AND wasm unseal it (round-trip + wrong-
identity refusal). private.behavior.test.ts drives sealing-stores-ciphertext,
same-session read-back, keyless-reader refusal, and the guard cases.
ac8b8ef5 · dbf3dbe6…diff
Renames are not followed. loot's tree maps a path to an address, so a rename is a delete and an add. This list is the history of the name, not of the bytes.