···1313The current baseline for saying "the audited suite is green" is:
14141515- `prove -lr t`
1616- - latest full green result in the realigned Meridian worktree: `Files=48, Tests=2967`
1616+ - latest full green result in the realigned Meridian worktree: `Files=48, Tests=3000`
1717- `prove -lv t/server-auth.t`
1818- `perl -c script/differential-validate`
1919- `PERLSKY_RUN_REFERENCE_DIFF=1 prove -lv t/reference-differential.t`
···5858- The executable differential harness now proves that handle-conflict shape directly for both user and admin handle-update flows, not just local regression tests.
5959- `com.atproto.server.createSession` invalid-credential failures now use the reference runtime’s `401 AuthenticationRequired` shape instead of the older local `AuthRequired` variant.
6060- `com.atproto.admin.sendEmail` now follows the reference runtime’s `400 InvalidRequest` / `Recipient not found` shape for a missing recipient instead of returning a local `404 AccountNotFound`.
6161+- `com.atproto.admin.getAccountInfo` now follows the reference runtime’s `400 NotFound` / `Account not found` shape for a missing DID instead of returning a local `404 AccountNotFound`.
6162- `com.atproto.admin.updateAccountEmail` now follows the reference runtime’s `400 InvalidRequest` / `Account does not exist: ...` shape for a missing account identifier instead of a local `404 AccountNotFound`.
6263- `com.atproto.admin.deleteAccount` is now reference-style idempotent for missing DIDs: it succeeds and emits the same deleted account event shape instead of failing locally with `404 AccountNotFound`.
6464+- `com.atproto.admin.getSubjectStatus` now follows the reference runtime more closely for repo subjects: existing repos return a synthesized active subject status even without a stored moderation row, missing repos use `400 NotFound` / `Subject not found`, blob requests without a DID use `400 InvalidRequest` / `Must provide a did to request blob state`, and entirely missing subject references use `400 InvalidRequest` / `No provided subject`.
6365- `com.atproto.admin.updateAccountPassword` follows the reference runtime’s looser admin policy: it rejects overlong passwords with `400 InvalidRequest` / `Invalid password length.`, but does not impose the normal user-facing minimum-length gate.
6466- `com.atproto.admin.disableAccountInvites` / `enableAccountInvites` now ignore the local `note` field so the visible account state matches the official runtime instead of carrying an extra stored `inviteNote`.
6567- `com.atproto.admin.getInviteCodes` now matches the official runtime on sort validation, always-emitted cursor behavior, total `available` counts, and newest-first `uses` ordering.
+5-3
lib/ATProto/PDS/API/Admin.pm
···2323 $registry->register('com.atproto.admin.getAccountInfo', sub ($c, $endpoint) {
2424 require_admin($c);
2525 my $account = $c->store->get_account_by_did($c->param('did') // q());
2626- xrpc_error(404, 'AccountNotFound', 'Account was not found') unless $account;
2626+ xrpc_error(400, 'NotFound', 'Account not found') unless $account;
2727 return admin_account_view($c->store, $account, entryway => $c->config_value('entryway', 0));
2828 });
2929···5757 require_admin($c);
5858 my $subject = _subject_from_params($c);
5959 my $status = current_subject_status($c, $subject);
6060- xrpc_error(404, 'NotFound', 'Subject not found') unless $status;
6060+ xrpc_error(400, 'NotFound', 'Subject not found') unless $status;
6161 return {
6262 subject => $status->{subject},
6363 ($status->{takedown} ? (takedown => $status->{takedown}) : ()),
···303303sub _subject_from_params ($c) {
304304 return { did => $c->param('did') } if defined($c->param('did')) && !defined($c->param('uri')) && !defined($c->param('blob'));
305305 return { uri => $c->param('uri') } if defined $c->param('uri');
306306+ xrpc_error(400, 'InvalidRequest', 'Must provide a did to request blob state')
307307+ if defined($c->param('blob')) && !defined($c->param('did'));
306308 return {
307309 did => $c->param('did'),
308310 cid => $c->param('blob'),
309311 } if defined $c->param('blob');
310310- xrpc_error(400, 'InvalidRequest', 'A subject reference is required');
312312+ xrpc_error(400, 'InvalidRequest', 'No provided subject');
311313}
312314313315sub _validated_subject ($c, $subject) {