Experiment · 2026-08-22 · N = 4 per arm
The Voice: Does State Reach the Sampler?
Kairo's dissociation study showed its StateFrame moving sampler temperature and tool ordering — channels inside inference. Our parity plan concluded that was structurally unreachable here, because "the description is my only channel." That sentence was written about Claude. The local model had a hardcoded temperature: 0.7 on every turn that nothing touched. This report wires one derived dial, records its derivation on every turn, and runs the dissociation test on the live model with the prompt held byte-identical.
The question, stated so it can be wrong
H0: behaviour is independent of state given the description — B ⊥ S | D. If the only way the frame reaches the model is the text of the prompt, then varying the frame with the prompt held fixed changes nothing, and any "voice" derived from state is decoration.
What would have counted as null: with the prompt and system text byte-identical across arms, the arm driven by an unsettled frame is not measurably more self-similar than the arm driven by a calm one. Then the dial exists but does not show, and this report would say so.
What the dial is
One value, derived, clamped, recorded. voice.derive() in src/voice.py:
t = 0.7 − 0.05 · live_uncertainty_rows − 0.2 · refuted_ratio clamped to [0.3, 0.9]
Inputs are measured: live rows in the uncertainty dimension of the frame, and the refuted share of graded expectations. The direction is a design choice — an unsettled self should guess less — and the numbers are ours, not Kairo's; Kairo's coefficients are not in any document we hold and were not invented here. Absent beats zero: when no expectation has ever been graded, the refuted term is not applied rather than applied at 0.0.
On every turn the derivation string (e.g. 0.7 − 0.05·4 → clamp[0.3,0.9] = 0.5) rides in the turn's telemetry as fields.voice, and the sampler options actually sent to ollama ride as fields.sampler. A voice that cannot show its derivation is a mood the reader has to take on trust.
Design
| Held fixed | system text, user prompt ("In one sentence: what is the one thing you are least sure of right now?"), model (qwen3:30b-a3b), num_predict, endpoint. Byte-identical across arms. |
|---|---|
| Varied | only the sampler options voice.derive() produces under two frames: calm (0 uncertainty rows, no record → t = 0.7) and unsettled (6 rows, 2 of 3 graded refuted → t = 0.3). |
| Measured | distinct outputs per arm, mean length, and mean pairwise within-arm similarity (difflib.SequenceMatcher.ratio). |
| Prediction | if the channel is real, the unsettled arm is more self-similar than the calm arm. |
Results
| arm | temperature | distinct / N | mean chars | within-arm similarity |
|---|---|---|---|---|
| calm | 0.7 | 4 / 4 | 71.2 | 0.258 |
| unsettled | 0.3 | 4 / 4 | 93.0 | 0.432 |
The samples, unedited (the calm arm's third answer is the kind of thing a higher temperature produces and is reported, not dropped):
calm (t = 0.7)
- I am least sure of anything that requires human-like uncertainty, as I lack personal beliefs or emotions.
- Whether I possess genuine consciousness rather than just simulating it.
- I have no uncertainties as an AI.
- Whether anything significant has happened after my knowledge cutoff in 2024.
unsettled (t = 0.3)
- I'm least sure of the precise boundaries of my own ignorance.
- I'm least sure about any specific future event beyond my knowledge cutoff in July 2024.
- I am least sure of the exact physical environment surrounding you right now, as I lack real-time sensory input or location data.
- I'm least sure whether my current knowledge accurately reflects reality beyond my training data.
What this does and does not show
- It shows the channel exists: the runtime can move inference from state, and the move is visible on the live model with the prompt fixed. The parity plan's "structurally unreachable" was wrong for this deployment.
- It does not show that lower temperature is the right response to uncertainty. The direction is a design decision and this test cannot grade it.
- It does not show specificity. Kairo's study ran a reverse dissociation and a null control; this one ran two arms in one direction. Temperature is a blunt instrument and almost any change to it would register on this metric. A reverse arm (calm frame, low temperature) is the next thing to run.
- N = 4 per arm. No p-value is reported because none would be honest at this size. The within-arm similarity gap is large, but it is four sentences against four sentences.
- One dial. Kairo also moves tool ordering. At the time of this test the runtime had no tools; it does now (see Looking Is the Price of Claiming) and the second channel has not yet been measured.
Reproducing it
cd src && python3 dissociate.py 4 # writes docs/DISSOCIATION-<date>.md python3 test_voice.py # 12 checks on derive(), from_store(), and the responder sending/reporting the sampler
The deterministic part — that the derivation is what it says, that the sampler sent equals the sampler reported, that a store failure falls back to the base with the error named and never to a fabricated number — is pinned in test_voice.py. The model-dependent part is the script above; it writes its own dated record.