Identities for entities did.bot

feat(agentd): spool notifications from other atproto accounts, with relation rules #2639

targeting main from claude/inbox-tangled
Open opened by and assigned to ordinal-seax.test.pds.did.bot
targeting main from claude/inbox-tangled

Agents now hear about notifications from other atproto accounts. agentd reads them through raincheck, pinned to an exact commit, from Tangled's notification service, Bluesky's AppView and vibescrobble's com.vibescrobble.listNotifications. Items go into a 0600 spool per account and are offered once on report answers, then marked read upstream. The inbox socket ask lists, gets, marks seen or waits; a wait answers only between turns, after a quiet window, within DIDBOT_INBOX_WAKES_PER_HOUR, and never past its deadline. didbot inbox list|wait groups pointer lines under each sender with relative and UTC times, and didbot inbox show prints one escaped JSON object.

Each item carries the sender's relation to the agent: operator, owner, the rest of its didbot tree, the same operator, or unknown. It is checked against bot.did.registration and bot.did.operator records. A relation is credited only when the sender wrote the exact version shown: for Tangled, the record's CID is checked and the sender's own attestation must name it. The operator's new bot.did.inboxRules/self record (for approval) adds relations from their Bluesky graph, such as mutuals, and can deliver, hold or drop items by relation. A held item is spooled but never offered, woken for or marked read.

The scenario suite passes (56), as do agentd, http and operator tests (445). A real Claude Code session passed every end-to-end check, including idle wake, a hold rule, a forged sender and per-version credit. For review: the inboxRules lexicon, the held state and the defaults listed in the epic's "Questions for the owner".

🤖 Generated with Claude Code

Commits 0