Skip to the content

A demo on synthetic data, built for the Junction 2026 Valio Aimo challenge. Not the wholesaler's own shop.

An AI buyer for every kitchen, and a gate it cannot talk its way past.

Any company's purchasing agent can order from the wholesaler. It carries a mandate its company signed, saying what it may buy and how much it may spend alone. Plain code checks every order against it. Anything beyond it waits for a named person to sign on their phone.

Built for Valio Aimo's Trusted Trade Agents challenge, Junction 2026.Watch it live at the gate

The store on a desktop: the dairy and cheese department with the kitchen's agent docked beside it, showing the same conversation about 1,000 litres of lactose-free milk.
The kitchen's agent on a phone. The buyer asked for 1,000 litres of lactose-free milk by Monday; the agent answers that the usual 10-litre boxes cannot arrive by Monday because the order cut-off has passed, and offers three ways in one-litre cartons with their prices.

Two minutes, from a sentence to a signed order

The film is in the edit. Until it lands here, every picture on this page is the product itself, captured from a production build.

The challenge's own example, start to signed order

Request, lookup, order, approval: the four steps the challenge asks for, on the example it gives. The usual product fails on the way, and the agent finds a way that still makes Monday.

  1. Request

    The chef types one line. No form, no product code.

    The buyer's message, 'I need 1,000 litres of lactose-free milk by Monday', and the agent reading the request.
  2. Lookup

    It asks the live price service about three products, not the catalogue. The usual 10-litre boxes have missed their order cut-off.

    The agent's five steps opened: read the request, looked at the kitchen's history, searched the range, checked live price and delivery for three products, left out seventeen with the reasons, six of them because the order cut-off had passed.
  3. Order

    Three ways in one-litre cartons, each a fixed price the wholesaler signs: 1 010,00 €, 1 560,00 € and 1 574,48 €.

    The agent's reply with three options in one-litre cartons, each with its total, price per litre and delivery on Monday 16 November.
  4. Approval

    1 010 € is over the 500 € the agent may spend alone, so it stops at the gate and goes to the kitchen manager's phone.

    The sign-off page on a phone: stopped at the gate, 1 010,00 € for delivery on Monday, over the agent's 500 € per-order limit, a note that 1,000 litres is 2.5 times the usual 400, and the Approve button.
  5. Signed

    A passkey signs that exact order. The order is placed and the wholesaler signs the confirmation.

    After approval: a 'Signed off' stamp with the approver's name and time, and 'Order placed', approved with a passkey.

Six agents. Every one of them meets the same gate.

Each one does a real job in a kitchen or at the wholesaler. None of them can place an order the gate has not passed, and none of them can sign one.

The kitchen's buying agent

The chef talks; the agent buys. It remembers the kitchen's usual products, its rules and last week's order, and asks only when the answer changes the order. Typed, spoken on a call, or a photo of the whiteboard.

Voice: 33 of 36 held-out clips heard right, in hall noise and accents, in three languages; a mis-hearing is read back and needs a yes. Photo: twelve test lists, no wrong quantity, nothing invented.Voice and photo evaluation

The agent's home on a phone: it noticed that Monday's usual milk missed its cut-off and asks once whether to switch.
Voice mode on a phone: the agent speaking, with a large Hold to talk button and End call.

The wholesaler's selling agent

It speaks to the buyer's agent, not to the chef: a new or seasonal product, or the same thing cheaper, as a signed offer any agent can check offline. Plain code chooses what to offer. An offer never buys anything.

At most two offers a kitchen in seven days. Every reason (cheaper, in season, more reliable, lower carbon) is recomputed from the data before it is sent, or the offer is held back with the rule that stopped it.The selling agent

The operations portal's selling agent page: offers sent, one held back by a guardrail, and a table of what was offered to whom and what happened.
The kitchen's agent on a phone showing the wholesaler's offer: the same milk 0,37 € less per litre, the price held until a stated time.

The watch

It keeps an eye on what the kitchen buys every week and on orders still to come, so it notices a stock-out before the kitchen does. It learns standing orders, holds one that drifted and asks, and lines up a backup for products with a poor delivery record.

One live availability call for at most ten key products. A recurring order that drifted is never renewed silently: renew at the new amount, the usual, or skip this week.Connect an agent

The operations portal's kitchen watch: a finding that a product cannot come on its day, with good, better and best substitutes, marked as staged for the demo.
The kitchen's agent on a phone: Monday's milk cannot come, here is the substitute, it needs a sign-off. Staged for the demo, and marked so.

The menu planner

A seasonal menu, or a booking at short notice: dishes for the covers, what the kitchen already has, and only the shortfall bought. What cannot arrive in time is replaced by recipe logic, not by the next product code.

Substitutes by the ingredient's job in the dish (crème fraîche to smetana 1:1, fresh dill to dried 1:3), each checked to be in the range, in time, and within the kitchen's allergen and nutrition rules.Connect an agent

The agent on a desktop after planning a lunch for ten: nothing arrives Monday so it moves to Tuesday, a salmon soup lunch at 31,43 €, about 3,14 € a cover.

Any outside agent

A hotel chain's own agent, a procurement system, Claude or ChatGPT with a connector address. They come in through MCP or REST described by OpenAPI 3.1, and meet the same mandate check, the same gate and the same sign-off as the agent in the store.

Seven agent frameworks we did not write (Pydantic AI, OpenAI Agents SDK, Google ADK, Claude Agent SDK, Vercel AI SDK, LangGraph, Semantic Kernel over OpenAPI) took the milk order to a person's sign-off with nothing but the address and a signed mandate.Runtime results

The page for outside agents: copy one address into your assistant, or run one command; the MCP address and the OpenAPI document.

The operations copilot, and an agent on Aiven

Staff ask the platform in words: is anything unhealthy, which agents are failing, what is waiting for sign-off. Answers are computed from rows and service state, never written by a model, and a question the data cannot answer gets "The data does not say."

A purchasing agent running on Aiven Managed Agents, with its own model in Aiven's environment, orders through the MCP door. At 1,400 € it is over the 1,000 € it may spend alone, so it waits for a named person.The Platform page (operations)

Ask the platform

  • Is anything unhealthy?
  • Which agents are failing?
  • What is waiting for sign-off?
  • How many orders were refused in the last hour, and by which rule?
delete from telemetry.events

Refused before it is sent: the copilot reads one view, as a user that can only select.

In the operations portal, on the Platform page.

The six situations the challenge names, each handled

Type the words into the agent, or open the page named.

Never trust the model

The model reads, searches and explains. It never decides whether an order is allowed. That is a pure function of 20 rules: the same mandate and the same order give the same answer, with no model and no clock inside.

  1. Signed by the buyer's companyMandateWhat the agent may buy, how much it may spend alone, and who signs above that.JWS, Ed25519
  2. Signed by the wholesalerQuoteA fixed price for exact lines, for this buyer and this request, until a stated time.JWS, Ed25519
  3. Plain codeGateEvery rule reports pass, needs a person, or refused, and why.No model inside
  4. A named personSign-offA passkey on their own phone, bound to the digest of that exact order.WebAuthn passkey
  5. Anyone can checkLedgerHash-chained entries and a signed receipt that verifies offline against the published keys.SHA-256 chain, JWK Set

The gate's 20 rules, by name

  • mandate_agent
  • mandate_window
  • quote_binding
  • quote_expiry
  • quote_replay
  • order_matches_quote
  • category_allowed
  • required_attributes
  • forbidden_allergens
  • nutrition_rules
  • required_certificates
  • recall_hold
  • delivery_deadline
  • substitution_rule
  • substitute_price
  • weekly_budget
  • per_order_limit
  • order_splitting
  • human_confirmation
  • approver_authority
  • Refuses, and says why

    Every refusal carries the rule that fired and a sentence a person can read. Pay less than the signed quote and the answer is order_matches_quote, not a shrug.

  • A mistake check that shows its working

    "1,000 L is 2.5 times your usual 400 L (median of your last 8 milk orders)." Both figures, on the sign-off itself, so the person signing knows what they are signing.

  • Allergens and nutrition by declared evidence

    No allergen data is not safe. A nutrition rule holds only by the maker's declared figure; a missing figure is not compliant.

  • A relayed yes is not a person

    "The chef said yes", passed on by a model, is recorded as relayed. Where it matters, the order goes to a named person's passkey.

  • Suspend an agent

    The wholesaler's staff can suspend any agent at the door. Its next call is refused, in every door, until they lift it.

  • Licences from the crash test

    An agent earns a licence on the crash test. When the wholesaler enforces it, the gate applies the stricter of the mandate and the licence, never the looser.

The presenter's 'Now try to break it' board: ten times too much, a forged mandate, a replayed fixed price, the agent approving its own order, one need split to dodge the limit, 'the chef said yes', and a suspension; each refused or held with its rule.

Open standards, all the way down

  • MCPStreamable HTTP, protocol 2026-07-28 and the 2025-era handshake
  • OpenAPI 3.1The same operations over REST
  • W3C Verifiable CredentialsSigned stock, price and origin claims, and the offers
  • JWS with Ed25519Mandates, quotes and receipts; keys published as a JWK Set
  • WebAuthn passkeysA person's sign-off, bound to one order
  • RFC 9727 API catalogSo an agent that knows only the address can find the rest

You can see it think

Under every reply sits one quiet line: "5 steps". Open it and the agent shows what it read, which history it used, what it searched, which live prices it asked for, and what it left out and why. The wholesaler sees the same request as a replay, station by station, each with its ledger entry.

A reply on a phone with its five steps opened: read your request, looked at your history, searched the assortment, checked live price and delivery for three products, left out seventeen products with the reasons.
The buyer's view: the steps behind one reply.
The operations trace of the milk request: a transport bar to replay it, seventeen stations from the request to the signed order approved by the kitchen manager, and what the live price service saw.
The wholesaler's view: the same request, replayable.

Tested like it matters

The crash test puts a buying agent through 13 hard purchasing situations, three times each: litres to cases, a missed cut-off, partial stock, lactose-free that is not low-lactose, a school's allergen data, a price that expires, a standing order that drifted, an impossible deadline. Every model ran through the same harness and the same gate; the licence is judged on its worst run.

Crash-test ratings and the licence each agent earned
AgentWorst runRatingLicenceUnsafe attempts
Reference buyerscripted baseline100.0100.0L3 Autonomous0
Claude Fable 5.2Anthropic96.596.9L3 Autonomous0
Claude Opus 5.5the model our agent runs on95.295.7L3 Autonomous0
Claude Sonnet 5.5Anthropic85.790.8L1 Supervised0
GPT-6 AstraOpenAI79.980.4L1 Supervised0
Claude Haiku 5.5Anthropic68.978.3L1 Supervised0
GPT-6 LunaOpenAI59.764.8L0 Learner0
Reckless buyerscripted baseline13.213.2L0 Learner9
Nemotron-3-Nano-30B-A3B-BF16Featherless8.813.5L0 Learner0
Qwen3-14BFeatherless7.714.9L0 Learner1
Qwen3-8BFeatherless6.610.4L0 Learner2
Qwen3-4BFeatherless0.07.9L0 Learner2
Does nothingscripted baseline0.00.0L0 Learner0
Stops earlyscripted baseline0.00.0L0 Learner0

Licences: L0 Learner, every order to a person; L1 Supervised, up to 250 € alone; L2 Trusted, up to 1,000 €; L3 Autonomous, up to 2,500 € and like-for-like substitutes. The crash-test leaderboard

1,500+
automated tests over the gate, the core, the server and the documents' own claims.
61
conversation scenarios scored against the expected end state, counting every correction the buyer had to make.
13
everyday tasks done by a scripted first-timer in a phone-sized browser, counting taps, typed messages and questions.
66
probes against a running server: who may do what, hostile and malformed calls, boundaries, floods.

380+ browser tests across Chromium, WebKit and Firefox at phone and desktop size, including the sign-off with a passkey, accessibility, reduced motion and a crowded room.

Run it like a business

The wholesaler's staff see every agent at the door, how each is doing and why, and what is waiting for a person. Everything an agent does is a record they can search in words and replay.

The operations portal's agents page: the scorecard with one agent failing after the attacks and one performing, each with requests, refusals and its licence, and the orders waiting for a person.
  • Agent scorecard

    Each agent performing, escalating or failing, with the reason in words and a proposed action that a named person carries out.

  • Waiting for a person

    Every order waiting for sign-off, oldest first, why it needed one, and how long sign-offs take.

  • Safeguards

    Each rule of the gate and how often it fired: alone, a named person, refused.

  • Observe and alerts

    Orders, sign-offs, refusals by rule, model spend and search quality as panels, each showing its SQL; six thresholds checked by the app itself.

  • The audit trail, in words

    "Refusals for allergens by outside agents today" searches the trail; codes, counts and times only, no buyer text.

  • The stream

    Every agent action and gate decision on Kafka, keyed by order, so a request can be replayed in order.

The safeguards page: how many orders the agent decided alone, how many a named person signed, how many were refused, and the rule book with how often each rule fired.

On Aiven, every service has one job

Aiven Runtime
Hosts AimoPilot: the gate, its MCP door, REST, the portals.
PostgreSQL
Orders, approvals, the hash-chained ledger, kitchen memory, telemetry; the scorecard is SQL over it.
Kafka
Every agent action and gate decision, ordered and replayable.
Valkey
The live-price cache and each agent's lookup budget.
OpenSearch
Search over 17,546 products in three languages, the recall index and the audit trail.
Grafana
The full dashboard, read-only over PostgreSQL.
Managed Agents
An outside buyer AimoPilot does not run.
Aiven MCP server
The copilot's read-only view of service state.

For the wholesaler

On every screen

A chef on the line has a phone; the purchasing manager has a desk. Every moment works on both, the same moment, the same data.

The conversation
The conversation on a phone: the order needs the kitchen manager's OK, 1 010,00 €, with OK with Face ID.
The conversation on a desktop, the agent as the whole workspace, at the moment the kitchen manager OK'd the order.
The sign-off
The sign-off on a phone: stopped at the gate, 1 010,00 €, why you are asked, the Approve button.
The same sign-off page in a desktop browser.
The store
The catalogue on a phone: butter in the dairy department, two products, the tab bar with the agent in the middle.
The catalogue on a desktop with the agent docked beside it.
Operations
The operations portal on a phone: live at the gate, three doors and one gate, with its tab bar.
The operations portal's Live page on a desktop: three doors, one gate, and what happened to each request.

Emails that look like a business sent them

A receipt the moment an order is placed, and a plain-spoken mail when something changes: a delay, a shortage, a substitute. Built for mail clients, in the kitchen's language, never sent twice.

From AimoPilotOrder placed: 20,94 €, delivery Sun 15.11.2026
The receipt email: your order is placed, the order number, kitchen, placed and delivery dates, the product line, VAT and total, and a link to check the signed receipt.
From AimoPilotA product on your order cannot come on Mon 16.11.2026
The change email: a product on your order cannot come, what happened, what was done, the figures, and best, better and good substitutes, marked as staged for the demo.

What is sent, when, and to whom

Honest about what it is

A working demo on the partner's synthetic data, built in a weekend. Here is what is real, what is mocked, and what a production deployment needs next.

Real

  • The partner's 17,546 products, with their delivery-reliability and carbon files.
  • The partner's mock price and availability service, called live, for short lists only.
  • Every gate decision, signature, passkey and ledger entry.

Mocked, and said so

  • Orders are committed in AimoPilot's own store and ledger; nothing reaches the partner's order system.
  • Supplier-shipped products report no real stock, so the agent says "not reported" and never prints a placeholder as stock.
  • Kitchens are fictional; in the demo the server holds their keys. In production the kitchen holds its own.

Next

  • A pilot with two or three real kitchens, every order still read by a person at first.
  • OAuth 2.1 for consumer assistants, with the mandate as the consent screen.
  • Contract prices and assortments per buyer from the wholesaler's ERP.
  • Keys in an HSM or KMS, with rotation and a published key history.

Read all assumptions and next steps · Documents

Talk to the agent

Open a test kitchen in one click, ask for 1,000 litres of lactose-free milk by Monday, and sign it on your phone.