{
  "version": "1",
  "type": "PropRaven National Quality Attestation",
  "scope": "national",
  "jurisdictions": 51,
  "quarter": "2026-Q2",
  "generated_at": "2026-05-03T17:20:17.610Z",
  "audit_run_id": "1cbbdca1-62b1-4ab5-bfc2-98dbc6f45c01",
  "audit_run_completed_at": "2026-05-03 09:51:08.806",
  "pdf_url": "https://propraven.com/audit/sample-national.pdf",
  "public_key_url": "https://propraven.com/audit/attestation-public-key.b64",
  "content_hash_sha256": "747691aaf8e32b8427d1c1c0b3492eed07a7b04e74e85a7b8fbf096f8ea4065b",
  "content_bytes": 59337,
  "embedded_hash_warning": "The hash printed on the cover page is the pass-1 hash, not the canonical hash you should verify against. Always verify against content_hash_sha256 in this manifest.",
  "signature_ed25519": "UlKQhz6ZkxGc5MCJOX7P9qiHwJWjNYI5WKN6phKEwwJ9km3Zuthkyg9f/VyxJN2Zc9xuYmzdbaukNZnIjHq/Dw==",
  "signature_message_canonical": "eyJ2ZXJzaW9uIjoiMSIsInR5cGUiOiJQcm9wUmF2ZW4gTmF0aW9uYWwgUXVhbGl0eSBBdHRlc3RhdGlvbiIsInNjb3BlIjoibmF0aW9uYWwiLCJqdXJpc2RpY3Rpb25zIjo1MSwicXVhcnRlciI6IjIwMjYtUTIiLCJnZW5lcmF0ZWRfYXQiOiIyMDI2LTA1LTAzVDE3OjIwOjE3LjYxMFoiLCJhdWRpdF9ydW5faWQiOiIxY2JiZGNhMS02MmIxLTRhYjUtYmZjMi05OGRiYzZmNDVjMDEiLCJhdWRpdF9ydW5fY29tcGxldGVkX2F0IjoiMjAyNi0wNS0wMyAwOTo1MTowOC44MDYiLCJwZGZfdXJsIjoiaHR0cHM6Ly9wcm9wcmF2ZW4uY29tL2F1ZGl0L3NhbXBsZS1uYXRpb25hbC5wZGYiLCJwdWJsaWNfa2V5X3VybCI6Imh0dHBzOi8vcHJvcHJhdmVuLmNvbS9hdWRpdC9hdHRlc3RhdGlvbi1wdWJsaWMta2V5LmI2NCIsImNvbnRlbnRfaGFzaF9zaGEyNTYiOiI3NDc2OTFhYWY4ZTMyYjg0MjdkMWMxYzBiMzQ5MmVlZDA3YTdiMDRlNzRlODVhN2I4ZmJmMDk2ZjhlYTQwNjViIiwiY29udGVudF9ieXRlcyI6NTkzMzcsImVtYmVkZGVkX2hhc2hfd2FybmluZyI6IlRoZSBoYXNoIHByaW50ZWQgb24gdGhlIGNvdmVyIHBhZ2UgaXMgdGhlIHBhc3MtMSBoYXNoLCBub3QgdGhlIGNhbm9uaWNhbCBoYXNoIHlvdSBzaG91bGQgdmVyaWZ5IGFnYWluc3QuIEFsd2F5cyB2ZXJpZnkgYWdhaW5zdCBjb250ZW50X2hhc2hfc2hhMjU2IGluIHRoaXMgbWFuaWZlc3QuIn0=",
  "verification_steps": [
    "1. Fetch the public key from public_key_url over HTTPS",
    "2. Fetch the PDF from pdf_url and SHA-256 its bytes",
    "3. The hash in step 2 must equal content_hash_sha256 in this file, and the PDF byte length must equal content_bytes",
    "4. Decode signature_message_canonical from base64 to bytes",
    "5. Parse those bytes as JSON. It must equal every field of this file except signature_ed25519, signature_message_canonical and verification_steps: the same keys with the same values and JSON types (no field added, missing or changed)",
    "6. ed25519-verify(public_key, signature_ed25519 (b64-decoded), message)",
    "7. If steps 3, 5 and 6 all pass, the PDF bytes and this file's claims are the ones that were signed. A signature verifies integrity, not data accuracy or freshness."
  ]
}