DentSignal repair · Async reliability

One turn had two owners—and neither knew when sound was real.

The repair made response ownership explicit, tied cancellation to playable output, and kept silence bounded with fallback.

Status
Historical change record
Area
Async state and streaming events
Data
Synthetic fixtures
Async response workflow showing one selected response owner, a playable-output gate, and either normal completion or bounded fallback
Control traffic does not count as a spoken answer. Only playable output closes the turn.

What broke

Two paths could answer the same turn.

Control activity could also be mistaken for audible output, cancelling the only recovery path before a caller could hear anything.

What changed

One path owns the response.

Queued speculative work is cleared, and only playable output cancels the fallback. Silence reaches a bounded recovery path after 2.5 seconds.

What it fixed

Duplicate answers and unbounded silence became explicit states.

The turn has one producer, one real completion signal, and one time-bounded recovery rule.

Before / after

Cancel fallback only after playable audio.

Broken
primary.respond()
secondary.respond()
on_any_activity(cancel_fallback)
Fixed
response_owner = primary
on_playable_output(cancel_fallback)
await fallback_after(seconds=2.5)

Evidence

Ownership, cancellation, and fallback were exercised as separate failure paths.

The historical record shows one response owner per turn, cancellation tied to playable output rather than generic activity, and bounded fallback when sound never arrives. This is engineering evidence from that revision, not a current production-health claim.

Stack and capabilities

Deterministic control over asynchronous voice work.

Next

See another repair or bring an async race.

Back to projectsContact Niyam