DEV Community

ilya mozerov
ilya mozerov

Posted on

A Failed Voice Path Should Change the Next Call

Our local voice reflex had a sensible routing rule: when the workstation was occupied and the
event was proven, deliver it locally. Then the local TTS engine failed.

The next proven event met the same predicates and tried the same broken path again. The rule was
right for the current state and still wrong for the next decision, because it had forgotten what
had just happened.

This is a small failure, but it is a useful boundary for systems that claim to adapt: a detector
that remembers nothing cannot change its behaviour because of experience.

The measured change

On September 9, 2026, I reviewed and tested a change to scripts/mesh-say. Before it landed,
--deliver routed from instantaneous OCCUPIED × PROVEN state. A failed local TTS attempt did not
become input to the following delivery.

The new path records a real local TTS failure in $HOME/.mesh/mesh-say-coupling (or the path in
MESH_SAY_COUPLING_FILE). For the next 300 seconds, a later OCCUPIED + PROVEN event is sent
through mesh-voice-tx instead, and the output identifies the decision as
coupling=quarantined.

That is not a permanent preference and it is not a global routing change. It is a bounded memory
of one failed interaction with one organ.

The release condition matters

The marker is cleared only after a later local delivery is proven. Expired or unreadable state is
treated as no memory. Ambient non---deliver speech is unchanged.

Those details keep the adaptation from becoming a second outage. A stale marker must not quarantine
local voice forever, and a failed read of the marker must not manufacture a confident routing
decision.

Why I call this structural coupling

The useful idea from the autopoiesis literature is not the label. It is the mechanism: a system's
history can reorganize how later perturbations are metabolized. Wong et al. describe learning as a
history-dependent change that modifies responses to future perturbations (A Biological Learning
Theory
). Heylighen and Busseniers
connect resilience to compensation selected for the particular perturbation
(Modeling autopoiesis and cognition with reaction networks).

The workstation implementation is much smaller than those theories, but the operational test is
clear: cause a local TTS failure, observe the next proven event take the alternate route, then
observe a proven local delivery release the quarantine.

Verification

The case and its evidence are recorded in
docs/autopoiesis-literature-mesh-say-20260909.md.
The measured checks were:

bash -n scripts/mesh-say
scripts/mesh-say --test
smoke-test: ok (... history-dependent coupling quarantine/release ...)
Enter fullscreen mode Exit fullscreen mode

The point is modest: if a failed attempt should affect the next attempt, write that history at the
source and make both the quarantine and the release observable. Otherwise the system is not
adapting; it is merely repeating a correct rule against a changed world.

Top comments (2)

Collapse
 
topstar_ai profile image
Luis Cruz

The adaptation strategy you've implemented by tracking local TTS failures and adjusting future routing decisions is a smart way to introduce resilience into the system. This bounded memory approach effectively balances the need for adaptability with the risk of persistent failure states, which is often overlooked in similar systems. Have you considered implementing a more granular logging system that could provide insights into multiple failure modes over time? If you’re looking for help with this part of the project, I’d be happy to discuss a paid collaboration.

Collapse
 
ilya_mozerov_867dbdd91feb profile image
ilya mozerov

Yes — that is the next boundary I want to measure. The current marker proves a local TTS failure and quarantines the next proven event for 300 seconds; the refinement is to carry failure class and confidence, so an explicit engine error fails over while an uncertain timeout gets one retry. I would keep that policy bounded and verify both branches with separate artifacts.