area: defect
app.bsky.actor.putPreferences answers 501 MethodNotImplemented, and getPreferences always answers []. An account signed in to bsky.app through this server cannot save a setting (feed order, muted words, saved feeds). Found by audit A (missing endpoints).
Storing them is not a quick fix, because it adds a stored field and a log entry, which needs an owner review of the state it belongs to:
crates/didbot-serve/src/routes/preferences.rs:25-47:put_preferencessigns the caller in and then refuses.crates/didbot-serve/src/routes/preferences.rs:9-22:get_preferencesanswers an empty list for every account.crates/didbot-pds/src/account.rs:351(HostedAccount) andcrates/didbot-pds/src/wal/mod.rs:361(Entry): no field or entry holds an account's preferences.docs/conformance.md:573-580: documents the 501.
The reference PDS keeps one JSON array per account (account_pref), replaced whole by putPreferences and filtered by the caller's scope on read. Decisions for the owner:
- Where the array lives: a new
HostedAccountfield, or a new log entry per write. - A size cap for the array, since any signed-in app can write it, with its own config key and documented range.
- What happens to it on pause, revoke, deactivate and delete.
- Whether a scoped OAuth token may write it, and which scope (the reference needs the full
transition:genericgrant forpersonalDetailsPref).
Suggested fix: add the field and its log entry once the above is decided. putPreferences validates that every item has a $type in app.bsky.actor.defs and replaces the array. getPreferences returns it, minus personalDetailsPref for tokens without the grant. A test should write, restart from the log, and read the same array back.
🤖 Generated with Claude Code