Repository navigation
fix(messages): keep messages in their canonical channel - #2349
mrand-block merged 1 commit into
Conversation
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: Michael Rand <177165992+mrand-block@users.noreply.github.com>
jmecom
left a comment
There was a problem hiding this comment.
🤖 AI-agent review of c64d8641aae921615d722ec19c2649edbd4fc864: LGTM; no blocking findings. Correctness and minimalness: 9/10.
The canonical-channel check applies before live and finite-read admission, and independently during message/history folding. I exercised genuinely signed messages with missing, empty, duplicate, and conflicting channel tags, including both tag orders. They are excluded from live delivery, finite reads, Codex conversation history, and pending-reply counts while valid messages remain available. Signature verification remains unchanged.
Validation: 147 existing focused tests plus 8 independent regression cases passed. All eight regressions failed on the parent revision for the expected reason and passed at this head. This was lower-layer/session validation; no GUI or packaged-app acceptance was performed.
Optional: retain equivalent regression coverage in the PR; the current diff contains no tests.
jmecom
left a comment
There was a problem hiding this comment.
🤖 Approved after the review above at c64d8641; no blocking findings.
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz> * origin/main: fix(mcp): accept create scopes in durable approvals (#2650) feat(bestie): Bestie tab and Remembers you for a hosted Bestie (#2478) fix(relay): p-tag a one-to-one DM's agent partner on new messages (#2475) fix(agents): show each message author's username and display name (#2628) fix(agents): preserve visible edits in conversation history (#2355) fix(canvas): keep todo edits from approving unrelated instructions (#2350) fix(messages): keep messages in their canonical channel (#2349) NEXUS-4165: Add Thinking to agent creation (#2409) feat(plugins): let a plugin paint a backdrop behind the shell (#2437) feat(search): lead empty quick open with unread conversations (#2634) NEXUS-4170: Allow external apps to create private Solo chats (#2411) fix(acp): count grouped thinking levels when checking a synced level (#2640) Signed-off-by: John Tennant <jtennant@squareup.com>
…leanup * origin/main: fix(mcp): accept create scopes in durable approvals (#2650) feat(bestie): Bestie tab and Remembers you for a hosted Bestie (#2478) fix(relay): p-tag a one-to-one DM's agent partner on new messages (#2475) fix(agents): show each message author's username and display name (#2628) fix(agents): preserve visible edits in conversation history (#2355) fix(canvas): keep todo edits from approving unrelated instructions (#2350) fix(messages): keep messages in their canonical channel (#2349)
* origin/main: (28 commits) fix(mcp): accept create scopes in durable approvals (block#2650) feat(bestie): Bestie tab and Remembers you for a hosted Bestie (block#2478) fix(relay): p-tag a one-to-one DM's agent partner on new messages (block#2475) fix(agents): show each message author's username and display name (block#2628) fix(agents): preserve visible edits in conversation history (block#2355) fix(canvas): keep todo edits from approving unrelated instructions (block#2350) fix(messages): keep messages in their canonical channel (block#2349) NEXUS-4165: Add Thinking to agent creation (block#2409) feat(plugins): let a plugin paint a backdrop behind the shell (block#2437) feat(search): lead empty quick open with unread conversations (block#2634) NEXUS-4170: Allow external apps to create private Solo chats (block#2411) fix(acp): count grouped thinking levels when checking a synced level (block#2640) feat(conversation): let plugin rows manage messages without visiting a channel (block#2512) feat(github): make side-panel link opening optional (block#2629) feat(messages): show a blurred thumbnail until an image loads (block#2556) fix(relay): give large roster and read-state reads a 30s deadline (block#2627) fix(user-status): show a status emoji's :name: on hover where the full status shows (block#2384) fix(inbox): keep the list's place when returning in the same session (block#2134) fix(messages): pass verified labels to the forward recipient picker (block#2633) feat(messages): forward a message to a person (block#2167) ... # Conflicts: # tests/browser/settings.spec.mjs
* commit '4bb94e259': feat(github): rework the GitHub settings page (#2450) fix(mcp): accept create scopes in durable approvals (#2650) feat(bestie): Bestie tab and Remembers you for a hosted Bestie (#2478) fix(relay): p-tag a one-to-one DM's agent partner on new messages (#2475) fix(agents): show each message author's username and display name (#2628) fix(agents): preserve visible edits in conversation history (#2355) fix(canvas): keep todo edits from approving unrelated instructions (#2350) fix(messages): keep messages in their canonical channel (#2349) NEXUS-4165: Add Thinking to agent creation (#2409) feat(plugins): let a plugin paint a backdrop behind the shell (#2437) feat(search): lead empty quick open with unread conversations (#2634) NEXUS-4170: Allow external apps to create private Solo chats (#2411)
…-service * origin/main: (29 commits) Normalize profile names for verified-name matching (#2348) Add BuzzTerm font settings and compact glyph spacing (#2502) feat(plugins): let a host command run only verified bytes (#2535) NEXUS-4228: Add plugin toolbar actions and panel links (#2645) Keep plugin update controls stable and spaced (#2636) feat(inbox): rename to Activity and simplify the filter bar (#2543) fix(goose): track every replaced protected worker and check its security gate (#2528) docs(agents): say Pi agents don't take plugin notes yet (#2534) feat(agents): reorder agent cards with hold and drag (#1837) fix(messages): keep own sends from before the loaded history off the timeline (#2525) feat(github): rework the GitHub settings page (#2450) fix(mcp): accept create scopes in durable approvals (#2650) feat(bestie): Bestie tab and Remembers you for a hosted Bestie (#2478) fix(relay): p-tag a one-to-one DM's agent partner on new messages (#2475) fix(agents): show each message author's username and display name (#2628) fix(agents): preserve visible edits in conversation history (#2355) fix(canvas): keep todo edits from approving unrelated instructions (#2350) fix(messages): keep messages in their canonical channel (#2349) NEXUS-4165: Add Thinking to agent creation (#2409) feat(plugins): let a plugin paint a backdrop behind the shell (#2437) ... # Conflicts: # src/bundled/goose/runtime.ts
Why
A message with conflicting channel tags could appear in another conversation’s locally assembled history. Different read paths could interpret the same signed event as belonging to different channels. A sender allowed to post in a shared channel could therefore supply text to a private agent conversation, where the agent might act on it during a later request.
What changed
Require exactly one nonempty channel tag before accepting a message into views or history. Apply that rule to live admission, finite reads, and message folding. Ambiguous messages are excluded without changing their signed contents or assigning them to an arbitrary channel.