···4949- Passkeys are stored as account credentials: credential ID, public key,
5050 signature counter, friendly name, and timestamps. Password login remains
5151 available unless an explicit account policy changes that.
5252+- Password sessions are storage-backed token families. Accept session JWTs only
5353+ when their JTI is active, and keep subject/actor/controller fields distinct in
5454+ account-plane audit work.
5255- OAuth should follow the ATProto OAuth profile and JOSE behavior without
5356 relaxing stricter repo-signature verification semantics.
5457- Appview behavior belongs behind the generic proxy path, not in local
+10
docs/architecture.md
···1717 login/security surface.
1818- SQLite stores account, repo, commit, token, OAuth, blob metadata, and identity
1919 state.
2020+- Password sessions are durable rows keyed by access and refresh JWT IDs. Refresh
2121+ rotates the stored token family instead of trusting self-contained JWTs alone.
2222+- Account-plane audit events store subject, actor, and optional controller DID
2323+ fields. That mirrors Tranquil's delegation-ready model without exposing user
2424+ delegation before the surrounding account controls exist.
2025- Invite codes follow the official PDS split between code metadata and recorded
2126 uses; account creation consumes a code while holding the store lock.
2227- Blob bytes live in the disk blobstore rooted at `ZDS_BLOBSTORE_PATH`.
···5661resource-server checks.
57625863Password sessions and app passwords match the reference PDS account model.
6464+Session JWTs are accepted only when their JTI is present in the active session
6565+table, so revocation and refresh rotation can be enforced by storage. The
6666+session schema already carries an optional `controller_did` column for future
6767+delegated-account flows, following Tranquil's controller-vs-subject split.
6868+5969Passkeys are an additional OAuth login credential inspired by Tranquil, backed
6070by the local `webauthn` dependency and stored in SQLite. Discoverable passkey
6171login is supported so an account can be chosen by the authenticator during the
+7
docs/development.md
···5151- Passkey support should stay close to Tranquil's WebAuthn model: account-owned
5252 credential rows plus challenge rows, with browser prompts opened directly from
5353 user gestures.
5454+- Account-plane security state should stay durable. Password sessions are not
5555+ just signed JWTs; storage tracks active access/refresh JTIs, refresh rotation,
5656+ revocation state, auth method, and optional future controller DID.
5757+- When adding account-management behavior, record subject DID, actor DID, and
5858+ optional controller DID separately. That keeps the path toward Tranquil-style
5959+ delegated accounts explicit instead of embedding policy in ad hoc token
6060+ strings.
5461- Storage shape follows the official PDS SQLite model where practical: record
5562 index rows identify current CIDs, and canonical record content is stored as
5663 DAG-CBOR blocks.