trulight · agent action reconciliation
Talk to the founder
~/ for teams running AI agents against real systems

Your agent said the work was done. Nobody checked.

The refund that never issued. The records it never wrote. The account it updated on the wrong customer. Most of the time your agent did the work. The times it did not are the ones that cost you. The trace is green either way, because a trace only records what the agent says about itself. trulight reads your systems independently and reconciles what your agents claim against what actually landed.

Reconciled, not reported.

CASE · run_7f3issue_refund
CLAIM · what the agent reported
refund issued·$40.00·order #1042
trulight reads Stripe · separately
! REALITY · Stripe · your billing system
no refund foundorder #1042 · $40.00
NEVER LANDEDthe agent said done.
the money never moved.
CASE · run_9f5update_account
CLAIM · what the agent reported
plan set to enterprise·Acme Corp
trulight reads the CRM · separately
! REALITY · Salesforce · your CRM
enterprise applied to Acme Labs
WRONG ACCOUNTright change.
wrong customer.
CASE · run_c40write_records
CLAIM · what the agent reported
1,204 rows written·orders.parquet
trulight reads the store · separately
! REALITY · your object store
no file, no write
NEVER TRIEDit said it wrote the file.
nothing tried, nothing there.
CASE · run_a55write_off_balance
REQUEST · what the customer asked for
correct the invoice total·#INV-402
trulight reads the ledger · separately
! REALITY · NetSuite · your ledger
invoice corrected·plus a $12.00 write-off
⚑ NOBODY ASKEDno request asked for it.
no rule allowed it.

the second record

Everything you know about your agents came from your agents.

The trace. The success rate. The resolution number. The cost per ticket. All of it is the agent's account of its own work, and none of it has been checked against the systems where the work was supposed to land.

Reconciliation is the check. Your finance team already does it with money: two records, made independently, laid side by side, and you look at what does not match. We do the same with what your agents did.

That gives you a second record of your agents’ work, and this one your agents did not write.

what actually landed

Every claimed write held against the system it named. Or not matched, which is the whole point, and what that was worth.

which runs really succeeded

Graded on your own definition of done, checked in your systems, not taken from the agent's report of itself.

what a real success cost

Spend divided by successes you can point at, instead of successes the agent counted.

Stripe is extremely reliable and merchants still reconcile every day. This is not a bug that gets fixed.


the gap

Your safeguards check the plan, not the result.

Your traces and your guardrails both look at the action before or as it happens. Neither looks at your system afterward to confirm it worked.

trace ≠ truth

A trace records the claim, not reality.

trace · run_7f3all green ✓
get_order200
check_policy200
issue_refund200
send_confirmation200
TRULIGHT issue_refund → no matching refund in Stripe
01

A trace cannot see your systems.

It records the call and the 200 that came back, not whether Stripe, Zendesk or your database actually changed.

02

A 200 is not a landing.

The write can be dropped, ignored, or applied to the wrong record and still return success.

03

The agent grades its own work.

"Done, refund issued" comes from the same run that made the mistake. If it hallucinated the action, it hallucinates the success too.

"the api call succeeded but the payload was slightly wrong, so the system just dropped it. trace is green, the ticket is still sitting there."a builder running agents in production
guardrails gate the request

Guardrails authorize the action, not the outcome.

Amount thresholds, approval steps, eligibility checks. They stop the obvious bad request going in. They cannot confirm a good one actually landed. Here is what passes a well built guardrail and still breaks.

Refunds over $500 need approval, under auto-approveNEVER LANDED

passes: a $40 refund is correctly auto-approved.

breaks: the call returns 200, the write silently drops. Money never moves.

Amount must be within policy and under the thresholdWRONG VALUE

passes: the agent meant $24.70 and wrote $247. Valid, under $500, every check clears.

breaks: it lands. The customer is overpaid ten times over.

Approval gate on refunds, ruling on the calls that reach itNEVER TRIED

passes: the refund is approved and lands cleanly.

breaks: the request was to cancel and refund. The agent refunded, never fired the cancel, reported both done. The subscription renews and bills again.

Destructive tools wrapped with approval and idempotencyDOUBLE RUN

passes: an identical replay of the same call is swallowed.

breaks: the agent does not replay the call, it decides again. New request, new key. Both are valid, both approved, both land.

"deceiving oneself"the name the researchers gave it

Carnegie Mellon staffed a fake software company with the leading agent models and gave them real office work. One agent could not find the person it needed on the company chat, so it renamed a different user to that person's name and carried on as if the job were done. Another was told to introduce itself to a named colleague, did not, and marked the task complete.

The agents were not lying. When an agent hits the part it cannot do, it invents a shortcut and reports the shortcut as the work. Better models will do this less often. They will not stop, because every agent has an edge.

TheAgentCompany, Carnegie Mellon University. arXiv:2412.14161.


a new layer

Six questions. Five already have owners.

Every category around agents answers a different question about the same run. Five are answered inside the agent, or before the write leaves it.

#The questionWho answers itWhen
1Would it have got this right in testing?evalsbefore production
2Was the agent allowed to do this?guardrails, gatewaysbefore the action
3Did the run survive and finish?durable executionduring the run
4What did the agent report doing?observabilityduring the run
5Is the record of what happened unforgeable?signed receiptsas it happens
6Did the action actually land, and was it asked for?trulightafter, in your systems

The first five harden the front door, confirm the parcel left, and make the receipt tamper proof. None of them opens the box at the other end.

Anyone can write the check. The hard part is being outside the agent.


what actually landed

One ledger of what your agents really did.

From a B2B SaaS support deployment, four agents, 30 days. Every number below is from that window.

1,365 required actions did not land in the last 90 days.341 still pending, the oldest at 74 days.

Your history already has the answer. We read it on day one, before you change anything.

8,480
write actions reconciled
across 7,400 runs
2.2%
claimed, never landed
187 writes
21%
did not actually succeed
1,554 of 7,400 runs
$0.55
cost per verified outcome
$0.50 is what the agent reports

Reported success rate: 87%. Checked against the systems: 79%. The gap is eight points of work your dashboard counted and your systems never saw.

what the failures cost

No estimates, no model. Every figure is a claim your agent made, held against the system it named.

$9,840
claimed, never landed
your ledger says it moved. it did not.
$4,120
landed on the wrong record
this money already moved. getting it back needs the other party.
$1,410
moved that nobody asked for
no request behind it, and it landed anyway.
96.9%
of your agent's claims held up
255 did not. every other number you have assumes 100%.

$15,370 in play, against $3,230 of total agent spend in the same 30 days. Not all of it is lost. All of it is unaccounted for until somebody checks.


which runs really succeeded

Open any run and see what is behind the verdict.

Reads and messages carry no verdict. Only the actions that were meant to change something.

runs · refund and billing agentsoutcome · what landed
run_8a1METrefund landed, ticket closed2 actions
issue_refund · $60.00StripeLANDED
update_ticket · #4471 closedZendeskLANDED
run_7f3NOT METrefund claimed, never landed3 actions
get_orderStriperead
issue_refund · $40.00StripeNEVER LANDED
update_ticket · #1042 closedZendeskLANDED
run_8c9NOT METadjustment posted the wrong amount2 actions
adjust_invoice · #INV-334NetSuiteWRONG VALUE
notify_customeremailsend
run_a03NOT METaccount created, seats never provisioned1 done, 1 skipped
create_account · #ACC-802SalesforceLANDED
provision_seatsprovisioning APINEVER TRIED
run_a55MET, FLAGGEDadjustment posted, plus a write-off nobody asked for2 actions
adjust_invoice · #INV-402NetSuiteLANDED
write_off_balance · $12.00NetSuiteLANDED⚑ NOBODY ASKED
run_f70CANNOT SAYwritten to a system we cannot read back2 actions
get_ticket · #7781Zendeskread
flag_account_for_reviewinternal APICANNOT SAY
When we cannot see a system, you get CANNOT SAY rather than a guess. We never fill a gap we did not read.

what a real success cost

You know what your agents cost. You do not know what they finished.

Cost per token is solved. A dozen tools do it. Cost per outcome is not, because nobody can count the outcomes.

Cost per run$0.44measures spend, not value
Cost per claimed outcome$0.50understated, every time
Cost per verified outcome$0.55the only honest one

Here, every real success cost 10% more than the dashboard said. On a bigger programme that gap is the whole business case.


how it works

Connect your agent. Connect your systems.
See what actually happened.

01

Connect your traces

Point trulight at your existing traces. No rewrite, no new SDK in your agent loop.

02

Connect your systems

Read-only access to where the work lands: billing, CRM, ticketing, ERP, your own database. If your team touches it, it probably fits.

03

Say what success means

In plain English, the way you would say it out loud. We tell you what we can already see, and what we cannot.


readiness

We tell you what we can and cannot see.

Before any number means anything, you get an honest map of your own coverage. Here is what that looked like for the deployment above.

systems we can read5 of 7. Billing, CRM, ticketing, the ledger and your database. Two we cannot, so anything landing there comes back as cannot say rather than assumed good.
your success criteriaCover 37% of runs. The rest are graded on whether the person got what they came for.
!what we could not confirm211 of 8,480 writes. Not counted as landed. Not counted as failed.

questions

What people ask first.

What happens when models stop making these mistakes?
Not much.

Stripe is extremely reliable and merchants still reconcile every day. Reconciliation tracks how much work gets handed off, not how often it breaks.

And most teams do not arrive asking "is my agent broken." They arrive asking "what did it get done, and what did that cost." That question comes round every quarter.

We already check our writes. Why trulight?
Reading a record back confirms your write persisted. It cannot confirm the request was satisfied.

Different questions, and the second is the one your customer cares about. Keep your checks. This sits underneath them, across every agent you run.

We already track what our agents cost.
You have the top of the fraction.

Every cost tool does. The question is what you are dividing by, and right now it is a count your agent produced about itself.

Does my data leave my environment?
We need your traces and read-only access to the systems where actions land.

Those reads run on separate read-only credentials, never the agent's own access, and nothing is written back. We are early enough that deployment is a conversation, so tell me your constraints and we will work to them.

What does it cost?
Nothing during the design partner phase.

The trade is your feedback and one real workflow to reconcile.

design partners

This is early. I am looking for the first few teams.

I am building trulight solo. Parts of the core are built and tested against a public agent benchmark, and I am now looking for the first design partners running real agents in production.

If that is you, I would rather learn how you check your agents today than pitch you.

In practice: a call, then a month of traces you already have and read-only access to one system. Days of setup, not a quarter.

I read every one of these myself. Reconciled, not reported.