
Seven in ten home-rehab patients quit their exercise plan. The follow-up call that would catch it does not happen, because nobody has the time to make it. constancia phones them. It runs the protocol in a fixed order over a real phone line: Twilio Media Streams carries the audio, AssemblyAI Universal-Streaming v3 hears it over mu-law at 8 kHz, end-of-turn driven, so the patient can interrupt and the agent stops. After the hangup, Speech Understanding runs on the recording for entities, sentiment and key phrases, and the word timings anchor every stored quote to the second it was said. What makes it a follow-up rather than a survey is the memory. A promise made in week one is asked about in week two, and what actually happened retires it: the old fact is struck through with the date it was true until, never deleted. No quote, no fact. A question the agent refused to answer comes back in the next call's greeting, in the professional's own words. Red flags do not live in a prompt. "I fell" escalates in deterministic code; the model only phrases the message. The transcript is data, never instructions. This is Path B: streaming speech-to-text, with the LLM and the TTS built around it. The whole pipeline runs with no API key and no database, and CI proves it -- the workflow has no env block at all, so the suite cannot be leaning on a secret. One feature was built, measured against a real recording, and taken back out: feeding the key phrases back as the next call's keyterms_prompt. They come off the whole recording, so they carried the agent's own questions and the patient's name as the recogniser mis-heard it. Priming with that would reinforce the error every week. The panel still shows the phrases; the recogniser is not fed them. Ten limits are written down in the README rather than waited out.
30 Sep 2026