docs/adr/0176-every-room-is-an-inspectable-conversation.md

ADR 0176: Every room is an inspectable conversation

Status: accepted

Context

Discord research produces the same kinds of messages and tools as operator work. A heard/said lane tail cannot explain that work, and requiring an operator or agent to hunt down Pi files makes ordinary inspection needlessly hard. The conversation contract already provides discovery, replay, live tails, redacted tool details, and a visual renderer.

Decision

External Discord text and voice captain rooms have an explicit room scope with a lane and target. Their stable conversation id groups the native sessions for that room, including actor-granted one-shots. The sessions retain their independent model contexts and tool authority. Inspection does not grant send, reset, fork, or autonomous execution authority over an external room.

The native Pi journal remains authoritative, as native harness journals do for Herdr seats. Its messages and tools are projected into the existing conversation event log with per-source entry checkpoints. Startup discovers journals modified within the 30-day retention window; live Pi events advance their projections and wake ordinary conversation tails. A source entry identifies the native file. Images are not copied into the event log; tool details retain the existing redaction and size bounds. Voice history is captain handoffs, not ambient speech. Turn events describe captain execution, not confirmed delivery by Discord.

The TUI picker lists every conversation scope. Room views show read-only status and expandable context/tool entries. clankie conversations list, show, and tail provide the same authenticated contract to agents, with explicit paging.

Trade-offs

Extending /trace alone would keep two inspection contracts and omit tool history from the normal conversation UI. Moving all Pi sessions into the operator runner would conflate transport permissions and execution lifetime. The existing transcript projection provides one inspection contract while preserving both boundaries. It stores a bounded readable projection beside the native source, and discovery uses the existing conversation retention window.