···141141- `/account` is the resident account hub. It includes passkey and app-password
142142 management, app access/session views, email/account status controls, and the
143143 experimental permissioned-space record browser.
144144-- `com.atproto.space.*` permissioned-data routes are an experimental prototype
145145- and operator gated with `ZDS_PERMISSIONED_DATA`. ZDS implements enough storage
146146- and credential substrate for local experiments, but the upstream proposal is
147147- still moving and this surface is not a stable compatibility contract.
144144+- Permissioned-data routes are experimental and operator gated with
145145+ `ZDS_PERMISSIONED_DATA`. ZDS keeps protocol routes under
146146+ `com.atproto.space.*` and baseline PDS-managed space management under
147147+ `com.atproto.simplespace.*`, but the upstream proposal is still moving and
148148+ this surface is not a stable compatibility contract.
148149149150## references
150151151152- [Tranquil PDS](https://tangled.org/tranquil.farm/tranquil-pds)
152153- [Pegasus](https://tangled.org/futur.blue/pegasus)
153154- [Bluesky PDS](https://github.com/bluesky-social/pds)
154154-- [Bluesky atproto PDS package](https://github.com/bluesky-social/atproto/tree/main/packages/pds)
155155+- [haileyok/cocoon](https://github.com/haileyok/cocoon)
···114114- `ZDS_INVITE_REQUIRED`: set to `true` to require invite codes for account
115115 creation. `describeServer` reflects this value.
116116- `ZDS_PERMISSIONED_DATA`: set to `true` to opt into experimental
117117- `com.atproto.space.*` permissioned-data routes. Default: disabled. The
118118- current implementation is a prototype, not a stable protocol contract. It
119119- provides space lifecycle, private records, grants, credentials, writer repo
120120- state/oplogs, ranged blob reads, and notify routes for local experiments.
121121- Reader/group semantics remain application policy, while the newer proposal's
122122- `com.atproto.simplespace.*` baseline is tracked as future alignment work.
123123- Use `just smoke-permissioned` for the experimental smoke lane.
117117+ permissioned-data routes. Default: disabled. ZDS exposes protocol reads and
118118+ writes under `com.atproto.space.*`, and baseline PDS-managed space management
119119+ under `com.atproto.simplespace.*`. The implementation remains experimental:
120120+ reader/group semantics should stay in application policy, while `simplespace`
121121+ only provides the small required baseline. Use `just smoke-permissioned` for
122122+ the experimental smoke lane.
124123- Passkeys do not require a separate deployment secret. WebAuthn RP ID is
125124 derived from the public URL host.
126125
+8-3
docs/permissioned-data-proposal-94.md
···185185It also introduces simple policies such as `public`, `member-list`, and
186186`managing-app`, plus a managing-app access check hook.
187187188188-This is not the same as reviving the older generic member-list experiment. If
189189-the proposal keeps `simplespace`, ZDS should treat it as a small baseline space
190190-management API while still leaving richer application/group semantics to apps.
188188+This is not the same as reviving the older generic member-list experiment. ZDS
189189+now treats it as a small baseline space management API while still leaving
190190+richer application/group semantics to apps.
191191192192Some commentary describes the boring access model as a list of DIDs. In ZDS
193193terms, do not read that as permission to restore the old protocol member-list
194194sync surface. Treat it as space-management policy, especially for
195195`com.atproto.simplespace.*` and managing-app credential minting.
196196+197197+Implementation note: ZDS exposes the proposal namespace directly and does not
198198+carry the old `com.atproto.space.createSpace` / `updateSpaceConfig` /
199199+`deleteSpace` lifecycle surface. HappyView keeps compatibility aliases for its
200200+own older namespace; ZDS intentionally does not.
196201197202## useful tests before more surface
198203
+25-22
docs/permissioned-data.md
···3434The upstream design is still moving. The May branch included protocol-level
3535member lists. The later discussion moved toward making space credentials the
3636protocol substrate and leaving reader/group semantics to applications or
3737-space-host policy. Proposal PR #94 keeps that broad direction, but also sketches
3838-a baseline `com.atproto.simplespace.*` management surface for PDS-managed
3939-spaces. ZDS has not implemented that newer proposal shape yet.
3737+space-host policy. Proposal PR #94 keeps that broad direction and defines a
3838+baseline `com.atproto.simplespace.*` management surface for PDS-managed spaces.
3939+ZDS implements that namespace split without legacy aliases.
40404141Feedback should respect the research behind the sketch and avoid overfitting to
4242ZDS or plyr.fm. Name concrete implementation pressure, but frame it as input for
···50505151## current prototype surface
52525353-ZDS currently keeps a pre-proposal-94 permissioned-data substrate:
5353+ZDS splits protocol data routes from baseline PDS management routes:
54545555-- space lifecycle: `createSpace`, `getSpace`, `listSpaces`,
5656- `updateSpaceConfig`, `deleteSpace`
5757-- records and blobs: `createRecord`, `putRecord`, `deleteRecord`,
5858- `applyWrites`, `getRecord`, `listRecords`, `getBlob`
5959-- writer state: `getRepoState`, `listRepoOps`, `notifyWrite`
6060-- credentials and deletion fanout: `getDelegationToken`, `getSpaceCredential`,
6161- `notifySpaceDeleted`
5555+- `com.atproto.space.*`: `getSpace`, `listSpaces`, `listRepos`,
5656+ `getDelegationToken`, `getSpaceCredential`, records, blobs, writer state,
5757+ write notifications, and deletion notifications
5858+- `com.atproto.simplespace.*`: `createSpace`, `updateSpace`, `deleteSpace`,
5959+ `addMember`, `removeMember`, and `listMembers`
62606361ZDS uses the proposal names for the credential and sync-read surface:
6462`getDelegationToken` and `listRepoOps`.
65636666-ZDS deliberately does not expose the older protocol member-list routes:
6464+ZDS deliberately does not expose the older protocol member-list routes or the
6565+pre-proposal lifecycle names:
67666868-- `addMember`
6969-- `removeMember`
7067- `getMembers`
7168- `getMemberState`
7269- `getMemberOplog`
7370- `notifyMembership`
7171+- `com.atproto.space.createSpace`
7272+- `com.atproto.space.updateSpaceConfig`
7373+- `com.atproto.space.deleteSpace`
74747575`getSpace` and `listSpaces` do not return `members` or `isMember`.
7676···8585portable access state, it should model that state as application records in a
8686permissioned space rather than relying on a universal PDS-wide member list.
87878888-The newer proposal draft may still require a small PDS-managed
8989-`com.atproto.simplespace.*` baseline for simple spaces. That is a compatibility
9090-target to evaluate, not permission to rebuild the older generic member-list
9191-experiment.
8888+`simplespace` membership is stored only as baseline space-management policy
8989+state. It is not exposed as a protocol sync surface. For a `member-list` space,
9090+ZDS mints credentials and allows bearer reads/writes only for listed DIDs. For
9191+`public`, any requester can be authorized. `managing-app` is represented in
9292+config, but ZDS currently fails closed until the `checkUserAccess` service-auth
9393+hook is implemented.
92949393-For private spaces, ZDS currently mints space credentials only to the space
9494-authority DID unless the space is public. That is the conservative default until
9595-the protocol settles on an application or space-host policy hook for broader
9696-credential issuance.
9595+`appAccess` follows the proposal shape: `{"type":"open"}` or
9696+`{"type":"allowList","allowed":[...]}`. ZDS can enforce the literal client ID
9797+it sees in a delegation token; client attestation remains an explicit gap.
97989899Writer notifications are keyed by writer repo. `notifyWrite` verifies service
99100auth from the writer repo to the space DID, then fans out to registered
···107108- `permissioned_spaces`: canonical authority-space config keyed by space URI
108109- `permissioned_space_actor_state`: actor-local authority/deleted state keyed by
109110 `(space, actor_did)`
111111+- `simplespace_members`: baseline PDS-managed member-list policy state keyed by
112112+ `(space, member_did)`
110113- `permissioned_space_records`: current records keyed by
111114 `(space, repo_did, collection, rkey)` with CID, DAG-CBOR value, repo revision,
112115 and indexed timestamp