Identities for entities did.bot

serve: putPreferences answers 501, so bsky.app settings cannot be saved #225

Open permadeath.com
Open opened by permadeath.com

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_preferences signs the caller in and then refuses.
  • crates/didbot-serve/src/routes/preferences.rs:9-22: get_preferences answers an empty list for every account.
  • crates/didbot-pds/src/account.rs:351 (HostedAccount) and crates/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 HostedAccount field, 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:generic grant for personalDetailsPref).

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

Sign up or Sign in to add to the discussion.