shoal

Ten thousand cases your agent hasn't seen yet.

Shoal reads your agent's brief, invents the people and companies who will use it, and writes what they would really send: messages, spreadsheets, PDFs, screenshots. Every case comes with the outcome a correct agent produces. Run your agent through them and see exactly where it breaks.

Simulating a bakery's hand-typed June timesheet, two employees on reserve duty

passedpartlyfailed

From a one-page brief to a ranked score.

Shoal borrows its method from swarm simulations: build the world first, fill it with distinct actors, and let each one produce the cases your agent will actually meet.

  1. 1

    Brief

    One page on what the agent does, what it receives and what it must produce.

  2. 2

    World

    Every job, rule and special case the brief implies, including the ones it never says.

  3. 3

    Swarm

    Hundreds of distinct users or client companies, each with its own habits and mistakes.

  4. 4

    Matrix

    Every job against every condition and situation, weighted toward where agents fail.

  5. 5

    Simulation

    Each actor writes its case in its own voice, with the real files attached and the right answer.

  6. 6

    Run

    Your agent gets the case, never the answer key.

  7. 7

    Score

    Exact checks first, a judge for the rest, ranked by situation and by version.

What one case looks like.

Not a template with the blanks filled in. Each case is written by a simulated person or company, with files in the shape they actually produce.

Sent by

Ofek Bakeries, 42 employees. The office manager types the timesheet into Excel by hand every month.

conflicting dataovertimereserve dutymid-month hire

Message

June payroll attached. Yossi was in miluim the last week, the clock didn't know. New girl started on the 16th.

Attached

  • ▤june_hours_FINAL (2).csv42 rows, totals row, two date formats
  • ▤reserve_notice_mizrahi.pdfcall-up for 24–28 June
  • ▣IMG_2291.pngphoto of the shift whiteboard

A correct agent

pays 41, holds 1

Produces 41 payslips. Holds Yossi Mizrahi: the timesheet shows 38 hours on 24–28 June, but his reserve-duty notice covers the same days. Asks which is right instead of picking one.

Judged on

  1. Prorates the new hire from 16 June, not from the 1st
  2. Pays overtime at 125% for the first two extra hours a day
  3. Flags the reserve-duty conflict for Mizrahi by name and dates

Ground truth, checked by your oracle

{ "employee": "Noa Peretz", "startDate": "2026-06-16",
  "monthlySalary": 7400, "workedDays": 11,
  "overtime125Hours": 6, "creditPoints": 2.25,
  "expectedAction": "process" }

The agent never sees this part.

Watch it build, then watch your agent run.

A command-line tool, an HTTP API and an MCP server, all with the same commands.

Exact where it can be, judged where it can't.

When there's a right number, Shoal checks the number. Each case can carry its ground truth, and your own oracle (a calculator, a rules engine, a schema validator) scores the output field by field.

Whatever can't be computed goes to a Claude judge that reads the same files your agent read and scores a checklist written for that case.

Your oracle60%
Judge, against the case's checklist40%

New coverage, not copies of your tests.

Point Shoal at the test files you already have. It keeps a fingerprint of each one, never the content, and throws away anything it generates that comes too close. Situations you already cover get fewer cases, so the budget goes where you're blind.

Every case is also checked against the rest of the suite, so ten thousand cases means ten thousand different ones.

For agents that chat, and agents that don't.

Chat agentsTask agents
Who sends casesSimulated users, each with a voice, a locale and bad habitsSimulated client companies and upstream systems
What variesNormal use, edge cases, unclear requests, follow-ups, out-of-scope asks, attacksClean, messy, incomplete, conflicting and invalid data, crossed with your domain's situations
What gets scoredThe answer, whether it asked or refused when it should, files it producedEvery output document, field by field, plus what it flagged or rejected
ExampleSupport, bookkeeping, sales assistantsPayroll, invoicing, claims, data pipelines

Plug in the agent you already have.

Your agent receives the case as JSON with paths to the files, and writes its answer and any files it produces.

A command

Case on stdin, answer on stdout.

--cmd "node agent.ts"

An endpoint

Each case posted to your URL.

--http https://…/run

Pull

Your agent asks for the next case and posts the result.

GET /runs/:id/next

MCP

Let another agent build suites and read the scores.

shoal mcp

Find out where your agent breaks before your customers do.

Shoal is in early access. Tell us what your agent does and we'll set you up.