The action ledger

Every autonomous action lands in a row with its run id, its cost, a one-line summary and the value it changed — so 'what did it do last week' is answerable and undoable.

What it is

One table with a row per action. Kinds are write_post, generate_hero, publish_post, apply_proposal, update_page_meta and reprioritize. Each carries status (ok, failed, skipped), the subject it acted on, a human summary, a detail blob, the value BEFORE the change as the rollback source, the cost in cents, and the report id when the action came from a proposal. Actions from one cron pass share a run id.

Also called: what did it do · audit trail · undo automation · activity log

See it
The action ledger
CustomerBuildingAmountStatus
Gideon AltBarndominium$1,390Open
Ivy BrubakerBarndominium$13,360Sent
Marlin Hoover30×40 Garage$3,860Open
Delia Yoder40×64 Shop$3,670Approved
Marlin Hoover30×40 Garage$2,910Paid
The 'What it did' feed: status dot, kind, one-line summary, timestamp and cost, over the last 14 days. Sample data — no customer information appears here.
How it works
  1. 1AutonomyRun.record() is the only writer — it is also what charges the budget, so spending without a trace is impossible.
  2. 2beforeValue holds the prior state: a stub's outline before it was rewritten, a post's draft status before publish, a slot's date before it was freed.
  3. 3A ledger write failure is caught and logged loudly rather than taking down the work it describes, because an unrecorded autonomous action is the exact thing the module exists to prevent.
  4. 4recentActions(days) feeds both the panel's 14-day feed and the weekly email's 'what I did' block.
  5. 5Rows are indexed by site and time, by kind, and by run id.
Why we built it

The migration states the principle: "Nothing autonomous happens without a LEDGER ROW. 'What did it do last week' must be answerable, and reversible." The before-value column is what makes the second half true — the publisher stores { status: draft, published_at: null } as the rollback source, and the writer stores the original outline, so a post rewritten by the machine can be put back the way a human planned it.

The problem
  • Autonomous changes left no trace of what they replaced.
  • Cost and activity were tracked in different places and could disagree.
  • Failures were invisible unless someone read the logs.
Sound familiar?
What you get
A dated, costed line for every autonomous action
The previous value is stored, so changes can be reversed
Failed and skipped actions are recorded, not just successes

See it on your own jobs

Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.

or keep browsing features →