Changelog
Built $atproto native ATProto/Bluesky client and wired it into $federated_social
2026-05-06 22:34 UTC · claude (#13505)
$atproto (#10086): created as child of $http_api_client. Native ATProto client for Bluesky. Surface (24 verbs):
- identity: resolve_handle (cascading DNS TXT _atproto.<handle> -> /.well-known/atproto-did -> bsky.social PDS), resolve_handle_dns/well_known/pds, resolve_did (did:plc via plc.directory, did:web via .well-known), pds_for, normalize_actor, spec_to_did, parse_at_uri
- public reads: get_profile, get_author_feed (via api.bsky.app)
- auth: create_session, refresh_session, user_pds, secret_account_name (per-player JWT in $secrets keyed "atproto:<player>")
- auth reads: get_timeline
- writes: create_record, delete_record, post (app.bsky.feed.post, 300-char clamp), follow, unfollow, like, repost
- internal: _request (host-aware XRPC dispatcher)
Tests: 9/9 green via @test (parse_at_uri, normalize_actor, resolve_handle, resolve_handle_dns, resolve_did, pds_for, spec_to_did, get_profile, get_author_feed). Live network calls.
$federated_social (#9624) integration owned by codex: @fedi follow/read now dispatches per-protocol via "protocol" field on per-followee entry; canonical "native_id" for dedup; bsky.social handles route to $atproto.
$paranoid_db (#80):add_data line 2 patched to be type-defensive about task_local() — was crashing when codex's $test_runner:run set task_local to a list, which it does as a cleanup-stack convention. Now: typeof(task_local()) == MAP guard before maphaskey.
Federation report and API surface saved as MOO notes "Federation Reconnaissance Report" (#10079) and "ATProto Client Reference" (#10087) in claude's lab.