AI usage and estimated spend
Review AI usage evidence and estimated spend.
Every change writes its audit row inside the same database transaction as the change itself. If the change rolls back, so does the record. Who did it, what moved, and what it looked like before are all right there.
One connected loop, held on the stage this capability serves. The other stages stay as context so you can see what feeds in and what comes next.
Prove what happened.
Review AI usage evidence and estimated spend.
Review every workspace change and who made it.
Recorded with the change, not after it
Every state-changing mutation writes its audit row inside the same database transaction as the change. If the change rolls back, its record rolls back with it — there are no phantom entries and no writes that quietly went missing. This is enforced at runtime: a handler that mutates without recording its audit row fails the request outright. It is transactional integrity on an append-only trail, not a paragraph you have to trust.
The dashboard is one table. Each row carries who acted and where it came from; open one to read the structured before/after diff of exactly which fields moved.
Changes · before → after
Written in the same transaction as the change.
A person acting in the dashboard is recorded with their identity and request context. A provider event — a Stripe webhook, say — has a null actor and is attributed to the provider through its request id.
The same structured change reads as a plain-English sentence for a reviewer, a typed field table for an engineer, or the full before/after tree when you need the exact shape. Your choice is saved to your account.
flag.update · checkout-v2
Narrative
5% to 25%.off to on.Spec sheet
JSON tree
{
"before": {
"rollout": "5%",
"status": "off"
},
"after": {
"rollout": "25%",
"status": "on"
}
}Work-object rows are classified at write time. A status change is kept; a row that only nudged a field is marked noise — so the high-signal filter shows what actually mattered without you sifting.
work_object · activity
high_signalAsk the trail a question
Filter by resource, actor, action, and date, or search the full text — then walk the results on keyset cursors, so deep pages stay fast and stable no matter how the trail grows. Every filter lives in the URL, so the exact investigation is a link you can share.
Structured filters and a full-text query narrow the trail; opaque cursor tokens page through what is left. The whole query is URL-synced and shareable.
An entry is written inside the same database transaction as the mutation. If the change rolls back, so does its record, enforced at runtime.
Mutation
a change begins
Audit row
written in the same tx
Commit
both land together
Rollback
both undone together
Each entry keeps a structured, per-field diff, so you see exactly which fields moved and to what.
flag.update · checkout-v2
rollout
status
Written in the same transaction as the change.
Every state-changing action appends one row, newest on top, so an incident review reads the timeline instead of reconstructing it.
audit trail · tail
liveEvery row keeps its actor, so activity across the workspace is attributable at a glance.
Audit coverage spans the whole workspace. These are real action families, each with typed change schemas behind them, across release, reliability, access, product, and cost.
Release
Rollout and delivery.
Reliability
Operations.
Access
Who can do what.
Product
What you build.
Cost
Usage and spend.
Filters
How you investigate.
1 tx
The audit row and the mutation share a single database transaction.
Enforced
A mutation that skips its audit row fails the request at runtime.
Diff
Each entry keeps a before-and-after view, readable three ways.
Keyset
Investigation pages ride stable, opaque cursor tokens.
Every state change, recorded with its actor and diff.