One dial set at room creation: how vividly each persona plays itself (True to life → Larger than life). It lives in the cached system prefix beside model + language, so it costs nothing per turn. This is the thinking behind it and how it's built. Live in the new-chat modal of lib/room-ui.html.
intensity.3 notches now (was 4). True to life is the floor — you only ever dial up. At the floor it emits nothing, so a default room is byte-identical to a room with no dial at all. (The Temperament slider pictured just below is kept for the design record — it's no longer in the app.)
The first ask was an "agree ↔ disagree" dial. Taken literally — force the hosts to disagree — that breaks the whole instrument. The project exists to kill manufactured conversation; a dial that makes hosts disagree regardless of what they believe is exactly the contamination the audits hunt for.
Because the risk grows as you turn it up, the no-fabrication clause is written into each notch's directive, hardest at the top:
An earlier cut of Temperament also went below natural — harmonious, collegial. We dropped them. Dialling down toward harmony pushes the panel toward the chorus-flattening failure: everyone agreeing in the same accommodating register, the second-speaker who only confirms the first. That's the other thing this instrument is built to avoid. Making Natural the floor sidesteps it entirely — and matches Intensity, which never had a reason to go below "as written."
Modulates the confer and the response gate — the threshold and vigour of surfacing a real divergence. Verbatim directive text per notch (centre/floor emits nothing):
No directive emitted. Honest positions, however they fall — the panel agrees where it agrees and diverges where it diverges, sized to substance. (Identical to a room created before the dials existed.)
"This panel is probing. The hosts test each other's claims rather than nod them through — they ask the hard follow-up, name the assumption they doubt, and surface the divergences they would otherwise let pass. Press on the weak points in each other's reasoning.Guardrail — never manufacture a disagreement: a host argues only a position they would actually hold, and concedes a point that is genuinely right."
"This panel runs hot. The hosts come in looking for where they differ and lead with it — they challenge each other directly, say plainly what is wrong with another host's case before granting anything right in it, push back hard, and hold their ground instead of drifting to consensus. Disagreement is not resolved for the sake of tidiness: if they still do not agree, the split stays open and unsoftened.Guardrail — a host contests only a position it genuinely rejects and never invents one — but short of that, nothing is left politely unsaid, and a real objection is never softened to keep the peace."
"This panel treats the conversation as a clash to be won. The hosts hunt out every fault line, press each disagreement to its limit, give no ground, and would rather leave the guest holding two openly contradictory answers than anything that reads as agreement. No concession for comfort, no rounding toward a shared line.Guardrail (hardest here) — even at full heat a host argues ONLY what it genuinely believes and never fabricates a stance, a grievance, or an objection it does not hold — the intensity is in how hard REAL differences are fought, never in inventing differences that aren't there. Where two hosts do in fact agree, they say so in a single curt line and drive straight back to where they don't."
One dial for the whole panel. Amplifies each host's diction, mannerisms, and stance — never adds a trait they lack.
No directive emitted. Each host voiced as written in their profile.
"Voice each host at full strength. Lean into what makes them distinct — their diction, their characteristic moves, the stance they take — so no two hosts could be mistaken for each other. This sharpens who they already are; it adds no trait they lack, and it never tips into caricature or repeats a signature move past the point a real person would."
"Voice each host at their most pronounced — the boldest, most vivid version of themselves, the way they'd come across at their most fully expressed, with the contrast between them turned up.Guardrail — this is amplitude, not parody. Heighten the real person; never flatten them into a catchphrase or a single mannerism on repeat."
"Voice each host at the absolute extreme of themselves — every defining trait, cadence, and conviction turned to its maximum, the version of this person that would be unmistakable from a single line, with the contrast between hosts pushed as far as it goes.Guardrail (hardest here) — it must still be THEM at full volume, never a parody OF them. Invent no catchphrase, tic, or trait the person does not have, and never let a host collapse into one repeated mannerism. Maximum amplitude, zero fabrication."
A dial is just text appended to the system block at room creation — right beside the language directive. The system block is the big, stable prefix that caching re-reads nearly free every turn, so a dial costs one-time tokens at creation and nothing thereafter.
Set at creation, baked into the prefix → from turn 2 on it's a cheap cached read like the rest of the system block.
Why creation-time, not a live mid-chat control? The dial sits before the dialog. Editing it mid-conversation rewrites the system block, which (per the caching rules) moves the first-differing byte ahead of the whole conversation and re-reads all of it. So the dial is strong + cache-safe at creation; to change it you fork or start a fresh chat. At Natural it emits nothing — so an untouched room never pays for a dial it didn't set.
Once set, a dial is informational — so the chat-info panel echoes both as read-only sliders. To make "you can't change this here" obvious, the scale fades into the background and only the current notch pops: the editable modal sliders are coral, these are not.
Faded scale = --line (lighter in light themes, darker in dark — it always recedes toward the background); the current notch = --ink (maximum contrast in every theme). Editable sliders keep the coral fill + thumb.
lib/run_room.pyEach dial is a value → directive lookup; the centre/floor maps to the empty string, which appends nothing. build_system_blocks threads both into the cached materials block, right after the language directive.
Persisted in both persist() and _load_state (a per-room field forgotten in load silently reverts on resume); carried by create() / fork(); normalised + validated at POST /api/rooms; the option lists ship in /api/config; the chosen values echo back in /state.
lib/room-ui.htmlrole="slider" + aria-valuetext. A live one-line gloss updates under each.data-readonly="1": pointer-events off, faded scale + popping current notch (above).dynamics / intensity.