ワンクリックで
ledger
Answer a cross-run audit question against the receipt ledger, returning matched receipts and a chain-verification result.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Answer a cross-run audit question against the receipt ledger, returning matched receipts and a chain-verification result.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Governed runtime for agent skills: discover and install portable skills, run bounded skill graphs with explicit authority, and inspect signed receipts for what happened.
Audit a sealed runx receipt for governance, comparing the authority a run exercised against what it was granted, and flag over-reach, ungated mutation, unrecorded refusals, or exposed secret material.
Verify the receipt ids behind a normalized authority-usage summary, compare that evidence with granted scopes, and propose the narrowest grant the evidence supports.
Read durable reflect projections, group repeated signals by skill, and emit validated handoffs to skill-lab improve when the evidence clears configured floors.
Review receipts and harness failures to propose bounded skill improvements.
Read Runx's native receipt history and skill catalog, then return deterministic run outcomes, catalog test coverage, and governance follow-ups without model-authored metrics.
| name | ledger |
| description | Answer a cross-run audit question against the receipt ledger, returning matched receipts and a chain-verification result. |
| runx | {"category":"security"} |
Answer one audit question against the whole receipt ledger, and prove the chain behind the answer.
runx seals a receipt for every run. Those receipts accumulate into a ledger: every act, every approval, every refusal, across every principal and every skill, in sealed order. When an auditor asks "did anyone spend over $500 last week", "how many sends did this principal authorize", or "which runs touched the billing scope", the answer lives in that ledger. This skill turns the question into a ledger query, returns the receipts that match by id, and, when asked, verifies that the matched stretch of the chain is intact. It reads; it never writes.
ledger applies an explicit bounded query over receipt ids, principal, skill
ref, status, and time range, then returns the receipts that satisfy it as
id-keyed stubs (receipt_id, skill_ref, status, created_at, verification
status), never a
receipt body. When proof asks for it, the skill confirms the matched stretch of
the chain is intact, naming any break by the receipt ids involved. The chain is
the proof; a count that looks plausible is not. The skill answers the question in
one or two sentences grounded only in the matched set and the verification
result, and stops with needs_more_evidence when the ledger is silent rather
than reporting a fabricated zero.
The default read runner is a read-only front to the shipped receipt engine. It
shells runx history --json to list matched receipts from the
sandbox's own receipt store (rooted at RUNX_RECEIPT_DIR) and, when proof is
requested, runx verify --json for each matched receipt's tree verdict. It is
the in-sandbox way for an agent to read its own sealed receipts before a gated
action, with no caller-supplied stubs. It projects to id-stubs only and never returns a
receipt body, act payload, or secret field.
The read runner accepts one optional receipts input: explicit ledger rows
for replay or controlled evaluation. When present it uses those rows directly
instead of shelling runx history, which is how the inline harness seeds a
deterministic ledger without a populated store.
It queries and proves history across many runs; audit-receipt audits the
integrity of a single receipt chain. Its nearest neighbor is
run-history, which also reads the ledger but returns deterministic platform
outcome and catalog-coverage metrics and routes them to governance
lanes. ledger answers one precise audit question with the receipt ids that
match and a verified chain walk, not an aggregate health report.
audit-receipt; that
is the integrity-of-one-chain question, not the cross-run history question
ledger answers.least-privilege.run-history.needs_agent.skill_ref,
status set, and time_range. An absent filter means the question alone bounds
the query.needs_more_evidence and name the query that found
nothing.proof requests chain verification, take the chain verdict from the
engine's tree-rooted verify report (runx verify), not a hand-rolled link
walk: intact follows the report's overall validity, and each break is
derived from a tree's missing parent or a verification finding, named by the
receipt ids involved. When the engine has no verify keys
(RUNX_RECEIPT_VERIFY_KID / RUNX_RECEIPT_VERIFY_ED25519_PUBLIC_KEY_BASE64
absent), it cannot prove production signatures, so the chain is reported
unverified (checked: true, intact: null), never silently intact. When
proof is absent, set chain_verification.checked to false and leave
intact null.summary that answers the question from the
matched set and the verification result only. The question bounds the answer;
do not generalize from the matched slice to the whole ledger.ledger_answer with decision: answered.needs_agent; there is nothing to query.needs_more_evidence with the resolved query,
so the gap is the query, not a silent zero. Silence is a stop, not a zero.needs_more_evidence; do not guess a near match.decision: answered but set
chain_verification.intact false and list the breaking id pairs from the
verify report; an intact answer set with a broken chain is still a reportable
result.chain_verification.intact null with
checked: true; the chain is unverified, not intact.needs_more_evidence for the match, not a chain claim over nothing.ledger:read scope only and no gate can widen it.ledger_answer:
decision: answered | needs_agent | needs_more_evidence | refused
question: string # the audit question, restated in operational terms
query: # the resolved filter actually run, so the answer reproduces
principal: string
skill_ref: string
status: array
time_range:
from: string
to: string
matched_receipts: # id-keyed stubs only; never a receipt body
- receipt_id: string
skill_ref: string
status: string
created_at: string
chain_verification:
checked: boolean # was verification requested
intact: boolean | null # null when unchecked
breaks: # empty when intact
- from_receipt_id: string
to_receipt_id: string
reason: string
summary: string # one or two sentences answering the question
The ledger_answer object is the named packet runx.ledger_answer.v1. Scope is
ledger:read only; no gate is required because the skill cannot mutate, and a
delete, redact, reseal, or reorder request is refused, not gated. The run's own
receipt carries the question, the resolved query, the matched count, the list of
matched receipt_id values, and the chain-verification result; it carries no
matched receipt body, principal PII, or secret material. Matched receipts are
always referenced by id.
Input: "Which spend runs over $500 sealed for the ops principal last week, and is
that stretch of the chain intact?" with a filter scoping principal:ops,
skill_ref runx/spend, status sealed, and the 2026-06-01 to 2026-06-08
window, plus proof: { verify_chain: true }.
Output: decision: answered. The resolved query is echoed for reproducibility.
matched_receipts lists two sealed spend stubs by id with skill_ref, status,
and created_at, no bodies. chain_verification reports checked: true,
intact: true, breaks: [] from the engine's tree-rooted verify verdict over
the store. The summary reads: two sealed spend runs over $500 ran for
principal:ops in the window, and the verify verdict is intact. Had the window
matched zero receipts, the run would stop at needs_more_evidence naming the
query, not report a clean zero. Run through the read runner, the same answer
comes straight from runx history/runx verify over the sandbox's own store;
when the verify keys are absent the chain is reported unverified rather than
intact.
question (optional): the audit question bounding the ledger read. Without
one the runner returns needs_agent and does not query.filter (optional): JSON narrowing the query by principal, skill_ref,
status, time_range (from/to), and limit (default 500, maximum 5000).receipt_ids (optional): up to 100 exact receipt ids to resolve and verify.proof (optional): JSON requesting chain verification over the matched
receipts, for example { "verify_chain": true }.receipts (optional): explicit ledger rows for replay or
controlled evaluation; when present the read runner uses them instead of
shelling runx history.