CALL-E: NO ANSWER outcome misleads when carrier rejects before reaching handset
Summary
When an outbound call fails immediately, the API/CLI returns NO ANSWER
with hangup_type: ByCallee and duration_seconds: 0. This is misleading
because the call never reached the handset — it got rejected before ringing.
Reproduction
Three identical attempts (same plan, same number, same region, 30s apart):
Environment: Windows 11, Node v22.23.1, calle CLI 0.5.0, post-provisioning fix (Issue #103).
calle call plan --to-phone "+52••••••9116" --goal "Say: Danny..." --region MX
calle call run --plan-id <plan_id> --confirm-token <token>
calle call status --run-id <run_id>
Results observed
| Attempt |
run_id |
Status |
Hangup Type |
Duration |
Callee sees ring? |
| 1 |
LYI-...TsLA |
NO ANSWER |
ByCallee |
0s |
NO |
| 2 |
1BiD...Hw |
NO ANSWER |
ByCallee |
0s |
NO |
| 3 |
nVI5...EvQ |
NO ANSWER |
ByCallee |
0s |
NO |
Server-side timeline per run:
[stage_start] run_call started
[external_call] botlab create bot
[external_call] calling resolve robot id
[external_call] calling create task
[result] calling task created
[progress] calling task status=pending
[progress] calling task status=calling
[callee_realtime] Call ended; syncing final Calling result
[progress] calling task status=NO ANSWER
[error] calling task completed with status=NO ANSWER
call_start_time == call_end_time == the same second. duration_seconds: 0.
Request
When a call ends in under 0 seconds with hangup_type: ByCallee before the
device ever rings, we would like:
- A distinct outcome or diagnostic value (e.g.,
NO_ANSWER_NO_RING,
CARRIER_REJECTED, UNSUPPORTED_DESTINATION, REGION_NOT_SUPPORTED).
- If this is simply the carrier's "no coverage in that region" behavior for a
specific destination, the CLI/docs should say so instead of conflating it
with "user didn't pick up".
Current behavior
NO ANSWER means "the carrier did not connect to a handset" and conflates:
- callee actually unanswered (normal failure)
- callee-side screen/visual voicemail (still an answer to the carrier)
- carrier rejected the number/regional drop (no ring, no opportunity to answer)
This is particularly deceptive in an SDK: a caller calling e.g. wait_for_result
sees NO ANSWER and assumes the remote device was reached, but @call-e/core
knows the call instantly dropped (ByCallee, 0s).
Behavior expected
A truthful outcome that lets callers distinguish these cases so retry logic and
analytics are correct.
Where the seam is (not a bug, but worth noting)
Not a blocker (we understand this can be implementation-carrier-dependent), but
a useful second-order observation added to the known "[not-call]" patterns:
- Attempt sequence: plan -> confirm_token -> run_call -> get_call_run
- Outcome signal:
NO ANSWER with ByCallee + 0s duration
- Missing signal: a "reachability" classification (ringing vs rejected)
Notes
CALL-E: NO ANSWER outcome misleads when carrier rejects before reaching handset
Summary
When an outbound call fails immediately, the API/CLI returns
NO ANSWERwith
hangup_type: ByCalleeandduration_seconds: 0. This is misleadingbecause the call never reached the handset — it got rejected before ringing.
Reproduction
Three identical attempts (same plan, same number, same region, 30s apart):
Environment: Windows 11, Node v22.23.1,
calleCLI 0.5.0, post-provisioning fix (Issue #103).Results observed
LYI-...TsLA1BiD...HwnVI5...EvQServer-side timeline per run:
call_start_time==call_end_time== the same second.duration_seconds: 0.Request
When a call ends in under 0 seconds with
hangup_type: ByCalleebefore thedevice ever rings, we would like:
NO_ANSWER_NO_RING,CARRIER_REJECTED,UNSUPPORTED_DESTINATION,REGION_NOT_SUPPORTED).specific destination, the CLI/docs should say so instead of conflating it
with "user didn't pick up".
Current behavior
NO ANSWER means "the carrier did not connect to a handset" and conflates:
This is particularly deceptive in an SDK: a caller calling e.g.
wait_for_resultsees
NO ANSWERand assumes the remote device was reached, but @call-e/coreknows the call instantly dropped (ByCallee, 0s).
Behavior expected
A truthful outcome that lets callers distinguish these cases so retry logic and
analytics are correct.
Where the seam is (not a bug, but worth noting)
Not a blocker (we understand this can be implementation-carrier-dependent), but
a useful second-order observation added to the known "[not-call]" patterns:
NO ANSWERwithByCallee+0sdurationNotes
client-side wrapper that surfaces this distinction for local usage.