Gabriel Murray

Boo 2026

Summary

I built Boo at Ghost, a marketplace for surplus retail inventory. Each supplier sends its inventory in a different file format.

Boo reads the file and maps each value to a field in Ghost's taxonomy. An LLM writes the rules for how to read the file, and code applies those rules to every row. A decision model then infers the fields the supplier left out, such as Category and Gender, from the details in the file. A person checks the result, and the items are listed on the marketplace.

Boo has been in production since March 2026, and Ghost's operations team has run it on more than 870 supplier files.

Boo review screen for a file named Northfield Outfitters closeout.csv. A grid of 23 item rows shows price, quantity, category, size and gender columns. Three size cells are red and several gender cells are amber. A side panel lists issues to fix and, under "How Boo read the file", which source column fed each field and whether Claude or Jev chose it.

Background

No two supplier files look the same.

  • LayoutTitle rows sit above the header, or one file holds several tables and tabs.
    Supplier's file
    ABCD
    1NORTHFIELD OUTFITTERS
    2Closeout list, October
    3
    4ArticleDescrColourQty
    5SGB-296Re-Nylon JacketBlack36
    After Boo
    ABCD
    1Style #Style NameVariantUnit Quantity
    2SGB-296Re-Nylon JacketBlack36
  • Column namesA supplier writes "Descr", "Sz" and "RRP" for Style Name, Size and MSRP.
    Supplier's file
    ABCD
    1ArticleDescrSzRRP
    2SGB-296Re-Nylon Jacket482150.00
    3SGB-296Re-Nylon Jacket502150.00
    After Boo
    ABCD
    1Style #Style NameSizeMSRP
    2SGB-296Re-Nylon Jacket482150.00
    3SGB-296Re-Nylon Jacket502150.00
  • SizesOne file has a row for each size. The next has a column for each size.
    Supplier's file
    ABCDE
    1ArticleDescr464850
    2SGB-296Re-Nylon Jacket123624
    3SGB-410Re-Nylon Vest82016
    After Boo
    ABCD
    1Style #Style NameSizeUnit Quantity
    2SGB-296Re-Nylon Jacket4612
    3SGB-296Re-Nylon Jacket4836
    4SGB-296Re-Nylon Jacket5024
    5SGB-410Re-Nylon Vest468
  • Extra rowsSubtotals, totals and notes sit between the item rows.
    Supplier's file
    ABC
    1SGB-296Re-Nylon Jacket36
    2SGB-410Re-Nylon Vest20
    3Subtotal56
    42HC-137Re-Nylon Bucket Hat18
    5TOTAL74
    After Boo
    ABC
    1SGB-296Re-Nylon Jacket36
    2SGB-410Re-Nylon Vest20
    32HC-137Re-Nylon Bucket Hat18
  • Bad or missing valuesA barcode arrives in scientific notation, or the file has no Category or Gender.
    Supplier's file
    ABC
    1ArticleEANCategory
    2SGB-2968500310004127empty
    3SGB-4108.50031E+12empty
    After Boo
    ABC
    1Style #UPCCategory
    2SGB-2968500310004127Outerwear
    3SGB-4108.50031E+12Outerwear

This is a whole sample file as it arrives. It has four of the five.

The "Original file" tab in Boo showing the supplier sheet as sent. Rows 1 and 2 are title lines, row 4 holds the headers Article, Descr, Colour, Sz, EAN and RRP, and the barcode in row 14 reads 850031000000 while the other barcodes are full 13-digit numbers.

How it works

  1. CodeReads every tab and row and summarizes each column
  2. LLMWrites the rules for this file
  3. Decision modelChecks which field each column holds
  4. CodeApplies the rules to every row
  5. Decision modelPicks Category and Gender once per product
  6. PersonChecks the flagged cells before the items are listed

Reading the file

Claude Sonnet reads each file one time and writes a set of rules for it. The rules cover four things.

  • Tabs and rows. Which tabs to read, where each table starts, and which rows are items.
  • Fields. How to build each field. A field can come from one column, part of a column, or several columns joined.
  • Sizes. Whether the file has a row for each size or a column for each size.
  • Values. Which of the supplier's words map to Ghost's words, and which currency the prices are in.

A decision model then checks each column choice. A decision model answers a multiple-choice question with one choice and a confidence from 0 to 1. Boo uses Jev, from TypeSafe. When Jev picks a different column at 0.9 or more, its choice replaces Claude's.

Code then applies the rules to every row, so every row in the file is read the same way.

Filling in missing fields

When a file has no Category or Gender, Jev picks them. For Category, it reads the name of the product. For Gender, it reads the brand, the name, the Category and the sizes.

Jev answers once for each product. A product is a brand and a style number, and its items are the sizes and colors. A jacket in two colors and three sizes is six items and one question. Code writes the answer to all six items.

1 question to Jev, same result

Style NameColorSizeUnits
Re-Nylon JacketBlack4636
Re-Nylon JacketBlack4848
Re-Nylon JacketBlack5042
Re-Nylon JacketRed4624
Re-Nylon JacketRed4860
Re-Nylon JacketRed5030
Code groups the items
PradaRe-Nylon JacketOne product, six items
Jev decides onceJev
Code fills in every itemOuterwear
Category
Outerwear
Outerwear
Outerwear
Outerwear
Outerwear
Outerwear

In 372 past files, 248,388 items made 52,434 products. That is 4.7 times fewer questions. The cost is that one wrong answer gets applied to every item of that product.

Boo uses the confidence to decide what to do with each answer.

  • 0.9 or more. Boo applies the answer.
  • 0.5 to 0.9. Boo applies the answer and marks the cell amber for the reviewer.
  • Below 0.5. Boo leaves the field empty for the reviewer.
Boo review grid with Brand, Style Name, Variant, Style # and SKU columns. The Variant column holds a color on each row, such as Moss, Slate and Harbor Blue. A side panel titled "Answers to check" has a Seller Price card where Claude chose column H "Our Price" and Jev chose column G "Whsl" at 99%, followed by one Category or Gender card per style with the number of rows it covers and Confirm and Change buttons.

Review

A reviewer checks every file before the items are listed. I built the review screen as a grid of the mapped rows, with a list of issues beside it.

In the sample file, three rows have the sizes YM, YL and Youth 14-16. Those sizes are not in the taxonomy. Boo marks the three cells red and lists one issue, "Size not in Ghost taxonomy". A click on the issue filters the grid to those three rows.

Boo uses two colors.

  • Red. The upload rejects the value. It breaks an upload rule, or it is not in the taxonomy.
  • Amber. Jev was not sure of the value, or a recommended field is empty.
Boo review grid filtered to three rows. Their size cells, YM, YL and Youth 14-16, are red. In the side panel the issue "Size not in Ghost taxonomy" is selected and reads "Showing only these rows".

Results

The team has run Boo on more than 870 supplier files since it went into production in March 2026. It replaced a vendor's tool on a monthly contract.

  • Vendor's tool$11,000Monthly contract of about $11,000
  • Boo$31Claude Sonnet $29, Jev $2
  • Saved$10,96999.7% less

Supplier files run with Boo, May to September 2026

  1. 194May
  2. 159June
  3. 149July
  4. 129August
  5. 189September

Learnings

  • Items of one product share a Category and a Gender. Asking once per product cut the questions to the model by 4.7 times.
  • With the recent introduction of decision models like Jev, the multiple-choice questions go to a decision model. The LLM does the open-ended work, which is writing the rules for each file.
  • Asking once per product has a cost. One wrong Category lands on every item of that product.
  • Boo cuts the check down to the flagged cells, and a person still checks every file.

Back to work