Skip to content

DL-344

Channels fold into the agent tree as an additive Channel.parent_agent_id attach edge (field 11) plus a ReparentChannel RPC, and membership becomes a SECOND AXIS from kind/placement: a new ChannelMembershipMode (field 12, column channels.membership_mode) with EXPLICIT = 0 keeping today’s stored channel_members behaviour and TREE = 1 deriving the member set from the anchoring agent’s subtree PLUS that agent’s owner_user_id (the owner term is load-bearing: it is the second disjunct of the participant probe and the reason a human owner can post at all), with NO managed member list (Matt’s RIG-1622 ruling: tree-only membership is the right default for tree-hung channels, but individually-managed members must stay possible). Rejected: implying the mode from parent_agent_id IS NOT NULL (forecloses a hand-membered channel that still lives in the tree) and a third ChannelKind value (kind is the DM-vs-channel axis; the retired CHANNEL_KIND_GROUP_DM = 2 is the cautionary tale). Consequence: a new ChannelParticipant probe with a recursive actor-to-root ancestor arm is added BESIDE the surviving ChannelMemberExists (which two callers still need for stored-member-row semantics) and requireChannelMember rebinds onto it, so the AppendMessage post gate GAINS a derived arm rather than staying unchanged; the five FROM channel_members delivery queries need their DRIVING relation unioned with the derived set, not a new WHERE disjunct; channel_members.subscribed has no home on a row-less channel, so TREE subscription moves to an override-only channel_subscriptions table. ChannelGroup is NOT deleted — it survives as machinery for the reserved __dm__/__coordination__ namespaces and as the home of SHARED spaces, but stops being the sidebar organizer

Status: Active (Matt, 2026-09-07)

Record: ../../ui/compass-channels-in-agent-tree/design.md#3-two-membership-modes-posting-follows-the-tree