{
  "group": "leaf",
  "protocol": 1,
  "description": "Leaf = JCS bytes; leaf hash = SHA-256(0x00 || JCS(leaf)), the same in both logs. Published leaves never carry entry_id, only its commitment; claim_commit commits to the prize code.",
  "cases": [
    {
      "name": "entry_leaf",
      "leaf": {
        "v": 1,
        "type": "entry",
        "draw": "vec-stream-1",
        "seq": 3,
        "t": "2026-10-16T11:53:33.333Z",
        "subject": "c87a6cd9b42b119547afcbf183081d915e3cf5c236cc1847393ab8de3eac5d23",
        "chances": 1,
        "ref": null,
        "entry_commit": "d0ed1d40d0f926230f0366d0e5270dfe88bc26b4e8e95a3118e41ebfe1c01352",
        "claim_commit": "dd4ba0eb22afbc72fa142ba9775527adf0784ac2821c5d953e2bf215deb00d2f"
      },
      "expected_canonical": "{\"chances\":1,\"claim_commit\":\"dd4ba0eb22afbc72fa142ba9775527adf0784ac2821c5d953e2bf215deb00d2f\",\"draw\":\"vec-stream-1\",\"entry_commit\":\"d0ed1d40d0f926230f0366d0e5270dfe88bc26b4e8e95a3118e41ebfe1c01352\",\"ref\":null,\"seq\":3,\"subject\":\"c87a6cd9b42b119547afcbf183081d915e3cf5c236cc1847393ab8de3eac5d23\",\"t\":\"2026-10-16T11:53:33.333Z\",\"type\":\"entry\",\"v\":1}",
      "expected_leaf_hash": "5dd2466881ce71cf978c2c41c43717c08747411d2f0eb3749ea146177d707d13"
    },
    {
      "name": "spin_leaf_draft",
      "leaf": {
        "v": 1,
        "type": "spin",
        "draw": "vec-wheel-1",
        "seq": 0,
        "t": "2026-10-16T12:10:05.250Z",
        "round": 33116416,
        "ref": "evt-0001"
      },
      "expected_canonical": "{\"draw\":\"vec-wheel-1\",\"ref\":\"evt-0001\",\"round\":33116416,\"seq\":0,\"t\":\"2026-10-16T12:10:05.250Z\",\"type\":\"spin\",\"v\":1}",
      "expected_leaf_hash": "f8cbed6ef082de73c363ac84753f1a6d9faa9812325674a1a038ffd384a8b0d7",
      "note": "wheel is a draft for Ф7 (§12.6)"
    },
    {
      "name": "global_commit_leaf",
      "leaf": {
        "v": 1,
        "type": "commit",
        "service": "vec-service",
        "draw": "vec-stream-1",
        "version": 1,
        "prev_commit": null,
        "conditions_hash": "467f97cad6856fd4be8991d4244d3c29cf7f99f052685e5ba6c372fbe825e924",
        "keyset_hash": "d26833a05bd722c2c970a254be2745fcce940e2a17f9b54519572ae2f9aa6bd4",
        "t": "2026-10-16T11:49:30.000Z"
      },
      "expected_canonical": "{\"conditions_hash\":\"467f97cad6856fd4be8991d4244d3c29cf7f99f052685e5ba6c372fbe825e924\",\"draw\":\"vec-stream-1\",\"keyset_hash\":\"d26833a05bd722c2c970a254be2745fcce940e2a17f9b54519572ae2f9aa6bd4\",\"prev_commit\":null,\"service\":\"vec-service\",\"t\":\"2026-10-16T11:49:30.000Z\",\"type\":\"commit\",\"v\":1,\"version\":1}",
      "expected_leaf_hash": "9241536ea8dc8f6eb93deffcdaf6c15c9df691f7e8a3e79e74016b7de7f6a281"
    },
    {
      "name": "same_subject_other_entry",
      "leaf": {
        "v": 1,
        "type": "entry",
        "draw": "vec-stream-1",
        "seq": 3,
        "t": "2026-10-16T11:53:33.333Z",
        "subject": "c87a6cd9b42b119547afcbf183081d915e3cf5c236cc1847393ab8de3eac5d23",
        "chances": 1,
        "ref": null,
        "entry_commit": "635f03ed000427dc7314df597388473777c3f9d27a2f2ce6488bed7bc73c58be",
        "claim_commit": "dd4ba0eb22afbc72fa142ba9775527adf0784ac2821c5d953e2bf215deb00d2f"
      },
      "expected_leaf_hash": "d6720256f43c4c40801681c5c8b5882bd080e2b1daf74e4840078ae0fc8a4e48",
      "note": "same subject and seq, another entry_id: another leaf hash"
    },
    {
      "name": "build_leaf_valid",
      "leaf": {
        "v": 1,
        "type": "build",
        "service": "vec-service",
        "component": "verify",
        "version": "1.0.0",
        "hash": "44575cf5b28512d75644bf54a517dcef304ff809fd511747621b4d64f19aac66",
        "t": "2026-10-16T10:00:00.000Z"
      },
      "expected_valid": true
    },
    {
      "name": "commit_version_as_string_rejected",
      "leaf": {
        "v": 1,
        "type": "commit",
        "service": "vec-service",
        "draw": "vec-stream-1",
        "version": "1",
        "prev_commit": null,
        "conditions_hash": "467f97cad6856fd4be8991d4244d3c29cf7f99f052685e5ba6c372fbe825e924",
        "keyset_hash": "d26833a05bd722c2c970a254be2745fcce940e2a17f9b54519572ae2f9aa6bd4",
        "t": "2026-10-16T11:49:30.000Z"
      },
      "expected_valid": false,
      "expected_error": "version must be an integer >= 1"
    },
    {
      "name": "leaf_with_entry_id_rejected",
      "leaf": {
        "v": 1,
        "type": "entry",
        "draw": "vec-stream-1",
        "seq": 3,
        "t": "2026-10-16T11:53:33.333Z",
        "subject": "c87a6cd9b42b119547afcbf183081d915e3cf5c236cc1847393ab8de3eac5d23",
        "chances": 1,
        "ref": null,
        "entry_commit": "d0ed1d40d0f926230f0366d0e5270dfe88bc26b4e8e95a3118e41ebfe1c01352",
        "claim_commit": "dd4ba0eb22afbc72fa142ba9775527adf0784ac2821c5d953e2bf215deb00d2f",
        "entry_id": "b806a5279cb54c909f236602c93a0f08"
      },
      "expected_valid": false,
      "expected_error": "leaf entry must have exactly fields v, type, draw, seq, t, subject, chances, ref, entry_commit, claim_commit"
    },
    {
      "name": "leaf_uppercase_hex_rejected",
      "leaf": {
        "v": 1,
        "type": "entry",
        "draw": "vec-stream-1",
        "seq": 3,
        "t": "2026-10-16T11:53:33.333Z",
        "subject": "C87A6CD9B42B119547AFCBF183081D915E3CF5C236CC1847393AB8DE3EAC5D23",
        "chances": 1,
        "ref": null,
        "entry_commit": "d0ed1d40d0f926230f0366d0e5270dfe88bc26b4e8e95a3118e41ebfe1c01352",
        "claim_commit": "dd4ba0eb22afbc72fa142ba9775527adf0784ac2821c5d953e2bf215deb00d2f"
      },
      "expected_valid": false,
      "expected_error": "subject must be 32 bytes of lowercase hex"
    },
    {
      "name": "ref_not_printable_ascii_rejected",
      "leaf": {
        "v": 1,
        "type": "entry",
        "draw": "vec-stream-1",
        "seq": 3,
        "t": "2026-10-16T11:53:33.333Z",
        "subject": "c87a6cd9b42b119547afcbf183081d915e3cf5c236cc1847393ab8de3eac5d23",
        "chances": 1,
        "ref": "ставка-1",
        "entry_commit": "d0ed1d40d0f926230f0366d0e5270dfe88bc26b4e8e95a3118e41ebfe1c01352",
        "claim_commit": "dd4ba0eb22afbc72fa142ba9775527adf0784ac2821c5d953e2bf215deb00d2f"
      },
      "expected_valid": false,
      "expected_error": "ref must be null or 1..128 printable ASCII characters"
    },
    {
      "name": "ref_too_long_rejected",
      "leaf": {
        "v": 1,
        "type": "entry",
        "draw": "vec-stream-1",
        "seq": 3,
        "t": "2026-10-16T11:53:33.333Z",
        "subject": "c87a6cd9b42b119547afcbf183081d915e3cf5c236cc1847393ab8de3eac5d23",
        "chances": 1,
        "ref": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "entry_commit": "d0ed1d40d0f926230f0366d0e5270dfe88bc26b4e8e95a3118e41ebfe1c01352",
        "claim_commit": "dd4ba0eb22afbc72fa142ba9775527adf0784ac2821c5d953e2bf215deb00d2f"
      },
      "expected_valid": false,
      "expected_error": "ref must be null or 1..128 printable ASCII characters"
    },
    {
      "name": "size_as_string_rejected",
      "leaf": {
        "v": 1,
        "type": "close",
        "service": "vec-service",
        "draw": "vec-stream-1",
        "t": "2026-10-16T11:59:01.000Z",
        "closed_at": "2026-10-16T11:59:00.000Z",
        "size": "7",
        "root": "463590a662dd181d5bf442c81c938f0893b6f7df9d79bcc2ee3bd511e472acad",
        "latest_round": 33116192
      },
      "expected_valid": false,
      "expected_error": "size must be an integer"
    },
    {
      "name": "global_close_leaf",
      "leaf": {
        "v": 1,
        "type": "close",
        "service": "vec-service",
        "draw": "vec-stream-1",
        "t": "2026-10-16T11:59:01.000Z",
        "closed_at": "2026-10-16T11:59:00.000Z",
        "size": 7,
        "root": "463590a662dd181d5bf442c81c938f0893b6f7df9d79bcc2ee3bd511e472acad",
        "latest_round": 33116192
      },
      "expected_canonical": "{\"closed_at\":\"2026-10-16T11:59:00.000Z\",\"draw\":\"vec-stream-1\",\"latest_round\":33116192,\"root\":\"463590a662dd181d5bf442c81c938f0893b6f7df9d79bcc2ee3bd511e472acad\",\"service\":\"vec-service\",\"size\":7,\"t\":\"2026-10-16T11:59:01.000Z\",\"type\":\"close\",\"v\":1}",
      "expected_leaf_hash": "56b54df8973eb630e32126ce37f2366405b2fbc534f538c48bbdb069de0ac139",
      "note": "t is when the leaf was written, closed_at is when intake closed"
    },
    {
      "name": "close_closed_at_after_t_rejected",
      "leaf": {
        "v": 1,
        "type": "close",
        "service": "vec-service",
        "draw": "vec-stream-1",
        "t": "2026-10-16T11:59:01.000Z",
        "closed_at": "2026-10-16T11:59:02.000Z",
        "size": 7,
        "root": "463590a662dd181d5bf442c81c938f0893b6f7df9d79bcc2ee3bd511e472acad",
        "latest_round": 33116192
      },
      "expected_valid": false,
      "expected_error": "closed_at must not be later than t"
    },
    {
      "name": "commit_version_2_without_prev_commit_rejected",
      "leaf": {
        "v": 1,
        "type": "commit",
        "service": "vec-service",
        "draw": "vec-stream-1",
        "version": 2,
        "prev_commit": null,
        "conditions_hash": "467f97cad6856fd4be8991d4244d3c29cf7f99f052685e5ba6c372fbe825e924",
        "keyset_hash": "d26833a05bd722c2c970a254be2745fcce940e2a17f9b54519572ae2f9aa6bd4",
        "t": "2026-10-16T11:49:30.000Z"
      },
      "expected_valid": false,
      "expected_error": "prev_commit must be null for version 1 and an index otherwise"
    },
    {
      "name": "commit_version_1_with_prev_commit_rejected",
      "leaf": {
        "v": 1,
        "type": "commit",
        "service": "vec-service",
        "draw": "vec-stream-1",
        "version": 1,
        "prev_commit": 0,
        "conditions_hash": "467f97cad6856fd4be8991d4244d3c29cf7f99f052685e5ba6c372fbe825e924",
        "keyset_hash": "d26833a05bd722c2c970a254be2745fcce940e2a17f9b54519572ae2f9aa6bd4",
        "t": "2026-10-16T11:49:30.000Z"
      },
      "expected_valid": false,
      "expected_error": "prev_commit must be null for version 1 and an index otherwise"
    },
    {
      "name": "time_year_0000_rejected",
      "leaf": {
        "v": 1,
        "type": "entry",
        "draw": "vec-stream-1",
        "seq": 3,
        "t": "0000-01-01T00:00:00.000Z",
        "subject": "c87a6cd9b42b119547afcbf183081d915e3cf5c236cc1847393ab8de3eac5d23",
        "chances": 1,
        "ref": null,
        "entry_commit": "d0ed1d40d0f926230f0366d0e5270dfe88bc26b4e8e95a3118e41ebfe1c01352",
        "claim_commit": "dd4ba0eb22afbc72fa142ba9775527adf0784ac2821c5d953e2bf215deb00d2f"
      },
      "expected_valid": false,
      "expected_error": "time must be YYYY-MM-DDTHH:MM:SS.mmmZ, year 2000..9999: 0000-01-01T00:00:00.000Z"
    },
    {
      "name": "time_february_31_rejected",
      "leaf": {
        "v": 1,
        "type": "entry",
        "draw": "vec-stream-1",
        "seq": 3,
        "t": "2026-02-31T12:00:00.000Z",
        "subject": "c87a6cd9b42b119547afcbf183081d915e3cf5c236cc1847393ab8de3eac5d23",
        "chances": 1,
        "ref": null,
        "entry_commit": "d0ed1d40d0f926230f0366d0e5270dfe88bc26b4e8e95a3118e41ebfe1c01352",
        "claim_commit": "dd4ba0eb22afbc72fa142ba9775527adf0784ac2821c5d953e2bf215deb00d2f"
      },
      "expected_valid": false,
      "expected_error": "invalid time: 2026-02-31T12:00:00.000Z"
    },
    {
      "name": "draw_id_with_trailing_newline_rejected",
      "leaf": {
        "v": 1,
        "type": "entry",
        "draw": "vec-stream-1\n",
        "seq": 3,
        "t": "2026-10-16T11:53:33.333Z",
        "subject": "c87a6cd9b42b119547afcbf183081d915e3cf5c236cc1847393ab8de3eac5d23",
        "chances": 1,
        "ref": null,
        "entry_commit": "d0ed1d40d0f926230f0366d0e5270dfe88bc26b4e8e95a3118e41ebfe1c01352",
        "claim_commit": "dd4ba0eb22afbc72fa142ba9775527adf0784ac2821c5d953e2bf215deb00d2f"
      },
      "expected_valid": false,
      "expected_error": "draw must match /^[a-z0-9][a-z0-9-]{0,62}$/"
    },
    {
      "name": "unknown_failure_reason_rejected",
      "leaf": {
        "v": 1,
        "type": "failure",
        "service": "vec-service",
        "draw": "vec-stream-1",
        "reason": "rekor_late",
        "t": "2026-10-16T12:00:10.000Z"
      },
      "expected_valid": false,
      "expected_error": "unknown failure reason"
    }
  ]
}
