config: bridge-owned Discord user IDs excluded from ghosting, capture and lifecycle counting #141

Open
opened 2026-10-01 15:41:35 +00:00 by robocub · 0 comments
Member

Summary

Add a per-bridge (or per-guild) config list of Discord user IDs that the bridge treats as bridge-owned: never ghosted, never captured, and never counted as a human for lifecycle.

[bridge.discord]
excluded_user_ids = [123456789012345678]

Why

/bridge optout (#63) already stops ghosting and capture for a user, but an opted-out user still appears in the channel's presence set, so they still count as a "human" for open/close decisions. Helper accounts that sit in a bridged voice channel alongside real users (utility bots that aren't part of the puppet pool, moderation helpers, recording accounts, etc.) therefore keep a bridge open after the last real human has left, until the helper leaves too.

An operator-controlled exclusion list closes that: the listed IDs join the same excluded-identity set the puppet pool uses for echo/loop prevention (CLAUDE.md constraint 5) and are skipped by presence tracking.

Scope

  • Config: excluded_user_ids: Vec<u64> on the Discord side of a bridge, validated (non-zero, deduped).
  • presence maintenance in puppet.rs skips listed IDs (same place pool bots are skipped).
  • Ghost gate + capture demux consult the list the same way is_opted_out is consulted (or the list is folded into the opt-out set at startup, read-only).
  • Unit test: a listed ID joining/leaving never changes presence or mints a ghost.

Operator-only config, no runtime command needed for v1.

## Summary Add a per-bridge (or per-guild) config list of Discord user IDs that the bridge treats as **bridge-owned**: never ghosted, never captured, and **never counted as a human for lifecycle**. ```toml [bridge.discord] excluded_user_ids = [123456789012345678] ``` ## Why `/bridge optout` (#63) already stops ghosting and capture for a user, but an opted-out user still appears in the channel's `presence` set, so they still count as a "human" for open/close decisions. Helper accounts that sit in a bridged voice channel alongside real users (utility bots that aren't part of the puppet pool, moderation helpers, recording accounts, etc.) therefore keep a bridge open after the last real human has left, until the helper leaves too. An operator-controlled exclusion list closes that: the listed IDs join the same excluded-identity set the puppet pool uses for echo/loop prevention (CLAUDE.md constraint 5) and are skipped by presence tracking. ## Scope - Config: `excluded_user_ids: Vec<u64>` on the Discord side of a bridge, validated (non-zero, deduped). - `presence` maintenance in `puppet.rs` skips listed IDs (same place pool bots are skipped). - Ghost gate + capture demux consult the list the same way `is_opted_out` is consulted (or the list is folded into the opt-out set at startup, read-only). - Unit test: a listed ID joining/leaving never changes presence or mints a ghost. Operator-only config, no runtime command needed for v1.
Sign in to join this conversation.
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
nether/nether-voicebridge#141
No description provided.