| # WhenToSpeak Controller Notes |
|
|
| The controller is training-free. It consumes signals from a `Brain` interface and |
| never loads or calls a model itself. The live brain must provide, for each |
| incremental transcript update and each agent context, mean token surprise, a |
| last-layer hidden vector, readiness, and turn-end probability. |
|
|
| ## Signals |
|
|
| - `surprise`: mean per-token negative log-likelihood of the newly added user |
| tokens, teacher-forced. |
| - `hidden`: mean last-layer hidden-state vector for the newly added tokens. |
| - `readiness`: speculative reply confidence for this agent. Draft about eight |
| tokens and compute `readiness = 1 / (1 + mean_token_entropy)`. |
| - `p_end`: heuristic probability that the human turn is complete. The live loop |
| should combine trailing silence, sentence-final punctuation, and high EOS |
| probability. |
|
|
| ## Urge |
|
|
| Each agent keeps an online running mean/std of surprise and uses the current |
| z-score. Hidden-state cosine deltas feed Adams-MacKay BOCPD; a collapse in MAP |
| run-length becomes the change-point score. |
|
|
| ```text |
| U_t = w_surprise*z(surprise) |
| + w_change*changepoint_score |
| + w_readiness*readiness |
| + w_end*p_end |
| + w_barge*max(z(surprise), 0)*readiness*(1 - p_end) |
| ``` |
|
|
| `tau` is the single global conversational-aggressiveness knob. Lower `tau` makes |
| the panel take the floor sooner; higher `tau` makes it wait. |
|
|
| ## Arbitration |
|
|
| Each tick is deterministic. Agents first classify local intent as `SILENT`, |
| `BACKCHANNEL`, `TAKE_FLOOR`, or `INTERRUPT`. Only the highest-urge agent above |
| `tau` may take the floor or interrupt. Non-winning agents may still backchannel |
| if their urge clears the derived backchannel threshold. A short refractory period |
| prevents repeated firing on adjacent ASR updates. |
|
|