name: run-report description: Assembles the report on what the run did — steps run, steps skipped with their reasons, verifier result, and everything needing a human's eyes. Built from the manifest, the verifier and the ledger, never written as prose. Use as the final step of Phase B, on every run.
Run report
The deliverable is the report, not the artifacts. It is how Kathryn knows what happened without opening seven files.
Never skipped
Run the verifier first
py verifyrun.py engagements/
It checks the manifest against the filesystem: every unconditional step ran, every RUN produced a real artifact stamped with the right ledgerId, every SKIP named a reason from the closed list.
Exit 1 blocks the report. Do not write around a failure and do not explain it away. Go back and run the step. A report that says PASS on a failed run is the one output that makes everything else untrustworthy.
Assemble, do not compose
Three structured inputs and nothing else:
run-plan.json— what you declared before producing anythingverify_run.pyoutput — what actually landedledger.json— the flags, recorded while the transcript was still in front of you
By the end of a run you are the least reliable narrator in the system, so you do not get to describe your own work from memory here. Every line comes from a file.
Shape
SESSION: [engagement] · [date] · [type]
LEDGER: [ledgerId] · [n] claims · [n] hedged · gate CLEAR
VERIFY: [PASS | FAIL — failing check]
DID
- [step → artifact path]
DID NOT, AND WHY
- [step → reason from the closed list]
NEEDS YOU
- [consent flags, contradictions, scope events, interpreted dates,
unconfirmed names, open questions, advisor notes — in that order]
WAITING ON THEM
- [client commitments, with owner and date state]
WAITING ON YOUR YES
- [each draft and where it is]
UNOWNED
- [work that surfaced and belongs to a different function]
Ordering rule
NEEDS YOU is ordered by what costs most to get wrong, not by what is easiest to describe. Consent flags first — a decision made after someone left the call is a relationship problem, and it outranks every fact error underneath it.
Output
engagements/, and returned in the conversation.