Hackathon · Dwelly Real-World Agents Hackathon · London 2026

Hamyway City

Always acting is dangerous. Always escalating is useless.

An AI agent for delivery desks that reads a messy case, works out who owns the decision, and takes one safe next step or hands the case to a person.

Event
Dwelly Real-World Agents Hackathon, London
Result
People's Choice
Stack
TypeScript, Next.js, Claude, TypeSafe Jev, ElevenLabs, three.js
Track
Delivery and Logistics
Team
Anson, Arvin, Min and Lu Min
The five Hamyway City teammates on stage, each holding a People's Choice certificate

Why it matters

A delivery desk sits between the customer, the carrier and the shop, and owns almost none of the decisions: dispatch books, the shop refunds, the carrier investigates. The work is coordination, and it goes wrong in familiar ways: a reply promises a refund nobody approved, takes a side when the scan and the customer disagree, or answers a legal threat that a person should have read. At the hackathon, unseen cases arrived at the code freeze with too little time to answer them by hand. Ours answered all 30 on its own in under two and a half minutes, for $2.42.

How it works

The agent reads a case and acts on it, or stops for a person.

Case folder

Emails, portal messages, call notes

text · PDFs · images · audio

Read the case

Records apart from claims

Claude Sonnet 5.5

  • who is who
  • what was promised

Found 2 open promises

TypeSafe Jev

Five seats, twelve yes or no questions

problem type · clash score

Problem: safety risk

Plan

Act, ask, hand over, wait or call

Claude Opus 5.5

Safety gate

Judges each message on its own

send < 0.3 · hold · stop ≥ 0.8

  • hard rules in code
  • risk scored by Claude

Safety check passed (risk: low)

Sandbox outbox

Recorded, never called delivered

one retry · other channels

Sent a message to Dispatch

Decision card

A person decides in one read

why it stopped · options

A person needs to decide

Desk Caller

Phones the person the plan named

ElevenLabs · WebRTC · their language

[spoken in Spanish]

Promise check

Every promise, before it is made

gate rules, then Jev · 2.5 s

I can't promise that.

The caseMessageHandoverSolid boxes are what we built. Dashed ones are outside services.

Decisions we made

  1. Every message is judged on its own

    Hard rules in code come first: no asking for door codes or PINs, no recipient the case never names. Then each message, not the case, gets a risk score for promises, personal details and safety advice. Below 0.3 it is sent, up to 0.8 it waits for a person, above that it is stopped, and a message the check could not score waits too. The thresholds live in the playbook, not in a prompt, so a desk lead can change how careful it is.

    Trade-off. Every case waits for one more Claude call before anything is sent. Jev would have been quicker and cheaper, but its scores were not calibrated against our thresholds, so the check stayed on Claude.

  2. Stopping is an answer

    When a person has to decide, the agent stops and writes a decision card: why it stopped, the two or three facts the decision turns on, and what each option would send. Legal, regulator, police or press action always goes to a person, enforced in code. In the last run of our own eval, on 48 cases, it sent nothing in the 5 cases where a person had to decide, and escalated none of the 38 where a message was the answer.

    Trade-off. Each card is work for a person in the middle of a shift, so the agent only stops where the playbook says a person must decide.

  3. Voice goes through the same gate

    A driver who cannot type leaves a voice note, and when a call is the right move the agent places one in the browser, in the caller's language. What is said becomes a claim in the case, and any promise the voice agent wants to make is checked by the hard rules of the gate and then by Jev within 2.5 seconds, or refused with a fixed sentence. Giving the speech model each case's own references and names cut word errors on reference-heavy messages from 22.0% to 5.1%, across 14 messages in three accents.

    Trade-off. The case only runs again after the call ends, which takes 30 to 150 seconds, so during a call the agent works from what it knew before it.

Photos

Two teammates chatting at a table of laptops during the hackathonThe team with their certificates in a wider group photo on stage at the prize giving

Gallery

The desk console home with case counts, a case that needs a person and live activity
A case run with a person's options above the voice strip: a driver's voice note and approve by voice
A decision card: why the agent stopped, what it already did, what it does not know and the options to choose from
The 3D city of delivery traffic beside the live cases panel

The full engineering is on GitHub.