An adversarial battery against identity-bound secrets: isolation, leakage, tampering, lifecycle, migration, audiences.
165 checks in 16 files. Run: cd Typescript && npm run test:security. Source: Typescript/tests/
Same path, secret and noise under two identities: wholesale copies of blobs, snapshots, envelopes and rootId grant nothing.
Sibling and nested scopes isolate, secret order does not matter, noise cuts inherited secrets but not the identity root, a child inherits protection.
Regression: a root-scope write does not become public after lockIdentity().
Regression: leaves under the root scope me["_"] are not readable by guests.
Pins the deprecated withScope() behavior against as(); a diagnosis, not a permanent contract.
Root secret with [] aggregates and quoted literals: a guest sees what an empty kernel shows.
Regression: same-millisecond writes leave the live index equal to rebuildIndex().
Marker strings do not appear in snapshots, memories, disk files, public reads or errors.
Altered ciphertext, nonce, tag, version, rootId or context, truncation, swapped blobs and unknown formats fail closed; KDF bounds.
Passwords, password change, lock, backup and restore, reseed; a restored root never auto-unlocks branch secrets.
Save, fresh instance, hydrate: scopes stay closed until the secret is supplied, then recovery is exact.
v3 to v4: mixed blobs, scopes pending without a secret, interruptions, original kept until the new one is verified.
Seeded generative sequences checked against a reference model; cache growth is measured.
No plaintext private material is written to localStorage.
Public derivations over secret scopes.
Laws L1 to L9 and the OR, AND, nesting, tamper and revocation cases for audiences.
run-all.mjs runs each file in its own process. Attack model and findings: tests/Security/README.md.
Last result: 165 passed, 0 failed in 16 files. Run summary 2026-10-26
Data encrypted under one .me identity root does not open under another.
Protected values, scope secrets and passwords never appear in snapshots, memory logs or error messages.
Tampered, truncated or relabelled blobs and envelopes fail closed.
A kernel rebuilt from a snapshot comes back closed and recovers once its owner supplies the secrets.
Public derivations of a secret: only someone who can open the secret can expose them.
A secret wrapped for one P-256 public key opens only with the matching private key.
Each panel runs npm latest by default; pick another version in its top bar, or add ?v=x.y.z (?v=4.0.2 runs the hash-pinned kernel).