{
  "entry": {
    "seq": 3992,
    "at": "2026-10-31T09:38:57.134Z",
    "type": "change.observed",
    "subject": "rightshold-production",
    "payload": {
      "after_hash": "f3994c5",
      "after_summary": "the production build at observation time identifies itself as commit f3994c5…",
      "aspect": "production_commit",
      "before_hash": "3a7c7ce",
      "before_summary": "the production build last observed identified itself as commit 3a7c7ce…",
      "detector": {
        "id": "rightshold-change-detector",
        "version": "1"
      },
      "observed_at": "2026-10-31T09:38:57.134Z",
      "path": null,
      "subject_label": "Rightshold production",
      "subject_seq": null,
      "subject_type": "rightshold.production"
    },
    "payload_hash": "775de3a359f38aa56b41c8b4f8bbcece5a779e283a8fac68b8197fb9dc9d4eeb",
    "leaf_hash": "2f6eaa932b88d05e815eb0b9b30ffb3e2e2111e88d2ce7f7d09275d3592497a8",
    "block_height": 1964,
    "texts": {},
    "data": {
      "after_hash": "f3994c5",
      "after_summary": "the production build at observation time identifies itself as commit f3994c5…",
      "aspect": "production_commit",
      "before_hash": "3a7c7ce",
      "before_summary": "the production build last observed identified itself as commit 3a7c7ce…",
      "detector": {
        "id": "rightshold-change-detector",
        "version": "1"
      },
      "observed_at": "2026-10-31T09:38:57.134Z",
      "path": null,
      "subject_label": "Rightshold production",
      "subject_seq": null,
      "subject_type": "rightshold.production"
    }
  },
  "status": "sealed",
  "block": {
    "v": 1,
    "height": 1964,
    "prev_hash": "011b2bb7b8207f617a200ff781dea46ec6bd2044cf8c9946d75519ade5785308",
    "merkle_root": "2a8804a2697e6e6932ce117a0ca7edfcd5f857cff1b3e56ed8605f571869ea02",
    "first_seq": 3991,
    "last_seq": 3992,
    "entry_count": 2,
    "at": "2026-10-31T09:39:37.236Z",
    "key_id": "key_41eb7b6d1b11968a",
    "block_hash": "327418fbbbf6514827c345b6c95fb2f174f93d22607bffe09ca61768aba3ef6c",
    "signature": "LbZjWLr6MVbxXLyqEWQE1W/WQnhFKV1XpOirbR7Xr2Qj3w4Yf92wUyvjenTWw/RyotOTC5eObEdBfnpUA5nCAA==",
    "public_key_pem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAEYWJAvPDwdwiByA4ucuPBAV0jLWwXGgtbZqbyrLNMiM=\n-----END PUBLIC KEY-----\n"
  },
  "proof": {
    "leaf_hash": "2f6eaa932b88d05e815eb0b9b30ffb3e2e2111e88d2ce7f7d09275d3592497a8",
    "index": 1,
    "path": [
      {
        "side": "L",
        "hash": "a8f2e93ccc1ce4bc4dbb1b27a9e9e47923ad12de4dbc3fd359afb4f5170e07c5"
      }
    ],
    "merkle_root": "2a8804a2697e6e6932ce117a0ca7edfcd5f857cff1b3e56ed8605f571869ea02",
    "how_to_verify": "payload_hash = sha256(canonical(payload)); leaf = sha256('leaf:' + canonical({seq, at, type, subject, payload_hash})); fold the path (R: sha256('node:' + acc + hash), L: sha256('node:' + hash + acc)) to merkle_root; verify the Ed25519 signature over canonical(block header)."
  },
  "finality": {
    "state": "bitcoin-anchored",
    "final": false,
    "witnesses": 0,
    "witnesses_confirmed_unaffiliated": 0,
    "witnesses_total": 0,
    "required": 2,
    "finalized_through": null,
    "bitcoin": {
      "anchored": true,
      "block_height": 973962,
      "confirmed_through": 6024
    },
    "states": [
      "recorded",
      "sealed",
      "bitcoin-anchored",
      "witness-quorum",
      "final"
    ],
    "rule": "States climb recorded -> sealed -> bitcoin-anchored -> witness-quorum -> final. A block is final only once its hash is confirmed in Bitcoin AND 2 confirmed-unaffiliated witnesses on distinct registrable domains with distinct keys have cosigned it or any later block; each header commits to every earlier block. Cosignatures from affiliated, unconfirmed, pending or challenged witnesses are public evidence but never count toward quorum. The quorum steps up on a published schedule as confirmed-unaffiliated witnesses grow: 2 required while fewer than 5 are confirmed, 3 at 5, 4 at 10, 6 at 20, 8 at 40. Every tier's requirement sits well below the count that triggers it, so churn is weather, not a freeze; the requirement is recomputed from the live count on every read."
  }
}