1.5.4 — a question that never comes back now says so
A question that never comes back now comes back and says so.
The bug looked like two messages where there should have been one:
MYNAH >> On it — give me a couple of minutes and I'll come back when it's all done.
MYNAH >> Searching for that now.
The real one was underneath. No answer ever arrived. Two more messages sent a minute later were received and never answered either, and the appliance stayed like that — alive, using no processor at all, having stopped answering Signal entirely without a word in any log to say so. Turns are handled one at a time, so a single turn that never finishes takes the whole thread with it.
Three waits in this app had no end. A network call has a timeout, a search has a timeout, and the agent loop has its own five-minute brake — but that brake is checked between steps and never during one, the memory node is read down a pipe with no deadline of any kind, and a provider asking to be retried in an hour was simply obeyed. None of the three writes anything down while it waits, which is why fourteen minutes of silence left no trace to read afterwards.
So a turn is now bounded from outside, a minute past the loop's own brake — high enough that it only ever fires when that brake has already failed, low enough that nothing is ever silent for more than about six minutes. When it fires you are told, in a sentence that takes back the promise the first message made and says what to do instead, and the queue is released so the next thing you send is answered. It is written to the log as an error, because it means some wait still has no end of its own and that is where it will be found. A provider's retry request is now capped at thirty seconds.
This does not fix any one hang. It makes every hang finite, which is the property that was missing.
And the two messages. All the deduplication here works by comparing wording, which is right for catching a stutter — "having a look online" then "Looking online" — and useless for two sentences that say different things. Nothing counted how many times one turn may speak. Now it may speak once.
The update banner is green, using the same translucent tint the app already uses for inline notes.
1730 tests, 0 failures. Notarized and stapled.