Skip to content

Commit 30fff6a

Browse files
ascorbicclaude
andauthored
docs: simplify migration to deactivated account pattern (#32)
Replace the complex migration wizard with a simpler deploy-first approach: - Accounts start deactivated when deployed with a DID - Data imported via existing importRepo/uploadBlob endpoints - activateAccount transitions to active state - No createAccount needed - setup happens at deploy time Key changes: - migration-wizard.md: Rewritten around deactivated account concept - endpoint-implementation.md: Updated priorities, removed unneeded endpoints 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
1 parent c1619fe commit 30fff6a

2 files changed

Lines changed: 246 additions & 639 deletions

File tree

plans/todo/endpoint-implementation.md

Lines changed: 70 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -70,80 +70,101 @@ This document tracks the implementation status of all AT Protocol XRPC endpoints
7070

7171
## TODO Endpoints (Grouped by Priority)
7272

73-
### Migration Support (P1 - Critical)
73+
### Account Lifecycle (P1 - Critical for Migration)
7474

75-
**Account Lifecycle:**
76-
- `com.atproto.server.createAccount` - Create deactivated account for migration
77-
- `com.atproto.server.activateAccount` - Activate account after migration
78-
- `com.atproto.server.deactivateAccount` - Deactivate old account post-migration
79-
- `com.atproto.server.checkAccountStatus` - Verify migration progress
75+
For the deactivated account pattern (see `migration-wizard.md`):
8076

81-
**Identity Management (PLC Operations):**
82-
- `com.atproto.identity.getRecommendedDidCredentials` - Get DID credentials from new PDS
83-
- `com.atproto.identity.requestPlcOperationSignature` - Request email challenge
84-
- `com.atproto.identity.signPlcOperation` - Sign PLC operation with email token
85-
- `com.atproto.identity.submitPlcOperation` - Submit to PLC directory
77+
| Endpoint | Purpose | Notes |
78+
|----------|---------|-------|
79+
| `activateAccount` | Transition deactivated → active | Enables writes, firehose |
80+
| `deactivateAccount` | Transition active → deactivated | Disables writes |
81+
| Enhanced `getAccountStatus` | Return activation state | Add `activated`, `imported` fields |
8682

87-
**Data Migration:**
88-
- `com.atproto.repo.listMissingBlobs` - Identify failed blob imports
83+
**Deactivation guards needed:**
84+
- Block writes (`createRecord`, `putRecord`, `deleteRecord`, `applyWrites`) when deactivated
85+
- Allow reads, `importRepo`, `uploadBlob`, `activateAccount`
8986

90-
**Total: 9 endpoints**
87+
**Total: 2 new endpoints + 1 enhancement**
9188

9289
### App Passwords (P2 - Important)
9390

94-
- `com.atproto.server.createAppPassword` - Create app-specific revocable passwords
95-
- `com.atproto.server.listAppPasswords` - List all app passwords
96-
- `com.atproto.server.revokeAppPassword` - Revoke specific app password
91+
| Endpoint | Purpose |
92+
|----------|---------|
93+
| `createAppPassword` | Create app-specific revocable passwords |
94+
| `listAppPasswords` | List all app passwords |
95+
| `revokeAppPassword` | Revoke specific app password |
9796

9897
**Total: 3 endpoints**
9998

10099
### Advanced Sync (P3 - Nice to Have)
101100

102-
- `com.atproto.sync.getBlocks` - Get specific blocks by CID
103-
- `com.atproto.sync.getLatestCommit` - Get latest commit without full repo
104-
- `com.atproto.sync.getRecord` - Get record with merkle proof
101+
| Endpoint | Purpose |
102+
|----------|---------|
103+
| `getBlocks` | Get specific blocks by CID |
104+
| `getLatestCommit` | Get latest commit without full repo |
105+
| `getRecord` (sync) | Get record with merkle proof |
105106

106107
**Total: 3 endpoints**
107108

108-
## Will NOT Support
109+
## Not Implementing
110+
111+
### createAccount
112+
113+
**Reason:** Account creation happens at deploy time, not via API.
114+
115+
For migration: DID set in env vars, data imported via `importRepo`.
116+
For new accounts: Deploy script generates DID, publishes to PLC.
117+
118+
May revisit if tools like Goat require it.
119+
120+
### PLC Operation Endpoints
121+
122+
| Endpoint | Reason |
123+
|----------|--------|
124+
| `getRecommendedDidCredentials` | Not needed - keys generated at deploy |
125+
| `requestPlcOperationSignature` | Handled by old PDS during migration |
126+
| `signPlcOperation` | Handled by old PDS during migration |
127+
| `submitPlcOperation` | Handled by old PDS during migration |
128+
129+
PLC operations for migration are performed against the **old** PDS, not the new one.
109130

110131
### Multi-User Administration (14 endpoints)
132+
111133
**Reason:** Single-user PDS has no admin/user separation
112134

113135
All `com.atproto.admin.*` endpoints
114136

115137
### Moderation (1 endpoint)
138+
116139
**Reason:** Single-user PDS doesn't need moderation infrastructure
117140

118141
- `com.atproto.moderation.createReport`
119142

120143
### Account Creation & Invites (5 endpoints)
121-
**Reason:** Single-user PDS is pre-configured
122144

123-
- `com.atproto.server.createInviteCode`
124-
- `com.atproto.server.createInviteCodes`
125-
- `com.atproto.server.getAccountInviteCodes`
126-
- `com.atproto.temp.checkSignupQueue`
145+
**Reason:** Single-user PDS is pre-configured
127146

128-
*Exception:* `createAccount` will be implemented for migration only
147+
- `createInviteCode`
148+
- `createInviteCodes`
149+
- `getAccountInviteCodes`
150+
- `checkSignupQueue`
129151

130152
### Email Verification & Recovery (6 endpoints)
153+
131154
**Reason:** Single-user PDS has no email system
132155

133-
- `com.atproto.server.confirmEmail`
134-
- `com.atproto.server.requestEmailConfirmation`
135-
- `com.atproto.server.requestEmailUpdate`
136-
- `com.atproto.server.updateEmail`
137-
- `com.atproto.server.requestPasswordReset`
138-
- `com.atproto.server.resetPassword`
156+
- `confirmEmail`
157+
- `requestEmailConfirmation`
158+
- `requestEmailUpdate`
159+
- `updateEmail`
160+
- `requestPasswordReset`
161+
- `resetPassword`
139162

140163
### Deprecated (2 endpoints)
141164

142165
- `com.atproto.sync.deprecated.getCheckout`
143166
- `com.atproto.sync.deprecated.getHead`
144167

145-
**Will Not Support Total: 28 endpoints**
146-
147168
## Proxy Strategy
148169

149170
All unimplemented `app.bsky.*` endpoints are proxied to `api.bsky.app` with service auth. This includes:
@@ -157,19 +178,25 @@ This is intentional - the edge PDS focuses on repository operations and federate
157178

158179
## Implementation Phases
159180

160-
### Phase 1: Migration Support (13 endpoints)
161-
Enable full account migration to/from this PDS
162-
- See `migration-wizard.md` for detailed specification
181+
### Phase 1: Account Lifecycle (2 endpoints)
182+
183+
Enable deactivated account pattern for migration:
184+
- `activateAccount`
185+
- `deactivateAccount`
186+
- Deactivation guards on write operations
163187

164188
### Phase 2: OAuth Provider
165-
Enable ecosystem compatibility with "Login with Bluesky" apps
166-
- See `oauth-provider.md` for detailed specification
167189

168-
### Phase 3: Enhanced Features (3 endpoints)
169-
Multi-device auth with app passwords
190+
Enable ecosystem compatibility with "Login with Bluesky" apps.
191+
See `oauth-provider.md` for detailed specification.
192+
193+
### Phase 3: App Passwords (3 endpoints)
194+
195+
Multi-device auth with revocable app passwords.
170196

171197
### Phase 4: Advanced Sync (3 endpoints)
172-
Efficient partial sync and merkle proofs
198+
199+
Efficient partial sync and merkle proofs.
173200

174201
## Endpoint Coverage by Namespace
175202

0 commit comments

Comments
 (0)