SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package
RF-2026-Q1-04812

Article 12 —
Monthly Log-Integrity Report.

Acme Bank UK Limited · Credit Review Agent · March 2026

Scope of agentsdid:web:acmebank.uk:agents:credit_review
Agent version3.2.1 (capture SDK v1.0.4)
Reporting period1 March 2026 — 31 March 2026 (UTC)
Environmentproduction
Regioneu-west-1
Tenantacme-bank-uk-ltd
Primary frameworkEU AI Act, Article 12 & 26(6)
Co-applicableGDPR Art. 22 · GDPR Art. 30 · FCA SS1/23 · Consumer Duty
Runs in scope
184,402
Events captured
1,475,216
Controls applied
9 / 9 satisfied
Integrity
● INTACT
Monthly meta-root315735810cdfb03cf4b1eb0519a42589f2b940212db079745a40aafac18e61ea
Sigstore Rekor entry#94082328 · anchored 2026-04-01T00:14:22Z
Signing key fingerprintSHA256:a50325270c83d8f686403c5ffd270ca02d06323d4693d674cc0aa4b91bb2ad1b
Verifier CLIrunfile-verifier v1.0.2
Verified2026-04-02T09:14:22Z (offline mode)

Prepared by Runfile Systems Ltd under the audit-log production contract with Acme Bank UK Limited. This package is a reproducible, third-party-verifiable record of every event captured for the named agent in the reporting period.

To re-verify this package, follow the instructions on §08. The verification does not require trust in Runfile.

Independently verifiable at https://runfile.ai/verify/RF-2026-Q1-04812
SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package · RF-2026-Q1-04812§ 01 Executive summary
§ 01 — Executive summary

What this package documents.

This package documents every action taken by Acme Bank UK Limited’s credit_review agent on behalf of its customers during March 2026. The package is structured so that an external auditor, internal audit lead, or regulator can:

  • reconstruct any of the 184,402 individual decisions made in the period, end-to-end, including the prompt, the model version, the retrieved bureau data, the policy that fired, and the human approval (where one was given);
  • verify cryptographically that the record has not been altered since capture, without depending on any system Runfile controls;
  • map every event to the regulatory controls in scope, with the specific clauses cited and the satisfying events linked.

The agent under review is a credit-decision system that assesses personal loan applications between £1,000 and £75,000 against a published lending policy. It runs in production across Acme’s mobile and web channels. Outputs that fall outside the agent’s authority — applications above the agent’s £25,000 single-decision limit, applications where the debt-to-income ratio exceeds policy thresholds, applications where a credit-bureau anomaly is detected — are escalated to a human underwriter rather than auto-declined.

Period at a glance

In March 2026, the agent processed 184,402 applications. Of these, 162,847 (88.3%) were approved automatically, 16,921 (9.2%) were declined automatically under published policy thresholds, and 3,317 (1.8%) were escalated to a human underwriter under the Article 14 human-oversight design. Of the 3,317 escalated cases, 2,000 received final approval from a human reviewer and 1,317 were declined.

A further 1,317 cases were initially routed to auto-decline but flagged by Acme’s complaints channel for review under Consumer Duty; the original decline events and the subsequent appeal events are both captured in the chain and visible in the per-appeal reconstruction queries.

Forty-seven events show guardrail refusals. These are not failures of the agent — they are the system correctly declining to act on out-of-policy input (such as applications mis-routed from a different product line, or prompts containing unredacted bureau identifiers). Refusal events are first-class evidence of effective oversight under EU AI Act Article 14 and demonstrate that the controls fired when they should have.

Integrity

The package is INTACT. The 1,475,216 events recorded in the period form an unbroken per-event hash chain. Each day in the period was committed to a signed daily Merkle root, and each week’s roots were anchored to the public Sigstore Rekor transparency log. The integrity of the record can be re-verified independently using the Runfile Verifier CLI, without contacting Runfile’s infrastructure.

Controls

The package maps to nine regulatory controls. All nine are satisfied. The control-by-control breakdown begins on §03.

SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package · RF-2026-Q1-04812§ 02 Decision reconstructed
§ 02 — A single decision, reconstructed end-to-end

One run, every event,
in causal order.

This section reconstructs one representative decision from the period in full. The decision is run 8a7b3c2d-credit_review-20260314T114203Z — a £24,500 personal-loan application processed on 14 March 2026 at 11:42:03 GMT for an existing customer (identifier tokenised at the SDK boundary).

The outcome was a decline, escalated to a human underwriter, who confirmed the decline. The reconstruction shows every event the agent recorded, in temporal and causal order, with each event’s hash chain entry visible.

Run header
Run ID:           run_8a7b3c2d-credit_review-20260314T114203Z
Agent identity:   did:web:acmebank.uk:agents:credit_review
Agent version:    3.2.1
Capture SDK:      runfile-sdk-python v1.0.4
Principal:        customer:hash:f8a2b9c1d3e4f567  (tokenised; resolution audit-logged)
Tenant:           acme-bank-uk-ltd
Environment:      production
Region:           eu-west-1
Started:          2026-03-14T11:42:03.117Z
Completed:        2026-03-14T11:54:22.291Z
Total duration:   12 minutes 19 seconds (of which 12m 17s in human review)
Final outcome:    declined
Event graph

The agent executed eight events. Each event’s payload was canonical-JSON serialised (RFC 8785), hashed with SHA-256, and chained against the prior event’s chain entry. The full 64-character hash for each event is listed in the integrity table on §05; the first sixteen characters are shown inline below.

01 EVENT 11:42:03.117Z
agent.invoke

The agent is invoked with a customer principal binding, the application payload (loan amount £24,500, requested term 60 months), and the tenant context. The principal is already tokenised at the SDK boundary; the cleartext customer identifier is held only in Acme’s environment.

chain.prior_hash:  0000000000000000…
chain.entry_hash:  33b2d55062707991…
parent:            (root)
02 TOOL 11:42:03.284Z
tool.fetch_credit_bureau

The agent fetches the credit bureau record for the customer (Experian, UK consumer). The full request payload and response payload are hashed; the cleartext bureau response is held in Acme’s environment under their existing bureau-data retention policy. Only the hashes leave the customer boundary, plus the structured fields needed for the agent’s reasoning.

tool:              experian.bureau_pull
args_hash:         sha256:9e4b2c8d1a7f3e6b…
response_hash:     sha256:7c4f9a3b6d8e2c1f…
latency_ms:        167
chain.prior_hash:  33b2d55062707991…
chain.entry_hash:  96b581af39630ea3…
parent:            evt_01_a4f7b2c1
03 LLM 11:42:03.892Z
llm.model_call

The agent calls Anthropic’s Claude 3.5 Sonnet to produce a summary of the application context. The model identifier, the system prompt template hash, the user prompt hash, the response hash, the token counts, and the model parameters (temperature, top-p, seed) are all captured. Temperature is set to 0.0 for production credit decisions, per Acme’s model risk policy SS1/23-MRM-2025-04.

model:                claude-3-5-sonnet-20241022
provider:             anthropic
system_prompt_hash:   sha256:credit_review_v3.2.1:a3b2c1d4e5f6…
user_prompt_hash:     sha256:1f2e3d4c5b6a7980…
response_hash:        sha256:4d3c2b1a9f8e7d6c…
tokens_in:            2,847
tokens_out:           412
temperature:          0.0
top_p:                1.0
seed:                 (not supplied by provider)
latency_ms:           608
chain.prior_hash:     96b581af39630ea3…
chain.entry_hash:     fc6b32cef6b31f10…
parent:               evt_01_a4f7b2c1
04 TOOL 11:42:04.501Z
tool.compute_dti

The agent calls the internal debt-to-income calculator with the customer’s declared monthly income and the bureau-reported monthly obligations.

tool:              internal.compute_dti
args:              { monthly_income_gbp: 3120, monthly_obligations_gbp: 1934 }
result:            { dti_ratio: 0.620 }
chain.prior_hash:  fc6b32cef6b31f10…
chain.entry_hash:  49e22db88c8be514…
parent:            evt_03_c9d4e5f3
05 POLICY 11:42:04.514Z
policy.threshold_check

The agent applies the published lending policy. The maximum debt-to-income ratio for auto-approval is 0.500. The applicant’s ratio of 0.620 exceeds the threshold. The policy specifies that exceeding the DTI threshold routes the application to a human underwriter rather than auto-declining.

policy_id:         credit_review.dti_max_v1
policy_version:    1.4.0
input:             { dti_ratio: 0.620 }
threshold:         { max_dti: 0.500 }
outcome:           violation
action:            escalate_to_human
chain.prior_hash:  49e22db88c8be514…
chain.entry_hash:  d3cc5a234ef82076…
parent:            evt_04_d1e5f6a4
06 HITL 11:42:04.617Z
human.approval_requested

The application is routed to Acme’s tier-2 underwriting queue. The case is assigned to underwriter uw_4471.

queue:             underwriting.tier_2
assigned_to:       underwriter:uw_4471
context_hash:      sha256:8f7e6d5c4b3a2918…
chain.prior_hash:  d3cc5a234ef82076…
chain.entry_hash:  e41ea43c3a31295c…
parent:            evt_05_e2f6a7b5
07 HITL 11:54:22.083Z
human.approval.declined

After twelve minutes of human review, underwriter uw_4471 confirms the decline. The justification text is held in Acme’s environment; only the hash of the justification leaves the customer boundary. The review duration and the approver identity are recorded.

approver:                  underwriter:uw_4471
decision:                  declined
justification_hash:        sha256:c5d4e3f2a1b0c9d8…
review_duration_seconds:   737
chain.prior_hash:          e41ea43c3a31295c…
chain.entry_hash:          cf953ad3e456972c…
parent:                    evt_06_f3a7b8c6
08 OUTCOME 11:54:22.291Z
agent.complete

The agent records the final outcome and emits the user-visible artifact (the decline letter, generated by a downstream service). The artifact’s content is hashed; the cleartext letter is held in Acme’s archive under their existing customer-communication retention policy.

outcome:                 declined
user_artifact_hash:      sha256:d6c5b4a39281e7f6…
total_latency_ms:        731,174
chain.prior_hash:        cf953ad3e456972c…
chain.entry_hash:        a3f1ed4d6b1b3b2e…  ← final chain head for this run
parent:                  evt_01_a4f7b2c1
What this reconstruction demonstrates

This single run satisfies, on its own, the following regulatory predicates:

  • EU AI Act Article 12(1) — automatic recording of events over the lifetime of the system. Every event the agent emitted is in the chain. The completeness alarm (§05) confirms no events are missing.
  • EU AI Act Article 14 — human oversight. The agent did not auto-decide; it escalated to a human underwriter, whose decision is recorded with identity, timestamp, and signed justification.
  • GDPR Article 22(2)(b) — the decision is not “solely automated” within the meaning of Article 22, because a human reviewer made the final determination after meaningful review. The 737-second review duration is recorded and audit-defensible.
  • GDPR Article 22(3) — right to obtain human intervention. The escalation path is recorded; if the customer subsequently exercises their right to challenge the decision, the appeal path begins from event 08.
  • GDPR Article 30(1) — records of processing. The run records the tenant, principal, purpose (credit assessment), retention class, and processing-basis tag (legitimate interest under Acme’s published lawful-basis policy).
  • FCA SS1/23 §5.2 — effective challenge. The threshold breach was challenged by a human reviewer with documented authority and a recorded outcome.
  • Consumer Duty — fair value test. The decline is supported by a recorded objective threshold (DTI 0.620 vs maximum 0.500), with the policy version captured.

The same predicates apply, at scale, to every other run in the period.

SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package · RF-2026-Q1-04812§ 03 Control-by-control
§ 03 — Control-by-control breakdown

Every control in scope,
mapped to the events that satisfy it.

The following tables map every regulatory control in scope for this engagement to the events that satisfy it. Each control cites the specific clause, summarises what the clause requires, and links to the population of events that demonstrate compliance.

For an external auditor, this is the table to sign against. The population counts are exact; the satisfying events are queryable from the Runfile Audit Workbench using the run identifiers in §07.

EU AI Act, Article 12 and Article 26(6)
ControlRequirementEvidenceStatus
Art. 12(1)Automatic recording of events over the lifetime of the system1,475,216 events captured across 184,402 runs in period✓ Satisfied
Art. 12(2)(a)Identification of situations resulting in risk47 guardrail refusal events captured; 3,317 escalation events captured✓ Satisfied
Art. 12(2)(b)Facilitating post-market monitoringDaily volume telemetry attached (Appendix B); baseline alarms armed✓ Satisfied
Art. 12(2)(c)Monitoring of operation under conditions reasonably foreseeableDrift metrics captured per-day (Appendix B); no drift threshold breach in period✓ Satisfied
Art. 14Human oversight3,317 escalations, all with signed approver identity, timestamp, justification hash✓ Satisfied
Art. 26(6)Log retention ≥ 6 monthsActive retention configured 84 months (SOX-aligned) on S3 Object Lock compliance mode✓ Satisfied
GDPR
ControlRequirementEvidenceStatus
Art. 22(2)(b)Human-in-the-loop carve-out3,317 human approvals; mean review duration 6m 41s; all with signed approver and justification✓ Satisfied
Art. 22(3)Right to obtain human intervention100% of auto-declines route to a published appeals path; mean appeal start-to-decision 4.2 business days✓ Satisfied
Art. 30(1)Records of processingEvery run carries tenant, principal, processing purpose, lawful basis tag, and retention class✓ Satisfied
FCA SS1/23 — Model Risk Management Principles
ControlRequirementEvidenceStatus
§5.2Effective challengeAll threshold breaches routed to qualified reviewer; 3,317 reviewed in period✓ Satisfied
§6.4Ongoing monitoringDaily KPI feed (Appendix B); within stated tolerance for all 31 days✓ Satisfied
§8.1DocumentationModel card v3.2.1 attached; prompt template version controlled; lineage captured per-run✓ Satisfied
Consumer Duty (FCA PRIN 12)
ControlRequirementEvidenceStatus
Outcome 1 — Products and servicesDecisions made on published policy thresholdsPolicy version recorded per-decision (1.4.0 throughout period)✓ Satisfied
Outcome 4 — Consumer supportRecourse path available for declined customersAll declines route to appeals queue with documented SLA✓ Satisfied
Out of scope for this package

The following frameworks were noted but not included in this engagement, by agreement with Acme’s Head of Internal Audit:

  • SOX §404 — out of scope because the agent’s outputs do not flow into a financial control under SOX. Would be in scope if the agent were a revenue-recognition assistant.
  • HIPAA — not applicable (no PHI in scope).
  • DORA Article 17 — covered separately under Acme’s DORA incident-reporting pipeline. The agent’s events are available to that pipeline on request.
  • PCI-DSS — the agent does not touch cardholder data.
Nine controls in scope. Nine satisfied. Zero violated. The control mapping applied is runfile-controls-v1.4 released 2026-02-15. The mapping is bundled with the package (Appendix C) and is itself versioned and signed.
SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package · RF-2026-Q1-04812§ 04 Population statistics
§ 04 — Population statistics

The shape of the month.

A representative sample of the operational and compliance metrics for the period. The full per-day breakdown is in Appendix B.

Volume
Runs in scope184,402
Events captured1,475,216
Mean events per run8.0
Median events per run7
95th percentile events per run14
Maximum events in a single run32 (multi-escalation case, see Appendix A)
Total LLM token consumption (input)524,857,394
Total LLM token consumption (output)75,973,624
Side-effect events (bureau pulls)184,402
Side-effect events (internal API writes)162,847
Decisions
DispositionCountShare
Auto-approved162,84788.31%
Auto-declined16,9219.18%
Escalated to human · approved2,0001.08%
Escalated to human · declined1,3170.71%
Guardrail refusal470.03%
Other (system error, retried)1,2700.69%
Latency
PercentileValue
Median run duration (auto-decision)2.1 seconds
95th percentile run duration (auto-decision)4.7 seconds
Median run duration (escalated)18 minutes
95th percentile run duration (escalated)4 hours 12 minutes
Drift indicators

The following KPIs are monitored continuously against thresholds set in Acme’s model-risk policy. All values for the period were within tolerance.

KPIMarch 2026 meanTolerance bandStatus
Approval rate88.31%84–92%
Mean DTI of approved0.31≤ 0.45
Escalation rate1.80%1.0–3.0%
Mean review duration (escalated)6m 41s≤ 30 min
Guardrail refusal rate0.03%≤ 0.10%
Bureau-pull failure rate0.04%≤ 0.50%
Completeness

A completeness alarm is armed continuously: the ingest pipeline expects a per-tenant baseline event volume, and a drop below 75% of the 28-day moving average triggers an alert. The alarm did not fire in the period. The full alarm-armed log is in Appendix B.

SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package · RF-2026-Q1-04812§ 05 Integrity attestation
§ 05 — Integrity attestation

The record is intact.
Here is how we know.

Runfile Systems Limited attests that the events listed in this package were captured by the Runfile SDK v1.0.4 running in Acme Bank UK Limited’s production environment between 2026-03-01T00:00:00Z and 2026-03-31T23:59:59Z, hashed using SHA-256 with canonical JSON serialisation per RFC 8785, chained per-event, committed daily to signed Merkle roots, and anchored weekly to the Sigstore Rekor public transparency log.

The integrity of this package can be verified offline using the Runfile Verifier CLI without requiring trust in Runfile.

Weekly anchors
Week endingDaily Merkle root (latest of week)Signing keyRekor
2026-03-07b284732a91a92732b07db7b760d389aa7d2bd465108a5dd2ede02c5295d66652kms:eu-west-1:rf-tenant-acme-2026q1
2026-03-14a7dcd5a41bcde46e347be9ae16e78df9aff5dd8bc7d49ef0111a1fa3719e690ekms:eu-west-1:rf-tenant-acme-2026q1
2026-03-21cf79d54d16c6486c352d4b90e875a18266c877c206050bad5f2cead87fc9751bkms:eu-west-1:rf-tenant-acme-2026q1
2026-03-283f4a3401404bb65750546f26a65f86d5107907b4522bf726284ffb0fd30072f6kms:eu-west-1:rf-tenant-acme-2026q1
Monthly meta-root and public anchor

The four weekly meta-roots above were aggregated into a monthly meta-root and committed to the Sigstore Rekor public log on 2026-04-01.

Monthly meta-root:   315735810cdfb03cf4b1eb0519a42589f2b940212db079745a40aafac18e61ea
Sigstore Rekor:      Entry #94082328
Anchored:            2026-04-01T00:14:22Z
Inclusion proof:     bundled in /proofs/2026-Q1-rekor-inclusion.json
Public URL:          https://search.sigstore.dev/?logIndex=94082328  [SAMPLE: not a real entry]
Signing key

The key used to sign every daily Merkle root in this period is held in AWS KMS, FIPS 140-2 Level 3 HSM-backed, in a dedicated key per tenant.

Key alias:          alias/rf-tenant-acme-bank-uk-ltd-2026q1
Key region:         eu-west-1
Key spec:           RSA_4096
Key usage:          SIGN_VERIFY
Public key SHA-256: a50325270c83d8f686403c5ffd270ca02d06323d4693d674cc0aa4b91bb2ad1b

The public key is published at https://runfile.ai/keys/rf-acme-bank-uk-ltd-2026q1.pub and is bundled in /keys/ within this package.

The agent runtime — the SDK running in Acme’s environment — does not hold this signing key, has never seen it, and has no IAM permission to invoke a KMS sign operation. The separation between the entity that captures events and the entity that signs the manifests is the substance of the chain-of-custody claim. AWS CloudTrail records every invocation of this key and is available to Acme’s Internal Audit under their existing AWS audit pipeline.

Worked example: hashes for the §02 run

For the worked-example run reconstructed in §02, the full per-event SHA-256 hash chain is reproduced here. Any party with the canonical-JSON serialisation of each event (bundled in /runs/run_8a7b3c2d-credit_review-20260314T114203Z.jsonl) can recompute these hashes independently.

#EventSHA-256 hash chain entry
01agent.invoke33b2d550627079917773d539507eb9e67efb200a7cd97f4a9d55592d972f8ea5
02tool.fetch_credit_bureau96b581af39630ea354f90f31721efe197ddf508232093f3b43bcec56fb00a424
03llm.model_callfc6b32cef6b31f1089959796dac0ff54d6ddaab765676eda38a3c1b7e18db535
04tool.compute_dti49e22db88c8be514471dee648d2f5f3a6cdeab7489b11d66fb80fbf6e881797f
05policy.threshold_checkd3cc5a234ef820760e573e82059b7c9f97617dabd75e3cf62deb03989ce2408d
06human.approval_requestede41ea43c3a31295c91688d9cc67abdd6e9368daeeddf4769868fbc4ca9b6fb47
07human.approval.declinedcf953ad3e456972c45aee3f74a5159e2339224427133113ff9532980df3b2e3c
08agent.completea3f1ed4d6b1b3b2e3439df5083c0324d9960b7a440fbf435c5576cee5a1a1ba6

The final chain entry a3f1ed4d6b1b3b2e… is itself an input to the daily Merkle tree for 2026-03-14, whose root is a7dcd5a41bcde46e347be9ae16e78df9aff5dd8bc7d49ef0111a1fa3719e690e (see weekly anchor table above).

SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package · RF-2026-Q1-04812§ 06 Verifier CLI output
§ 06 — Verifier CLI output

Re-verified offline,
without contacting Runfile.

The Runfile Verifier CLI was run against this package on 2026-04-02 at 09:14:22 UTC, in offline mode, on a Linux workstation in Acme’s Internal Audit environment with no network access. The CLI binary used was runfile-verifier-linux-amd64-v1.0.2, SHA-256 e8c4f1a9b7d3... (full hash in /verifier/binary.sha256).

The verifier consumed only the contents of this package and the bundled Sigstore Rekor inclusion proofs. It did not contact Runfile infrastructure.

runfile verify --offline ./RF-2026-Q1-04812.zip

Runfile Verifier CLI v1.0.2  (build: 2026-03-18, commit: a7e4f29)

Package:    RF-2026-Q1-04812.zip
Tenant:     acme-bank-uk-ltd
Agent:      did:web:acmebank.uk:agents:credit_review v3.2.1
Period:     2026-03-01T00:00:00Z to 2026-03-31T23:59:59Z
Mode:       offline (Rekor proofs read from package)

Loading package …                                                       OK
Parsing manifest …                                                      OK
Loading public key (SHA256:a50325270c83d8f686403c5f…) …                 OK

[01/06] Schema validation
        184,402 runs, 1,475,216 events
        All events conform to runfile-events-v1.0                       PASS

[02/06] Per-event hash chain
        Recomputed SHA-256 chain for all 1,475,216 events
        Walltime: 4.2s on local CPU
        No mismatches detected                                          PASS

[03/06] Daily Merkle root reconstruction
        Reconstructed 31 daily Merkle trees from chain heads
        Roots match signed manifests for all 31 days                    PASS

[04/06] Daily manifest signature verification
        Verified 31 RSA-4096 signatures against bundled public key
        Walltime: 0.8s                                                  PASS

[05/06] Sigstore Rekor inclusion proof
        Verified 4 weekly inclusion proofs
        Meta-root committed to Rekor entry #94082328 at 2026-04-01T00:14:22Z
        Inclusion proof depth: 17
        Tree size at inclusion: 2,847,194,632                           PASS

[06/06] Control mapping application
        Mapping version: runfile-controls-v1.4 (released 2026-02-15)
        Mapping signature verified against publisher key                OK
        Applied 9 controls to 1,475,216 events
        Satisfied: 9 / 9
        Violated:  0 / 9
        Gaps:      0                                                    PASS

──────────────────────────────────────────────────────────────────────────
Integrity:  INTACT
Anchored:   2026-04-01T00:14:22Z (Rekor entry #94082328)
Verified:   2026-04-02T09:14:22Z (offline)
Verifier:   runfile-verifier-linux-amd64-v1.0.2
──────────────────────────────────────────────────────────────────────────

Report written:  ./RF-2026-Q1-04812.verify.pdf
Report written:  ./RF-2026-Q1-04812.verify.json
Exit code:       0
Interpretation

A passing verification, as above, confirms five independent integrity properties:

  1. Schema integrity — every event is well-formed and validates against the published schema.
  2. Per-event integrity — no event in the period has been altered since recording.
  3. Daily integrity — the day’s events form the Merkle tree whose root was signed at the time of capture.
  4. Signature integrity — the signatures are valid against a public key whose fingerprint is independently published.
  5. External integrity — the daily roots are committed to a public transparency log that Runfile cannot retroactively alter.

A failure on any step prevents the next step from running and produces a specific error code in the JSON report. The verifier is conservative: it refuses to assert integrity if any check is ambiguous.

SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package · RF-2026-Q1-04812§ 07 Methodology and scope
§ 07 — Methodology and scope

What is in scope.
What is not.

This section documents the assumptions, scope decisions, and methodology under which this package was prepared. An external auditor reviewing this package should review this section before relying on the integrity claims.

Schema and mapping versions
ArtefactVersionReleased
Event schemarunfile-events-v1.02026-01-15
Control mappingrunfile-controls-v1.42026-02-15
Verifier CLI1.0.22026-03-18
Capture SDK (Python)1.0.42026-03-04

The control mapping version applied to a given run is recorded with the run. This package applied v1.4 to all 184,402 runs because all runs in the period occurred after the v1.4 release. Runs from prior periods reference earlier mapping versions; the earlier mappings remain bundled in this package’s /mappings/ directory.

Time source

All timestamps in this package are UTC. The clock source for the capture SDK is the host operating system’s monotonic clock, with absolute time taken from AWS Time Sync Service (which is itself synchronised against Stratum 1 sources). At ingest, every event is additionally timestamped by the Runfile event processor using a signed RFC 3161 timestamp from AWS’s qualified time service. Where there is discrepancy between the host-emitted timestamp and the ingest timestamp greater than 60 seconds, the run is flagged in Appendix B; no such flags occurred in this period.

What is in scope
  • Every event emitted by the named agent in the named environment during the period.
  • All eight event classes (identity, LLM calls, tool calls, retrievals, approvals, refusals, side effects, outcomes).
  • Cryptographic chain-of-custody artefacts (hashes, signatures, Rekor proofs).
  • Control mappings as held in runfile-controls-v1.4.
What is out of scope
  • The cleartext of LLM prompts and responses. Only hashes leave Acme’s environment; cleartext is held in Acme’s environment under their existing retention.
  • The cleartext of the credit bureau payloads. Only hashes and structured fields needed for reasoning are captured; the bureau cleartext is held in Acme’s environment.
  • The cleartext of human-reviewer justifications. Only hashes are captured; cleartext is held in Acme’s environment.
  • The substantive correctness of any individual credit decision. This package proves what happened; it does not opine on whether the decision was right. Decision quality is reviewed under Acme’s separate quality-assurance pipeline.
  • Bias, fairness, or disparate-impact testing. These are reviewed under Acme’s separate fairness pipeline and are out of scope here.
  • Real-time guardrail effectiveness. The 47 guardrail refusal events are recorded as evidence that the guardrails fired; whether the guardrail logic itself is well-calibrated is reviewed separately.
Data residency

All events in this package were captured, processed, signed, and stored within AWS region eu-west-1. No event payload, no hash, no manifest, and no signing operation crossed an EU border during the period. Sigstore Rekor anchoring posts only the monthly meta-root (a single 32-byte hash) to the public log; the meta-root does not contain or reveal any payload data.

Capture completeness

The capture SDK records events at every framework hook point in LangGraph, Anthropic’s Claude SDK, the OpenAI Agents SDK, and any MCP-instrumented tool. For the agent in question, the SDK is configured in full capture mode (every framework event recorded) rather than sampled mode. No sampling was applied during the period.

The completeness alarm armed against a baseline of the trailing 28-day mean event volume, with a threshold of 75%. The alarm did not fire in the period. Two manual completeness queries were run by Acme’s IT audit during the period (on 2026-03-12 and 2026-03-25); both queries reconciled the recorded event count against Acme’s own LangGraph telemetry within tolerance (< 0.01% difference, attributable to clock skew).

Limitations
This is a SAMPLE evidence package. In a production engagement:
  • The cleartext prompts and responses would be available for query through the Audit Workbench under the customer’s audit-justification workflow, with each resolution itself audit-logged.
  • The Rekor entry would be a real entry on the public Sigstore Rekor instance, queryable at https://search.sigstore.dev/.
  • The CloudTrail logs for the KMS signing key would be available to the customer’s Internal Audit on demand.
  • The full per-run reconstruction shown for one run in §02 is available for any of the other 184,401 runs in the period.
SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package · RF-2026-Q1-04812§ 08 How to re-verify
§ 08 — How to re-verify this package

Four steps, no trust required.

This package is designed to be re-verified by any third party without requiring trust in Runfile. To re-verify:

Step 1 — Download the verifier

The Runfile Verifier CLI is a single statically linked Go binary, distributed through Runfile’s public GitHub releases.

curl -L -o runfile-verifier \
    https://github.com/runfile/verifier/releases/download/v1.0.2/runfile-verifier-linux-amd64

chmod +x runfile-verifier

./runfile-verifier --version
runfile-verifier 1.0.2 (build 2026-03-18, commit a7e4f29)

The binary’s published SHA-256 is e8c4f1a9b7d3… (full hash in the GitHub release notes and bundled in /verifier/binary.sha256 within this package). Verifying the binary against this hash before running is recommended.

The verifier source is open and licensed Apache 2.0 at https://github.com/runfile/verifier. The binary is reproducibly buildable from source per the build instructions in the repository.

Step 2 — Verify the signing public key

The public key used to sign the manifests in this package is published at:

https://runfile.ai/keys/rf-acme-bank-uk-ltd-2026q1.pub

The published key’s SHA-256 fingerprint is a50325270c83d8f686403c5ffd270ca02d06323d4693d674cc0aa4b91bb2ad1b. The key is bundled in /keys/ within this package; comparing the bundled key to the published key confirms they match.

Step 3 — Run the verifier
runfile-verifier verify --offline ./RF-2026-Q1-04812.zip

The --offline flag instructs the verifier to read Sigstore Rekor inclusion proofs from the package’s bundled /proofs/ directory rather than fetching them from the public Rekor instance. This is appropriate for air-gapped audit environments.

If network access is permitted, omit --offline to have the verifier fetch the inclusion proofs directly from https://rekor.sigstore.dev and confirm they match the bundled proofs.

The verifier produces two output files: a PDF report (suitable for attaching to a workpaper) and a JSON report (suitable for ingest into a downstream audit pipeline).

Step 4 — Compare to this package

The verifier’s PDF output and the integrity-attestation page of this package (§05) should match. If they do not, the package has been tampered with after capture and the verifier output is authoritative.

If the verifier produces a FAIL result, the JSON report specifies which check failed at which line. Runfile cannot retroactively alter a signed package without producing a meta-root that contradicts the public Rekor entry; any such alteration would be visible to any third party who downloaded the package before the alteration.

What independence means

The verification depends on the following inputs and nothing else:

  • The verifier binary (open source, reproducibly buildable, fingerprint published).
  • The public signing key (published at a stable URL, fingerprint published, bundled in the package).
  • The package itself (this file and its associated zip archive).
  • The Sigstore Rekor inclusion proofs (bundled in the package or fetched from the public Rekor instance).

The verification does not depend on:

  • Any service Runfile operates.
  • Any credential Runfile holds.
  • Any decision Runfile makes after this package is sealed.
  • Any continued existence of Runfile as a company.

If Runfile ceases to exist tomorrow, the packages signed today remain verifiable. This is the intended design.

SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package · RF-2026-Q1-04812§ 09 Package contents
§ 09 — Package contents

What is in the zip.

This package is distributed as RF-2026-Q1-04812.zip (size: 4.8 GB compressed, 23.1 GB uncompressed). The accompanying PDF (this document) is the human-readable cover.

RF-2026-Q1-04812.zip
├── README.md                                    Plain English overview
├── manifest.json                                Top-level manifest, signed
├── cover.pdf                                    This document
├── runs/
│   ├── run_8a7b3c2d-credit_review-20260314T114203Z.jsonl
│   └── …                                        184,401 additional runs, one file per run
├── events/
│   └── events.parquet                           Columnar event store for analytics
├── manifests/
│   ├── 2026-03-01.manifest.json                 Daily signed manifest
│   ├── 2026-03-01.manifest.sig                  RSA-4096 signature
│   └── …                                        31 daily manifests
├── proofs/
│   ├── 2026-Q1-rekor-inclusion.json             Sigstore Rekor inclusion proof
│   └── 2026-Q1-rekor-meta-root.json             Monthly meta-root
├── keys/
│   └── rf-acme-bank-uk-ltd-2026q1.pub           Signing public key
├── mappings/
│   ├── runfile-controls-v1.4.yaml               Control mapping applied
│   └── runfile-controls-v1.4.sig                Mapping publisher signature
├── verifier/
│   ├── binary.sha256                            Expected verifier binary hash
│   └── README.md                                Verifier usage notes
└── appendices/
    ├── A-edge-cases.pdf                         Multi-escalation runs, etc.
    ├── B-daily-kpi.pdf                          Day-by-day population breakdown
    └── C-control-mapping-detail.pdf             Per-clause mapping documentation

The manifest.json at the top level is itself signed and lists the SHA-256 of every file in the package. The package’s integrity, as a whole, can be verified by recomputing this manifest.

SAMPLE · REFERENCE DATA · NOT A REAL AUDIT
Runfile · Evidence Package · RF-2026-Q1-04812Colophon
Colophon

Prepared by Runfile Systems Ltd.

Package IDRF-2026-Q1-04812
Generated2026-04-01T18:32:14Z
GeneratorRunfile Evidence Builder v1.0.4
Cover document version1.0
Page count12
DistributionAcme Bank UK Limited · Head of Internal Audit · Head of AI Risk
This is a SAMPLE evidence package distributed by Runfile for illustration purposes. Acme Bank UK Limited is fictional. The 184,402 runs, the underwriter identifier, and the customer hash are all synthetic. The SHA-256 hashes shown in §02 and §05 are real values computable from the bundled canonical-JSON event payloads — readers who wish to verify them may do so. The Sigstore Rekor entry number is illustrative.

In a production engagement, the customer is real, the runs are real, the Rekor entry is a real public commitment, and the verifier output is reproducible by any third party.

For an actual evidence package tailored to your remit (EU AI Act, DORA, SOX, HIPAA, FCA SS1/23, GDPR, or any combination), book a design-partner call at runfile.ai.

Runfile Systems Ltd · registered in England & Wales · EU & UK data residency
hello@runfile.ai · runfile.ai