Agent evals that run against a throwaway zds hit two missing pieces:
- No test mail provider.
requestPlcOperationSignaturesends its code by email, and Comail is the only provider. A provider that writes mail to a local outbox would let an eval read the code. - No user self-delete or PLC tombstone. Only
com.atproto.admin.deleteAccountexists. The reference PDS also hascom.atproto.server.requestAccountDelete/deleteAccount. Without those, eval accounts and their PLC identities are left behind after each run.
Shipped in 0.7.8 (live on pds.zat.dev).
ZDS_MAIL_PROVIDER=outboxkeeps mail in the database instead of sending it.dev.zat.admin.listMail?to=<email>returns each message with itscode, and needs the admin token.confirm_email,update_email,plc_operation,delete_account), as on the reference PDS. Before this, one code per account authorized all of them.com.atproto.server.requestAccountDeleteemails adelete_accountcode.com.atproto.server.deleteAccounttakes the DID, password and code, and both behave as on the reference PDS.ZDS_PLC_TOMBSTONE_ON_DELETE=truetombstones thedid:plcwith the PDS rotation key before deleting, whether the account deletes itself or an admin deletes it. If the directory refuses, the account stays. It's off by default, since a tombstone is permanent.An eval host sets both
ZDS_MAIL_PROVIDER=outboxandZDS_PLC_TOMBSTONE_ON_DELETE=true. The main smoke runs that way, and walks the whole cycle: sign up, confirm the email, sign a PLC operation, self-delete, then check the tombstone.Two bugs turned up along the way, both fixed in 0.7.8:
signPlcOperationreturned invalid JSON (the outer object was never closed). This had been there since PLC signing landed.FutureCursoranswer closed the socket from the wrong thread.