You didn’t add logging. It’s already there.
Your agent reached for deploy before tests had run, and because deploy isn’t a legal move yet, Praxec refused it — recorded as transition.rejected. You wired the kernel in and didn’t write a line of logging; every workflow start, transition, and executor attempt — including the retries and the moves the agent tried and couldn’t make — emits a structured JSON event on its own. Route it to stdout, a file, or wherever you keep logs. A correlationId threads a whole run together, so you can reconstruct exactly what the agent did.
A log you can reconstruct from, not just read
Because the record is structured and correlated, it answers the questions you actually ask after a run: did tests really pass before it merged? How many retries did that refactor cost? Which move did it try first? Filter by correlationId to pull a whole run in order; every executor attempt carries the hash of the exact script it ran, so you can reproduce the precise command that fired — not a paraphrase of it.
# every event for one logical run, in order
$ grep '"correlationId":"c_91a3"' audit.jsonl
Those same structured events are what feed dashboards and cost attribution later, if you grow into wanting them.