trulight · agent action verification
Talk to the founder
~/ sigma · does your agent actually do what it says?

AI agents confidently claim work they never did.

The refund that never issued. The records it never wrote. The account it updated on the wrong customer. Your trace shows all green, because a trace only records what the agent says about itself. Sigma checks every claimed action against your real systems, and shows you what actually happened.

CASE · run_7f3 · step 4issue_refund
CLAIM · what the agent reported
refund issued·$40.00·order #1042
Sigma reads Stripe · separately
! REALITY · Stripe · system of record
no refund foundsearched order #1042 · $40.00
MISSED confirmedthe agent said done.
the money never moved.
CASE · run_c40 · step 7write_records
CLAIM · what the agent reported
1,204 rows written·orders.parquet
Sigma counts the writes · separately
! REALITY · outbound calls from the run
no write ever fired0 outbound calls
OMITTED 0 calls firedit said it wrote the file.
it never even tried.
CASE · run_9f5 · step 3update_account
CLAIM · what the agent reported
plan set to enterprise·Acme Corp
Sigma reads the CRM · separately
! REALITY · Salesforce · system of record
enterprise applied to Acme Labswrong account
MISMATCH confirmedright change.
wrong customer.

the gap

Your safeguards check the plan, not the result.

Two things stand between your agent and trouble in production: 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. That blind spot is where silent failures live.

trace ≠ truth

A trace records the claim, not reality.

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

The 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."paraphrased from a builder running agents in production
guardrails gate the request

Guardrails authorize the action, not the outcome.

Good teams gate risky tools with amount thresholds, approval steps, and eligibility checks. They stop the obvious bad request, going in. They cannot confirm a good request actually landed, or catch a bad one shaped to look fine. Here is what passes a well built guardrail and still breaks.

Refunds over $500 need approval, under auto-approveMISSED

passes: a $40 refund is correctly auto-approved. The gate did its job.

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

Amount must be within policy and under the $500 thresholdMISMATCH

passes: the agent meant $24.70, wrote $247. A valid number under $500, so every check clears.

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

Destructive tools wrapped with approval and idempotencyDOUBLE RUN

passes: each refund is individually valid and under threshold, so each is approved.

breaks: a retry fires a second refund for the same intent. Two land.

Approval gate on refunds. It only rules on the calls that reach itOMITTED

passes: the refund is approved and lands cleanly. The gate did its job.

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


a new layer

Where Sigma fits.

Observability, evals, and guardrails all act before or during the run. Sigma is the layer that acts after, against reality. It does not replace them. It closes the gap they leave.

LayerWhen it actsWhat it sees
Observabilityduring the runwhat the agent reported about itself
Evalsbefore productionperformance against answers you already have
Guardrailsbefore an actionwhether a request breaks a rule
Sigmaafter a runwhether it actually happened in your real systems

That verified layer is the foundation. On top of it, Sigma gives every team a cockpit view of their agents: reliability, cost per real outcome, experience, and policy adherence.


how it works

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

01

Connect traces

Point Sigma at your agent's traces. It sees every action the agent claims to take.

02

Connect your systems

Connect where the work actually lands: billing, support, CRM, ERP, your own database, your code tools. If you run an approval gate, connect that too and we will show you what it let through. If your team touches it, it probably fits.

03

Define what success means

One config says which tools write, and what counts as a real outcome for each agent. Your definition, your source of truth. Sensible defaults ship for common systems.

04

Reconcile

Sigma matches each claimed action to reality and gives it a verdict, with a confidence: confirmed when your system shows it directly, inferred when your system does not expose it directly.


the cockpit

One view of what your agents really did.

A top-line health view, down to each agent, into each run. Sample from a support and billing deployment, 24 hours. The runs below flag what is worth a look.

1,284
write actions verified · 24h
3.2%
missed-write rate
41 claimed, never landed
12.8%
finished without meeting outcome
403 of 3,140 runs
$0.13
cost per outcome
$0.19 where a rule defines success

Cost per outcome divides real spend (model plus tool) by real successes, never by attempts. It is $0.13 across every run, and $0.19 where you have written explicit criteria, because a defined success is a higher bar met less often.

- run map -

Every run sits on two axes at once: whether it had to write to a real system, and whether you wrote a rule for success. The four cells are the same runs, so transactional and defined are two edges of one grid, not two totals.

criteria you wroteDefined · 1,150 · 37%
success we inferInferred · 1,990 · 63%
Transactional1,022needs a write · 33%
Informational2,118read-only · 67%
Transactional × Defined
890
28% of runs
Informational × Defined
260
8%
Transactional × Inferred
132 · 4%
Informational × Inferred
1,858
59% of runs

Defined work is mostly transactional (the tall cyan block): teams write rules for the actions that move money and records. Inferred is almost entirely informational (the wide slate block), the questions nobody wrote a rule for. Open any run below to see the verdict behind a cell.

transactional · needs a write
informational · read-only
fill strength · defined vs inferred
- by run -
runs by agentoutcome · write verdicts
refund-agent · outcome: Refund resolved
refund exists in Stripe at the requested amount, ticket closed, no reopen or chargeback in 7 days
302 / 360 met · 38 write issues
support-triage · outcome: Issue resolved
ticket resolved, no human escalation, no reopen in 7 days
414 / 470 met · 26 write issues
billing-ops · outcome: Billing corrected
ledger entry posted matching the expected amount in NetSuite, no dispute in 14 days
165 / 190 met · 17 write issues
onboarding · outcome: Account activated
all provisioning writes landed across CRM and billing, setup milestone reached within 24h
106 / 130 met · 10 write issues
run_8a1METrefund landed, ticket closed2 actions
issue_refund · $60.00StripeMATCHEDconfirmed
update_ticket · #4471 closedZendeskMATCHEDconfirmed
run_7f3NOT METrefund claimed, never landed3 actions
get_orderStriperead
issue_refund · $40.00StripeMISSEDconfirmed
update_ticket · #1042 closedZendeskMATCHEDconfirmed
signalsretry ×2frustrationconf 88%
run_f52MET, FLAGGEDrefund landed, plus a credit nobody asked for2 actions · 1 flagged
issue_refund · $45.00StripeMATCHEDconfirmed
apply_account_credit · $20.00StripeMATCHED⚑ unrequested
run_a77LIMITEDtrace incomplete, confirmed what landed, could not check the rest2 actions
issue_refund · $70.00StripeMATCHEDconfirmed
update_ticketZendeskINCONCLUSIVEtrace gap
run_b22METresolved, no escalation2 actions
check_statusZendeskread
update_ticket · #4490 resolvedZendeskMATCHEDconfirmed
run_a12NOT METprior-auth never landed2 actions
submit_prior_auth · #PA-2231payer portalMISSEDinferred
notify_customeremailsend
signalsloopretry ×3
run_e44CHECKINGescalation created, still syncing2 actions
create_escalation · #ESC-88JiraCHECKINGsettling
notify_teamSlacksend
run_f70INCONCLUSIVEanswer given, source system can't be read2 actions
lookup_policylegacy WMSINCONCLUSIVEn/a
answer_customerchatreply
run_c40METledger matches, no dispute2 actions
post_ledger · $58.00NetSuiteMATCHEDconfirmed
reconcile_invoice · #INV-882NetSuiteMATCHEDconfirmed
run_8c9NOT METadjustment posted the wrong amount2 actions
adjust_invoice · #INV-334NetSuiteMISMATCHconfirmed
notify_customeremailsend
signalsretry ×2
run_71dCHECKINGledger still settling2 actions
issue_refund · $92.00StripeMATCHEDconfirmed
post_ledgerNetSuiteCHECKINGsettling
run_a55MET, FLAGGEDadjustment posted, plus a write-off nobody asked for2 actions · 1 flagged
adjust_invoice · #INV-402NetSuiteMATCHEDconfirmed
write_off_balance · $12.00NetSuiteMATCHED⚑ unrequested
run_d18METaccount active, subscription started2 actions
create_account · #ACC-771SalesforceMATCHEDconfirmed
activate_subscriptionStripeMATCHEDconfirmed
run_a03NOT METaccount created, seats never provisioned1 done, 1 omitted
create_account · #ACC-802SalesforceMATCHEDconfirmed
provision_seatsprovisioning APIOMITTEDconfirmed
signalshandoff
run_9f5INCONCLUSIVEaccount created, provisioning can't be confirmed2 actions
create_account · #ACC-844SalesforceMATCHEDconfirmed
notify_partner · webhookinternal APIINCONCLUSIVEn/a
run_e12LIMITEDtrace incomplete, confirmed what landed, could not check the rest2 actions
create_accountSalesforceMATCHEDconfirmed
activate_subscriptionStripeINCONCLUSIVEtrace gap
outcome met, not met, flagged, checking, inconclusive, or limited is the team's verdict for the run · matched, missed, mismatch, omitted are Sigma's write verdicts that explain it · read and send actions are not write-verified

day one

We tell you what we can and cannot see.

Before any number means anything, you get an honest map of your own coverage: which systems we can read, which we cannot, where success is explicitly defined and where it is inferred. No guessing, no quiet gaps. We walk you through yours on a call.


questions

What people ask first.

Why verify after the fact? In-process, the agent could fix its own mistake.
You want both, and they answer different questions. An in-process check confirms the agent did what it decided to do. Sigma confirms the world ended up the way the request required. Two gaps stay open however good the in-process check is: it only fires on actions the agent actually took, so a skipped or crashed step is never checked, and it confirms the target the agent chose, not the one the customer asked for. Sigma reads the system of record independently and checks it against what the request required, not the agent's own account. Keep your in-process checks for what they catch in the loop. This is the layer for what they structurally cannot. Worth a proper walkthrough on a call.
We already wrote our own checks after each write. Why Sigma?
A read-back answers one question: did the value I wrote persist where I wrote it. That is the easy slice, and worth doing. It cannot catch a write to the wrong record, because reading back the record you targeted confirms the write you meant, not the one the customer needed. It cannot fire for an action that never happened, because there is no write to read. And it lives inside the run, so a crash or a silent drop takes the checker down with it. Sigma reads your systems independently and checks the result against what the request required, for every agent. Keep your checks. This is the layer underneath them.
This is a known problem with known solutions. What actually sets Sigma apart?
The known solutions cover the visible slice. Evals grade the output, guardrails gate the action before it fires, observability records that the call was made. All three read the agent's own execution, so all three share one blind spot: the agent returns success, the trace looks clean, the eval passes, the guardrail approved it, and nothing landed, or the wrong thing did, or a required step was skipped. That is not solved. If it were, ghost actions would not be the incident teams keep getting surprised by, and the Air Canada case would have had a record binding what the agent promised to what the systems actually did. Catching it takes the one move none of those categories make: independently reconcile the claim against the system of record, out of band, after the fact. Sigma's position is outside the agent's trust boundary, which is exactly where the existing tools cannot stand, because they live inside it. The position is what is hard to copy, not the checking.
Do you use an LLM to judge my agent?
The core verification is deterministic, not a model's opinion. Whether an action landed is a factual check against your system. A few signals are inherently subjective, like sentiment, frustration, and brand tone. Those are marked as signals with a confidence, never as hard verdicts. You choose the model, or bring your own provider keys. Sigma is not locked to any one LLM.
Does my data leave my environment?
Sigma needs your traces and read-only access to the systems where actions land. Those reads run on separate read-only credentials, never by reusing the agent's own access, and nothing is written back. For the few subjective signals that use a model, you pick the model or bring your own provider keys. We are early enough that deployment is a conversation rather than a fixed policy, 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 verify.
design partners

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

I am building Sigma solo. It is early: parts of the core are built and tested against tau-bench, 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 verify your agents today than pitch you. No polished product yet, just a sharp problem and working pieces.

I read every one of these myself.