About the project

Inspiration

A talent buyer rarely lacks recommendations. What they lack is one bill they can defend. Audience taste, fees, availability and programming rules all pull against each other. A popular act can be a poor fit for a particular city, and a strong recommendation can fall apart when one quote rises or a headliner cancels.

Most "AI for music" demos stop at a ranked list of artists. A ranked list is not a booking decision. So we made the whole decision the unit of work: given a city, the artists its fans already love, a budget and a number of acts, Houselights books the best bill that fits every rule. It shows exactly how much Qloo's taste data changed that decision, and how solid the decision is.

What it does

  1. Plan a show. Enter a city, up to three artists your audience loves, an artist budget and 1–4 acts.
  2. Qloo research, live. A bounded agent confirms each artist with Qloo, discovers artists those fans love in that city, and ranks the pool for that audience. Calls are capped at 12 per plan, and every call is saved as a receipt you can open.
  3. Exact booking. An optimizer checks every possible bill against the budget and rules, books the best one, or says plainly that none fits.
  4. Turn Qloo off. One switch reruns the same optimizer with the same pool, fees and budget, but without Qloo's evidence. In the featured New York run, Qloo's evidence books Michael Kiwanuka + Sault for \$13,500. Without it, the same rules book Jordan Rakei + Hiatus Kaiyote for \$9,000.
  5. How solid is this bill? Every plan reports exact checks on its own saved evidence:
    • Fee robustness: how many of 500 seeded fee scenarios keep the same bill, and a safer bookable bill when one wins more often;
    • Flip points: the exact fee at which each booked act would change the bill, and what replaces it;
    • Budget ladder: every budget at which the bill changes, one click away on the slider;
    • Does Qloo separate the picks? Each booked act is marked a clear pick, a likely pick or a coin flip. In the featured run, Sault against Jordan Rakei is a coin flip (affinity 0.9580 vs 0.9579);
    • Which Qloo signal decides it: which class of evidence changes the bill on its own.
  6. The agent spends Qloo calls where they matter. Before its deep checks, the agent asks whether any possible result could change the bill, and skips the acts no result could change. The plan shows that reasoning act by act.

How we built it

Stack. Node.js 24 and Express, with Qloo through the official Qloo MCP harness (@qloo/qloo-harness with the Model Context Protocol SDK). SQLite (node:sqlite) stores plans, receipts, traces and quotas. The public demo runs in Docker behind Caddy on a free Oracle Cloud ARM VM.

From affinity to fit. Qloo returns an affinity $\alpha_a$ for each candidate $a$. We turn it into fit on a fixed span, so tiny gaps stay tiny:

$$ \text{fit}_a = \operatorname{clip}!\left(1 - \frac{\max_b \alpha_b - \alpha_a}{\max(0.05,\ \max_b \alpha_b - \min_b \alpha_b)},\ 0,\ 1\right) $$

The optimizer. For a candidate pool $C$, $k$ acts and budget $B$, it solves

$$ S^\star = \arg\max_{S \subseteq C,\ |S| = k} \ \text{score}(S) \quad \text{subject to} \quad \sum_{a \in S} f_a \le B \ \text{and every booking rule.} $$

The score combines average fit (weight 100), local support, momentum, discovery and genre breadth, minus a penalty for missing evidence. Ties go to the lower total fee. With at most 20 candidates the search is exhaustive, so a hard rule can never be broken and "no bill fits" is a proven answer.

The property behind "How solid is this bill?" The score of a bill does not depend on fees. Fees only decide which bills fit. So every bill is enumerated once, and each fee scenario just reprices it:

$$ S^\star(f) = \arg\max {\, \text{score}(S) \;:\; \textstyle\sum_{a \in S} f_a \le B \,} $$

This makes all of the following exact rather than estimated:

  • Fee robustness: 500 seeded scenarios reprice every bill. Estimated fees vary across their own popularity tier, from the geometric midpoint with the tier below, $\sqrt{t_{i-1} t_i}$, to the one with the tier above, $\sqrt{t_i t_{i+1}}$. Other fees vary within ±20%.
  • Flip points: a binary search on a single act's fee, which is valid because the winner changes monotonically as that fee moves.
  • Budget ladder: the bill can only change at a total fee, so one sweep in order of total cost finds every breakpoint.
  • Affinity noise: fit enters the score as one additive term, so each draw rescores every bill directly.

Unit tests check every one of these figures against rerunning the optimizer on randomly generated test pools.

Value-of-information research. A deep check on one act can return $2 \times 2 \times 4 = 16$ outcomes: local fans or not, audience overlap or not, and a rising, flat, cooling or unknown trend. For each candidate the agent asks the optimizer for the bill under all 16. If every outcome leads to the same bill, that check cannot change the decision, so it is skipped. In one production run where no bill could fit the budget, the agent made no deep checks and used 5 Qloo calls instead of up to 12.

Receipts and integrity. Each Qloo call is stored with its query, status and returned rows. Every published plan carries content digests and replays under the scoring version that produced it.

Anshuman Bahekar

What we measured, honestly

All of these are reproduced offline by npm run verify:all, with no provider calls:

  • Withdrawing the saved Qloo evidence changes the decision in 7 of 9 briefs with a complete Qloo ranking. Under ±20% fee noise, withdrawal changes the decision in 71% of draws, and robustly in only 1 of 9 briefs. So "7 of 9" is a point estimate at the published fees.
  • Over 3,600 seeded scenarios, Qloo's top-ranked acts could not be booked at all in 58% of them. There the optimizer either finds the best bookable bill or proves that none exists. Where the top acts were bookable, it chose differently in 11.7% of cases (177 of 1,517), all from one near-tie brief.
  • On comparable solvable disruptions, 3 of 231 re-prompted LLM responses (1.3%) broke a hard booking rule; the exact optimizer broke none. That is true by construction, not evidence of better judgement.
  • Our own research-allocation policy (Autopilot 2.0) showed no statistically meaningful advantage over a simpler fixed-order policy. We report that negative result.

We have not measured ticket sales, attendance or profit, run usability sessions, or used real quotes. Qloo has no booking fees, so every new act's fee is an estimate from its popularity tier, labelled as such everywhere.

Challenges we ran into

  • Small affinity gaps. Our first fit scaling stretched a 0.001 affinity gap across the whole scale, which overstated Qloo's certainty. Fixed-span scaling corrected that. The new affinity-noise check now says plainly when a pick is a coin flip.
  • Keeping missing evidence missing. When Qloo did not rank every candidate, the tempting move is to guess a fit score. We label those plans provisional instead.
  • Deciding, not just ranking. Most of the value turned out to be in constraint handling: finding the best bill that can actually be booked, or proving none exists.
  • Shipping safely to a shared server. Every release passes CI in Chromium, Firefox and WebKit, takes a backup that is restored to verify it, rehearses a rollback, and is checked from outside, including one live Qloo run. A WebKit-only layout jump (the browser scrolling to keep a re-rendered card in place) once failed a release check; we traced and fixed it before deploying.
  • Correcting ourselves. We published corrections to our own earlier claims, including an inflated disruption headline and the overstated fit scale.
  • Qloo is right about taste and silent about careers. A sweep of real plans offered Soundgarden, Talking Heads, Rage Against the Machine, Sidhu Moose Wala, Loretta Lynn and Glen Campbell as bookable. No test with fixture data would have shown it.
  • Names are shared. Several artists are called Pond, and only one has ended, so a match that disagrees stays unknown rather than removing a working band.
  • Our mock hid a real bug. Qloo's place results carry an address but no coordinates, so our first distance check threw out every real room in Portland. We only caught it by driving the live site. We now check every feature on real Qloo as a visitor before calling it done.

What we learned

  • A ranking and a decision are different products. The decision has to survive fees, budgets and cancellations.
  • Exactness is a feature: because the search is exhaustive, every "what if" question has a precise answer instead of a guess.
  • The most honest way to show what Qloo contributes is a matched counterfactual on the same rules, not a before-and-after story.
  • Saying "this pick is a coin flip" builds more trust than a confident pick.
  • An agent earns trust by knowing what its data cannot know. Qloo knows what fans love, so MusicBrainz checks who still exists and OpenStreetMap checks where a place is.

What's next

  • Usability sessions with promoters and working bookers (the protocol is written; no session has run yet).
  • Real quotes and confirmed availability in place of estimated fees.
  • Pairing decisions with real ticketing outcomes to measure what matters.

Built With

Share this project:

Updates

Submission history