Mouth: id shape on every delivery field, mentions bounded in bytes, round cap counts every target GET #72

Merged
heimdall merged 4 commits from heimdall/pending-v4-lows-two into main 2026-11-11 21:06:14 +00:00
Member

Cuts the two remaining lows after #68 (CHAT_PENDING_V4 off, not deployed).

  1. Delivery ids: event id, sender, context sender, mention and tail id must be Matrix ids (<=255 bytes, no whitespace/control/format). The mouth skips such an event or drops the context/tail line or mention; encoders and parsers refuse them. Mentions are bounded in bytes. A sender with an empty localpart is shown under its full id.
  2. Round cap: the 8 per round now counts every uncached reply-target GET (basis, reply_to, thread root); an event that would pass it waits for the next round. The check pins targets it counted as cached for that event only. Context reads stay separate and uncounted (documented).

Tests: mouth + runtime 194/195 (the systemd-credentials test fails identically on base in this sandbox); golden v1-v6 green, fixtures untouched. Soul: two findings rounds fixed, final clean at 34f6dc1. Known, not fixed: a busy earlier room can starve a deferred event (pre-existing in #68's DEFER); follow-up admitted.

🤖 Generated with Claude Code

Cuts the two remaining lows after #68 (CHAT_PENDING_V4 off, not deployed). 1. Delivery ids: event id, sender, context sender, mention and tail id must be Matrix ids (<=255 bytes, no whitespace/control/format). The mouth skips such an event or drops the context/tail line or mention; encoders and parsers refuse them. Mentions are bounded in bytes. A sender with an empty localpart is shown under its full id. 2. Round cap: the 8 per round now counts every uncached reply-target GET (basis, reply_to, thread root); an event that would pass it waits for the next round. The check pins targets it counted as cached for that event only. Context reads stay separate and uncounted (documented). Tests: mouth + runtime 194/195 (the systemd-credentials test fails identically on base in this sandbox); golden v1-v6 green, fixtures untouched. Soul: two findings rounds fixed, final clean at 34f6dc1. Known, not fixed: a busy earlier room can starve a deferred event (pre-existing in #68's DEFER); follow-up admitted. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GameCult/Bifrost!72
No description provided.