How durable the record is
Postern writes the record in the background, so the write never slows an agent down and a dead database cannot break a read. The defaults: flush every 1000 ms or at 100 buffered entries; 100 entries per insert; a queue that holds 10,000; at most one insert in flight. Three things stop an entry before it reaches the table.Nothing enforces immutability
Postern only ever adds to the record. Append-only in practice: the only statement the code runs againstaudit_log is an insert. Nothing updates or deletes a row.
- An erase keeps the record. Erase is a real hard delete and touches domain rows only. The record of the act survives the act, and never held the values.
- A revoked agent keeps its rows.
agent_idis plain text with no foreign key, so the history does not go with the grant. - Nothing ages out. There is no retention job in the repository.
What the record cannot tell you
- Whether it is complete. Nothing in a row says an entry is missing.
- How many entries exist. No total, no count endpoint. A filtered-empty view can say whether older pages exist, and nothing more.
- Which key made a call, after a rotation.
agent_idis a name, not a key identity. A new key under the same name inherits the earlier key’s history. - What a read returned. Only how many rows.
- Anything about a call that was never made. That cuts the useful way too. An agent that claims work it never did leaves no row for it. Witnessed on ChatGPT — 50 seconds of progress text, an answer that said it had no data, and 0 calls recorded. Trust the record over the answer.
Next
The audit log
what one row holds, what gets a row, and what does not
Read the record
the ledger screen and
GET /api/audit — filters, paging, and Export CSV