← AI work · Chris Little Case study · applied AI · October 2026
EST.2026

Treasure Hunter

Golf memorabilia & collectibles

Real stories. Lasting value.

A sourcing tool that hunts eBay for the pieces you want, prices each one against what similar items actually sold for at auction, and tells you the most you can pay and still make your margin.

RESEARCH  /  EVALUATE  /  COLLECT

The app runs on Chris's computer by design: it never buys, bids or messages anyone. Below is a walkthrough of a real hunt.

What it is, accurately: a scheduled workflow with the valuation math in code and exactly one AI agent, an on-demand researcher. Models read and compare text; they never produce a price.

1,219real auction sales in the price book, each traceable to its lot page
66automated tests, from deal math to the cent to the cost cap
$0.23total model spend for a full day of live testing
$25hard monthly cap; the run stops when it is reached
The product

One hunt, in five lots

Screens from the working app, run locally against live eBay listings on October 9, 2026. Each is cropped to the part described; tap one to see the full screen.

Treasure Hunter landing page with a large target box reading 'Anything signed by Bobby Jones', example searches, budget and category optionsSwipe sideways to see more →
Lot 1 · The target

Say it in plain words

"Anything signed by Bobby Jones." A low-cost model turns the sentence into filters you can see and edit: the subject, who must have signed it, aliases, and words to rule out. It knows golfer Bobby Jones is not the basketball player of the same name.

eBay deal board for Tiger Woods signed flags showing cost, max to pay and status chips for each listingSwipe sideways to see more →
Lot 2 · The hunt

A deal board, not a search page

Code screens every listing first: wrong signer, reproductions, other sports. Survivors go to the model in batches, and every verdict must quote the listing or it's discarded. Live auction-house lots are screened in the same pass and flagged as a second hunting ground.

Value card: cost to acquire $331.00, wholesale range $487 to $748 with a $642 median, labeled sell value, max to pay $556.74, margin 70.3 to 76.2 percent
Lot 3 · The value card

The price story, done in code

Cost to acquire, wholesale from approved auction comps, a sell value that always names its source, eBay fees, max to pay and margin. Here, a $331 buy against a $556.74 ceiling. With fewer than three comps the card says "thin" or "insufficient" instead of guessing.

Records panel listing the five auction lots behind the max-to-pay figure, with hammer price, buyer's premium, shipping estimate and landed cost
Lot 4 · The receipts

Every number opens its records

Click any figure and the sales behind it appear: hammer, buyer's premium, shipping (actual or estimated) and a link to the original lot page. A test feeds the app a fake model that "states" prices and proves none of them reach a money field.

Research panel for a feather ball lot: the claim that Gourlays made feather balls until 1950 is flagged as a conflict, with quoted sources from other archived lotsSwipe sideways to see more →
Lot 5 · The researcher

The one agent, on a short leash

On demand it pulls a listing's claims, chooses its own searches through the auction archive, and files a report. Its test case: a lot claiming feather balls were made "until 1950." It flagged the conflict and cited an archived gutty ball from c.1865. A verdict stands only if code finds its quote in a record the agent actually fetched.

Refresh eBay→Screen in code→Model check→ Read attributes→Propose comps→You approve→ Value card·Research on demand
AI and workflow design

Where the AI sits, and where it doesn't

Each model job is narrow, matched to the cheapest model that does it well, and checked by code before anything is kept. Costs are from the live runs.

StepDone byGuardrail in codeLive cost
Sentence to targetHaiku 5.5Structured output against a schema; every field shown and editable; word rules if no key.$0.0003
Screen eBay listingsCode then Haiku 5.5A verdict whose quote isn't in the listing becomes "unsure"; a skipped listing is asked again, never dropped.$0.0025 per hunt
Read item attributesHaiku 5.5 · Batch APIThe one-time archive pass runs as a batch at half price; attributes without a verbatim quote are dropped.≈ $0.0002 each
Propose comparable salesSonnet 5.5Sees descriptions only, never prices, so it can't anchor. IDs and quotes validated; you approve or reject; rejections stick.$0.017 per item
All money mathCodeExact decimals in one module with no model client. Proven by test.$0
Research a listing's claimsThe one agentPicks its own lookups, loops, reports. Step cap and cost cap; a "conflict" needs a quote found in a record it fetched.$0.03–0.08 per listing
Engineering decisions

Rules the code enforces

No price from a model

Models extract, compare and cite. Arithmetic lives in one module with exact decimals, and any model-stated number on a money field fails the tests.

Quote it or drop it

Attributes, screening verdicts, comp reasons and research findings all carry the exact words they came from. Code looks for those words and discards whatever it can't find.

One agent, bounded

Only the researcher decides its own steps, because only that job needs open-ended lookups. It has a step cap and a cost cap and must cite fetched sources.

Spend is metered

Every call is costed from its token usage and logged. A counter in the app shows each run's tokens and dollars against the monthly cap.

Polite data access

Both auction houses block scripts, so nothing crawls. Pages were viewed in a browser at human pace, saved with checksums, and never re-read once a sale closed.

Marketplace rules in code

eBay data follows the API license: a daily call cap, listings shown with their age after six hours, no seller data or images stored, and a 30-day purge.

Measured, not claimed

How good are the prices?

70%of actual sale prices fell inside the comp range (217 of 311 archive lots) 71price ranges recorded for live auction lots before they close on October 18, scored after

How the backtest works. Each past lot is priced only from sales dated before it, then compared with what it actually made. This run uses code-picked comps alone, with no model and no human approval: the floor, not the product.

The harder numbers. 43% of lots had a comp median within 2× of the actual price, and only 26% of the 1,219 archive lots had three or more earlier comps to price from. Thin data is the main limit, which is why the card says "thin" or "insufficient" instead of guessing.

One-off memorabilia prices vary widely, so the honest claim is a ballpark. The scorecard is built to show whether model-proposed, human-approved comps tighten it.

Live · pass

Finds the conflict

Flagged a lot's "until 1950" date, citing an archived c.1865 gutty ball. It took one fix: archive search now ranks partial matches.

Live · pass

No false alarm

On a clean feather-ball lot, every checkable claim came back consistent, each with a quoted source.

Live · pass

Right Bobby Jones

The basketball player dropped out. Artist-signed prints were ruled out, and author-signed books were marked "unsure".

Build sheet

How it's made

Language & dataPython 3.14 and SQLite; money as exact Decimal values stored as strings AppFastAPI on 127.0.0.1 with a hand-written HTML, CSS and JavaScript front end; no build step ModelsAnthropic SDK: Haiku 5.5 for bulk reading, Sonnet 5.5 for comps and research with server-side fallback, Message Batches for the archive pass SourceseBay Browse API; TheGolfAuction and Golden Age Auctions archives, captured in a browser Tests66 pytest tests with fake and scripted model clients, plus live runs for the researcher, screening and comps SizeAbout 4,200 lines of Python across 21 modules and 9 test files WorkflowOne daily command refreshes eBay, re-hunts saved targets, records live price ranges and purges old data