Traces
Follow one task from the message that started it to the verdict that billed it: every Action records who did it, for whom, how and on what.
A trace is every Action one Task took, in order. Each Action records by, for, via, on and thing, so the trace is a query, not a log someone has to keep.
What each Action records
| Field | Holds | Example |
|---|---|---|
by | The Worker that acted | Harbor Residential's agent |
for | The Party it acted for | Harbor Residential |
via | The channel or Interface | email |
thing | The record it acted on | The lease for unit 5C |
status and reason | Where it stands | done, or pending with awaitingAction |
An Evaluator's verdict, an Approval's answer and every model call sit beside the Action they belong to.
Read a trace
The builder lists one customer's Actions for a day on api.sb:
import { $ } from 'startup-builder'
const actions = await $.Action.list({ where: "for = 'cus_BNY3PShL26' and createdAt >= '2026-10-06'" })The Customer reads its own trace in its Portal, or from api.leaseline.app with its own key. It sees its Tenant's Actions only.
Why traces matter here
A Customer disputes a notice: "your agent offered a concession nobody here set". The trace shows the draft, the price Approval, who approved it and when. The question ends in one read.
A failed Evaluator verdict in a trace becomes an eval case. Add it before the fix, so the next Version proves it.