mind-body: chat_pending.v3 tail_gaps (defaulted); a named room reads as unknown, not quiet #49

Merged
eureka merged 1 commit from eureka-substrate/pending-tail-gaps into main 2026-11-11 12:34:36 +00:00
Owner

Bifrost b2e0bb2 (#57) adds a fourth element tail_gaps to chat_pending.v3: the rooms whose tail lines are incomplete (read failed or timed out, or lines trimmed). Huginn main decoded a three-field reply and would fail with LengthMismatch against it.

Changed (crates/mind-body):

  • ChatPending.tail_gaps: Vec<String>, #[serde(default, skip_serializing_if = "Vec::is_empty")]: three-field replies still decode (none named); an empty fourth element is the same answer.
  • render_tail takes the gaps: a named room (among the process's rooms) renders as "Unknown, not quiet: ..." whether or not it has lines; only an unnamed room with no line is "No tail line for: ... they were quiet". The old note's "or the mouth could not read them" is gone since the mouth now says which. Gaps flow poll -> Session -> PersonaInbox -> first line, like the tail.
  • Fixture copied unchanged from Bifrost b2e0bb2 (persona-chat-v7).

Verified (Linux Yggdrasil, unshare -r cargo test -p mind-body): --lib 882 passed (0 failed, 1 ignored, pre-existing), after rebase onto main 96a88d3 (render_tail is now render_tail(config, addressing, tail, gaps, rooms, seen, waiting_ids)); --test chat_rudp 16 passed. New: chat_rudp 1 (three-field, four-field with gaps = Bifrost's own bytes, four-field empty, unnamed quiet room, all over real RUDP), chat_client 1 (golden round trip, default), persona 1 (unknown vs quiet through the full first line, and from the golden bytes).
Mutations (hand-applied, restored): dropping default on tail_gaps fails 5 lib tests and 6 RUDP tests; breaking the unknown rendering fails the persona test. tools/cargo-mutants.sh was not run.
No cut_spec covers this change (huginn cut eureka-substrate wake-reads-room-tail matched 0), so no cut_report is admitted.
With no line offered and a room named, the section reads only the unknown note, never "empty" (pinned by a_named_gap_with_no_lines_reads_unknown_and_never_empty).

Known limit: a pre-#57 mouth is indistinguishable from a 4-field mouth with an empty reply, so the "they were quiet" wording holds only for a mouth that sends tail_gaps (Bifrost says v3 is undeployed).

Not merged or deployed.

🤖 Generated with Claude Code

Bifrost b2e0bb2 (#57) adds a fourth element `tail_gaps` to `chat_pending.v3`: the rooms whose tail lines are incomplete (read failed or timed out, or lines trimmed). Huginn main decoded a three-field reply and would fail with LengthMismatch against it. Changed (crates/mind-body): - `ChatPending.tail_gaps: Vec<String>`, `#[serde(default, skip_serializing_if = "Vec::is_empty")]`: three-field replies still decode (none named); an empty fourth element is the same answer. - `render_tail` takes the gaps: a named room (among the process's rooms) renders as "Unknown, not quiet: ..." whether or not it has lines; only an unnamed room with no line is "No tail line for: ... they were quiet". The old note's "or the mouth could not read them" is gone since the mouth now says which. Gaps flow poll -> Session -> PersonaInbox -> first line, like the tail. - Fixture copied unchanged from Bifrost b2e0bb2 (persona-chat-v7). Verified (Linux Yggdrasil, `unshare -r cargo test -p mind-body`): --lib 882 passed (0 failed, 1 ignored, pre-existing), after rebase onto main 96a88d3 (render_tail is now `render_tail(config, addressing, tail, gaps, rooms, seen, waiting_ids)`); --test chat_rudp 16 passed. New: chat_rudp 1 (three-field, four-field with gaps = Bifrost's own bytes, four-field empty, unnamed quiet room, all over real RUDP), chat_client 1 (golden round trip, default), persona 1 (unknown vs quiet through the full first line, and from the golden bytes). Mutations (hand-applied, restored): dropping `default` on tail_gaps fails 5 lib tests and 6 RUDP tests; breaking the unknown rendering fails the persona test. tools/cargo-mutants.sh was not run. No cut_spec covers this change (`huginn cut eureka-substrate wake-reads-room-tail` matched 0), so no cut_report is admitted. With no line offered and a room named, the section reads only the unknown note, never "empty" (pinned by `a_named_gap_with_no_lines_reads_unknown_and_never_empty`). Known limit: a pre-#57 mouth is indistinguishable from a 4-field mouth with an empty reply, so the "they were quiet" wording holds only for a mouth that sends tail_gaps (Bifrost says v3 is undeployed). Not merged or deployed. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Bifrost b2e0bb2 sends [persona, deliveries, tail, tail_gaps]; a three-field decode failed LengthMismatch. The field defaults empty, so three-field answers still decode, and render_tail splits unknown (named) from quiet (unnamed, no line).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
eureka force-pushed eureka-substrate/pending-tail-gaps from 3f1b651e93 to 0f2652d7fa 2026-11-11 12:29:23 +00:00 Compare
eureka merged commit bbb05b51a4 into main 2026-11-11 12:34:36 +00:00
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/Huginn!49
No description provided.