Dialogue · Design notes · Seven steerings
← Design notes

The seven steerings

The review verdict on the collaborator branch ui/floorproducer (CW, 18 commits, 2026-07-11 → 14; net +44 lines across the two prompt files the model reads — lib/prompts/floor_producer.txt, read every turn, and prototype/meta/system-prompt.md, baked at room creation). Seven behaviour rules, all governing how a turn ends — how a topic closes, a refusal closes, a joke lands, a conversation ends. Reviewed and ruled 2026-07-15; the six carried rules are built as v2 "manners" — a clean-slate re-authoring (~13 lines against the branch's 44), not a merge of the branch.

Six carry: three bug fixes with live incidents behind them, two insurance rules, one new capability. The seventh — the every-turn open ending — is parked: its job belongs to a proactive nudge (time trigger + push), not to prose. One slice of it was reclaimed into #3: on a detected wind-down, the last line leaves a stake only the guest's return can settle — the door-card, spent at the one pre-exit moment the system can see, not on every turn.
#CategoryRuleTarget effect
1 Bug fix Never a bare no — a refusal always hands you something: either one concrete thing that would turn it into a yes (pay it and the work follows — no second ask), or, if the no is real, a plain no plus the nearest thing it would do. Never a fake price. A dead end becomes a path; nobody leaves empty-handed
2 Bug fix Joke back — a laugh, small news, an aside: one host steps out with you. A friend's reaction, not a counselor's summary. The room reads as a person, not an analyst
3 Bug fix The room never says goodbye first — only you end the conversation; a winding-down makes replies smaller, never sealed. On a genuine wind-down the last line leaves a stake of the room's own — something only your return can settle — never a question that must be answered before you go. Nobody gets dismissed mid-conversation; the return already has its first line
4 Insurance Drop it means drop it — "drop it," in any words however mild, kills that thread for good; only you can reopen it. Holds even mid-grilling you asked for. Any stop always works → makes hard questions safe to ask for
5 Insurance Everyone who argued commits — when an argued decision winds down, each host who took a side lands one committed line, no hedging. Exempt from the 1–2 speaker limit. An argument resolves instead of trailing off into hedges
6 New capability Say what they couldn't say — words for what you couldn't phrase, offered as a question or a sample, never a verdict. Three shapes: a fork of readings · your fog named in one sentence · your own words handed back. Being understood — the strongest in-chat engagement driver there is
7 Build later Every reply leaves a thread hanging — an open ending as the room's resting state. (Its wind-down slice — the departure stake — was reclaimed into #3; the every-turn default stays parked.) Parked until the time trigger + push transport exist — its job moves to a proactive nudge, code not prose
Bug fix a live incident forced it Insurance added by design; nothing broke first New capability bottling what only happened by luck of casting Build later needs code that doesn't exist yet

Rulings that shape the carry

built · 2026-07-15v2 "manners" is built — a clean-slate re-authoring, not a merge (the branch stays as authored). Two full-file variants: lib/prompts/floor_producer.v2.txt (3 clause extensions on ASKS WIN · ENGAGEMENT · CONTENTION + one new ASIDE bullet) and prototype/meta/system-prompt.v2.md (the refusal price on the existing decline bullet · one guest-ownership bullet · the "Words they're reaching for" paragraph, anchored on the never-put-words guardrail). Four of the six are clauses on rules main already had; only the aside bullet and the mirror are new directions. A room is stamped v1|v2 at creation (state.json + /state echo; fork inherits; pre-feature rooms stay v1; the FP file follows the same stamp; floor_producer_open.txt is shared) — never flipped live: the SP bakes into the 1h-cached prefix, and the immutable stamp is what makes the v1-vs-v2 return-rate comparison honest. Console → Settings → "Panel guidance — default for new chats" picks the default (unset = v1; smoketest gates the files + stamp round-trip). Probed live 2026-07-15 (6 rooms, DeepSeek panel + v1p FP, direct-drive battery rooms-dev/_probe/probe_manners.py): #1 #2 #5 #6 passed first run (the aside staged ONE host at ≤30 words — the scenario that failed CW's test at 102; the verdict call landed two committed picks; the mirror guessed in question-form). #4 failed first run — the FP staged the panel to analyze the drop itself ("that's a reflex"), twice — fixed by quoting the offending move as forbidden in the stop-ask clause (+ the SP twin: "the setting-down is no one's material"); passes all four turns on re-run, the guard copied verbatim into the staging. #3's return collection passes 2/2 ("I've been thinking about you" · "Did the fish swim and did the rice crust hold?") — the room ends up owed-and-collecting via the transcript; the explicit door-stake under-fires (0/2 strong-form) and is the one watched item — the known next lever (a quoted manner string, ~100% FP copy-rate) is deliberately unpulled: it would force one shape on every wind-down, the formula trap. #7's replacement — the proactive nudge (a persona messages you on a real gap, over a time trigger + Web Push) — is its own workstream; the greenroom (v425) already proved the core mechanic: a persona authoring a live first message unprompted.