# Silence and check-ins

Connect keeps its own view of whether the caller is speaking rather than trusting the model's, and it will not say anything into a line while the caller is talking or was heard within the last 2.5 seconds. On the default model no check-in and no goodbye is spoken at all: the silence is recorded, and if the call has genuinely been abandoned the hang-up watcher ends it without a word.

- **Status:** Available
- **Audience:** both
- **Channels:** phone
- **In the app:** #/calls
- **Last verified:** 2026-09-10
- **Canonical:** https://connectbyjbrh.com/docs/phone/silence/

## Presence is kept by the host, on purpose

`conversation.Presence` exists because the SDK's user state on the model path is the model's own detection, and it misses speech starts. A system that speaks whenever it believes the line is quiet, using a signal that misses speech starts, will talk over people. So the host builds its own picture from every transcript chunk it sees and treats that as the truth about who is talking.

The rule that comes out of it is short: **nothing is said into the line while the caller is speaking, or was heard within 2.5 seconds.** That applies to anything the host might want to insert, not only replies — a check-in, an acknowledgement, a closing line. The most common way an automated voice ruins a call is by starting to speak at the exact moment the person does.

## Why the default model says nothing at all

There is a specific reason no check-in is spoken on Gemini 3.1 Flash Live, and it is worth stating plainly because it looks like a missing feature. The live model refuses `say()`, so any host-spoken line has to be synthesised by the text-to-speech API instead — and the text-to-speech side has the live voice's **name**, not its sound. A check-in would arrive in a noticeably different voice, mid-call, to a caller who has been listening to one person for two minutes.

Rather than do that, Connect records the silence and leaves the line quiet. If the caller is still there they will speak; if they are not, the hang-up watcher deals with it. The greeting is the exception that proves the rule — it is text-to-speech audio too, but it is the first thing on the call, so there is no established voice for it to clash with.

> **Note** This is a model-shaped limit, not a policy anybody prefers. On 2.5 native audio the situation is different in other ways — mid-call notes reach it, and its first token is 1.2–2.2 s against 0.6 s. [What a setting cannot change](/docs/phone/model-limits/) is where these trades are collected.

## Silence that is a fault, and silence that is a person thinking

| What is quiet | What it means | What happens |
|---|---|---|
| The caller, briefly | Somebody is thinking, or reading a number off a screen | Nothing. Turn detection waits; dynamic endpointing exists for this |
| The caller, for a long stretch | Possibly an abandoned call | The silence check and hang-up timers run; true abandonment ends the call |
| Connect, after the caller stopped | The model has not started generating | The response watchdog nudges it after 5.5 s by default |
| The whole call, from the start | The greeting could not be spoken | `engine_error {at: greeting}`, the call is ended by the engine, and the record says so |

The last row is the one that hurt. Five inbound calls on 2026-09-07 sat in silence and were recorded as "the caller hung up before speaking" — a true statement about the audio and a completely false account of what happened. The engine now writes `facts.silent_failure` from that event and `voice.no_conversation` says so, with outcome `not_reached`.

Distinguishing the third row from the second is the whole reason the watchdog threshold sits where it does; [the response watchdog](/docs/phone/response-watchdog/) covers why a lower number made calls slower rather than faster.

## What a reviewer sees afterwards

- *Long gaps* is one of `voice_quality.review`'s deterministic findings, with the setting change that addresses it attached.
- The silence check and hang-up timers are engine knobs in the Voice Lab, so they are session parameters rather than instructions to a model.
- A call with fewer than two caller lines and fewer than five caller words is never sent to the summariser at all — ten one-turn rows once carried an invented afternoon at a sales desk.

That last rule is why a mostly-silent call has a thin record rather than a confident one. A summariser given almost nothing will write something; refusing to ask it is cheaper than correcting it.

## Questions

### Can I make Connect ask "are you still there?" after a pause?

Not on the default model, and the reason is the voice rather than the wording: the line would be spoken by text-to-speech in a voice that does not match the one the caller has been hearing. The silence timers still run and still end a genuinely abandoned call — it just ends quietly.

### Does a long silence still cost money?

The call is open, so the session is open, and a live session is billed for its context on every turn it takes. A silent stretch takes no turns, but the call's own duration is still charged — a call that reports no tokens is charged from its duration at the published per-minute rate, never at zero.

### Why did a call end with no goodbye?

Because on the default model there is no goodbye to say — the same text-to-speech constraint applies to a closing line as to a check-in. The ending is attributed on the record instead: `hangup_by` names the caller, the model, the owner, the engine, the carrier or the agent.

## Related

- [Abandoned calls](https://connectbyjbrh.com/docs/phone/abandonment/)
- [The response watchdog](https://connectbyjbrh.com/docs/phone/response-watchdog/)
- [Turn detection and end of speech](https://connectbyjbrh.com/docs/phone/turn-detection/)
- [Calls that were never a conversation](https://connectbyjbrh.com/docs/phone/not-a-conversation/)
- [When a call is answered in silence](https://connectbyjbrh.com/research/silent-failure/)

## What this page is based on

- Connect phone source pack — `docs-source/sources/PHONE.md` §7, presence and the conversation layer
- Connect phone source pack — `docs-source/sources/PHONE.md` §8 and §9, silent failure and attribution
- Connect capability registry — `docs-source/facts.py` (`conversation_layer`, `MEASURED`)
