Skip to content
Open menuClose menu

Sample report

Sample change evidence report

What your auditor receives for two repositories and one quarter: how every merged change got in and what it does, with every fact labelled with how it was obtained.

Fictional organisation and data, for illustration only.

LiveCode evidence is live today. Change records and process evidence are live since v1.4.0. The last section shows later layers, marked Planned.

Fictional organisation and data, for illustration only.

toevan

Change evidence report

Merged changes

Northwind (sample data) · 2 repositories · default branch · 15 Jul to 13 Oct 2026

Prepared for
[Auditor firm]
Repositories
northwind/payments-api · northwind/ledger-service
Changes in scope
146 pull requests merged into the default branch, each with a sealed change record, and 2 direct pushes, captured from GitHub as they happened.
Records
4,152 sealed records: change records, control-change events and code checks. Signatures verified at generation.
Engine and rule sets
toevan-engine 0.9.4 · Clean Architecture 1.4.0 · Security Essentials 2.14.0
People
Shown as digests of their GitHub accounts in sealed records. Waivers name their requester and approver.
Generated
13 Oct 2026, 11:42 UTC by [name]
Report hash
sha256:3f9a…c21e

This report is evidence for the auditor to assess. Toevan does not express an opinion on whether controls are designed or operating effectively. Every fact states how it was obtained. Controls outside Toevan’s coverage are listed in the scope section and remain the organisation’s responsibility.

1Summary

Process evidence · how changes got in

Merged pull requests146into the default branch
Independent approval143 / 1463 deviations
Direct pushes2no pull request, flagged
Control changes31 opened a 29-minute gap

Code evidence · what the changes do

Pull requests checked146 / 146gate verdict before merge
Code rules passing11 / 12production code, latest release
Analysis coverage97.4%gate 95% · 0 runs below
Approved waivers10 expired in period

What was captured

Toevan captured the merges into the default branch, the changes to review rules, the bypasses and the direct pushes in both repositories as GitHub reported them, and sealed each one as it happened. In the period, 146 pull requests were merged and 2 commits were pushed directly. Reported + sealed

Items for attention

  1. Two direct pushes to payments-api/release/v1 on 19 Sep, inside a 29-minute window when the review requirement was switched off.Process
  2. Three pull requests merged without approval by someone other than the author: two in ledger-service before its review rule existed, one by admin bypass during the 19 Sep window.Process
  3. Rule secret-detection-high fails in production code (1 finding), covered by an approved waiver until 20 Dec.Code, Waivers

2Scope, provenance and control mapping

How each fact was obtained

Recomputed
Toevan computed it from the code or git history itself.
Re-perform it from the same inputs and get the same result.
Reported + sealed
GitHub reported it; Toevan captured it at the event and signed it.
Rely on it as far as you rely on GitHub. Any later change is detectable.
Declared + sealed
The organisation declared it, such as a change to what is checked; Toevan signed the declaration and its history.
See who declared what, when, and every later change.
Toevan record, not sealed
Held in Toevan’s database but not sealed in the ledger, such as a waiver today. Nothing protects it by a signature.
Treat it as Toevan’s statement, and ask the organisation for the approval behind it.
Consumed
Taken from GitHub’s deployment and release records and linked by commit or digest.
Check the original record in GitHub.
Not captured
No reliable source was available. Toevan does not infer it.
Obtain it from the organisation by other means.

Evidence and the controls it relates to

EvidenceRelevant controlsObtained
Approval, independent review, approval on final commitSOC 2 CC8.1 · ISO 27001 A.8.32 · DORA RTS 2024/1774 Art. 17 (planned)Reported + sealedRecomputed
Required checks at merge; review rules in force; rule changes and bypassesSOC 2 CC8.1 · ISO 27001 A.8.32 · DORA RTS 2024/1774 Art. 17 (planned)Reported + sealed
Direct pushes to protected branchesSOC 2 CC8.1 · ISO 27001 A.8.4, A.8.32Reported + sealed
Code rules: architecture boundaries, secure coding, dependenciesISO 27001 A.8.25 · SOC 2 CC8.1Recomputed
Change population and completenessSOC 2 CC8.1 · ISO 27001 A.8.32Recomputed
Deployment of a commit to productionSOC 2 CC8.1 · ISO 27001 A.8.32ConsumedNot captured
Waivers and scope changesExceptions to the rules aboveToevan record, not sealed

Not covered by this report

  • Access reviews, joiner and leaver processesOrganisational
  • Runtime monitoring, incident responseOrganisational
  • ICT third-party risk, physical securityOrganisational
  • Deployments and artifacts outside GitHub, and whether a deployed artifact still runsOrganisational
  • Merges into branches other than the default branchNot in this version
  • Changes made outside GitHub, such as direct database or console changesOrganisational

3Process evidence

How the 146 pull requests merged in the period were reviewed and merged, captured from GitHub at the moment of each merge.

CheckResultObtained
Approved by someone other than the author143 / 146 · 3 deviationsRecomputed
Approval given on the final commit137 / 143 approved · 6 approved an earlier commitReported + sealed
Required checks passed at merge146 / 146Reported + sealed
Commit signatures verified by GitHub144 / 146Reported + sealed
Review rules in force recorded at merge146 / 146Reported + sealed

Deviations: merged without independent approval

PRMergedAuthorRule in force at mergeRecord
ledger-service #38824 Jul4be1…09c2None (rule added 02 Aug)rec_51b9e20
ledger-service #39129 Julc58f…71d0None (rule added 02 Aug)rec_6e07a3d
payments-api #190319 Sep 14:122a6e…f915Switched off 14:02 to 14:31 (admin)rec_0c88f14

Changes to the controls themselves

When (UTC)ChangeByRecord
02 Aug 09:14Review rule applied to ledger-service: 2 approvals, required checks9d07…e3a4rec_8a2f61c
19 Sep 14:02Review requirement switched off on payments-api/release/*2a6e…f915rec_3f10b9a
19 Sep 14:31Review requirement switched back on2a6e…f915rec_3f10c02

Direct pushes without a pull request

When (UTC)BranchCommitByRecord
19 Sep 14:09payments-api/release/v17c1e0a22a6e…f915rec_7c1e0a2
19 Sep 14:22payments-api/release/v191d4b3f2a6e…f915rec_91d4b3f

Control changes and direct pushes are captured as events when they happen, so a gap between snapshots can’t go unseen. People are shown as digests of their GitHub accounts; independence is computed from the account ids. Reported + sealed

Change population

Every commit that reached the default branch in the period, listed from git history and matched to a record. Recomputed

Deployments linked by commit

Which commit reached production, and when. Toevan reads these from GitHub; it does not produce them. Where GitHub holds no deployment record, the link is reported as not captured, never worked out from timing. ConsumedNot captured

4Code evidence

What the code does, checked by reading the code itself on the exact merged version. Rules marked failing apply to production code; documentation and test fixtures are out of scope (see Waivers).

Clean Architecture 1.4.0 · design rules

RuleWhat it checksLatest releaseFindings
layer-dependency-handlers-to-dbRequest handlers never call the database directlyPassing0
service-boundariesServices reach each other only through their public interfacesPassing0
role-placement-policyAbstractions and their implementations sit in the layers the architecture assignsPassing0
layer-dependency-policyA cross-layer dependency is allowed only where the policy lists itPassing0

Security Essentials 2.14.0 · secure coding

RuleWhat it checksLatest releaseFindings
secret-detection-highNo high-confidence credential hardcoded in source or configFailing1 · waiver
no-committed-secret-filesNo .env, private key or keystore committedPassing0
vulnerable-dependencyNo dependency with a known high or critical vulnerability (OSV.dev)Passing0
encryption-at-restStorage and database connections encryptedPassing0
iac-network-segmentationNo public exposure of internal servicesPassing0
iac-encryption-policyStorage encryption toggles enabled in infrastructure codePassing0
iac-access-controlNo wildcard access policiesPassing0
sensitive-unsafe-log-flowSensitive data does not reach logging sinksPassing0

How far the analysis reached

RepositoryCoverage on latest releaseGateRuns below gate in period
payments-api97.9%95%0
ledger-service96.6%95%0

Coverage is the share of the repository’s production source files that the code index parsed at the indexed commit. Below the gate, a run is flagged rather than recorded as passing. Engine and rule-set versions are recorded in every record, so any result can be re-run. Recomputed

5Waivers and scope changes

Every decision that changed what was checked, or accepted a known deviation.

DateChangeRequested · approvedReasonRecord
20 SepWaiver: secret-detection-high, payments-api/config/sandbox.yaml (exact file), expires 20 Decc58f…71d0 · 4be1…09c2Sandbox key with no production access; rotation scheduledrec_b30e7c5

No waivers expired or were revoked in the period. Requester and approver are different accounts for every entry. Waivers are Toevan records that are not sealed in the ledger. Toevan record, not sealed

Rule-set versions used in the period

Rule setVersionFromChange
Clean Architecture1.4.015 Jul (whole period)No change
Security Essentials2.13.015 JulNo change
Security Essentials2.14.012 AugRules updated by Toevan

6Change records

One change in full, as the auditor sees it when sampling. All records are in the CSV export, and each signed envelope is on the evidence branch in the organisation’s repository.

rec_5b81d4e

The change

Pull request
payments-api #1921 · Add tenant check to refund handler
Reported + sealed
Author · merged by
4be1…09c2 · 9d07…e3a4 · 13 Oct 2026, 10:41 UTC into main
Reported + sealed
Merge commit
5b81d4e
Reported + sealed

Process evidence

Approvals
9d07…e3a4, c58f…71d0 · both on final commit e81b2d0
Reported + sealed
Independent of author
Yes, by GitHub account id
Recomputed
Required checks
ci/test ✓ · ci/lint ✓ · toevan/gate ✓
Reported + sealed
Rules in force
main-protection: 2 approvals, required checks, signed commits
Reported + sealed
Commit signature
Verified by GitHub
Reported + sealed

Code evidence

Design rules
4 / 4 passing
Recomputed
Secure coding
7 / 8 passing · secret-detection-high under waiver rec_b30e7c5
Recomputed
Coverage · engine
98.1% (gate 95%) · toevan-engine 0.9.4
Recomputed

Path to production

Released
Release v2.31.0 · 13 Oct 2026, 11:05 UTC
Reported + sealed
Deployed
production · 13 Oct 2026, 11:20 UTC · build digest sha256:7d3e…a1c4 · rec_9e41b07
Consumed
Copied to release
Not captured: backport linkage (L5) is not built in this release
Not captured

Seal

Signature
ECDSA P-256 · DSSE envelope · keyid 8c1f…e0a2
Previous record
rec_b7e21f0
Public anchor
Optional Rekor anchoring · off for this organisation

Further records (sample)

RecordChangeIndependent approvalCode rulesSealed (UTC)
rec_b7e21f0payments-api #1918Yes11 / 12 · waiver13 Oct 09:58
rec_9d41e02ledger-service #412Yes12 / 1209 Oct 16:21
rec_0c88f14payments-api #1903No · admin bypass12 / 1219 Sep 14:12
rec_7c1e0a2direct push 7c1e0a2No · no PR12 / 1219 Sep 14:09

7How to check this report

Each route lets you test the evidence yourself. Choose the route that fits your role. Only the third needs any tools.

CheckWhat it provesWhat it doesn’t prove
Record is genuine and unchangedThe record was signed with Toevan’s published key and hasn’t been altered since. The hash chain shows none was removed.That the facts inside it are correct: the two checks below cover that.
Approval was independentApprover and author are different GitHub accounts, recomputed from the account ids in the record.That the review itself was adequate.
Code result is reproducibleThe same commit, engine version and rule-set version give the same result.That the rules cover every risk in the code.
  1. In the organisation’s app

    Read-only auditor access, no repository access

    • The organisation invites you with the Auditor role: read-only access to the evidence list, the exports and the reports.
    • Verify now re-checks the whole ledger, the signatures and any transparency log proofs in the app.
    • You open nothing else: repositories, code and findings are refused.
  2. Watch the organisation run it

    Screen share or on site

    • You choose the samples at the time of the session; an engineer runs the checks while you watch.
    • Verification of each record you sampled: chain, signature, unchanged.
    • Author and approver accounts for each sample, compared on screen.
  3. Run it yourself

    IT audit specialists with temporary read access

    • Use git and openssl. For the whole chain, use the toevan command, which Toevan provides on request and is not yet public. No Toevan account is needed.
    • Check that a copy’s branch tips match the tips recorded in the report.
    • Run the commands in the appendix and compare against the report.

8Planned additionsPlanned

Later layers of the evidence chain. They are planned and nothing in this report depends on them. Each says how its facts will be obtained.

  • Designated production branches

    Branches the organisation designates as production, such as a release branch, each designation declared and sealed with every later change. Each gets the same population as the default branch: every commit listed straight from git and matched to a record or flagged.

    Declared + sealedRecomputed
  • Copied fixes matched by content

    A fix reviewed on main and copied to a release branch gets a new commit ID. Toevan will match it to the reviewed original by content (git patch-id), and flag copies whose content changed.

    Recomputed

Appendix · Commands for technical reviewers

The commands an engineer runs for you, or you run yourself.

Check one record with openssl and the shell, no Toevan software

ENV=attestations/<head_sha>/<record_id>.dsse.json
REC=records/<head_sha>/<record_id>.json
PUB=toevan.pub
openssl pkey -pubin -in "$PUB" -outform DER | openssl dgst -sha256
T=$(sed -E 's/.*"payloadType":"([^"]*)".*/\1/' "$ENV")
sed -E 's/.*"payload":"([^"]*)".*/\1/' "$ENV" | openssl base64 -d -A > statement.json
sed -E 's/.*"sig":"([^"]*)".*/\1/' "$ENV" | openssl base64 -d -A > sig.der
{ printf 'DSSEv1 %s %s %s ' "${#T}" "$T" "$(wc -c < statement.json | tr -d ' ')"; cat statement.json; } > pae.bin
openssl dgst -sha256 -verify "$PUB" -signature sig.der pae.bin
H=$(sed -E 's/.*"record_hash":"sha256:([0-9a-f]{64})".*/\1/' statement.json)
if [ "$(openssl dgst -sha256 -r "$REC" | cut -d' ' -f1)" = "$H" ]; then echo "record matches the statement"; else echo "RECORD DOES NOT MATCH THE STATEMENT"; fi
printf 'record %s\n' "$(sed -nE 's/.*"record_id":"([^"]*)".*/\1/p' statement.json)"
printf 'subject %s\n' "$(sed -nE 's/.*"subject":\[\{"digest":\{"([^"]*)":"([^"]*)"\},"name":"([^"]*)"\}\].*/\3 \1:\2/p' statement.json)"

SHA2-256(stdin)= <key id>
Verified OK
record matches the statement
record <the record id you picked>
subject git+https://github.com/<owner>/<repository> gitCommit:<the commit you picked>

The envelope is one line of JSON, as Toevan writes it; the three paths are the ones on the evidence branch. The first line after the paths prints the key id to compare with the published list. Expect “Verified OK” and “record matches the statement” for every record you check. The last two lines must name the record and the commit you picked. Any failure means the record was altered or not signed with the published key.

Replay the whole chain with the Toevan verifier (on request, not yet public)

$ toevan audit verify --path evidence-clone --pub-key toevan.pub
✓ chain intact · 4,152 records
✓ signatures verify under the published key

This command needs the Toevan verifier, which Toevan provides on request. It is not part of the openssl route above.