Shopilot TechJam·26 · Track 4

Shopilot · Track 4

It decides whether to answer you
or ask you one more question.

A multi-turn agent over a frozen 50,000-product Amazon catalog. It routes every turn between a precise buying filter and a diverse browsing spread, carries your constraints forward, and picks its next question by expected information gain rather than from a list. Every panel below is read straight off the agent's own trace.

TechnicalScore
—
Hit Rate@10
—
MRR
—
Mean turns
—
Tokens spent
—

Talk to it

Nothing on the right is mocked — it is the same trace tools/demo.py prints, rendered live. Pick a shopper profile to see how the aggregate profile enters ranking (weighted 0.18 against 1.0 for anything you actually say, so it can never overrule you).

answers
profile
No prior signal.

Conversation

turn 0 / 10

Open it however you like. The evaluator always names a catalog category on turn one; a person does not, so the demo resolves one first and shows you what it resolved. Greetings are free — they never spend a turn.

50,000 Clothing, Shoes & Jewelry products

Replay a scored session

Pick any of the 200 labelled public sessions. The customer's replies come from the organizer's own simulator in evaluator/local_evaluator.py, so this is the scored behaviour, not a scripted walkthrough. The hidden target is revealed to you after the run — never to the agent.

Against the official starter

Your last message, sent unchanged to the weak BM25 agent shipped in starter/agent.py. It is stateless, so the gap opens the moment a conversation has a second turn — and it scores 0.107 against this agent's 0.954.

This agent

—
  1. No results yet.

BM25 starter

no state
  1. No results yet.

Measured, not claimed

Scored by the organizer's evaluator, unmodified, on all 200 public sessions. Every figure here is read from a committed artifact — the same files make verify writes.

By scenario

200 sessions
ScenarionHR@10MRRMTTC
Loading…

What actually drives it

ablation
Component removedScoreΔ
Loading…

Read the small rows honestly: several components do not earn their keep on the public set and are kept as insurance against paraphrase, which the next panel prices.

Under customer paraphrase

stress test
Customer textUnhardenedHardened
Loading…

The specification reserves the right to reword the customer. Rather than argue about it, make robust measures it.

Six decisions that carry the score

Each one is measured, not asserted — the deltas below come from artifacts/ablate.json, the same file the table above reads.

Questions are chosen, not listed

The customer discloses undisclosed constraints whose type matches the attribute named. So a question's value is exactly how finely it splits the live candidates — computable, and computed: IG(a) = H(C) − E[H(C | reply)]. Removing this costs 0.379 of composite score, more than everything else combined.

Show one product, not ten

A session ends the instant the target appears anywhere in the list. So padding a low-confidence turn buys a badly-ranked hit that ends the session before a better turn arrives. While the field is wide the agent offers the one product it believes. MRR climbs 0.690 → 0.968 for 0.65 of a turn.

A miss is evidence

If a turn showed ten products and the session continued, the target was not among them. That is not a heuristic — it follows from how a turn is scored — and it removes candidates for free. It is withheld in intent override sessions until the override lands, where it would be unsound.

Override re-weights, it does not erase

The brief asks for slot erasure on intent override. Measured against the actual customer, the abandoned preference is still a true attribute of the target, so erasing costs 0.009. The agent demotes instead. This is the one place it deliberately departs from the brief, and the ablation is the argument.

Rarity decides what a phrase may do

A disclosed constraint may nominate candidates only if at most 500 products carry it. The largest category holds 1,354, so a phrase less selective than a whole category cannot narrow anything — letting “Buckle closure” nominate replaced a 258-product shelf with an 18,000-product haystack. It still scores what other routes find. Same score, evaluation 5× faster.

A turn is never empty

An unreadable message leaves nothing to rank, and a turn that returns nothing cannot hit while still spending itself. Never happens on the public set; the organizer reserves the right to reword the customer, so the agent falls back to the held category ranked by quality. It costs nothing an empty list does not already cost — the public score is identical to five decimals, because the path never runs there.