Inspiration One of our grandmothers lives in the US and reads only Mongolian. Every day her phone fills with English: delivery alerts, bank notices, pharmacy texts, and messages from customers in her delivery job. Some of them are scams built to look exactly like the real thing. She has two options today. She can paste the text into a translator, which will faithfully translate a scam and never warn her. Or she can wait for a grandchild to call back. We wanted a third option: a helper that reads the message for her and, when it is not sure, says so and brings in the family instead of guessing. That made the track's question personal. When the AI agents helping her disagree, who should win? Our answer: nobody guesses. The agents argue it out, and if the stakes are high or they still disagree, a human in the family decides. What it does Ger (Mongolian for "home") is a chat app that works like texting a helpful family member. It has three tabs: • Check: she forwards any English message. Ger answers with a clear verdict (safe, ask family, or danger), what to do, and the message in Mongolian. • Reply: she writes in Mongolian; Ger turns it into English and double-checks it before she sends it to a customer. • Family: an alert feed for the family. Only cases where Ger is unsure land here (the agents could not agree, a safety agent was down, or the translation is doubtful), with a diagram of how the agents decided. Clear scams are handled without bothering the family. Behind each answer, four agents work on the message, and three of them form a safety council that negotiates the verdict with no supervisor deciding: • Translator: English to simple Mongolian and back. • Translation checker: translates the result back on its own and compares, so a changed meaning or a lost link, number or code is caught. • Scam checker: fixed rules (fake company links, the grandparent scam) plus its own AI opinion. • Advisor: explains the message and suggests what to do, without seeing the scam verdict, so the two can genuinely disagree. Example: for a fake USPS text, the advisor first says "update your address at the link" while the scam checker says DANGER. In the second lap the advisor reads the scam checker's reason, changes its mind ("the link is not an official USPS domain"), and the council reaches DANGER by consensus. Grandma sees: do not click, do not pay, do not reply. If an agent is down, the agent holding the ballot notices, skips it, and the rest decide. Ger never answers "safe" without its safety checks: if the scam checker is unreachable, the council cannot settle on SAFE and the family is asked instead. How we built it Ger is built on Cisco's AGNTCY stack, on top of the Lungo reference app, but with all-new agents and behavior. Every agent is its own container that speaks A2A and is reachable over SLIM. A FastAPI supervisor serves the app and starts each check; it runs the first two rounds in parallel (translate, scam check and advise, then the translation check) and then hands the case to the council. The council protocol (agents/helper/council.py):
- A ballot travels around a ring of three agents, agent to agent, over SLIM. The supervisor only starts it and reads the result.
- In lap 1 each agent states a position, SAFE, ASK_FAMILY or DANGER, with a reason.
- From lap 2, an agent that disagrees with someone re-reads the others' reasons with its own LLM and keeps or changes its position.
- Positions backed by hard evidence are "firm" and cannot be argued away: the scam checker's rules found a scam, or the translation changed the meaning.
- The council ends on consensus, or after three laps by a rule every agent applies: majority, with firm red lines winning over it.
- Before passing the ballot, an agent pings the next one; a peer that does not answer is skipped and recorded. With fewer than two agents left, the answer is ASK_FAMILY. Baseline. The supervisor's older fixed rules still run on every message and are returned next to the council's answer, so the two can be compared on the same input. Observability. Each message is one OpenTelemetry trace and session: a parent span with the message and verdict, and one span per agent holding what it was asked and what it answered. Traces go through the OTel collector into ClickHouse, and a custom Grafana dashboard shows each agent's answer and the full trace waterfall over SLIM. Models and tools. Agents call Groq through LiteLLM (gpt-oss-120b for translation, gpt-oss-20b for the scam checker and advisor, which also spreads the free-tier rate limit). The front end is a single HTML page with a Messenger-style chat and an SVG diagram of each decision. A family member who reads Mongolian reviewed the fixed Mongolian warnings and translation examples. We used Claude Code as a coding assistant throughout; the product decisions, agent rules, Mongolian review and testing with real messages were ours. Challenges we ran into • The translator refused to translate scams. Given a fake "grandkid in jail" text, it answered "I'm sorry, I can't help with that", which would have left grandma with an English refusal. The translation checker caught it ("completely different content"), which was the system working as intended. We then told the translator its job is to translate faithfully because another agent judges scams. • Refusals were cached. The model also refused harmless texts at random, and our answer cache remembered the refusal, so the same message failed every time. The translator now spots a refusal (no Mongolian letters), throws it away and retries. • A wrong translation could be outvoted. In an early council run, two agents voted SAFE on a friendly text while the translation checker warned the Mongolian was wrong. Majority won and she would have read a broken translation. We made a changed meaning a firm red line. • False alarms. At first the translation checker flagged tone and wording, and even misread "эмээ" (grandma) as "Mom", so family got alerts for harmless texts. We added severity grading (minor vs. major) and a small family-word glossary. • A stopped agent hangs forever over SLIM. We added our own deadlines, and the council pings a peer before handing it the ballot. • SLIM group channels re-broadcast every reply. With three agents each answering every message, the conversation would multiply out of control and burn the rate limit, so the council passes one ballot around a ring instead. • Free-tier limits. Groq allows 30 requests per minute per model and each check needs several calls. We split agents across two models, added retries with backoff and cached repeat questions. • An 8 GB laptop. Docker filled the disk twice; we pruned images and build cache to keep going. Accomplishments that we're proud of • Real disagreements, resolved by the agents. On the fake USPS and grandparent-scam texts the advisor started at SAFE and changed its mind after reading the scam checker's reasons. Harmless texts (a pharmacy pickup, a check-in from family, a customer's delivery note) reach SAFE by consensus in the first lap, in about 3 seconds. • Failure handling that never fails open. In testing we stopped the advisor container: the scam checker found it unreachable, skipped it, and the remaining two still reached DANGER on a fake FedEx text. A missing safety check can never produce "safe". • Council vs. baseline. On our test messages the council's final verdicts matched the fixed-rules baseline and were never less cautious, while adding what the baseline cannot: each agent's reasoning, the moment it changed its mind, and no single component in charge. • Agents catching agents. The translation checker caught the translator refusing a scam and, in another run, a link rewritten with an extra letter. • Built for one real person. A native reader reviewed the Mongolian, and the app speaks to her the way a grandchild would. What we learned • Agent-to-agent messaging does not make answers correct. What it gives you is a second opinion, and a way to notice when opinions differ. The value is in what you do with that difference. • Majority vote is not enough. A safety system needs some positions that cannot be outvoted: a confirmed scam, or a translation she cannot trust. • Fail closed. When an agent is down or slow, the honest answer is "ask family", never "safe". • Small details carry the product. A refusal in the cache, a look-alike hyphen in a link, or "grandma" read as "Mom" each broke the experience until we found them in traces and logs. What's next for Ger • Contacts. A login exists today; next is a contacts list, so "it's me on a new number" from an unknown number is flagged with certainty instead of by wording. • Real phone integration. Read notifications and emails directly instead of copy and paste. • More native-speaker review of every fixed Mongolian sentence, and more approved translation examples. • Voice. Many elderly users would rather listen than read. • More languages and families, since the same problem exists for every grandparent who doesn't read the language of their phone. • A health red line. Questions about food or medicine always go to family or a doctor, never to the AI.
Built With
- a2a
- agntcy
- clickhouse
- docker
- fastapi
- gpt-oss
- grafana
- groq
- html
- javascript
- litellm
- opentelemetry
- python
- slim
Log in or sign up for Devpost to join the conversation.