transfer_message (currently unused). One canonical content-free phrase, spoken deterministically by the platform → collisions become structurally impossible, the experience is uniform, and "go silent later" is clearing one config field — not a prompt rewrite.Caller (a vendor rep) said "Leave a message." Triage improvised its handoff line as a question — "Sure — what's the message you'd like to leave?" — then transferred to the Unknown-Caller specialist, which opened by asking the same question: "Sure — what's the message you'd like to leave for the team?" The caller heard the same ask twice, 3 seconds apart.
The prescribed handoff line for that route was the content-free "Let me look into that for you." The failure was the LLM composing a bridge that did the specialist's job — a prompt rule was violated, because a prompt rule is the only thing enforcing it.
transfer_to_agent tool fire, and the receiving specialist's first spoken turn — all with per-turn call timestamps (1s resolution) plus LLM time-to-first-byte metrics.Time from the transfer tool firing to the specialist's first spoken word, across all 162 transfers:
The ~8s dead-air figure that motivated the 2026-07-20 silent→spoken flip does not reflect current platform behavior — 89% of transfers land within 3s.
Correlation between bridge-line length and specialist arrival time: r = −0.19 (≈ none). The specialist does not wait for the bridge audio to finish — the transfer spins up while the bridge plays. Median bridge-start → specialist-speech is 2–3s, which is roughly the bridge's own audio duration: the bridge ends and the specialist's voice begins. The bridge adds zero latency; it exists purely to fill the gap.
If triage said nothing, the caller's wait after they stop talking = triage LLM deliberation (median 0.98s, p90 2.42s, n=165) + spin-up to specialist speech (median 2s, p90 4s):
| Median | p90 | |
|---|---|---|
| Dead air per transfer, silent mode (est.) | ~3.0s | ~5–6s |
The 6 transfers in the sample that happened to have no bridge line confirm the shape: 2–5s of silence from tool-fire to specialist speech. On a phone call, silence beyond ~2s reliably draws "hello…?" — at p90 the caller is 5+ seconds into dead air on a call they just started.
Of 162 transfers, exactly 1 bridge line leaked task content (a question) — the flagged call. The other 161 bridges were content-free and flowed cleanly into the specialist. The failure mode isn't "the bridge exists"; it's "the LLM composes the bridge, and one time in ~150 it freelances."
A and B/C have the same total time-to-specialist (F2: the bridge is concurrent). The only difference is whether the gap is silence or voice — and who authors the voice.
| Option | Bug surface | Consistency | Future-proof | Latency felt |
|---|---|---|---|---|
| A · Fully silent | none nothing to improvise | uniform | clean | 3s med / 6s p90 dead air, every transfer |
| B · LLM bridge + prompt hardening (status quo) | prompt-enforced improvisation is the observed failure | varies per call LLM wording drifts | prompt rewrite to ever change behavior | zero bridge masks the gap |
| C · Per-destination silent/spoken | case matrix grows with every specialist | two experiences | rewrite per change | zero |
D · Platform-fixed transfer_message ★ |
structural zero LLM never authors the bridge | identical phrase, every call | one config field silent = set it empty | zero same concurrency as today |
Option D is exactly the "no case-based decisions" property you asked for: one rule, applied by the platform, not by a model following instructions. ElevenLabs' transfer_to_agent config already carries a per-transfer transfer_message field — we have it set to null on all 7 routes today, which is why the LLM is composing bridges at all.
transfer_message to one canonical content-free phrase on all 7 transfer rules in the triage agent config (source-of-truth: triage.config.json + the sync-specialist-transfers sync). Phrase candidates: "One moment." / "Sure — one second." — short, warm, never a question, never task content.transfer_to_agent (pre_tool_speech: force → none) so the model can't ALSO speak — the fixed line replaces, not supplements, the improvised one.transfer_message non-null + pre_tool_speech: none on every route, so a config regression fails CI.When transfer spin-up gets fast enough that silence is imperceptible, going silent is clearing one config field — no prompt, no logic, no cases. Concrete trigger: when p90 (tool-fire → specialist speech) < 1.5s over a trailing-30-day window (today: 4s), set transfer_message empty and we're silent, uniformly. This analysis script becomes the recurring measurement.
transfer_to_agent handoffs · timestamps at 1s resolution from per-turn transcript metadata; LLM TTFB from conversation_turn_metrics. Incident call: conv_4801kyms7z0fert96tzwspek99aa. Per-destination medians (tool-fire→speech): leasing n=113 · 2s, unknown_caller n=16 · 2s, maintenance_handyman n=15 · 2s, maintenance_tenant n=11 · 2s, turnover_intake n=5 · 3s, renewal_inbound n=1 · 2s, lease_and_billing n=1 · 1s.