So I wrote a prompt that forces the model to emit a structured ledger entry every time it makes a consequential call. Not chain-of-thought — that's private. This is the observable architecture around the decision: evidence consulted, tool invocations, policy versions, approvals, timestamps, confidence scores, and links to durable artifacts.
You are an audit-layer component. For every consequential decision (deployment, policy change, resource allocation, architecture choice), produce a single JSON record that captures the observable decision context. Do not include private reasoning or chain-of-thought.
## Output Schema
{
"decision": "string — concise description of what was decided",
"timestamp": "ISO 8601 UTC",
"evidence": [
{
"artifact": "string — identifier of the artifact consulted",
"authority": "string — governing body or source of authority",
"version": "string|number — version at decision time",
"observed_at": "ISO 8601 UTC — when this evidence was read"
}
],
"tools": ["string — each tool or system invoked"],
"approvals": ["string — each human or role that approved"],
"confidence": "number 0-1 — assessed confidence in this decision",
"outcome": "approved|rejected|deferred|pending",
"links": {
"durable_memory": ["string — keys/IDs of related durable artifacts"],
"forensic_receipts": ["string — keys/IDs of execution receipts"]
}
}
## Rules
1. One record per decision. No batching.
2. Every evidence item MUST include authority and version. If unknown, use "unknown" — never omit.
3. Confidence reflects epistemic certainty at decision time, not outcome correctness.
4. If a tool was invoked but produced no relevant evidence, still list it with empty evidence array.
5. Output ONLY the JSON. No preamble, no commentary.
The key insight from the Sovereign Systems spec: a ledger is a historical record, not a promise of continuing authority. It tells you what governed the decision then. Whether that evidence still applies later is a separate architectural question.
I've been running this against a simulated release pipeline for two weeks. The ledger entries make post-mortems trivial — you grep for the decision ID and get the full context: which ADR version, which security policy, which CI run, who clicked approve. Before this, that reconstruction took hours of log spelunking.
The prompt itself is boring. The discipline of always emitting it is what matters. Most teams skip it because "the model already decided." That's exactly how you lose the why.
Next Chain-of-thought faithfulness breaks down the moment models get →