Lesson 07 · 6 min
The Audit Trail, and the Book Today
WorkflowSteps chain events into a replayable history. Fold the line and you get today's position.
The auditor's question
Eighteen months in, Goldman's risk desk gets the question every desk eventually gets: why does this position say USD 6,000,000, who approved the October change, and when exactly did Pershing Square drop off the trade? In most shops the answer is a week of spreadsheet archaeology. Here it is a walk along the line you have been drawing all module, because every event travels inside one more wrapper: WorkflowStep, the envelope that records who said what, when, and in reply to which earlier step.
WorkflowStep is the envelope
It wraps the
businessEventwitheventIdentifiers, at least onetimestamp, thepartyandaccountcontext, andmessageInformation: the difference between an event and a message about an event.The chain is explicit
previousWorkflowSteppoints each step at the one before, so the history is a linked chain rather than a pile of records sorted by hope.lineagecan also reference related trades and steps directly.Corrections append, never overwrite
actionisNew,Correct, orCancel. A bad booking is fixed by a new step that says Correct; the bad step stays on the chain, visibly wrong and visibly corrected.Position is a fold
Nothing in the model stores "the current book" as authority. Today's position is derived by replaying the line, which means any party holding the same events computes the same book. Disagreement becomes a diff, not a dispute.
One step, on the wire
{ "businessEvent": "… the October partial termination …", "eventIdentifier": [ { "assignedIdentifier": [ { "identifier": "PSLP-EVT-008214", "version": 1 } ], "issuer": "QW46WU5Y2RDY41BTIO66" } ], "timestamp": [ { "dateTime": "2026-10-15T14:02:11Z", "qualification": "eventCreationDateTime" }, { "dateTime": "2026-10-15T14:02:43Z", "qualification": "eventSentDateTime" } ], "action": "New", "party": [ "… Pershing Square, Goldman Sachs …" ], "previousWorkflowStep": "… the July reset's step, by reference …", "messageInformation": { "messageId": "5821647", "sentBy": "QW46WU5Y2RDY41BTIO66" }}
timestamp is required and plural because "when did this happen" has many true answers: created, sent, submitted, confirmed. EventTimestamp forces each one to say which it is.The book today
Now fold the line. Born at USD 10,000,000 at execution. Two resets recorded, the contract untouched. Down to 6,000,000 in the October unwind. Reset again. Novated to Bank of America. Replay those events and Goldman's book today reads: USD 6,000,000, facing Bank of America, with every number on that line traceable to an event, every event to a step, every step to timestamps and a sender. The answer to the auditor is not an explanation. It is the data, replayed.
timestamp into EventTimestampQualificationEnum. Twelve named clocks, and now you know why a trade needs all of them.01A booking error from last week is fixed by:
◆ Keep learning
More modules are coming
Drop your email and be the first to know when a new module ships.
◆ Feedback