
Problem. A train's air compressor fails slowly: a leak grows for a day or two before it trips. A dashboard shows the signs; it does not say whether to act now, what the manual says to do, or give a work order to sign. What Wrench does. 1. Alert. A 1D convolutional autoencoder trained only on healthy data scores every 10 minutes. Two thresholds give ok / watch / act, with the driving sensors. No language model decides the alarm. 2. Answer with checked quotes. From the service manual and past records (BM25). Each claim's quote is checked word for word against a document retrieved for that question; claims that fail are dropped. Out-of-scope questions are refused before any model call. 3. Work order. From an act alert, Wrench finds the fault section for the driving sensors and the procedure it points to, and drafts the steps with a priority. A person approves it. Results (MetroPT-3, a real metro air unit, 2020, split by time): - Two of the three evaluation failures were flagged early: 47.0 h and 35.2 h before the recorded start. The third and the validation failure were flagged within about an hour of starting. - False act alerts per normal week: 0.36 on evaluation, 0.71 on validation. - Retrieval: right section in the top 3 for 20/20 test questions, first for 12/20. AMD. Answers and work-order steps come from Gemma-4-31B-IT on AMD Token Factory (AMD's hosted API on AMD GPUs). If the key is rate-limited, recorded answers from the same model are replayed, marked RECORDED. The autoencoder was trained on CPU (69.1 s, 6 epochs); no ROCm run yet. Who pays. Rail maintenance teams. Rail asset management is estimated at USD 12.79 billion in 2025 (MarketsandMarkets). Proposed, untested pricing: a subscription per compressor after a free one-depot pilot. Limitations. Four failures, all air leaks, on one compressor. The evaluation period was seen once before tuning, so it is not a clean hold-out. The manual and records are fictional, by the author of the test questions.
18 Oct 2026

Streaming speech recognition is good, not perfect. "Transfer five hundred" and "transfer five thousand" differ by one acoustically close token and a factor of ten. That is why voice agents in banking are still mostly read-only: they will tell you your balance, but they will not move your money. The usual answer is to push accuracy higher. Accuracy is an asymptote: it never reaches a point where executing an irreversible action on a guess is acceptable. Voice Action Gate changes what the failure does, not how often it happens. The two directions are not symmetric — a wrong block costs the user a repeated sentence, a wrong pass moves real money — so the system is not built symmetric. The mechanism is a capability, not a check. Code that performs an irreversible action accepts only an Execute credential, and that credential has exactly one construction site: the gate. It is minted only when every argument of the proposed action is grounded in a witness drawn from AssemblyAI's word-level transcript. "I could not tell" is a refusal, never a pass: in this shape there is no expression you could write that would turn it into one. Two details carry the weight. First, the witness set is generated from the transcript alone, before the proposal is visible — otherwise a model that invents a number gets to pick the search query, and an unrelated number becomes its evidence. Second, the normalizer that turns "five hundred" into 500 is deliberately a partial function: it may answer UNDECODABLE, and UNDECODABLE is not a pass. A normalizer with a fallback return value quietly converts "I cannot read this" into "I believe it equals something" — the direction that costs money. Stack: AssemblyAI streaming speech-to-text — audio goes browser-to-AssemblyAI directly, so the Worker only ever sees words. A dependency-free Python gate, pinned by a mutation arm that turns red if that separation is undone. Cloudflare Workers, with the daily token cap in a Durable Object, not KV.
30 Sep 2026