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.

The Geek page (v996 · hands v997 · the one home v1000) — the open chat's settings on one card, behind a Geek pill in chat info (mirrored in its ⋯ menu, wearing a spectacles glyph). Three groups by when a thing can change: born with the chat (language · vividness · FP manner · incognito — fact rows, label + value), changeable mid-chat (speech model · floor producer · tools · private history), just for me (mute), plus each seated persona's memory switch. Since v1000 this is the one home of the room's controls: the chat-info sheet's Tools pill (+ its ⋯ mirror), the vividness echo, the FP segment and the model tag-switcher all retired into it; since v1001 the sheet keeps exactly three pills on one row — Theme · Mute · Geek — over cost + cache + members, and its ⋯ menu is the file menu: Rename · Fork · Archive · Delete (the chat row ⋮'s verbs and confirms, verbatim). A row the viewer may move is a real control: the speech model wears the house .dd dropdown (Settings ▸ Default language dress, current checked; a Born-group fact row on a local room, where the model is fixed for life); the FP segment and house switches commit through the same functions as before (gates unchanged: FP/Tools owner-or-admin, private history owner-only). Private history asks twice — the flip is one-way, so the first yes opens a second, harder confirm, both living in the one commit path every surface shares. Language spells out what Auto resolves to (「Auto (English)」 / 「自动(中文)」). In an incognito chat the persona-memory switches are moot (the room neither reads nor writes), so they show greyed and dead under one line — 「Incognito is turned on」. On wide the page takes the right pane — it answers the info sheet the way a chat answers the list. A standard sub-page otherwise — house header, the 600 column, drawer rows — painted on each open from the client's room state plus one /api/memory read.

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