Witnessed sample
This is a real export from an install enrolled with the hosted witness, published with
the witness's signed statement for that install. Download both and run switchtender verify --witness to see what the check holds an export to, and edit either file to watch it fail.
What was captured
On October 22, 2026, a fresh install of the signed v1.106.1 Linux build was initialized in a
container under an account named operator. It loaded the starter templates, enrolled with the
hosted witness at https://witness.switchtender.com, ran three jobs, and pushed a span beat every 30
seconds. Once the witness had countersigned six beats, the install exported its bundle and fetched
the witness's statement. Neither file was changed after that.
The install was a test, so its record was then retired at the witness, and the live statement route no longer answers for it. The statement here is the witness's signed copy, and it verifies offline against the published witness key.
| File | What |
|---|---|
| witness-sample-bundle.json | The install's signed audit bundle, 20 chain entries. |
| witness-sample-statement.json | The witness's signed statement for the install's producer key. |
The two keys to pin:
- Producer key, the install that signed the bundle:
sha256:cf6f2cc12770ba430de35b1db479178c1fd57c5894d988ae907ec12eea97c6c8 - Witness key, the one the hosted witness page publishes:
sha256:82047e9e6247134152a5ca482c61c1f642899586c6bc5562f1dbe3e110ca2804
Verify it
curl -fsSO https://switchtender.com/verify/witness-sample-bundle.json
curl -fsSO https://switchtender.com/verify/witness-sample-statement.json
switchtender verify witness-sample-bundle.json \
--pubkey sha256:cf6f2cc12770ba430de35b1db479178c1fd57c5894d988ae907ec12eea97c6c8 \
--witness witness-sample-statement.json \
--witness-pubkey sha256:82047e9e6247134152a5ca482c61c1f642899586c6bc5562f1dbe3e110ca2804
It prints:
subject fleet in_cf6f2cc12770ba430de35b1db479178c
signed by sha256:cf6f2cc12770ba430de35b1db479178c1fd57c5894d988ae907ec12eea97c6c8
signature OK
pin OK (matches the fingerprint you pinned, so this is that install's key)
chain OK (20 entries recompute, head seq 20)
anchors none (nothing outside this install fixes its position)
witness OK (6 beats countersigned by sha256:82047e9e6247134152a5ca482c61c1f642899586c6bc5562f1dbe3e110ca2804, newest seq 20, for producer sha256:cf6f2cc12770ba430de35b1db479178c1fd57c5894d988ae907ec12eea97c6c8, 1 note)
this bundle reproduces seq 20, the newest entry the witness countersigned. The tree over its first 20 entries matches the root the witness holds. The witness refused no push.
disclosed 24 checked, 0 unchecked, 0 redacted
checked beat 6, cadence_s 6, count 6, stream 6
VERIFIED: nothing has been altered since this bundle was signed
How to read it
- signature and pin say the bundle was signed by the producer key you pinned, so it came from that install.
- chain recomputes every entry's link from its content. An entry edited after it was written breaks the link at that entry.
- anchors reads none because this install never anchored to a public timestamp authority. The witness is the only party outside the install that holds its position here.
- witness holds the bundle to the statement. The statement verifies under the pinned witness key and names the same producer key and install. The bundle carries entry 20, the newest one the witness countersigned, and the tree over its 20 entries has the root the witness holds. The witness refused no push from this install. The one note is the witness's record of the first tree it saw, which is where its memory of the install starts.
- disclosed lists the beat fields verify checked against the chain.
Break it
Edit the statement so it claims a refusal, then verify again:
jq '.refusals_total = 1' witness-sample-statement.json > edited.json
switchtender verify witness-sample-bundle.json \
--pubkey sha256:cf6f2cc12770ba430de35b1db479178c1fd57c5894d988ae907ec12eea97c6c8 \
--witness edited.json \
--witness-pubkey sha256:82047e9e6247134152a5ca482c61c1f642899586c6bc5562f1dbe3e110ca2804
The witness signed the statement, so any edit to it fails under the witness key:
NOT VERIFIED: the witness statement does not hold: the witness statement does not verify: verify statement: signature: does not verify under key sha256:82047e9e6247134152a5ca482c61c1f642899586c6bc5562f1dbe3e110ca2804
What it does not show
- The witness fixes the chain from the first tree it countersigned onward. It shows the entries have not changed since that beat. It cannot show they were honest when they were written.
- Between two beats the witness sees nothing. This install beat every 30 seconds, and the cadence is the install's to choose.
- Root on the witness host, or a holder of the witness key's backup and its passphrase, can sign false countersignatures. The hosted witness page lists the rest of its limits.
- This is a test install with three short jobs, not a production fleet.
