VIRP demo evidence bundle — session-20260801T073527Z
=====================================================

Produced by demo/run.sh from a fresh clone of public main at commit 1794eed,
on an independent verifier machine, 2026-08-01 07:35 UTC. 9/9 behaviors
observed. Clone to pass: 15 seconds, measured on that machine.

THE TARGET WAS SIMULATED. The demo uses the built-in mock driver, so this
bundle evidences protocol behavior: what was classified, what executed or was
refused, what was authenticated, and what a verifier accepts or rejects. It
does not evidence that any real device was reached or reported truthfully.

KEYS IN THIS BUNDLE ARE DISPOSABLE AND DELIBERATELY PUBLISHED
-------------------------------------------------------------
run/onode.key  (32 bytes)  the collector's HMAC key
run/chain.key  (32 bytes)  the chain HMAC key
run/approval.pub (32 bytes) the approver's Ed25519 PUBLIC key

They are published so anyone can recompute every authentication tag and
replay the chain independently. They were generated for this one run, exist
nowhere else, and protect nothing. In a deployment the collector's key is
secret, and that secrecy is exactly what makes a valid tag evidence rather
than decoration.

ONE FILE WAS REMOVED FROM THE PUBLISHED COPY
--------------------------------------------
run/approval.key, the approver's Ed25519 SECRET key, is NOT included.
Verifying an approval signature requires only the public half, so publishing
the secret would expose material no verifier needs. Its absence changes
nothing you can check.

That asymmetry is the point of the project's terminology: observations are
"authenticated" (symmetric HMAC; verifying requires the same secret that
produces it, so every holder must be trusted), while approvals are "signed"
(Ed25519; anyone can verify with the public key alone). This bundle
demonstrates both, and demonstrates why only one of them let us withhold
the secret.

Original archive as delivered by the verifier (including approval.key):
  sha256 0d17287cda399eb06bad9e5461aec3634e1fc1f8cfc66332585a9c9ad85c9dff

A NOTE ON THE WORD "signed" IN THESE RECORDS
---------------------------------------------
records/01-green.txt prints "obs_type=0x07 (signed observation)" and
"signature=VALID". That is the reference tool's own output, reproduced here
byte for byte. This site says "authenticated" for HMAC material and reserves
"signed" for Ed25519, and the tool has not yet been updated to match. The
records are published unedited because falsifying evidence to match our
preferred vocabulary would be far worse than the inconsistency. Renaming the
CLI output is tracked as a code-level item.

WHAT IS HERE
------------
SUMMARY.txt        the harness's own pass/fail record, stamped with the commit
records/           per-step outputs, one file per demonstrated behavior
records/03-*.bin   an observation and the same observation with ONE byte changed
onode.log          the collector daemon's log for the whole session
devices.json       the simulated target definition
run/chain.db       the SQLite evidence chain (6 entries, 2 sessions)
run/approvals/     the proposal, challenge, approval, and consumed-list records

VERIFY IT YOURSELF
------------------
  # replay the chain
  ./build/virp-tool chain tail --db run/chain.db

  # verify the intact observation, then the tampered one (which must fail)
  ./build/virp-tool inspect records/03-observation.bin          run/onode.key okey
  ./build/virp-tool inspect records/03-observation-tampered.bin run/onode.key okey

  # or produce your own bundle from scratch
  git clone https://github.com/nhowardtli/virp && cd virp
  docker compose -f demo/docker-compose.yml run --rm demo

The chain in this bundle was independently re-verified before publication by
recomputing each entry hash as SHA-256 over its canonical JSON and walking
every per-session link from that session's genesis
(SHA-256("VIRP_CHAIN_GENESIS:" + session_id)). All six entries verify.
