Work / Agents and botsopen brief

Afterglow: an AI agent for a record and book shop that sees what walked out the door

What it was

A small record or book shop only sees what it sold. It never sees what the people who left empty-handed wanted. Qloo, the company behind a taste database (people who like X also like Y, across music, film, books and games), opened a brief for AI agents on top of its API. We wanted to build a real agent, not a scripted chat, and measure honestly whether it beats plain Claude.

What we did

Four days from an empty folder to a submitted entry, then three weeks of polishing driven by measurements. An agent on Claude Haiku 4.5 with 6 tools, 4 of them calling Qloo, choosing the order of calls itself. A shopper page with three items from the shelf and a Qloo fact under each, a morning note to the owner with three records to order, and a run over the catalogs of two real shops in Austin and Dallas. Every evaluation was blind: the requests were written by a separate agent that saw only the catalog.

What the client got

A live site, open code and a two-minute video. On 50 requests we never tuned on, our agent beat Claude without Qloo 25 times and lost 9. On 70 requests Claude without Qloo put an over-budget item in its top 3 fifteen times, our agent never did. We published the weak spots too: with a second judge the gap is smaller.

ClientQloo, open brief on Devpost for AI agents built on Qloo Taste AI
My roleIdea, product, code, design, measurements, copy, video
StatusSubmitted, live agent open to the judges, results not announced yet
Result25 / 9 wins and losses against Claude without Qloo on 50 requests we never tuned on · Open
Rejected: the same request answered by Claude without Qloo. 2 formats, no data behind the picks, nothing for the owner
Rejected: the same request answered by Claude without Qloo. 2 formats, no data behind the picks, nothing for the owner
Accepted: the agent with Qloo tools. 4 formats, a Qloo fact under every pick, 7 missing titles sent to the owner
Accepted: the agent with Qloo tools. 4 formats, a Qloo fact under every pick, 7 missing titles sent to the owner

The task

The owner of an independent shop restocks based on sales. But sales only show what is already on the shelf. If someone comes in for a record that is not there, they leave quietly, and no report ever shows it. We called this “demand the till never sees”. Meanwhile the shopper struggles to choose a gift: they know what the person likes, but not which of the things in this shop are close to it.

Qloo, the company behind a taste database (people who like X also like Y, across music, film, books and games), opened a brief for AI agents on top of its API. Video and pitch optional, Ukraine eligible. We wanted three things: to test ourselves on a real agent, where the model decides which tool to call and when to stop; to measure honestly whether it beats plain Claude; and to get a portfolio piece with a live site and open code.

Why, and what the idea was

The idea: put an agent in the shop that reads a shopper’s request in plain words (“a gift for my brother, loves Joy Division, under $40”), goes to Qloo, scores the whole catalog against that taste, checks budget and age, and pulls three things off the shelf. Under each one, a fact from Qloo on why it fits. And everything the shelf did not have goes to the owner in the morning as a list: which records to reorder. So the shop finally sees what walked out.

Two decisions were revised along the way. At first we wanted “AI for any online store”, but Qloo recognized only about 30% of random Amazon products. We narrowed the niche to a culture shop: records, books, films, games, shows. Second: my first design plan (a name, three storefront styles, generated images) was unanimously rejected by a council of five AI advisors. The project’s main point of difference was the owner’s screen, and it was not in the plan. We built what the verdict said.

How it went

Stage What happened
Day 1 Registration, request for a Qloo key. A skeleton on stubs while there was no key. First surprise: Qloo scores a brand, not a product
Day 3, morning The key arrived. Live Qloo calls, first measurement, “AI for any store” dropped. Niche chosen: a culture shop
Day 3 Two design councils. The whole site redone as a “late-night record shop”, covers as the main material. 72 commits in a day
Day 4, 00:11 Entry submitted
Day 4 Final council: five independent AI advisors judged the work as a panel, their whole plan carried out. Code review found 5 agent bugs, fixed, everything re-measured. New video, new gallery
Three weeks later Live agent switched on, the judges’ link checked

94 commits in total, 4 working days to submission.

Tools and method

The agent: Claude Haiku 4.5 with tool use. 6 tools, 4 of them call Qloo: entity search, insights filtered by the shop’s catalog with an explanation of which taste produced the match, taste tags, demographics for gifts by age, a city’s taste via signal.location. The model decides the order of calls itself, capped at 6 turns and 25 live Qloo requests per shopper request.

Code: Next.js 16, TypeScript, Vercel, about 2,500 lines in the agent core and pages. Catalog: 384 items, covers and data from the iTunes Search API and Open Library, age ratings from official sources, cover art generated in Higgsfield. Spending guard: while the live agent is closed, the public site shows recorded runs, the judges have a separate pass. A ceiling on Claude of $3 a day for everyone and $10 for judges, a separate Qloo quota reserve. If the limit runs out, the site does not fall over but shows the closest recorded example. One shopper request costs about $0.015 on Claude.

The measurements were blind. A separate agent that saw only the catalog wrote and labeled 40 shopper requests before any tuning. We tuned on the odd ones only, the even ones were never touched. After all tuning another blind agent wrote 30 new ones. We compared against the same Claude given the whole catalog as text but no Qloo. A second blind judge scored every disputed pick from both sides without knowing whose was which. Statistics in Python: bootstrap and the sign test.

Result

A live site with three pages. Shopper (/live): you type a request, on the right you watch the agent work step by step, below it the answer from Claude without Qloo to the same request, for comparison. Owner (/owner): the morning note “three records to order” with cover, artist and how many shoppers wanted each, below it the gaps on the shelf. Real shops (/real): the public catalogs of Waterloo Records (Austin) and Josey Records (Dallas) run through Qloo: how many of the city’s 50 favorite artists are on the shelf and what shoppers look for that the shop does not carry.

Numbers on 50 requests we never tuned on: top-3 hits 0.43 for our agent, 0.32 for Claude without Qloo; wins and losses 25 to 9. With the second judge 0.57 to 0.48 and 21 to 12. Budget: on 70 requests Claude without Qloo put an over-budget item in its top 3 fifteen times, our agent never did.

We published the weak spots too: with the second judge the gap is smaller and not statistically decisive, and one early test showed the opposite altogether. We publish the latest run, not the best one. The results of the brief have not been announced yet; we will add them when they come.

Mistakes and what we took from them

Qloo does not return the signal itself.A shop built from Qloo's suggestions for a Taylor Swift fan turned out to have no Taylor Swift. We added the seed items back.
Popularity drowned out taste.LEGO came first in every list. We switched to percentiles within each format.
Search confused entities."Studio Ghibli" came back as a photo app. Now an exact name match first, then a search by type.
The model confidently made things up."The Mule, a modern western" (it is not a western). Now the explanation has to match the item's own Qloo tags, and the owner's plan shows facts from the data, not the model's retelling.
Code review after submission found 5 real bugs.An empty candidate list sent the agent into a loop, the word "series" falsely switched on a format filter, "kid brother 25" falsely set a child's age. All fixed and re-measured, the result improved: 25/9 against 24/10.
Devpost did not save the image order from the form.The order is set by a separate request sent by drag and drop. We found it and called it.
The comparison block on a phone was 8 pixels wider than the screen.Every page is now checked on a phone.

Tools

Claude Haiku 4.5Qloo Taste AI APINext.js 16React 19TypeScriptVerceliTunes Search APIOpen LibraryHiggsfieldPythonClaude CodeGitHub