···6060- App-password sessions follow the official runtime more closely than the older local assumptions did: access-token scopes use the `com.atproto.appPass` / `com.atproto.appPassPrivileged` names, standard app-password sessions may list app passwords, privileged-only `getServiceAuth` failures report `InvalidRequest`, and revoked refresh tokens on `refreshSession` fail with `400 ExpiredToken`.
6161- `com.atproto.server.requestPasswordReset` and `com.atproto.server.deleteAccount` now follow the reference form-token flow, with focused regression coverage for missing-account and bearerless deletion semantics.
6262- Password-bearing account endpoints need the same bounded-length behavior as the official runtime: `createAccount` rejects passwords longer than 256 characters, `createSession` rejects passwords longer than 512 characters with the reset hint, and `resetPassword` / `deleteAccount` reject overlong password inputs with `Invalid password length.`
6363+- The executable reference harness now also pins those password-boundary semantics directly, including the official `AuthenticationRequired` error shape for overlong `createSession` requests and case-insensitive `requestPasswordReset` email lookup.
6364- `com.atproto.server.createAccount` with an explicit `did` must behave like an authenticated migration flow: require auth from that same DID, keep the existing DID document, and start the new account deactivated until activation catches the DID document up to the new PDS.
6465- `com.atproto.server.checkAccountStatus` must validate the stored DID document against the PDS service endpoint and signing key, and `com.atproto.repo.describeRepo` must derive `didDoc` / `handleIsCorrect` from that document instead of hardcoding success.
6566- `com.atproto.sync.getBlob` should ship the same download-hardening headers as the reference PDS (`X-Content-Type-Options`, `Content-Disposition`, `Content-Security-Policy`).
+1-1
lib/ATProto/PDS/API/Server.pm
···210210211211 $registry->register('com.atproto.server.createSession', sub ($c, $endpoint) {
212212 my $body = $c->req->json || {};
213213- xrpc_error(401, 'AuthRequired', 'Password too long. Consider resetting your password.')
213213+ xrpc_error(401, 'AuthenticationRequired', 'Password too long. Consider resetting your password.')
214214 if length($body->{password} // q()) > $OLD_PASSWORD_MAX_LENGTH;
215215 my $account = find_account($c, $body->{identifier} // q());
216216 xrpc_error(401, 'AuthRequired', 'Invalid identifier or password') unless $account;