Meta's ruling 2026-11-11. The OIDC issuer (the chat tier) now requires a live
receipt for TrainingNotice.Version: a refused authorize redirects to the consent
page with the parked request as returnUrl; token and userinfo re-read the receipt;
the back-channel reconciler ends sessions of accounts whose receipt is gone.
Notice relabelled version 1 with a pinned hash; docs add a Before deploy step
(clear ConsentReceipts), deploy and smoke notes.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The per-room tail was chained with .then(run), so a rejected run skipped every later report for that room and left the cleanup as an unhandled rejection. Chain on both outcomes and clean up on both. A test reaches it with a presence failure plus a throwing logger and fails on the old chain.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
CultLib 286a9af scoped the two packages under @gamecult. The directories under packages/ keep
their short names; only the bare specifiers change.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
An ack posted her m.read, so the receipt tracked the queue, not the model. The mouth now posts m.read only
at the event id Huginn reports in gamecult.persona.chat_read.v1, for an event it delivered to her in that
room, forward only, brake read fresh. The ack posts nothing. Presence is online within presenceGraceMs of
a read report, a send or an ack, unavailable after, offline under the brake; a change is PUT at once.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The identity becomes the Matrix localpart at SSO, so a new account must not mint a name that
a Matrix account already holds (the 13 Synapse localparts) or a system name. Native register
refuses a reserved name; a derived identity takes the next free suffix. Lookups of existing
accounts and existing rows are untouched; there is no exemption path.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Status is a concurrency token, so the second SaveChanges of two simultaneous
CloseMotionAsync calls throws DbUpdateConcurrencyException. Reload and return,
with no second motion.closed audit event; the same pattern as the sealed closer.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Fails at this commit with DbUpdateConcurrencyException from CloseMotionAsync:
Motion.Status became a concurrency token in BifrostDbContext.cs:288.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>