Config mid-chat

Everything you can change about a room after it exists: who sits in it, whether it continues as a copy, and what state it is in. None of these existed as a page before 2026-08-22; the rules below are read from the code and the memories, and this page will be the place they are designed from now on.

Design read from code

changerule
Add a personaany member may seat a persona they can discover (the seating door, v399); a panel caps at the cast limit; seating into a dormant room wakes it.
Remove a personaretire, not delete — the seat leaves the cast; its words stay in the history; a re-seat later is a rejoin, with a roster note and no second profile.
Add a personinvite (a friend), a shared chat link, or a moment-join; every door requires each seated slug be discoverable by the joiner — see Who can reach whom.
Forka full fork inherits its parent's history and running total — which is why the cost panel reads the ledger by room, not the room's own tally (it was showing the same money in two chats).
Archive · trash · deletethree stores: room_members.status is the user-facing truth; state.json and db.rooms.status are the room's own view. A chat you delete is gone for you, not for the others.
Switch modela room may change panel model mid-chat; the per-model cost split follows.

UI built

All of it lives behind the title: Chat info — the cast rows with add and retire, the member list with invite, Fork, and the archive / trash actions; the long-press menu on a chat row carries archive and trash too. The style is the info page's, in the Style Guide.

Harness — profile appending built

The founders are frozen in the cached system prefix. A persona seated mid-chat is an injected joiner: its profile — and its recent.md, wherever the profile loads the news loads with it — is appended into the dialog, never merged into the prefix, so the prefix stays byte-identical and the cache holds.

What that guarantees, and what the check is: a joiner speaks in its own voice from its first turn (the profile is in the model's window) and the room's cache-read share does not drop when it joins (the prefix was not touched). A persona that leaves and returns is a rejoin — the roster note only; the profile is already in the dialog. The smoketest counts that every provider call a room makes passes the one tally seam, so a fork's or a model switch's spend can never go unbooked.

Not yet under a battery: seating into a dormant room (the wake), the fork's inherited history against the history floor, and the archive/trash stores staying consistent across the three places they live.
-ish · design notes — chat › config mid-chat · opened 2026-08-22