Dialogue · The toolbox · The turn split
‹ the toolbox

The turn split — act, then speak

The build contract for the fix the scenario battery argued for. One sentence of diagnosis: the persona must be a careful form-filler and a natural conversationalist in the same breath, and conversation wins. The remedy is to stop asking one call to do both.

The shape. A turn becomes two model calls behind one visible reply. The act call decides whether an instrument is wanted and sets it exactly — reasoning ON, a real tool call, holding the tool manual. The speech call then talks — reasoning OFF, natural, with the manual removed from its prompt entirely. Act first, so the persona speaks knowing the dice are already on the table.

1 · What the battery established

FindingEvidence
The mechanism is not the problem27 runs, 0 leaks, 0 lifecycle errors, 0 valve failures. Every defect sat upstream of the instruments.
More manual would not have helpedThe SP names 吹牛 by name as the faces use case, with the literal tag, in the same paragraph. The persona armed neither faces nor sealed. The information was present and lost at ~18k tokens' distance — a retrieval failure, not a coverage failure.
The FP forbade the act「只确认收到指令,不加任何额外动作」·「不做多余的事」. Arming reads as「extra」.
The FP caused the fabrication「执行动作并报告结果」in ≤40 字. A real result does not exist at write time — the only way to obey is to invent it, and the persona invented 「1、3、3、5、6」.
31% of turns skip the tool call22 of ~70 panel calls answered in plain text and fell back to the <speak> parser.

2 · Verified ground truth

Probed live 2026-07-26, not assumed. Anything here that later disagrees with the code is a bug in the code, not in this table.

QuestionAnswer
Do we already use DeepSeek tool calling?Yes — one function, panel_turn, tool_choice:"auto". It carries speech only; instruments are XML inside a free-text field.
Is reasoning on?No. thinking_of() is False for both deepseek-v4-pro and -flash.
thinking ON + tool_choice:"auto"✅ works — and the model does call the tool.
thinking ON + tool_choice:"required"400 Thinking mode does not support this tool_choice.
thinking OFF + required✅ works. (The「cannot force」comment in the code was written under thinking-on and is stale.)
Does thinking mode support multi-step tool loops?Yes — the docs describe interleaved reasoning ↔ tool calls. More headroom than this build needs.
What must be preserved for thinking + tool calls?reasoning_content must be passed back on every subsequent request for turns that made a tool call. We currently discard it — only its length is kept.
the load-bearing decisionThe form compiles to a tag. The act call does not get its own apply path. Its filled form is rendered into the canonical <roll …/> · <vote …/> · <gate> string and appended to the lead reply as its closing act — so extract_panel_rolls and every _apply_panel_* method run completely unchanged. Three consequences, all wanted: no new mechanism to get wrong(the battery proved this half is sound)· the XML grammar survives as the fallback for turns that skip the tool call · and the whole feature is revertible by not compiling.

3 · The seven steps

1The instrument formschema

A typed JSON schema covering all instrument kinds, with every dial as an enum: visibility(all · contributors-only · own · none)· readout(sum · faces)· blocking(none · host · all)· place · reveal · close · for · dealer. Plus a missing escape: the field the call could not fill.

Done when: every tag today's grammar accepts is expressible as a filled form, and the compiler round-trips form → tag → parser → identical props.

2The act callthe real build

A second model call: trimmed prompt(tool manual + recent turns + open instruments + roster), reasoning ON, tool_choice:"auto", and its own message history that passes reasoning_content back. Returns a filled form, a missing signal, or nothing at all.

Done when: 「我们玩吹牛吧」arms 5d6 · visibility=own · readout=faces.

3The gatecost + latency

The act call must not run on every turn. A cheap check decides whether an instrument moment is plausible.

Done when: s18(the control)never fires it, and plain-chat latency is unchanged.

4The clarify paththe owner's choreography

A required field the act call cannot fill confidently means do not arm. The field name rides into the speech call so the persona asks about exactly that — self-targeting, and it cannot loop, because play starts the moment the form fills.

Done when: 「玩吹牛」with no house rules asks「五个骰子?谁先叫?」and arms on the answer.

5Slim the speech callprogressive disclosure, for free

The tool manual leaves the speech prompt entirely; the state-gated riding notes stay(the persona still needs to know what is on the table, never how to build one). This is the progressive disclosure the owner asked for, arriving as a side effect rather than as machinery — and it is why the manual is now free to get longer.

Done when: ~5,600 tokens leave the speech prefix and the control scenario reads unchanged.

6The FPsmaller than it was

The split already disarms the FP structurally — the act happens in a different call, so「不加任何额外动作」can no longer suppress it. What remains: never order a result in the same beat as an act(the fabrication cause)· never stage silence over an open instrument(s05)· and act vocabulary that permits, never mandates.

the over-correction to avoidAn FP that orders acts produces tools nobody asked for. s18 — ten turns of ordinary talk, zero tools — is the regression test that must never break.

Done when: s05 stops staging silence; s18 still arms nothing.

7Re-run the batterythe measurement

N=3–5 on the scenarios that carry a class-1/2/3 failure, scored old-path vs new-path off the same flag. Before/after table into the battery page in the same commit.

Done when: every failure class has a number against it rather than an opinion.

5 · What it measured

Both arms, N=3 per scenario, scored off the flag. The FP fix (step 6) is in both arms, so this isolates the split itself. Arming is probabilistic for identical phrasing (the T2 finding), which is why nothing here is read off a single run.

ScenarioBaselineTurn splitWhat changed
s07 吹牛3/3 armed, wrong dials every time3/3, visibility=own + readout=facesThe headline. The dials the manual named by name and the persona never wrote. Three for three.
s06 RPS2/3, and the dice 2 of 33/3, a deposit every timeThe wrong-tool class, closed. The baseline reached for the randomizer to settle a choice.
s04 RPG3/3, but the secret roll armed public, and self-rolled3/3 — stealth sealed (own), attack public (all), and the player gets the buttonRuling ⑬ applied correctly from the sentence 「don't tell me the number」.
s02 20 Questions1/33/3Sherlock's in-character refusal (「I committed it to memory」) mostly gone — but see below.
s14 Werewolf vote2/33/3
s05 Coaching0/31/3Partial. Pantomime is the most stubborn class.
s01 Trivia3/3 board, never a poll3/3 board, a poll only occasionallyNot fixed. A quiz question still does not reliably become a ballot.
s10 立字为证3/33/3Unchanged.
s18 control0/30/3, and zero escalationsThe regression that must not break, holds. The gate declined all twelve turns.
what the split boughtThe two classes it was built for are closed. Knob-blindness(s07, s04)and wrong-tool(s06)both go to 3/3, from a baseline that armed confidently and set the dials wrong. Arming got more reliable almost everywhere(s02 1→3, s14 2→3, s05 0→1). And the speech prompt lost 31% of its tokens — the tool manual, ~6.1k, now loaded only on a call that is actually deciding about an instrument.

6 · The three things the build learned

the seam was wrongThe manual did not hold only parameter documentation. Two SPEECH disciplines lived inside it, and cutting the manual out cut them too. Within one run the persona narrated 「*[clatter]* That's a hit — 5 damage」over a card nobody had tapped, and acted out its own sealed move as 「*[He throws: rock.]*」. Neither belongs to whoever sets the dials; both belong to whoever is TALKING. They now live on the speech prompt, written as hard prohibitions with the real failures quoted back.
the declinetool_choice cannot be forced with reasoning on — and the accurate call sometimes declines to call at all. Five of thirteen escalations, after the gate had already decided an instrument was wanted; on 吹牛 that alone turned 3/3 into 1/3. A bare decline is ambiguous: on 吹牛 it was wrong, in the control room it was right. Falling back to the gate's own form fixed the first and broke the second — it armed 「Score: Amy 0 : 0 Ben」into a conversation about someone's bad week at work. The resolution is not to guess but to ask again, forced: thinking-off makes required legal, and a new kind:"none" gives a forced call a way to still say no.
arming revealsA tool that never fires cannot leak. The baseline scored better on s02 only by sealing nothing at all. Once notes actually get armed, an older problem becomes visible: the persona is told its own sealed row — correctly, by the parity law, so it can reason from its own seal — and then says it out loud(「a sundial can certainly be larger than a breadbox」·「I threw paper」). One contributor was self-inflicted and is fixed: the act note used to paste the compiled tag into the speech prompt, handing over the very secret it demanded silence about. The rest is a discipline problem the split did not create and does not solve.

7 · What is still open

#ItemWhy it is next
1The persona speaks its own sealed contentThe top remaining defect, and now the most visible one: 2 of 3 on both s02 and s06. Pre-existing, surfaced by reliable arming. Needs its own pass — probably at the riding note, which is where the persona is handed the secret.
2A quiz question is still not a ballot (s01)The owner's own named scenario. Survives both the FP fix and the split; the act call sees a quiz and does not reach for vote.
3Pantomime (s05: 0/3 → 1/3)The most stubborn class. Improved, not closed.
4LatencyThe full act call averages 8.8s. The gate keeps ordinary turns cheap (~2s, and it declined all twelve control turns), but a game turn now pays gate + act + speech. Not yet measured end-to-end as felt latency.
5The flag is still offEverything above is behind MAD_TURN_SPLIT=1. Production is unchanged until the owner flips it.
a note on the numbersThe published battery ran N=1, and re-measuring at N=3 shows it overstated the failure rate — s07 armed nothing in the original run and arms 3/3 in the N=3 baseline. The failure classes it identified are all real and all reproduced; their rates were noise. Every number on this page is N=3.

8 · Standing rules for this build

The turn split · contracted 2026-07-26 from the scenario battery(18 scenarios · 27 runs)and the owner's design session the same day · the choreography(clarify before arming, then act, then speak)is the owner's · the form-compiles-to-a-tag decision keeps the mechanism untouched. Built and measured the same day: steps 1–7 shipped behind MAD_TURN_SPLIT — the form(v633)· act+gate+clarify+slim(v634)· the FP(v635)· the decline-breaker(v636)· secret redaction(v637). Knob-blindness and wrong-tool closed; the control holds; the sealed-speech discipline is the next front. Architecture: toolbox.html · lifecycle: tool-lifecycle.html · the FP: floor-producer.html.