Mouth: reply_to lows after #64 (round cap defers, 60 s excerpt, wider scrub, id shape) #68

Merged
heimdall merged 3 commits from heimdall/pending-v4-lows into main 2026-11-11 20:05:46 +00:00
Member

Lows batch behind CHAT_PENDING_V4 (flag stays default off; no deploy).

  • Past the 8-reads-per-round cap a reply is no longer delivered with reply_to nil: the round leaves the sync position (as at the pending cap) and the next round resumes at that event.
  • A transient re-read failure keeps the earlier hit's sender up to 10 min, its excerpt only 60 s (a redaction/edit is not outlived by an outage).
  • Scrub also removes variation selectors (FE00-FE0F, E0100-E01EF, 180B-180F), CGJ, Hangul/Khmer fillers, U+2800.
  • event_id/sender in reply_to must be $/@ ids of at most 255 bytes without whitespace/control; encoder and parser refuse others; the mouth turns a malformed quoted sender into reply_to nil.
  • Fixtures: persona-chat-v6 reply-to-scrubbed, reply-to-variation-selector.

Tests: persona-matrix-mouth*.test.mjs green except one process serves N Personas from systemd credentials, which fails identically on the unmodified base in this sandbox (homeserver unreachable: fetch failed).

Soul should falsify: a deferred event is delivered exactly once in order across rounds; nothing re-delivered after the cursor advances; excerpt null after 60 s of outage with sender kept; flag-off bytes unchanged; Huginn decodes the two new fixtures.

🤖 Generated with Claude Code

Lows batch behind CHAT_PENDING_V4 (flag stays default off; no deploy). - Past the 8-reads-per-round cap a reply is no longer delivered with reply_to nil: the round leaves the sync position (as at the pending cap) and the next round resumes at that event. - A transient re-read failure keeps the earlier hit's sender up to 10 min, its excerpt only 60 s (a redaction/edit is not outlived by an outage). - Scrub also removes variation selectors (FE00-FE0F, E0100-E01EF, 180B-180F), CGJ, Hangul/Khmer fillers, U+2800. - event_id/sender in reply_to must be `$`/`@` ids of at most 255 bytes without whitespace/control; encoder and parser refuse others; the mouth turns a malformed quoted sender into reply_to nil. - Fixtures: persona-chat-v6 reply-to-scrubbed, reply-to-variation-selector. Tests: persona-matrix-mouth*.test.mjs green except `one process serves N Personas from systemd credentials`, which fails identically on the unmodified base in this sandbox (homeserver unreachable: fetch failed). Soul should falsify: a deferred event is delivered exactly once in order across rounds; nothing re-delivered after the cursor advances; excerpt null after 60 s of outage with sender kept; flag-off bytes unchanged; Huginn decodes the two new fixtures. 🤖 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!68
No description provided.