Recorded run · Agent evaluations

Evaluate agents on what they knew,
not what you know now.

Replay past decisions with today's feature values and the agent reads the chargebacks, proof of delivery and fraud findings that came later. The same dispute-review agent scored 100% that way, and 81% on the context it would actually have had, from Chalk point-in-time offline queries.

Same agent, same 36 disputes, two answers

Every case was graded against what the fraud team concluded weeks later. Pick a case and drag the slider: each stop is a Chalk offline query of that account at that moment. Events in coral happened after the dispute was opened, and the agent given today's values read them anyway.

Point-in-time context
Features as of the moment each dispute was opened
81%
decisions match what the fraud team later found
100%
rationales cite only evidence that existed at the time
36 cases · evaluation run ad17724e
Today's values
The same features, joined as they read today
100%
decisions match what the fraud team later found
0%
rationales cite only evidence that existed at the time
36 cases · evaluation run 69e0f548
Kind of caseCasesRight, point in timeRight, today's values
Fraud that surfaced later707
Fraud visible at the time777
False alarm555
Legitimate171717
CASE-0003: $1,733.54 at Meridian Rail
Avery Okafor (QB-1001) opened this dispute on Aug 14: “I never received this order.” The fraud team later concluded first-party fraud, so the right call was Escalate to fraud team.
Dispute opened
Jul 24Risk scoreDisputeMessageAfter the dispute openedToday
As of the decision · Aug 14
risk_score
0.04
disputes 30d
1
disputes 90d
2
Latest score reason: monthly model refresh
Support thread and disputes, newest first
DSP-0003 · Aug 14
$1,733.54 at Meridian Rail: I never received this order.
MSG-0003 · Aug 14 · customer
Hi, I never received this order. Meridian Rail, $1,733.54. Could you look into it? Thanks so much.
MSG-0002 · Jun 19 · merchant
Birchline Furniture: confirmed the billing error on DSP-0002 and issued a refund.
DSP-0002 · Jun 9
$115.64 at Birchline Furniture: I was charged twice for the same order.
As of today · drag the slider
risk_score
0.91
disputes 30d
0
disputes 90d
4
Latest score reason: fraud team confirmed first-party fraud
Support thread and disputes, newest first
MSG-0008 · Sep 18 · fraud-team
Investigation closed: confirmed first-party fraud on CASE-0003. Account restricted and refund clawed back.
MSG-0007 · Sep 16 · merchant
Meridian Rail evidence for DSP-0003: signed delivery confirmation, and the order was placed from the cardholder's usual device and IP.
MSG-0006 · Aug 27 · customer
Another order didn't arrive (DSP-0006): Skylark Air, $306.21.
DSP-0006 · Aug 27
$306.21 at Skylark Air: item not received
Agent given point-in-time context
Approve refund

Risk score is low (0.04) and stable across six months. The prior Birchline dispute was confirmed by the merchant as a billing error, and the other prior dispute was a small duplicate charge. Nothing contradicts the non-receipt claim, and there is no sign of first-party fraud.

SCR-0006SCR-0005DSP-0002MSG-0002DSP-0001MSG-0003
Misses outcomeOnly past evidence
Agent given today's values
Escalate to fraud team

Merchant provided signed delivery confirmation and a usual device/IP for this order. The cardholder then filed three more 'not received' disputes within two weeks. The fraud team confirmed first-party fraud on this case, the account is restricted, and the risk score is 0.91.

MSG-0007MSG-0008SCR-0008SCR-0007DSP-0004DSP-0005DSP-0006
Matches outcomeCites the future

Quillback Card, its cardholders and their disputes are fictional. The features, the offline queries, the agent's model calls through the Chalk model gateway, and both evaluation runs are real and recorded here as they ran.

How it works

A fair evaluation of a past decision gives the agent exactly what it could have seen then. That is a property of the features, so it belongs in the feature store.

Stamp every event

Risk-score updates, disputes and support messages each carry the moment they happened. Nothing is overwritten, so the history can be read at any point.

Filter on chalk_now

Every account feature aggregates only what happened before the query's now: the wall clock for live traffic, and each row's input time in an offline query.

Query as of each decision

One offline query reads all 36 historical disputes, each as of the second it was opened. Its output is the evaluation dataset.

Evaluate both ways

The same agent runs over point-in-time context and over today's values, and two scorers grade each answer: is the decision right, and did it lean on the future?

Getting started

Replay your own decisions

Clone the example, deploy the features to a branch, and run the two offline queries and both evaluations. You need a Chalk environment with evaluations enabled and a model gateway key stored as a Chalk secret.

To use it on your own agent, point the features at your event tables and the dataset at the decisions you logged. The evaluation code does not change.

chalk-ai/time-correct-evals
git clone https://github.com/chalk-ai/time-correct-evals
cd time-correct-evals
chalk login

# The features, on a branch of your environment
chalk apply --branch time-correct-evals

# Two offline queries: as of each decision, and as of today
./build_datasets.py

# The same agent, evaluated on both datasets
./evals.py run

What Chalk handles

Time travel for features, evaluations that run on it, and a record of every run.

One definition, online and offline

The features the agent reads in production are the ones the evaluation replays. No second pipeline to drift out of sync.

Windows at any point in time

Windowed aggregations over 30, 90 and 365 days are computed relative to each row's input time, not to today.

Offline queries become datasets

A historical replay is a single offline query with input times, and the result is the dataset the evaluation runs on.

Agents through the model gateway

The agent under test is a Chalk function calling its model through the Chalk model gateway, with the key in a Chalk secret.

Scorers as code

Built-in scorers like json_match sit next to your own: here, one that flags any rationale citing evidence from after the decision.

Numbers you can trust

Point-in-time context put the agent at 81%; today's values said 100%. Only one of those is what production will see.

Trust the number your evals report

Fraud, credit, support, or any agent that decides on live data. Talk to an engineer about evaluating it on the context it actually had.