Every decision, queryable.
One append-only record of everything that happened: what was imported, what was drafted, what was held, what was refused and why, what went out and when. An audit trail you can hand a broker.
The spine.
- Shape
- Append-only. Nothing is edited and nothing is deleted, including the refusals.
- What is on it
- Every import, assessment, draft, guardrail verdict, approval, send and refusal, with the reason attached rather than only the outcome.
- What is built from it
- The morning briefing, “what happened with Nancy”, what a thread cost, the flow graph, and the compliance record. All five are queries over this one table.
- What survives a reset
- The log and the recordings. Clearing a conversation drops threads and messages and KEEPS the imported leads, because a retry that costs a re-import is a retry nobody makes.
The log is the spine, not a feature bolted to the side
The briefing, “what happened with Nancy”, the cost meter and the compliance record are all queries over the same log. There is no second store that could disagree with it.
Which means a step that does not emit an event does not exist as far as the product is concerned. That is a deliberately harsh design: it makes an unlogged action impossible to build by accident, because the thing you built would simply not appear anywhere.
What is on it
- Imports: what came in, how many rows, how many were textable.
- Assessments: what Lewis concluded about a lead and when.
- Drafts: proposed, edited, approved, skipped, dictated.
- Verdicts: every hold and every block, with the rule that fired.
- Sends: what went out, to whom, at what time.
- Refusals: including the ones nobody asked about, like a compose refused because a lead was marked do-not-contact.
Why append-only
Because the value of a compliance record is entirely in the fact that it cannot be tidied up afterwards. A log you can edit is a log that says whatever the last person to look at it wanted it to say.
Entries are added. Nothing is rewritten and nothing is deleted, including a flagged problem, whose position in the sequence is half of what it means.
Message rows and log events are deliberately not the same thing. Recording both put every bubble on the transcript twice, so the log carries the decisions and the thread carries the words, and each is read from the place that owns it.
If a step does not emit an event, it does not exist.
The flow graph is generated from the log, so a part of the product that records nothing simply does not appear in it. That is stronger than a convention, because it is visible.