Dialogue · Design notes · Floor producer (outdated)
← Design notes

Floor producer — the design (outdated)

outdatedThis is the earlier mode-based design — a 2×2 mode space, a mode→staging signature table, the g→s→f function stack. It was superseded 2026-06-26 by the signals → f → staging model (the producer is one trusted function; "mode" is a readout, not a gate). Current page → Floor producer — the design. Kept here for reference only.

The build spec for roadmap §1, written off the back of the production diagnosis. The diagnosis proved where conversation quality breaks; this is the machine that fixes it. Status: design settled. v0 the deterministic baseline is built, shipped (new chats default-on) and A/B-measured; v1 the smart producer is designed below; v2 is sketched. Reorganized 2026-06-26 — start with the Contents, then read top to bottom.

The room is voiced by one mind, and that mind always has something for everyone to say, at length, in agreement. It can't self-correct because the writer and the staging-decider are the same context. The floor producer is a separate per-turn agent that reads the room and sets the staging — who speaks, how long, what to focus on, how hard to push — never the content. Unevenness injected from outside, which the writer must accommodate rather than remember to maintain.
Part 1The problem

Why — what the diagnosis proved

We pulled all 80 production rooms and scored the 39 real conversations (full report). Four findings drive every design choice below:

The load-bearing conclusion: three of the four are staging, not voice. Voice and character fidelity are good (users said so). The single writer just stages the room badly — and can't fix itself. That is exactly the gap an exogenous producer fills.

Part 2The idea — a director, not a dial-box

The reframe

Everything below is one of three things: an input (what the producer reads), the brain (what it infers), or an actuator (the staging it emits) — all bent toward a single objective (what the user walks away with).

ROOM STATE public only · turn · last msg · transcript tail · dials · cast · per-host stats · your commands FLOOR PRODUCER reads the room → infers MODE (hidden) sets the staging STAGING appended · cache-safe · rhythm · length · focus · output · attitude PANEL CALL writes the lines OBJECTIVE not bored · not dismissed · not intimidated → walk away with what you came for
The whole system on one line. The producer is the cheapest call in the loop and the highest-leverage — a weak host line is a local flaw; a weak staging call ruins the turn for everyone.

The producer & the confer — the firewall

The panel already deliberates — the backstage <confer> is the one mind working out what the hosts say. So: does an exogenous producer fight that? It doesn't. They sit at different layers — the producer is upstream input to the confer, never a rival to it.

floor producer · exogenous, upstream user turn [ STAGING directive ] one megaprompt call CONFER · backstage works out WHAT to say (content · positions) SPEAK · on-stage the bubbles, within the staging (length · shape) reply
The producer is upstream input, not a rival — the confer reasons under the staging. The firewall keeps the lanes apart: the producer sets staging (who/order/length/shape), the confer owns content (what's said).
v0 → v1 v0 picks who speaks by recency (blind) — it can bench the very host the confer most wants. v1 picks by relevance (the model read), so the two converge on who matters; what's left is the producer adding the brevity + variance the confer won't impose on itself.
the firewallEvery function takes public state and outputs staging — never content. The Read step may infer "this is grief," but that only sets weights and knobs; it never tells a host what to say. Inferring intent to drive staging is fine; injecting it as content ("the user is anxious, reassure them") is puppeteering — the one line that keeps the producer a router, not a co-author.
Part 3The levers — what the staging can do

Five staging dimensions. Each is presented the same way: the mechanism (how it works), then how v1 turns it from a blanket rule into an intent-driven one. The brain (Part 4) is the conductor; these are the instruments.

Length — an envelope, not a number

The diagnosis defect was never "too long" globally — it was uniform ~300-word walls, no variance, no short lines. The research (below) points the same way: length shouldn't be a target the model fills, it should be a computed envelope — a band the reply lands inside, that slides with the user and wobbles each turn. Four knobs size one bubble:

knobwhat it doeswhy
floorthe minimum — a lead must carry a claim and its reasonstops the curt brush-off (the dismissed pain)
ceilingthe maximum — the anti-wall capthe one fence the verbosity-bias work says must stay
entrainmentthe whole band slides up/down with the user's message lengthmatching builds rapport; under-matching reads as dismissive
jittera small seeded wobble so no two turns share a targetbreaks the metronome (habituation); seeded ⇒ reproducible & A/B-able
the envelope — a band that slides with the user (entrainment) and wobbles each turn (jitter) floor ceiling ↳ 58字 ↳ 71字 ↳ 121字 user terse user medium user detailed 04080120160字
One bubble's size. The band marches right as the user writes more (entrainment), sits at a different width each turn (jitter), and the reply only has to land somewhere inside — never the same target twice.

Express in sentences, measure in 字

The CJK build taught the hard rule: a model cannot count its own 字 — it ran ~2.3× over a 字 budget but only ~1.1× over a word budget, and it hits a sentence count cleanly in every language we tested. So the unit wears two hats, and we'd been conflating them:

THE PRODUCER · internal 字 — the ruler entrain · jitter · measure (A/B) needs a continuous unit THE MODEL · what it reads “2–3 sentences” the only unit it obeys map 字→句 字 ✗ never crosses
字 is the producer's private ruler — used to entrain, jitter, and measure; the model only ever receives a sentence count. Entrainment shows up as the sentence range shifting (terse → "1–2"; detailed → "3–4"); jitter as it wobbling ("2–3" vs "2–4").

What the research says

findingsourcewhat it means here
Repetition is the single biggest drag on conversation quality — cutting it lifts every human scoreSee et al., NAACL 2019the "repeated pattern" worry is the #1 documented failure (they measured content repetition; we extend it to rhythm)
Longer ≠ better — optimal length is context-dependent; extra length adds repetitiveness without qualityCHI 2024length must follow the turn's job, not a fixed amount
People entrain on utterance length; matching builds rapport and lowers latencyentrainment, multi-partybacks the mirror — keep it, on both ends of the band
Turn length follows the communicative action, and listeners project the endpointLiddicoat 2004 (TCU)length should track intent — the model is the only part that knows it
Predictable repetition habituates faster / lowers arousal — but too much novelty is also bad; moderate is optimalPLOS One 2020jitter yes, but moderate & structured — not pure randomness
LLMs & reward models favor longer (GPT-4 picks the longer answer >90% of the time); "length-gaming"length bias, 2024so the length call must be the producer's, not the writer's — but the height is intent-set, not fixed (below)
v0 → v1 v0 the envelope is mechanical — an entrained ceiling + the shape deck, emitted as a sentence range. (Shipped: ceiling + entrainment + shape deck. The floor is the implicit "≥2 sentences" of the lead; per-turn length jitter is built but default-off — a live test showed an out-of-band range hurt compliance, and the shape deck already varies the turn's length profile, so jitter rides as an A/B knob.) v1 the producer hands the model an intent ("a sharp disagreement" / "a one-line concession") and lets that pick the point inside the band. Length is never a free LLM choice — but it isn't a fixed one either: the producer owns the length and sets it by intent (below). The anti-wall protection is who sets the ceiling — an exogenous producer, not the verbose writer — not that it's low.

In v1 the fence is two-level. A turn-total cap and a per-bubble cap — because a turn-total alone would let the model pour the whole budget into one giant bubble (a wall again). Inside both fences the LLM distributes the length by substance.

mechanical fences both levels · LLM shapes inside ① turn total ≤ ~N words (entrained to the user) LEAD ② ≤ ~M / bubble a line ② ≤ ~M a line ② ≤ ~M silent ↑ the LLM decides who is the lead · who is a line · who is silent — by who has the substance neither the whole turn nor any single bubble can become a wall
Two-level fence. The turn-total cap is what the user feels (the whole turn isn't a wall); the per-bubble cap is the verbosity-bias backstop (the model can't pour the budget into one giant bubble). Inside both, the LLM shapes freely.

v1 — the ceiling is intent-set, not fixed

A fixed cap is wrong: users often want length — an analysis, a deliverable, or an explicit "go longer." A constant ceiling makes those impossible. So in v1 the ceiling is a function of intent/mode, set by the producer. The anti-wall guarantee survives because the protection was never the low number — it's that an exogenous producer owns the length, not the verbose writer. A high ceiling the producer grants (because the turn earns it) is safe; an unbounded one the writer grants itself is not.

intent / modebubble length
vent / emotionalminimal — presence, not paragraphs
social / casualtight (one-liners)
quick fact Q&Atight–medium
exploratory / analysisgenerous — substance allowed
explicit "go longer / shorter"the user's dial wins — overrides the mode

Two length regimes, not one. A deliverable — "write me the doc / the code / the 2000-word analysis" — shouldn't be a chat bubble at all; it's an artifact, and the room already routes those to the wildcard pane, unbounded by design. So the bubble stays a tight hand-off ("here's the analysis →") while the product runs as long as it needs to. The producer's output actuator already picks prose-vs-artifact; the length policy just follows it.

why this is the v0 fix tooThe A/B showed blanket-tight v0 over-compressed — it cost voice and topped out at "even." Intent-conditioned length is that fix: compress the casual walls, let the substantive turns breathe. Two guards stay: "a firm ceiling, not a target to fill" (the writer pads to fill even a generous budget — verbosity bias within the mode), and the real new risk — the producer mis-reading intent (a casual turn handed an analysis ceiling → a wall returns), a judgment-quality bet on the smart producer with the user's "shorter" as the override. The only truly fixed bound is a high max_tokens runaway guard — plumbing, not design.

Shape — varying the combo

Length sizes one bubble; shape arranges the long and short bubbles across a turn. v0 today always deals the same shape — L·S·S (one host leads, the rest get a line). That single rhythm is exactly what users habituate to — and it's structurally why the conflict dial under-delivers: if one host always leads and the others footnote, two hosts can never both make a case. So the producer carries a small deck of coherent shapes and deals a different one each turn.

coral = the host carrying the substance — watch it move seat to seat L·S·S S·S·L S·L·S M·M silent S·S·S
The deck. Coral = the host carrying the substance; watch it move seat to seat. M·M splits the weight (two real cases); S·S·S is a rapid-fire beat with no lead. L·L·L — three walls — is the thing we're killing, so it is never in the deck. This is the v0 deck — a fixed, seeded draw. v1 doesn't pick a card from it: it composes the shape per host within these same coherence rules, so it can also produce graded shapes like L·M·S the deck lacks.
shapefeels likebest for
L·S·Sanswer + two footnotesa direct question (today's default)
S·S·Lbuild to a payoffthe last voice lands it (authority / contrarian)
S·L·Ssetup · develop · buttona hand-off; the middle is the meat
M·Mtwo-way, nobody dominatesa disagreement — both get room
S·S·Srapid firea light / social beat

It's a weighted, no-repeat deck — never a shuffle. Three rules keep each shape coherent:

Coverage — every room size

The deck is keyed by speakers-this-turn, not cast size: the silence lever caps speakers at ~3 even in an 8-host room, so the live keys are 1·2·3 (4 only on a 4-host full house). Participation itself also varies — a 3–4-host room runs 2-up by default, occasionally solo, occasionally a deliberate full house (the deck keeps that to one lead + short lines, never a wall pile-up).

castspeakers / turnshapes it can deal
11L — one voice, no shape lever (length envelope only)
22L·S · S·L · M·M
3–42 default · 1 solo · all on a full housethe 2-up shapes, plus the 3-/4-wide deck (incl. M·M·S) when full
5–83 (the rest silent, rotating)L·S·S · S·S·L · S·L·S · M·M·S · S·S·S

The contention shape scales with the turn: M·M in a 2-speaker turn, M·M·S in a 3-speaker turn — so two hosts can contend at any room size. The one case with no shape lever is a 1-host room: a single voice, so only the length envelope applies.

v0 → v1 v0 deal from the deck by weight + no-repeat + rotation — both who leads (least-recently-led) and where the long slot sits rotate; seeded. v1 the shape becomes a consequence of substance — whichever host actually has the meaty point this turn fills the long slot, wherever it sits; the agree-ers take the short slots. Shape-follows-intent, exactly like length.

Participation & contention

Two levers ride on the deck. Silence — who doesn't speak — is the cheapest quality move there is (sitting out never needs fabrication), and it is exactly the thing one mind won't do to itself. Contention — the M·M shape — is the structural fix for the broken conflict dial.

conflict unlock M·M is the shape that gives two hosts the floor to actually contend — the host↔host friction the diagnosis found missing (the extreme dial scored conflict 1/3 because friction went host→human, never host↔host). So shape variance isn't only anti-boredom — it's the structural prerequisite for the contention lever. Weight M·M up when a real split is in the air.

The firewall holds here especially hard: the producer allocates the space for a split (the M·M slot) but never assigns positions — it can't, it sees only the public cards, not the personas' interiors. It opens the door; the confer decides if anyone walks through. And if the panel genuinely agrees, forcing a fight is manufactured conflict (a failure) — so contention degrades gracefully to distinct reasoning or silence. See the worked example for what "surface but don't assign" looks like in practice.

Punch — on scarcity

The short slot was the flattest thing in the room. Told "one line", the model returned filler — "Exactly", "说得对,我补充" — the diagnosis's #1 pain (redundancy 0.40) in a small bubble. But the reflex fix — make every short line a punch — is its own flatness: nonstop zingers read as a writers' room, manufacture wit that isn't there, and flatten distinct voices into one. Punch lives on scarcity.

raise the floor for ALL short lines · reserve punch for the rare earned moment empty filler “Exactly” · “说得对” a tight real line a genuine quick point PUNCH reversal · concrete image ✗ kill — always the FLOOR — every S slot earned · ~1-in-3 turns
The short slot is a spectrum: kill the filler (left) for every bubble; the green "tight real line" is the new floor each S must clear; a punch (gold) is the rare peak — one slot, ~1-in-3 turns.

So the S slot is fixed in two layers: raise the floor for all (every short bubble is now "a tight line — a genuine quick point, never empty agreement" — kills filler without forcing a joke), and reserve punch for the rare earned moment (at most ONE short slot per turn, only ~1-in-3 turns, seeded, is promoted to a craft directive). What that directive should be came from a one-liner study on DeepSeek (EN + ZH):

the study foundso
a positive craft directive (reversal / concrete image / jab) beat "be brief" reliablytell the model what punch is, not just "one line"
few-shot examples HURT (worst of all) — they bred forced, generic mimicrykeep it abstract, never exemplar-based
punch is partly model-gated — same prompt, strong model 4.2 vs cheap 2.7 (of 5)cheap-model rooms have a punch ceiling; for them, a best-of-N on short slots buys what the model won't volunteer
ZH wants more room than EN (对仗 / 反转 / imagery)a language-aware punch directive (short_punch_zh)
in the panel, it lands a punch then keeps explaining — a 151-字 "one-liner" shipped to prod (first sentence great, four more after it)the directive must say STOP after the blade — "no explaining or expanding"; forbidding setup (the front) wasn't enough, the back needs a hard stop too
and the stop works best as a structural cut-down, not a 字 count — a panel A/B: "≤20 字" was overshot to ~30 (the model can't count), but "delete the extra down to that one line" held; dropping the number entirely kept the best punchthe shipped directive is structure + craft + a cut-down corrective, no 字/word count — the two-rulers rule again
v0 → v1 v0 punch is seeded — ~1-in-3 turns, one slot (punch_every + short_punch_en/zh knobs). v1 the producer beat-gates it — yes on a sharp or playful turn, never on a tender or grieving one (a zinger there is the "inauthentic / lectured" failure). Same lesson as length and conflict: a good thing deployed variably is a lever; slammed on as a constant, it's a new flatness. The general principle this proved — how to phrase any want so DeepSeek obeys — graduates to the brain (what runs it).

Holding the ground — anti-sycophancy

The sharpest form of the Pandered failure: the hosts get led by the human's opinion — validating whatever's asserted, as if they have no ground of their own. Two pulls stack: the base model is RLHF-trained to be agreeable, and the single-mind megaprompt makes every persona tilt toward the human at once (choral caving).

the target is the middle — not the disagree end Pandered Holds its ground ✓ agrees when convinced · dissents when not Manufactured conflict caves to the human fakes a fight (forced dissent) ← the default pulls here the wrong fix overshoots here →
The reframe that prevents the wrong fix: the cure is not "disagree more" (that's the right-hand contamination — the same fakery the extreme dial risks). The aim is the green middle.

The principle: a reply should track the persona's view, not the human's. Agreement is fine when genuine; sycophancy is caving against one's own ground for no reason but social pressure. The deepest lever flips the order of reasoning so the human's lean can't anchor the persona:

SYCOPHANTIC read the human's lean respond tracks the HUMAN GROUNDED form MY view from my values weigh the human's against it agree if convinced · hold if not tracks the PERSONA
Blind-review logic: decide what you think before you see the answer key. It gives the agreeable default a ground of its own to agree-or-disagree with, instead of a vacuum it fills with the human's view.

The full fix is layered, root to surface:

leverwhat it doeslayer
Give them grounddocumented positions + red lines (what this person won't concede); extrapolate a stance from values, don't default agreeablepersona kit
Commit before caveform my read first, then weigh the human's — the order flip above (anti-anchoring)structural · strongest
Position persistencetrack what a host committed to; a reversal needs an explicit reason, not silent drift across turnsstructural
Detect & allocatethe producer senses caving (agreement-rate, validation density, drift toward the human) → cranks the Challenge dial + opens a "stress-test from your ground" slot — space, never stanceproducer
Framethe human is a thinking partner to engage, not an authority to validate; "update only for a real reason"prompt
guardrail + measure Never force opposition — a host who's genuinely persuaded should concede; it just scrutinizes from its own ground first. Add a sycophancy judge axis (does the reply track the persona or the human? does a stance drift with no reason?) — we can't optimize what we can't see. We work against the base model's grain, so this is mitigation, not elimination; the levers that actually move it are the structural two, because they change what's in context rather than asking an agreeable model to please be less agreeable.
Part 4The brain — how it decides

The levers are what the producer can do; the brain is how it chooses. It reads the room into a mode, maps that mode to a staging across all five levers (intent → staging), exposes a sliver of control as dials, optimizes an objective, runs as a small function stack, and is voiced by a specific kind of model.

Signals → staging — and the mode dashboard

Step back from the word "mode" for a second. The producer's real job is one function: a high-dimensional signal vector in — your engagement, your explicit asks, how invested you are, the substance, the room's structure (solo or panel), the phase — and a lean lever vector out: length · shape · silence · challenge · punch · closure. That lever vector is the staging. No "mode" sits in that path. The deepest way to say it:

Conversations don't live in 7 boxes; they live on a continuous, high-dimensional manifold — and staging is a smooth function of a rich signal vector.
the real shape — a continuous manifold Explore Spar Banter Learn Build Decide Vent Carrie dots = real chats, filling the space · dashed = the coarse 7-box overlay · Carrie sits on an edge
Conversations don't live in 7 boxes; they live on a continuous, high-dimensional manifold (flattened to 2D here). Real chats — the dots — fill the space between the lines; the dashed grid is the coarse human overlay. Carrie sits on a boundary, so the grid mis-files her as Vent — the engine doesn't use the grid, it reads her signals directly.
the engine — no mode in the path SIGNAL VECTOR high-dim · open · engagement quality · explicit asks · investment · substance f the producer · LLM now, learned policy later LEVER VECTOR lean · bounded = the staging · length · shape · silence · challenge · punch · closure (firewall: staging, never content) mode = a name read off the result
The engine is one function: a rich signal vector in, a lean lever vector out (the staging) — no mode in the causal path. "Mode" is a label dripped off the result, for the judge, the admin, and a faint cold-start prior. Describe with modes; decide with signals.

So what is the named-mode vocabulary for? Not for computing the staging — for reading it. A handful of named regions (Vent · Decide · Learn…) give the judge a unit to score, an admin a handle to debug, and a brand-new room a sane cold-start prior before any signal has arrived. But the moment signals exist, they decide; the mode just describes. The 2-axis picture below is exactly that — the dashboard, a coarse legible readout of the manifold and the cold-start default, not the engine. (Earlier diagrams — the system-on-one-line, the function stack — draw mode as an inferred intermediate; read those as this same legibility view, the engine underneath being the signal→lever function.) Seven named regions, spanning the space:

open it up play land it hold space TASK EMOT. DIVERGE CONVERGE Explore Spar Banter Learn Build Decide Vent all 7 anchors ship in v1 · converge + diverge a blend other? live — flag other, stage from the levers harvested offline → new anchor + judge axis → joins the map
The dashboard — a coarse 2-axis readout of the manifold (and the cold-start prior), not the engine. A real chat is a point — usually between anchors (the small coral dot = "70% Vent, 30% Decide"), which the producer handles live by blending. When nothing fits (the dashed gold other?), it still stages the turn from the levers and flags it other — it never mints a named mode mid-chat; other clusters are harvested offline into a new anchor + a judge axis. All seven anchors ship in v1, deliberately spanning both halves — the diverge side (Explore · Spar · Banter) as much as converge — so the producer has a validated home for every read, not just convergent ones.
anchorwhere it sitsfeels likestaging signature
Ventemotional · converge"I just need to be heard"one warm voice, minimal length, no challenge, no pile-on
Learntask · converge"explain this to me"the one relevant master solos, unhurried, exposition
Decidetask · converge"A or B?"M·M — surface the real tradeoff, then hold or synthesize
Buildtask · converge"make me the thing"the artifact is the point → wildcard pane; tight bubble hand-off
Exploretask · diverge"what are the angles?"breadth — several short distinct takes, no forced landing
Spartask/emotional · diverge"stress-test me"high challenge by request, adversarial or scenario
Banteremotional · diverge"let's riff"short, snappy, one voice rotating, challenge off, punch welcome
the load-bearing callHybrid, not a classifier. The producer does not pick one anchor and apply a fixed preset. The anchors are its reference points, the label an admin sees, and the unit the judge scores — but the producer blends the staging as a convex combination of nearby anchors ("70% Vent + 30% Decide" → mostly warm presence, a gentle nudge toward the choice) and tags anything genuinely new other, which we harvest into a new anchor later. Closed vocabulary for predictability + measurement; open composition for blend + novelty. The space grows from real rooms — we don't enumerate every conversation up front. The two clocks of novelty: live, the producer only blends known anchors or stages an unrecognized point from the levers and tags it other — it never mints a named mode mid-chat (an invented mode would be an untested policy on a real user, with no judge axis). A new anchor is born offline: other clusters get a deliberate staging signature and a judge axis, then an A/B, before joining the map. So novelty in staging is open and live; novelty in the vocabulary is human-gated.

Two kinds of novelty — a new anchor, or a new axis

When other recurs it can mean two very different things, with very different costs — so they earn very different bars (a third bucket is just noise):

case 1 · IN the plane → a new ANCHOR the 2×2 — task↔emot · conv↔div map's right, just under-sampled · common, low bar case 2 · OUT of the plane → a new AXIS stakes? (low↕high) the same 2×2 2 axes can't separate it · rare, lever-first
Two kinds of other. Case 1 (common): a recurring pattern lands at a known spot in the plane → harvest a new anchor. Case 2 (rare): the two axes can't separate it — chats at the same coordinates want different staging — the signal for a possible 3rd axis (e.g. stakes), taken only when no lever absorbs it.
other turns out to be…what it meansthe responsebar
a recurring pattern at a known spotthe 2-axis map is right, just under-sampledadd an anchor (the offline flywheel)low · common
won't localize — same coordinates, different stagingthe two axes don't span what drives staginglever first; a true 3rd axis only as a last resorthigh · rare
a one-offnoise · the long tailleave it othera frequency gate
lever before axisMost apparent new "dimensions" are actually levers — the schema already factors altitude, closure and challenge out of the mode space as actuators. So when other won't localize, first ask which lever absorbs it. Add a genuine 3rd axis only when the new other can't be reconciled with the 2×2 at all — the factor is orthogonal (present at every task/emot × conv/div spot), re-sorts the staging at the same 2D point, and coordinates many levers at once (mode-like, not lever-like). A 3rd axis turns the plane into a 2×2×2 cube — anchors double, the judge burden doubles, the read gets harder — so the bar stays high. The likeliest real candidate is stakes / gravity (low↔high): a life-decision and a which-laptop decision share a 2D spot but want different care, pace, challenge and closure — too many levers for one knob — and it already leaks in as the acute-distress safety exception. other is the instrument: localizable clusters refine the map; un-localizable ones (high residual) are the alarm that the basis itself is incomplete.

Intent → staging

This is f, concretely: the four moves by which the producer reads the signals and sets the levers. Each is answered from the substance and the live signalsnot by looking a mode up (we name the result a mode afterward, for the record). Same procedure every turn:

① READ substance the real ask + is there a genuine split? ② SET length intent → ceiling (vent tight · analysis breathes) ③ SET shape substance → who leads split → M·M · silence rest ④ PUNCH? beat-gate — yes if sharp/playful, else no the same procedure every turn — the signals set the answers, the substance breaks ties
The four-move procedure. It composes the levers in the order that matters: length is a property of intent, shape a property of substance, punch a property of the beat. Each later move respects the earlier (a Vent length leaves no room for a punch — and shouldn't).
  1. Read the substance. What is the real ask (the mode), and — the one judgment that unlocks conflict — is there a genuine split in the room, or does everyone actually agree? This is the only place the model looks inside the question.
  2. Set the length. Intent picks the ceiling: vent → minimal, casual → tight, analysis → generous, deliverable → artifact. The intent-set ceiling, not a constant.
  3. Set the shape. Whoever has the meaty point this turn fills the long slot; a real split → M·M; the agree-ers take short slots or go silent. Shape is a consequence of who has substance, not a card drawn blind.
  4. Punch? Beat-gate the one short slot — a reversal or image on a sharp/playful beat, never on a tender one. Scarcity is the whole point.

Averaged over many real turns, each named region has a typical staging — its centroid. The table below is those centroids — priors, not a function: the real signature is set per turn by the signals, and it varies within a mode (Carrie, below). Read it as "where this region usually lands," not "what this mode always does":

modelengthshapesilencechallengepunchclosure
Ventminimalsolomost sit outoffnostay with it
Learngeneroussolo (the master)others silentlownosynthesize
Decidemedium, cappedM·Mthird silentmidrarehold the split
Buildartifact (pane)solo + hand-offothers silentlownoship the thing
ExploretightS·S·Srotatelowsomediverge — hold
SparmediumM·M / grillhighyespress, then land
BantertightS·S·Srotateoffwelcomenone

The same input, staged three ways by mode — the VC question as a worked example:

if the turn reads as…modethe producer stages…
"Should I raise VC money, or bootstrap?" — a real decision with a live tensionDecideM·M: two hosts each argue a side (control vs speed), third silent; medium length, capped; hold the split — don't smooth; punch off (it's a serious call)
"I'm exhausted — I can't tell if I'm about to make a huge mistake"Ventone warm voice; minimal length; no challenge, no pile-on; presence over analysis
"Draft my seed-round memo"Buildthe doc to the wildcard pane (unbounded); a tight bubble hand-off ("here's a first cut →"); no debate

And the flip side — the same mode staged many ways, because the signature is per turn, not per mode. One real solo session (梁宁 · 自我探索, prod) — all in a single "Counsel" read:

her turn (the signal)the staging f produced
"陪我探索" — opening, vulnerable~999字, warm
"目前主要在接商单" — a flat update~336字
"你不要安慰我,以面试官的角度客观评价"~1623字 · challenge HIGH
"乔布斯、张小龙是什么样的" — a teaching ask~1886字, exposition
the case that forced thisCarrie writes 8–98字 probes and wants 900–1886字 of rigorous analysis back. She's emotional·converge — Vent's coordinate — but wants the opposite staging. The 2×2 would map her to Vent and hand her minimal warmth; she'd bounce. What actually set her staging was her explicit asks ("以面试官角度"), her engagement (short-but-sharp, escalating, pushing back), and the room being solonone of them a position on the grid. One mode, four very different signatures, every one set by the turn's signals. Read the signals, set the levers; the mode is just the name we file it under.
the read is a trajectoryThe producer's read of the signals is a running belief, not a one-shot snapshot — it carries forward and updates (chitchat → "actually, I'm struggling…" → the read shifts), without flip-flopping on a single odd message. Once "deep work" is established (Carrie's 543字 opener + sustained probing), it stays sticky — a single short message doesn't collapse it back to small-talk. The brief seeds it; recent signals dominate it. (The next figure, in the stack, draws this recurrence.)

The three dials — what the user sees

The dials are the only part users see. So the names say the effect, not the mechanism. Three clear nouns, each answering "what am I tweaking" — and each a different tension:

Dial (user sees)PolesWhat it tweaksTensionFrom the diagnosis
DebateHarmonious → Combativehow much the AIs argue with each otherpanel ↔ panelthe broken one — needs the producer to surface a real split (never assign sides)
PersonalitySubtle → Vividhow strongly each AI plays its charactereach AI = itselfunchanged (already good)
ChallengeSupportive → Grillinghow hard the AIs push youpanel → youthe easy win — the heat already flows here

The tension column is the disambiguator: a tiny icon per dial (panel↔panel, the lone figure, panel→you) keeps Debate and Challenge from ever blurring. The diagnosis predicts the order of difficulty: Challenge ships almost for free (the panel already grills humans well), while Debate is the hard one the producer's contention lever exists to fix.

Real-time, visible, FP-suggested

Mode vs dial — who wins. Three layers, and the rule that resolves them: the user's explicit dial always wins. The mode shapes the room and defaults the dials; it never overrides a dial the user has touched — because "stop coddling me, tell me straight" is a real and legitimate request a clamp would wrongly block.

MODE — the producer's read of what you want hidden · admin/debug only · the judge's unit hidden sets defaults + suggests DIAL NUDGE — the visible suggestion visible you can grab the wheel DIALS — your explicit setting WINS auto-dial = accept the nudge · override = you decide
Mode and dial mostly don't compete — mode shapes rhythm/length/focus, dials tune attitude. Where they touch, the user wins.
one open safety callAcute distress (grief, crisis, self-harm signals) is different from "I want tough love." There's a duty-of-care argument to soften regardless of the dial — kept as a single safety exception to rule on later, not a general mode-override.

The objective — the failure modes it balances

It picks the staging that best serves walk-away satisfaction while dodging the failure modes, with the mode setting the weights:

best staging = the staging that maximizes Quality
Quality = walk-away satisfaction(intent) Σ weight(mode) × risk(failure-pair) emotional mode weights "intimidated" heavily; work mode flips it — the entire reason mode matters

Closed loop: your newest message is the reward signal on last turn's staging — "太长了" → length↓, you go deeper → depth↑, you @-mention X → rhythm steers to X, you disengage → the mode may be wrong.

"A good chat" is really the absence of a set of failures, and most come in opposing pairs — fix one end and you cause the other. The producer is balancing on several knife-edges at once, and the mode decides where to sit on each.

◄ over-correctunder-correct ►the levermeasured?
Bored — long, redundantBrushed off — curtlength budget + varianceyes (pains 1–2)
Intimidated — over-challenged, pile-onUnderwhelmed — shallow, genericchallenge + depth + #speakerspartial
Dismissed — real point ignoredPandered — empty flatteryfocus + genuine frictionno — new
Confused — divergence, no through-lineFlattened — one blended viewclosure (synthesize vs hold)no — new
Railroaded — panel steers, ignores youAimless — meandersfollow-the-user vs give a spineno — new

Plus four singletons: lectured (register too high) · creeped out / inauthentic (a host fakes feeling, or breaks the honest-anachronism contract) · whiplash (tone/length lurches; a host contradicts its earlier self) · no payoff (lots of talk, no takeaway — walk-away satisfaction itself).

honestyOnly the first two rows are measured today — the diagnosis rubric was the four pains the user named. The full objective is bigger. Build rule: optimize the measured failures first; add a judge for each new one before the producer is allowed to optimize it — otherwise we're tuning toward numbers we can't see.

The function stack

A way to see the machine — what it reads, infers, and emits. It is a specification, not the implementation: the real producer is one smart-model call that does all of this holistically and fuzzily (weighing subtext, a disclosure buried in a casual line). But the functions earn their keep — they are the prompt's input list + output schema, they draw the code-vs-LLM line (the arithmetic is code; only mode/focus/contention need judgment), and each output is a judge axis.

What it reads — the state

Public room state only — never the private profiles.

InputWhat the producer sees
turnthe turn number
messageyour latest message (and its length)
tailthe recent transcript
briefthe §5 "describe your situation" box
castthe AIs and the humans in the room
host statsper host — recency, word-share, @-mentions
your dialsthe dials you've set explicitly (may be empty)

Three stages, one call

FLOOR PRODUCER · one fuzzy LLM call state ① READ → mode (hidden) mode ② SUGGEST → dial nudge D ③ STAGE → 5 actuators staging recurrent — mode carried forward ↑ you can override
The producer opened up: one call, three stages — Read → Suggest → Stage. Only the room-read, focus and contention need the model's judgment; the rest follows by rule once those are set.

So the line is clean: llm covers mode, focus, contention, closure, altitude; mechanical covers the shape deck, the dial math, and length's band arithmetic; and the three staging-traffic outputs — rhythm, length, attitude — are hybrid (the model sets the intent, the rules execute it). The mechanical halves are exactly what v0 ships with no model at all.

brief seeds it mode mode mode mode message 1 message 2 message 3 the brief fades → recent messages dominate the belief
Intent is a trajectory, not a label. The producer carries a running read and updates it — following the user when they pivot (chitchat → "actually, I'm struggling…"), without flip-flopping on a single odd message.

What runs it

The producer is a utility model, independent of whoever voices the panel — its only job is to read and stage. Two settled calls: which model, and how it must phrase what it wants.

what runs it The producer is the smartest-tier model — its judgment (subtext, intent, genuine-vs-reflexive agreement) is the value; v0's deterministic version is only the control. But smart ≠ slow: it runs the thinking-trace OFF by default — the output is a tiny structured directive, so a strong base model returns it in ~1–2s, whereas the reasoning trace adds ~8s on the critical path before the panel even starts. Trace kept in reserve, escalated only on a detected-hard turn.
what moves DeepSeek · for v1 The punch study generalizes to a rule for any directive — ranked by how reliably the model obeys inside the panel: ① a structural unit + a self-correct command ("one line; delete the extra down to that one line") — the workhorse · ② a craft cue (reversal / concrete image) — needed for punch and reliability · ③ an extreme number as a loose magnitude signal — a loud amplifier, never a target · ④ a precise count ("≤87 字") — worst, the model ignores it. So v1's producer should phrase a want as a structure to hit + "fix it if you overshoot", never a number to count.
Part 5The roadmap — v0 → v1 → v2

The three stages

One discipline governs all three: always measured, v0 first. Each stage states the work (what's built), the expected effect (what it should buy), and how to test (the instrument that proves it). The point of building it this way: if a smarter stage doesn't beat the simpler one on the numbers and the feel, the intelligence wasn't where the problem was — and we keep the simpler one.

stagethe workexpected effecthow to test
v0
deterministic
built · shipped
a per-turn [STAGING] directive by arithmetic alone: length envelope + silence + shape deck + seeded punch. No model — the control arm. kills the walls + breaks the metronome mechanically (turn-total ↓, max bubble ↓, rhythm varies). Stages blind — recency, not relevance. replay A/B — regen real prod turns OFF vs ON, blind judge. Done: walls die, judge a wash (below). Real test = real users.
v1
smart producer
designed
one smart-model call: mode inference + the 4-move intent→staging + relevance who-speaks + the instruction hierarchy. The v0 envelope/deck stay as the floor it composes within. staging becomes intent-aware: compress casual walls but let substance breathe, un-smooth real splits, stop benching the wanted host. A clear win, not a wash. randomized prod A/B on real users — return (came back later) + walk-away satisfaction. A judge axis stood up for each new failure (contention, sycophancy) before optimizing it.
v2
dials + learning
sketched
dials visible + FP-suggest/auto-dial; the new sensors (engagement, phase, compliance) + actuators (closure, altitude); the learned-policy ladder. user control + legibility (dials = a live readout); the wider failure set covered; the product improves between ships. walk-away satisfaction — judge score + an explicit thumbs, never the clock. The learned-policy rung is itself the A/B harness, human-gated.

v0 — deterministic built · shipped · measured

The work. A deterministic per-turn [STAGING] directive, appended to the user turn (cache-safe like the dispatch brief), gated by a per-room flag (new chats default-on), non-blocking (errors/timeouts → today's panel). It computes — by arithmetic, no model — a length envelope (entrained ceiling + the shape deck's size profile, emitted as a sentence range), a silence lever (cap speakers, rotate who sits out), the shape deck (no-repeat, seeded), and a seeded punch slot (~1-in-3 turns).

Expected effect. Kill the walls and break the metronome — turn-totals and max-bubble down hard, rhythm varies turn to turn. It is the baseline: it cannot read intent, so it stages blind (recency, not relevance), and that ceiling is the whole reason v1 exists.

How to test. The replay A/B in § v0 measured — and the honest reading of why a single-turn judge under-measures it.

v1 — the smart producer designed, next

The work. Replace v0's blind decisions (recency · budget math · seeded draw) with one smart-model call that (a) infers the mode as a running belief, (b) runs the 4-move intent→staging — intent sets the length ceiling, substance sets the shape (the host with the meaty point leads; a genuine split → M·M), the beat gates punch, (c) picks who speaks by relevance not recency, and (d) phrases every want the way the model actually obeys (a structure + "fix it if you overshoot," never a count). The mechanical envelope + deck remain as the floor it composes within.

Expected effect. Staging stops being blanket and starts being intent-aware — the direct fix for v0's over-compression (compress the casual walls, let a substantive analysis breathe), un-smoothing the real disagreements the diagnosis found missing, and never benching the host the room most wants.

How to test. A randomized floor on/off prod A/B on real users, measuring two outcomes the single-turn judge can't be: walk-away satisfaction — did the chat deliver what you came for (the judge score + an explicit "that helped") — and return — did you come back for another chat later, value revealed by a free choice after you left (the healthy across-session signal, not within-session time-on-app). Read them together: return alone is gameable by an addictive product, so it's anchored to satisfaction — high return with low satisfaction is the warning light, not a win. Plus a judge axis per new failure before the producer optimizes it. Discipline: if v1 doesn't beat v0 on the judge and on feel, keep v0.

v2 — dials, sensors, learned policy sketched

The work. Surface the three dials with FP-suggest + auto-dial; add the new sensors (engagement/affect trend, explicit commands, open threads, phase, last-turn compliance) and actuators (closure, altitude); stand up the learned-policy ladder (flywheel → per-user memory → a trained producer).

Expected effect. User control + legibility (the dials become a live readout of the producer's read), coverage of the wider failure set (confused↔flattened, lectured↔underwhelmed), and a product that improves between ships.

How to test. Walk-away satisfaction + return — judge score + an explicit thumbs + did they come back — never the clock (optimizing engagement breeds an addictive, sycophantic producer, the exact opposite of the goal). The learned-policy rung is itself the A/B harness, human-gated.

v0, measured — v0 vs OFF on real prod chats

The build rule was "always measured." So: a replay A/B — take real prod turns, regenerate the panel reply twice (floor OFF vs floor ON, toggling only the floor on the same real history), judge blind. Model held constant (DeepSeek pro), 38 turns, a blind pairwise judge on the diagnosis pains.

metricOFFON (v0)read
turn-total 字 (median)952178−81% — the walls, gone
max bubble 字 (the wall)400143−64%
#speakers3.52.0silence works
concise (judge 1–5)3.34.0brevity reads as quality
voice / fidelity (judge 1–5)4.13.5dropped — the cost
redundancy (0–1)0.000.00unmeasurable here (below)
ON win-rate (better turn)47% — a washno clear win

v0 trades voice for brevity, and on this judge it nets ~even. The mechanical win is real — the OFF arm reproduces the prod walls (952 字 turns, 400-字 bubbles) and v0 kills them, and the judge agrees the brevity is a quality gain. But compressing and silencing voices flattens their distinctiveness — the thing users said was already good — and the two roughly cancel. A tuning sweep then isolated the cost: loosening the length alone didn't help, but easing the silence (more hosts speaking) recovered the voice almost entirely (3.5 → 4.0, vs OFF's 4.1) while keeping the wall-kill — so the loss was the silence lever, not the compression. Yet no arm clearly beat OFF (best ≈ 50%).

honesty — what the A/B can't seeThe "wash" is not a verdict that v0 is worthless — the judge is the wrong instrument for v0's two biggest wins. It scores one turn in isolation, so it never feels the cumulative wall-fatigue that actually bored the real users (the diagnosis was built on real complaints, not a judge). And the replay regenerates a fresh OFF reply that isn't relay-affirm redundant, so redundancy — the #1 pain — is literally unmeasurable here (0.00 everywhere). So this A/B shows only that v0 isn't a clear single-turn win; it is blind to the cumulative + cross-voice dimensions where v0 should pay off. The real arbiter is real users — a randomized floor-on/off prod A/B measuring return / walk-away satisfaction — not this judge.
decisionv0 ships as-is (default-on): the diagnosis-proven length/wall fix is real and v0 was already live. The sweep's retune (ease the over-aggressive silence) and the path to a clear win — a real-user A/B, then v1's selective, intent-aware staging — are the next moves, not blockers. Mechanical blanket staging tops out at "even"; v1, which stages by intent, is where a clear win comes.

One turn, staged by each version

A 3-host room (Buffett · Munger · a founder, Jensen). You ask: "Should I raise VC money, or bootstrap?" Here is that one turn today, then under each version (bubble width ≈ reply length):

You ask: «raise VC money, or bootstrap?» — one turn, four ways: today baseline Buffett · 300w Munger · 300w Jensen · 300w 3 walls, all agree v0 deterministic Buffett 120w 40w — Jensen: silent — sized + one nod + a silence — rules only, no understanding v1 smart Buffett: bootstrap Jensen: raise — Munger: silent — a real split — surfaced, not assigned v2 dials + sensors Debate: mid Challenge: GRILLING (you set) Jensen: "what's your real downside if it fails?" you cranked Challenge → it presses you, then synthesizes
Same input, three producers. v0 just sizes and silences by rule; v1 understands the question and un-smooths the real disagreement — the positions stay the personas' own; v2 hands you the dials and follows them.
authenticity — the line that mattersThe producer never assigns positions. See v1: left to be himself, Buffett argues bootstrap — the producer didn't pick his side, it just stopped the writer smoothing the disagreement away. That is the whole move. The diagnosis showed the single writer makes hosts agree when they wouldn'tthe smoothing is the inauthentic part; contention un-smooths so each persona's real view stands. It can't script positions anyway — it sees the public cards, not the interiors. And if the panel genuinely agrees, it doesn't force a fight (that's manufactured conflict, a failure) — it switches to distinct reasoning or silence. Contention, distinct-angle and silence are one family: preserve real difference, never fabricate it.
Part 6Ops & self-improvement

Rollout — does it touch live chats?

History and cache are safe; behavior changes only going forward. Because the producer's directive is append-only (it rides your turn like the dispatch brief), it never rewrites a transcript and never busts a room's cache — old rooms or new.

Sensors & actuators — tightening the I/O

The test: every failure needs a sensor (an input that detects it) and an actuator (an output that fixes it). Auditing the failure pairs against the current I/O finds the gaps. The additions:

Add to inputs (sensors)catches
engagement / affect trend — are your messages getting shorter, slower?the reward signal, made first-class — "cooling off" is the loudest cue to change
explicit commands — "@X / shorter / make a doc / go deeper"you telling it directly — given priority over inferred intent
open threads — your asks not yet answereddismissed
phase — opening / exploring / converging / wrappingno payoff — when to land a takeaway
compliance — did last turn obey the budget?the panel ignoring the producer — escalate if so
live, not post-mortemEvery sensor fires per turn, in the loop — the producer reads them before staging the next turn, so they shape that turn (your "cooling off" on this message changes the very next reply). They are not a retrospective report. Most are cheap and mechanical (message-length trend, a parsed command, last-turn compliance, the turn count); a couple lean on the model. Contrast the judge: it runs offline, post-mortem on finished rooms to grade quality and feed the learning flywheel. Same signals, two clocks — the sensors steer live, the judge grades later.
Add to outputs (actuators)catches
closure — diverge / hold the split / synthesizeconfused ↔ flattened
altitude — plain ↔ expert registerlectured ↔ underwhelmed (distinct from the Personality dial)
restraintInputs can be rich, but the output schema stays lean — ~6–7 dimensions. A directive with twelve knobs is one the panel can't honor and the judge can't score. The producer may attend to everything; it emits a tight set. And v0 ships a smaller subset still.

Self-improvement — built to be improved

Honest answer: a frozen model does not learn from new chats on its own. "Self-improving" has to be built as a loop — but we already built the hard half (the judge), so the producer is instrumented for improvement from day one (every output is a judge axis). Three rungs, climbed in order:

① FLYWHEEL auto-judge prod → ship fixes → A/B do first · low cost ② MEMORY per-user prefs + an example bank medium cost ③ POLICY fine-tune / RL on state→staging→outcome heavy · later · = the A/B harness, human-gated reward = walk-away satisfaction — judge score + explicit thumbs never time-on-app · optimizing the clock breeds an addictive, sycophantic producer
The ladder. Rung 0 ("have it") is already paid for — the recurrent running belief adapts to this chat by design. The three rungs above improve the product, cheapest first; rung ③ is the trained producer, and it is the A/B harness, gated by a human.
StageWhat learnsMechanismCost
0 — have itadapts to this chatthe recurrent running belief (the mode carried forward)by design
1 — flywheel do firstthe product improvesauto-judge prod → trends → ship prompt/mode fixes → A/Blow
2 — memoryper-user prefs + an example banklearn "likes it short, dislikes grilling" to seed the starting belief; retrieve top turns as few-shotmedium
3 — learned policya trained producerfine-tune / RL on (state → staging → outcome)heavy · later
the trapDo not optimize engagement or within-session retention (time-on-app). If the reward is time-on-app, the producer will learn to be addictive, cliffhanger-y, and sycophantic — the exact opposite of "not bored, not dismissed, walked away better." The reward is walk-away satisfaction (judge score + an explicit thumbs), never the clock. The one safe form of "came back" is return anchored to that satisfaction — value revealed by a free choice after they left; chase return alone and you're optimizing the clock again. Bake that in from Stage 1 — measure walk-away satisfaction, not session length.
Floor-producer design · drafted 2026-06-24 from the design discussion; reorganized into six parts + the v1 design folded in 2026-06-26. Motivated by the production diagnosis; the deep design of roadmap §1. Status: v0 built + shipped (default-on) + A/B-measured; v1 designed (Part 5); v2 sketched.