Poisson Tasks is out. Find where your agent breaks before your users do. Read the launch
Poisson Labs

Poisson Labs · Integrations

Bring the stack you already run.

Poisson reads what your evals, your agent framework and your cloud already produce. We onboard a small number of teams at a time and set up every integration your stack needs with you, before your first run.

Talk to us

Your evals and traces

  • DeepEval
  • Ragas
  • promptfoo
  • Inspect
  • OpenAI Evals
  • Braintrust
  • Weave
  • LangSmith
  • Lemma
  • OpenTelemetry
  • JUnit
  • CSV or JSON Lines

Your agent

  • OpenAI Agents SDK
  • LangGraph
  • CrewAI

Your cloud

  • AWS
  • GCP
  • Azure
  • Your machine
  • Modal

Poisson

  1. Break hunts for the conditions that make your agent fail, with Monte pointing it where failure is likely.
  2. Trace reads the runs you already have, step by step.
  3. Prove reruns every condition before and after a change, on the same seeds, with a test per condition corrected for testing them all at once.

What you get

A verdict per condition

  • Improved
  • Regressed
  • Too small to tell, with the limit

In CI, the check fails on a regression.

CI. The check is a command, so it runs wherever your pipeline does: GitHub Actions or any runner that can call one. It fails when a condition is significantly worse.

Compute

At scale, in your own cloud.

Prove runs a sweep across a cluster in your own AWS, GCP or Azure account. The sweep file declares the nodes, the price, the stop and the cap, and Prove enforces them before the run, during it and after.

On 2026-09-29 a 40-condition pair, 1,024 runs per condition per version, ran on four nodes in AWS us-east-2: 40,960 rows each, none errored. The four conditions that had been planted worse were the four called worse, with a limit line of 4 points.

A worked example

Already on DeepEval? Keep it, and ask whether the difference is real.

Two runs, nothing changed, half a point apart.

Two DeepEval runs of the same HumanEval agent, 56 minutes apart, with nothing changed on purpose. The second failed 0.47 points more often, and Trace’s test, stratified by input, says the difference is real: p = 0.036. It can’t say why: the version and the hour changed together.

$ poisson-trace-import deepeval humaneval-a.json.gz \    --store ./store --run humaneval-a \    --metric "Tests Passed" --cut recorded --case name# …the same for humaneval-b, 56 minutes later$ poisson-trace fix-check humaneval-a humaneval-b \    --store ./store --event missed --inputs all --max-mde 0.02old  10496 runs  failed 12.7%new  10496 runs  failed 13.2%p = 0.036 · +0.47 points (+0.04 to +0.90)different the new version failed more2 of 328 inputs flagged: HumanEval/129, at both temperatures

Under the hood

DeepEval You score two versions of your agent with DeepEval and get two pass rates. The reader finds out whether the difference between them is real.
Takes in
DeepEval's saved test run (test_run_<time>.json, .latest_run_full.json, or the wrapped .latest_test_run.json when it holds results), one file per version; a metric name; DeepEval's own recorded threshold or a declared cut with its side; what identifies a case.
Gives out
A store run per version with one row per test case, met or missed, the score kept on the row; then fix-check and changes. Nothing imports DeepEval, no metric runs, no model is called, no prompt or answer text is kept.
Worked example
The HumanEval pair written through DeepEval 4.2.6 with a custom metric over stored test results (the files are DeepEval’s, the metric is ours, and the page says so first): 164 problems at two temperatures, 32 runs each, 10,496 test cases per file, one agent run twice 56 minutes apart with nothing changed. DeepEval reports 9,158 of 10,496 passed, then 9,109. fix-check: different, the new run failed more, p = 0.036, +0.47 points (+0.04 to +0.90); by input, p = 0.127; 2 of 328 cases flagged, both HumanEval/129.
Command
poisson-trace-import deepeval FILE [FILE ...] --store ROOT --run NAME
        --metric NAME
        --cut ( recorded | X ( --below | --above ) )
        --case ( name | input | position )
        [--started ISO-8601] [--json]
Not in it
Not one of DeepEval’s model-judged metrics; not Confident AI; not DeepEval’s SQLite store; not files from versions other than 4.2.6, which are untested.
The page
The full walkthrough, mirrored from the Trace repository.
Ragas You score two versions of your system with Ragas and compare two means. The reader finds out whether the difference is real, or whether the run was too small to tell.
Takes in
The score table you saved from Ragas (result.to_pandas() written as CSV, JSON Lines, JSON or Parquet, or an @experiment file), one or more files per version; one score column; a cut with its side; the column that names the case.
Gives out
A store run per version with one row per row of the table, met or missed; a row with no score has no outcome, is left out, and is counted in the report’s header. Then fix-check and changes. Nothing imports Ragas, no metric runs, no model is called, and nothing is kept of any column but the two you name.
Worked example
Two published result sets, a base model and the same model fine-tuned, on the same 150 rows of 146 questions, at a cut of 0.5 written down before any was run. Faithfulness (means 0.550, then 0.566): too small to tell, p = 0.629, could not have detected a drop in the share of misses below 15.9 points, and three repeats per question or 356 questions would settle it. Answer correctness: different, the new version failed less, p = 0.011, −13.3 points (−23.1 to −3.6). Answer relevancy: different, failed less, p = 0.009, −11.3 points (−19.3 to −3.4). Three scores at one cut are three tests. A second example shows a score Ragas could not give: 1,130 of 1,800 cases left out and counted, and no significant difference on the 670 left (p = 1.000, could not have detected a drop below 1.7 points).
Command
poisson-trace-import ragas FILE [FILE ...] --store ROOT --run NAME
        --metric COLUMN
        --cut X ( --below | --above )
        --case-column COLUMN
        [--started ISO-8601] [--json]
Not in it
It does not compare means; it compares the share of cases that missed the cut. With one run per case no single case can be flagged. Tables from Ragas versions other than 0.4.3 are read by their column names and no test runs another version; the version that scored the published pair is not stated.
The page
The full walkthrough, mirrored from the Trace repository.
Framework capture What the runtime stores per episode, measured on one reference agent per framework.
FrameworkAgentModel callsTool callsInstrumented with
OpenAI Agents SDK521["openai_agents"]
LangGraph621["langchain"]
CrewAI221["crewai", "openai"]

Both instrumentors are needed. The CrewAI instrumentor alone stores the crew, the agent step and the tool and no model call; the OpenAI instrumentor alone stores the two model calls and nothing else, and the episode reads unanswered. Verified on reference agents; pinned versions are in the docs.

Modal Prove’s Modal backend: a sweep across parallel containers from an image spec.

Infrastructure retries and a cost guard, landing the same rows in the same store as the local backend. The HumanEval pair on the Prove page ran on it: runs 20260905T185407Z-0313 and 20260905T195009Z-18ac.