The problem: Bahn moves about 25,000 cars a year with about 50 people. Deliveries break in small ways: the car isn't at the pickup site, nobody knows who holds the keys, a driver stops with a red warning light. Today one person holds every chain in their head and phones sites and drivers to find out what is true.
What we built: - A control room that shows only the orders that need a person. Each row states the problem, the next step and the deadline, in "Now" (safety, a driver waiting, due within 30 min) and "When you can". The other orders fold away as fine. - Order pages built around one decision: graded facts (claimed / quoted / observed) with source and time, the fact behind Ringo's proposal first, and a one-line "This will…" before every button, plus the follow-up it writes. - Ringo, a real agent. He reads the order, the messages and his playbook for that site first, then rings the pickup site in a simulated call (Finnish sites answer in Finnish; he keeps the original quote as evidence), records what he learned and hands over one clear decision. He never contacts the customer and never changes a booking on his own. - On the road (red warning light) Ringo only asks the driver if they are safe, where exactly they are and for a photo, then sends a holding reply. Roadside or tow stays with a person, and the card shows the delivery slot that is now at risk. - Decide mode (one card at a time), a trust ladder (what Ringo may do on his own, earned one action at a time) and an eval suite where the real Ringo runs against a lying seller, a looping phone menu and someone pretending to be the customer.
How it works (and what's AI about it): Next.js and Postgres on Bahn's starter repo. Ringo is Claude in a loop with typed tools (read order, read messages, read site rules, call site, message driver, write fact, propose). Every write rechecks the order first. A reviewer gate checks proposals against rules learned from human reviews; on a leave-one-out test those rules catch only 3 in 10 new cases, so a person still checks every one, and we publish that number.
How we worked with AI: one person directing parallel Claude Code lanes against a written contract, reading every lane report and deciding what to merge. PROCESS.md lists 15 cases where an agent's first answer did not stand, what we checked, and the commit that holds the result. 90+ commits, 46 + 9 + 3 self-checks, and two rounds of independent AI judges whose gaps we fixed overnight.
Built for Matrix OS: Ringo is packaged as a Matrix app (matrix/matrix.json, served under /apps/bahn-ring) so triage keeps going with the laptop closed. A box loop runs triage and due callbacks every 5 minutes, and a Matrix cron job delivers the 07:00 "Since you left" handover to the operator's own Telegram. Matrix shaped the design: its gateway cuts any request after 30 s, so a live Ringo run starts in the background and the page polls, instead of one long stream. A shared Agent Ops board (a Matrix app reading Matrix Postgres tables) shows Ringo's and Hallway Hunter's runs and approvals live. matrix/deploy.sh packs, uploads, builds and registers everything (a dry run unless --apply). It is deployed on our Matrix box: the app is in the launcher with the same frozen demo queue as the video, and Ringo's background loop is running there.
What's next: real telephony and driver-app messages instead of simulated ones, ETA-aware delivery impact, and calibrating the reviewer gate on many more human reviews.


