Connect by JBRH Open Connect

Abandoned calls

An abandoned call is one where the caller has gone and the line is still open. The hang-up watcher ends it without saying anything — the default model has no way to speak a closing line in its own voice — and the record keeps three things apart: that the call ended, who ended it, and whether it was ever a conversation at all.

Status
Available What this means
Audience
both
Channels
phone
In the app
#/calls
Last verified
Product version
6.3.2

Three endings that look identical on a bill#

A carrier's call log will show a completed call of a certain length for all three of these. Connect refuses to file them together, because the operational response to each is different.

Abandonment
The call connected, the caller stopped participating, and the line stayed open until a timer closed it.
no_answer
It rang and nobody picked up. There was never a conversation to abandon.
not_reached
It never rang at all — the dial, the dispatch or the worker failed. This is a fault on Connect's side of the line, and reads as one.

The last two have their own word on the record, NOT_A_CONVERSATION, and _capture_lead creates no lead from either. A lead extracted from a call that never happened is worse than no lead, because somebody will ring it back.

Ending it without a word#

The instinct is to say something before hanging up — "I'll let you go, do call back". On the default model that line would be synthesised by the text-to-speech API, which has the live voice's name and not its sound, so it would arrive in a different voice. Given the choice between a stranger's voice saying goodbye and no goodbye at all, Connect takes the silence and puts the ending on the record instead.

hangup_by names one of six actors: caller, model, owner, engine, carrier, agent. Before that attribution existed every ending that was not obviously the caller's read "agent", which made every engine-side fault look like the voice deciding to leave.

The call that would not end#

The other half of abandonment is a call nobody closes. sweep_stale holds every provider to the configured cap and charges what it closes. It runs from the engine tick as well as from the worker heartbeat, and that second trigger was added for a specific reason: a browser call has no worker behind it, and one such call sat "active" for 24.78 hours.

There is also a product ceiling above any of this. A call is no longer cut at the model's session limit — session resumption plus a sliding-window context compression let the plugin reconnect on the server's go_away carrying the conversation — so the only hard stop is MAX_CALL_SECONDS, 30 minutes.

Closed bySituationhangup_by
The callerThey hung upcaller
The hang-up watcherTrue abandonment: nobody is thereengine
sweep_staleA call left open past the provider capengine
The supervisor panelA colleague ended a live callowner
The engine, at the greetingThe opening line could not be spokenengine

What survives an abandoned call#

The row closes, the cost is booked, and the digest runs in the background — finish(defer=True) marks facts.digest = pending and answers immediately, because waiting on a summary and a review inside one 20-second request used to log "end not recorded" for an ending the engine had recorded perfectly well.

If the caller said almost nothing, the summariser is not asked at all: under two caller lines and under five caller words, no summary is generated. That threshold exists because ten one-turn rows once carried an invented afternoon at a sales desk.

Questions#

How do I tell an abandoned call from a technical failure?

Read the outcome and hangup_by together rather than the duration. not_reached means the call never rang and is a fault; a silent_failure fact means the caller heard nothing; an abandonment shows a call that connected, exchanged something, and then went quiet until a timer closed it.

Does an abandoned call create a follow-up?

Only if something in the conversation warranted one before the caller left. There is no automatic call-back for abandonment, and a promise with nothing behind it is itself a finding — promised_unbooked. Follow-ups from a call covers what does get scheduled.

Is the caller charged, or are we?

Connect books the cost of the call it held, from its own duration when no tokens were reported. Nothing about abandonment makes a call free — the session was open and the provider billed for it, which is exactly why sweep_stale closing a 24-hour ghost call matters financially and not only tidily.