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.
| Finding | Evidence |
|---|---|
| The mechanism is not the problem | 27 runs, 0 leaks, 0 lifecycle errors, 0 valve failures. Every defect sat upstream of the instruments. |
| More manual would not have helped | The 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 call | 22 of ~70 panel calls answered in plain text and fell back to the <speak> parser. |
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.
| Question | Answer |
|---|---|
| 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. |
<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.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.
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.
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.
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.
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.
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.
Done when: s05 stops staging silence; s18 still arms nothing.
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.
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.
| Scenario | Baseline | Turn split | What changed |
|---|---|---|---|
| s07 吹牛 | 3/3 armed, wrong dials every time | 3/3, visibility=own + readout=faces | The headline. The dials the manual named by name and the persona never wrote. Three for three. |
| s06 RPS | 2/3, and the dice 2 of 3 | 3/3, a deposit every time | The wrong-tool class, closed. The baseline reached for the randomizer to settle a choice. |
| s04 RPG | 3/3, but the secret roll armed public, and self-rolled | 3/3 — stealth sealed (own), attack public (all), and the player gets the button | Ruling ⑬ applied correctly from the sentence 「don't tell me the number」. |
| s02 20 Questions | 1/3 | 3/3 | Sherlock's in-character refusal (「I committed it to memory」) mostly gone — but see below. |
| s14 Werewolf vote | 2/3 | 3/3 | — |
| s05 Coaching | 0/3 | 1/3 | Partial. Pantomime is the most stubborn class. |
| s01 Trivia | 3/3 board, never a poll | 3/3 board, a poll only occasionally | Not fixed. A quiz question still does not reliably become a ballot. |
| s10 立字为证 | 3/3 | 3/3 | Unchanged. |
| s18 control | 0/3 | 0/3, and zero escalations | The regression that must not break, holds. The gate declined all twelve turns. |
tool_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.| # | Item | Why it is next |
|---|---|---|
| 1 | The persona speaks its own sealed content | The 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. |
| 2 | A 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. |
| 3 | Pantomime (s05: 0/3 → 1/3) | The most stubborn class. Improved, not closed. |
| 4 | Latency | The 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. |
| 5 | The flag is still off | Everything above is behind MAD_TURN_SPLIT=1. Production is unchanged until the owner flips it. |
tool_choice cannot be forced with reasoning on, so some turns will always answer in prose. The XML path is the floor, not a legacy.python lib/smoketest.py after every backend step; only green work is pushed.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.