Verify a pack, without us
For examiners and auditors: how a key reaches you, what to download, how to check it, and what a pass and a fail look like.
Step 1
The institution issues the key.
An institution that answers to you issues a read-only key from its own tenant. It arrives by email, with an expiry. You never sign up, and nobody at GovernanceOS issues a key on an institution's behalf.
- Can
- read and query the institution's records; download packs; verify them offline
- Cannot
- write, draft or change anything
- Logged
- every read, under your key
With the pack, the institution sends you its chain head by a separate route. You compare the two when you run the verifier.
See the key email as it arrives
Learn more about examiner keys
The key opens the examiner's view of that institution's records. The examiner's view, with an example key
Step 2
Download the verifier and a pack, and check them first.
The verifier is one Python 3 file under the Apache 2.0 license. It runs offline, with nothing else installed and no account. The sample packs belong to Nebula Mutual, a fictional institution, and are signed with a prototype test key that signs nothing real.
| File | SHA-256 |
|---|---|
| The verifier 1.2.1 gos-verify.py | 9e47a9fa d63ead2f 7588c080 9291ed0d 6ed06e18 341f851a 78308c2c 9532b543 |
| Sample pack, 2026 Q3 nebula-mutual-2026Q3.pack.json | 204ecfcf a43a42f6 5019d5ca 71058878 d9ee8333 2086c3e5 015cfef7 a08afada |
| The same pack, with one record changed nebula-mutual-2026Q3-tampered.pack.json | 7ba97367 3c2950aa 8027d06c e890a148 25c854f3 8e808745 3bc33cfe 282fb85f |
Compare each value before you run anything. All three are listed in SHA256SUMS.txt.
certutil -hashfile gos-verify.py SHA256 # Windows
shasum -a 256 gos-verify.py # macOS
sha256sum -c SHA256SUMS.txt # Linux, all three at once
If one character differs, do not run the file.
Learn more about a checksum that differs
Download it again from this page. In a production release, the checksum list is signed with a separate release key, published on this page with that release.
Step 3
Run it on the pack.
Give it the pack and the pack key hash the institution sent you by another route. The key hash stays the same for every pack the institution signs, so you keep it on file. Sent a chain head too? Add it with --expect.
python gos-verify.py nebula-mutual-2026Q3.pack.json --key cb943626ee1843d2df97786726539a0486ffbf8fca54cf64d3f1bc2241536e90
python gos-verify.py nebula-mutual-2026Q3.pack.json --key cb943626ee1843d2df97786726539a0486ffbf8fca54cf64d3f1bc2241536e90 --expect 2bb3a4f271d74a906c1a507a918313f67a3ca88bd2c2edc84b4b5a4a853bcf9f
It recomputes the hash of every record and checks each links to the one before, checks the Ed25519 signature over the whole pack (the header, every record and the summaries), and compares the pack key, and any head you give it, with the values you were sent. The exit code says which:
- 0
- verified: intact, and signed by the pack key you were sent
- 1
- not pinned: you gave no pack key hash, so nothing yet ties the pack to the institution. A head alone shows the records end there, not that nothing earlier was left out
- 2
- chain broken
- 3
- signature invalid
- 4
- head mismatch: the head differs from the one you were sent
- 5
- cannot be read: the file is not a pack, or a value you typed is not a hash
- 6
- key mismatch: the pack was signed by a key other than the one you were sent
Learn more about the pack key
A pack carries the public key that signed it, so on its own a pack can only show that it agrees with itself: anyone who changes or shortens it can sign it again with a key of their own. The key hash that reached you by another route closes that gap. The signature covers the whole pack: the header, every record and the summaries. The same key signs every pack, so check that the pack name and positions the verifier prints are the ones you expect. By design, the pack key is the institution’s: in GovernanceOS VPC it lives in the institution’s own key service, and in GovernanceOS Cloud it is a key held for that institution alone. When the key changes, the institution sends the new key hash by the same route as the first. The sample pack’s key hash: cb943626 ee1843d2 df977867 26539a04 86ffbf8f ca54cf64 d3f1bc22 41536e90.
Step 4
Read the result.
The output below is the verifier's own, run on the two sample packs. The public anchor is not checked offline: once anchoring runs, compare the head with the published anchor yourself, not through us.
When it verifies, exit 0
GovernanceOS pack verifier 1.2.1 (Apache-2.0)
Pack: nebula-mutual-2026Q3 · 31 records, chain positions 289 to 319
Created: 2026-10-16T10:12:00-05:00 · Period: 2026-07-01 to 2026-09-30
Issued by: The CISO, Nebula Mutual (a fictional institution)
Notice: Prototype sample. Nebula Mutual is a fictional institution constructed for illustration; any resemblance to a real organization is unintended. People are shown as roles. Signed with a prototype test key that signs nothing real.
Chain: OK (31 of 31 records recomputed and linked)
Signature: OK (Ed25519, key nm-pack-01 (prototype test key); it covers the header, every record and the summaries)
Key: SHA256 cb943626 ee1843d2 df977867 26539a04 86ffbf8f ca54cf64 d3f1bc22 41536e90 MATCH with the pack key hash you were sent
Head: 2bb3a4f2 71d74a90 6c1a507a 918313f6 7a3ca88b d2c2edc8 4b4b5a4a 853bcf9f
Not compared. Add --expect with a head the institution sent you to compare it too.
Anchor: not checked (offline). No anchor operator is named yet; once one is, compare the head with its published anchor.
Result: VERIFIED. The pack was not changed after the pack key you were sent signed it: the header, every record
and the summaries. The same key signs every pack, so check the pack name and positions above are the ones
you expect. It does not prove the records were true when written; that is for the examination.When it does not, exit 2
GovernanceOS pack verifier 1.2.1 (Apache-2.0) Pack: nebula-mutual-2026Q3 · 31 records, chain positions 289 to 319 Created: 2026-10-16T10:12:00-05:00 · Period: 2026-07-01 to 2026-09-30 Issued by: The CISO, Nebula Mutual (a fictional institution) Notice: Prototype sample. Nebula Mutual is a fictional institution constructed for illustration; any resemblance to a real organization is unintended. People are shown as roles. Signed with a prototype test key that signs nothing real. Chain: BROKEN at position 299: the stored hash differs from the hash recomputed from the record. What to do: keep this output as evidence and ask the institution (the issuer above) to explain the change.
Do not rely on the pack. Keep the file and this output, and ask the institution to explain the change. The verifier says where the chain breaks; the institution explains why.
What a verified pack proves
No record was changed, removed or reordered after the pack was signed, the header and summaries are as signed, and the pack key is the one the institution sent you.
What it does not prove
A consistent chain of false records verifies perfectly. The chain proves integrity; the institution proves truth.
What a pack holds · Questions on verification · The verifier on the engineering page

