{
  "_comment": "Canonical golden vectors for the LXMF protocol specification. Generated by gen_vectors.py from the vendored reference. Do not edit by hand; re-run the harness.",
  "meta": {
    "lxmf_version": "1.1.0",
    "rns_version": "1.3.5",
    "lxmf_commit": "795fdaa2b0777c13033787d933d1afc94a2377cb",
    "reticulum_commit": "d5e62d4e15c5fe2e170f7bd9e120551671f21a27",
    "fixed_timestamp": 1700000000.0,
    "src_identity_prv_hex": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
    "dst_identity_prv_hex": "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f"
  },
  "constants": {
    "DESTINATION_LENGTH": 16,
    "SIGNATURE_LENGTH": 64,
    "TICKET_LENGTH": 16,
    "TIMESTAMP_SIZE": 8,
    "STRUCT_OVERHEAD": 8,
    "LXMF_OVERHEAD": 112,
    "ENCRYPTED_PACKET_MDU": 391,
    "ENCRYPTED_PACKET_MAX_CONTENT": 295,
    "LINK_PACKET_MDU": 431,
    "LINK_PACKET_MAX_CONTENT": 319,
    "PLAIN_PACKET_MDU": 464,
    "PLAIN_PACKET_MAX_CONTENT": 368,
    "PAPER_MDU": 2210,
    "COST_TICKET": 256,
    "TICKET_EXPIRY": 1814400,
    "TICKET_GRACE": 432000,
    "TICKET_RENEW": 1209600,
    "TICKET_INTERVAL": 86400
  },
  "stamper_constants": {
    "WORKBLOCK_EXPAND_ROUNDS": 3000,
    "WORKBLOCK_EXPAND_ROUNDS_PN": 1000,
    "WORKBLOCK_EXPAND_ROUNDS_PEERING": 25,
    "STAMP_SIZE": 32
  },
  "vectors": [
    {
      "id": "VEC-MSG-1",
      "title": "Minimal opportunistic message (no fields, no stamp)",
      "kind": "frozen",
      "citation": "LXMessage.py:355-388",
      "inputs": {
        "src_identity_prv_hex": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
        "dst_identity_prv_hex": "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f",
        "timestamp": 1700000000.0,
        "title": "Hi",
        "content": "Hello",
        "fields": {},
        "desired_method": "OPPORTUNISTIC"
      },
      "packed_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03cfb321978105a4c709c3b86930ff15a9d7b53b3485517ec19e2083b39f7661e6e531c78fb71d932f0baf13794c42234ab9320f1ab5b7688e93eaf5960810ece0094cb41d954fc40000000c4024869c40548656c6c6f80",
      "packed_len": 118,
      "parts": {
        "destination_hash": "cf0b2a4a8d2a0b6978b71290da7cc80e",
        "source_hash": "fae321c442e3c9bdcd7a3e79d850e03c",
        "signature": "fb321978105a4c709c3b86930ff15a9d7b53b3485517ec19e2083b39f7661e6e531c78fb71d932f0baf13794c42234ab9320f1ab5b7688e93eaf5960810ece00",
        "packed_payload": "94cb41d954fc40000000c4024869c40548656c6c6f80"
      },
      "payload_msgpack_hex": "94cb41d954fc40000000c4024869c40548656c6c6f80",
      "hashed_part_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03c94cb41d954fc40000000c4024869c40548656c6c6f80",
      "message_id_hex": "9aec506b63deab21d8fa4954d9f743cf20f5adeeb1abd1c7429bb3f832dc287b",
      "hash_hex": "9aec506b63deab21d8fa4954d9f743cf20f5adeeb1abd1c7429bb3f832dc287b",
      "signed_part_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03c94cb41d954fc40000000c4024869c40548656c6c6f809aec506b63deab21d8fa4954d9f743cf20f5adeeb1abd1c7429bb3f832dc287b",
      "signature_hex": "fb321978105a4c709c3b86930ff15a9d7b53b3485517ec19e2083b39f7661e6e531c78fb71d932f0baf13794c42234ab9320f1ab5b7688e93eaf5960810ece00",
      "signature_valid": true,
      "method": 1,
      "representation": 1
    },
    {
      "id": "VEC-MSG-2",
      "title": "Message with a fields dict (integer field key)",
      "kind": "frozen",
      "citation": "LXMessage.py:355-388,215-219",
      "inputs": {
        "timestamp": 1700000000.0,
        "title": "",
        "content": "body text",
        "fields": {
          "0x0F": "0x02"
        },
        "desired_method": "DIRECT"
      },
      "packed_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03c20c2b63a486a2c37a8798204cbdbfd5bb8ada608af29565ab985b63012163a32851a411e0e2d272603bf7b55127a8e79871678625d8aa2a37ee0ef35772dea0794cb41d954fc40000000c400c409626f64792074657874810f02",
      "packed_len": 122,
      "parts": {
        "destination_hash": "cf0b2a4a8d2a0b6978b71290da7cc80e",
        "source_hash": "fae321c442e3c9bdcd7a3e79d850e03c",
        "signature": "20c2b63a486a2c37a8798204cbdbfd5bb8ada608af29565ab985b63012163a32851a411e0e2d272603bf7b55127a8e79871678625d8aa2a37ee0ef35772dea07",
        "packed_payload": "94cb41d954fc40000000c400c409626f64792074657874810f02"
      },
      "payload_msgpack_hex": "94cb41d954fc40000000c400c409626f64792074657874810f02",
      "message_id_hex": "a68ab24e39e6f573ce6c486964b3673c8a3f2ab680e4a12d3ad96cc428befd16",
      "method": 2,
      "representation": 1
    },
    {
      "id": "VEC-MSG-NEGATIVE-FIELD",
      "title": "Message with a negative-fixint field key",
      "kind": "frozen",
      "citation": "LXMessage.py:355-387",
      "inputs": {
        "timestamp": 1700000000.0,
        "title": "negative key",
        "content": "body",
        "field_key": -1,
        "field_value_hex": "6e65676174697665206669656c64",
        "desired_method": "DIRECT"
      },
      "packed_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03cf801bafc76659755c9f16ae13a171dd39cc3d47fd50f6afafca50e2901b0f6130df3a77aa615b7eef1b6efa337915539edb2107fdb6e03dcb23c71efcc2d6d0294cb41d954fc40000000c40c6e65676174697665206b6579c404626f647981ffc40e6e65676174697665206669656c64",
      "packed_len": 144,
      "parts": {
        "destination_hash": "cf0b2a4a8d2a0b6978b71290da7cc80e",
        "source_hash": "fae321c442e3c9bdcd7a3e79d850e03c",
        "signature": "f801bafc76659755c9f16ae13a171dd39cc3d47fd50f6afafca50e2901b0f6130df3a77aa615b7eef1b6efa337915539edb2107fdb6e03dcb23c71efcc2d6d02",
        "packed_payload": "94cb41d954fc40000000c40c6e65676174697665206b6579c404626f647981ffc40e6e65676174697665206669656c64"
      },
      "payload_msgpack_hex": "94cb41d954fc40000000c40c6e65676174697665206b6579c404626f647981ffc40e6e65676174697665206669656c64",
      "message_id_hex": "9578a0095772e88bf55f151755bc174da0927a792cf375899220e683691d5d60",
      "method": 2,
      "representation": 1
    },
    {
      "id": "VEC-MSG-TICKET",
      "title": "Ticket-stamped message (five-element payload)",
      "kind": "frozen",
      "citation": "LXMessage.py:355-388,293-302; LXMRouter.py:1096-1100,1770-1772",
      "inputs": {
        "timestamp": 1700000000.0,
        "title": "T",
        "content": "ticketed",
        "outbound_ticket_hex": "101112131415161718191a1b1c1d1e1f",
        "field_ticket_expires": 1701814400.0,
        "field_ticket_secret_hex": "202122232425262728292a2b2c2d2e2f",
        "desired_method": "DIRECT"
      },
      "packed_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03caba34748775d2f00a91827e07e0bb394958d62d1312b953798c1fe7a9081dac7a2cf9714e0969db69f4e7240acbc354617bfd30d90f5a3cb6e110e0ff89b6d0795cb41d954fc40000000c40154c4087469636b65746564810c92cb41d95be820000000c410202122232425262728292a2b2c2d2e2fc41054f9096872188db445566721224cca74",
      "packed_len": 167,
      "parts": {
        "destination_hash": "cf0b2a4a8d2a0b6978b71290da7cc80e",
        "source_hash": "fae321c442e3c9bdcd7a3e79d850e03c",
        "signature": "aba34748775d2f00a91827e07e0bb394958d62d1312b953798c1fe7a9081dac7a2cf9714e0969db69f4e7240acbc354617bfd30d90f5a3cb6e110e0ff89b6d07",
        "packed_payload": "95cb41d954fc40000000c40154c4087469636b65746564810c92cb41d95be820000000c410202122232425262728292a2b2c2d2e2fc41054f9096872188db445566721224cca74"
      },
      "unstamped_payload_msgpack_hex": "94cb41d954fc40000000c40154c4087469636b65746564810c92cb41d95be820000000c410202122232425262728292a2b2c2d2e2f",
      "stamped_payload_msgpack_hex": "95cb41d954fc40000000c40154c4087469636b65746564810c92cb41d95be820000000c410202122232425262728292a2b2c2d2e2fc41054f9096872188db445566721224cca74",
      "hashed_part_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03c94cb41d954fc40000000c40154c4087469636b65746564810c92cb41d95be820000000c410202122232425262728292a2b2c2d2e2f",
      "message_id_hex": "190d522017c991b7e74bd958faadfc780dced409514904e6f7fd514b4a84d974",
      "signed_part_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03c94cb41d954fc40000000c40154c4087469636b65746564810c92cb41d95be820000000c410202122232425262728292a2b2c2d2e2f190d522017c991b7e74bd958faadfc780dced409514904e6f7fd514b4a84d974",
      "signature_hex": "aba34748775d2f00a91827e07e0bb394958d62d1312b953798c1fe7a9081dac7a2cf9714e0969db69f4e7240acbc354617bfd30d90f5a3cb6e110e0ff89b6d07",
      "signature_valid": true,
      "stamp_hex": "54f9096872188db445566721224cca74",
      "stamp_len": 16,
      "stamp_value": 256,
      "ticket_field_msgpack_hex": "92cb41d95be820000000c410202122232425262728292a2b2c2d2e2f",
      "stamp_excluded_from_message_id": true,
      "note": "payload[4] is the stamp; message_id and signature are computed over the four-element payload only."
    },
    {
      "id": "VEC-MSG-3",
      "title": "Unpack + signature verification round trip of VEC-MSG-1",
      "kind": "frozen",
      "citation": "LXMessage.py:747-822",
      "source_vector": "VEC-MSG-1",
      "recovered_message_id_hex": "9aec506b63deab21d8fa4954d9f743cf20f5adeeb1abd1c7429bb3f832dc287b",
      "recovered_title": "Hi",
      "recovered_content": "Hello",
      "signature_validated": true,
      "matches_source": true
    },
    {
      "id": "VEC-MSG-FOREIGN-UINT32",
      "title": "Foreign writer: payload[0] as MessagePack uint32",
      "kind": "frozen",
      "citation": "LXMessage.py:747-766",
      "inputs": {
        "timestamp_msgpack_hex": "ce6553f100",
        "timestamp_form": "uint32",
        "title": "Hi",
        "content": "Hello",
        "fields": {}
      },
      "packed_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03c31d9a07e39b6996b6c33e1c5c5de0825abb3879736fca70ff2f19d57df2bba49cb7d88f21e0fb093632182edcfec281587e5b70ea5d931098f9fda81baa7f80c94ce6553f100c4024869c40548656c6c6f80",
      "packed_len": 114,
      "parts": {
        "destination_hash": "cf0b2a4a8d2a0b6978b71290da7cc80e",
        "source_hash": "fae321c442e3c9bdcd7a3e79d850e03c",
        "signature": "31d9a07e39b6996b6c33e1c5c5de0825abb3879736fca70ff2f19d57df2bba49cb7d88f21e0fb093632182edcfec281587e5b70ea5d931098f9fda81baa7f80c",
        "packed_payload": "94ce6553f100c4024869c40548656c6c6f80"
      },
      "message_id_hex": "f249f3fd71ae2544ba19c2e678ea0e72fc7003cdf12bd0209da9e4a6d3c7f4cf",
      "reference_timestamp_repr": "1700000000",
      "reference_timestamp_type": "int",
      "reference_signature_validated": true,
      "reference_message_id_matches": true,
      "note": "The reference accepts the message and validates the signature against the bytes the writer packed, because an unstamped payload is hashed as received."
    },
    {
      "id": "VEC-MSG-FOREIGN-FLOAT32",
      "title": "Foreign writer: payload[0] as MessagePack float32",
      "kind": "frozen",
      "citation": "LXMessage.py:747-766",
      "inputs": {
        "timestamp_msgpack_hex": "ca3fc00000",
        "timestamp_form": "float32",
        "title": "Hi",
        "content": "Hello",
        "fields": {}
      },
      "packed_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03cd13daf3bcab517a561dd9fce9e700b9496742ca7c96cb4cb35929b484a3aecc443f38c99402df7b6d28b848ea1cafb6d1bac868ce47a50731f13c04f6c63950f94ca3fc00000c4024869c40548656c6c6f80",
      "packed_len": 114,
      "parts": {
        "destination_hash": "cf0b2a4a8d2a0b6978b71290da7cc80e",
        "source_hash": "fae321c442e3c9bdcd7a3e79d850e03c",
        "signature": "d13daf3bcab517a561dd9fce9e700b9496742ca7c96cb4cb35929b484a3aecc443f38c99402df7b6d28b848ea1cafb6d1bac868ce47a50731f13c04f6c63950f",
        "packed_payload": "94ca3fc00000c4024869c40548656c6c6f80"
      },
      "message_id_hex": "56c844861c283f3d484b0038bf4825a8cf5103f65e59c6223bc24f9da6988ff2",
      "reference_timestamp_repr": "1.5",
      "reference_timestamp_type": "float",
      "reference_signature_validated": true,
      "reference_message_id_matches": true,
      "note": "The reference accepts the message and validates the signature against the bytes the writer packed, because an unstamped payload is hashed as received."
    },
    {
      "id": "VEC-MSG-FOREIGN-NEGATIVE-FIXINT",
      "title": "Foreign writer: payload[0] as MessagePack negative fixint",
      "kind": "frozen",
      "citation": "LXMessage.py:747-766",
      "inputs": {
        "timestamp_msgpack_hex": "ff",
        "timestamp_form": "negative fixint",
        "title": "Hi",
        "content": "Hello",
        "fields": {}
      },
      "packed_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03cc4ce44ad0ae76542b8e2efc2190ec54be99d039a21bd86c5efe019d623a9059a1e5e958a371e7a5c3b0c8d82722db5dbc27130334b7fefd9ce5fcd10c1c8670294ffc4024869c40548656c6c6f80",
      "packed_len": 110,
      "parts": {
        "destination_hash": "cf0b2a4a8d2a0b6978b71290da7cc80e",
        "source_hash": "fae321c442e3c9bdcd7a3e79d850e03c",
        "signature": "c4ce44ad0ae76542b8e2efc2190ec54be99d039a21bd86c5efe019d623a9059a1e5e958a371e7a5c3b0c8d82722db5dbc27130334b7fefd9ce5fcd10c1c86702",
        "packed_payload": "94ffc4024869c40548656c6c6f80"
      },
      "message_id_hex": "8c5bec7442d3bd3368c72aa01ef65ac9ff718575638f51bd62b344ca2f3a4d47",
      "reference_timestamp_repr": "-1",
      "reference_timestamp_type": "int",
      "reference_signature_validated": true,
      "reference_message_id_matches": true,
      "note": "The reference accepts the message and validates the signature against the bytes the writer packed, because an unstamped payload is hashed as received."
    },
    {
      "id": "VEC-DLV-OPP",
      "title": "Opportunistic on-air payload (leading destination hash omitted)",
      "kind": "frozen",
      "citation": "LXMessage.py:626-638",
      "full_packed_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03cfb321978105a4c709c3b86930ff15a9d7b53b3485517ec19e2083b39f7661e6e531c78fb71d932f0baf13794c42234ab9320f1ab5b7688e93eaf5960810ece0094cb41d954fc40000000c4024869c40548656c6c6f80",
      "on_air_hex": "fae321c442e3c9bdcd7a3e79d850e03cfb321978105a4c709c3b86930ff15a9d7b53b3485517ec19e2083b39f7661e6e531c78fb71d932f0baf13794c42234ab9320f1ab5b7688e93eaf5960810ece0094cb41d954fc40000000c4024869c40548656c6c6f80",
      "note": "Destination is inferred from the RNS packet header."
    },
    {
      "id": "VEC-DLV-DIRECT",
      "title": "Direct delivery sends the full packed message",
      "kind": "frozen",
      "citation": "LXMessage.py:417-424,635-636",
      "on_air_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03cfb321978105a4c709c3b86930ff15a9d7b53b3485517ec19e2083b39f7661e6e531c78fb71d932f0baf13794c42234ab9320f1ab5b7688e93eaf5960810ece0094cb41d954fc40000000c4024869c40548656c6c6f80",
      "note": "Sent as a single Packet over a Link when content fits LINK_PACKET_MAX_CONTENT, else as a Resource."
    },
    {
      "id": "VEC-PROP-ENVELOPE",
      "title": "Propagation transfer envelope (encrypted, round-trip proof)",
      "kind": "roundtrip",
      "citation": "LXMessage.py:426-436",
      "inner_packed_hex": "cf0b2a4a8d2a0b6978b71290da7cc80efae321c442e3c9bdcd7a3e79d850e03cfb321978105a4c709c3b86930ff15a9d7b53b3485517ec19e2083b39f7661e6e531c78fb71d932f0baf13794c42234ab9320f1ab5b7688e93eaf5960810ece0094cb41d954fc40000000c4024869c40548656c6c6f80",
      "dest_hash_prefix_hex": "cf0b2a4a8d2a0b6978b71290da7cc80e",
      "pn_encrypted_len": 192,
      "lxmf_data_structure": "destination_hash(16) || destination.encrypt(packed[16:])",
      "transient_id_len": 32,
      "transient_id_is_full_hash": true,
      "transient_id_note": "transient_id = full_hash(lxmf_data); random ciphertext-derived bytes are intentionally omitted.",
      "envelope_structure": "msgpack([wall_clock_timestamp, [lxmf_data, ...]])",
      "decrypt_recovers_inner_tail": true
    },
    {
      "id": "VEC-PAPER-URI",
      "title": "Paper message lxm:// URI (encrypted, round-trip proof)",
      "kind": "roundtrip",
      "citation": "LXMessage.py:446-451,698-713",
      "uri_scheme": "lxm",
      "uri_prefix": "lxm://",
      "uri_length": 284,
      "padding_stripped": true,
      "destination_hash_matches": true,
      "decrypt_recovers_inner_tail": true,
      "structure": "lxm://base64url(destination_hash(16) || destination.encrypt(packed[16:])), '=' padding stripped",
      "note": "The random base64url body is intentionally omitted."
    },
    {
      "id": "VEC-STAMP-1",
      "title": "Stamp workblock, validity, and value (cost=8, expand_rounds=4)",
      "kind": "frozen",
      "citation": "LXStamper.py:49-77",
      "material_hex": "1c91877ffb9797aa6f33064586b47a3c41f6dfa75e10aa17bc24bf0ac6833712",
      "expand_rounds": 4,
      "target_cost": 8,
      "workblock_len": 1024,
      "workblock_sha256_hex": "3ef04c48464deb9d32b1433fa3a3e442af5be363c2d9e0a3ee347d8c62eb1251",
      "stamp_search": "stamp = full_hash(material || counter_be8), counter++ until valid",
      "winning_counter": 377,
      "stamp_hex": "9b79689af899049accea13624a3c59221603117e81086a86a3249ce278acc35e",
      "digest_hex": "00ed462c86ba94b972b6b8046476def6133ff9afe181bd4cb034f2e075181af3",
      "target_hex": "0100000000000000000000000000000000000000000000000000000000000000",
      "valid": true,
      "stamp_value": 8
    },
    {
      "id": "VEC-STAMP-PN",
      "title": "Propagation-node stamp (cost=8, expand_rounds=1000)",
      "kind": "frozen",
      "citation": "LXStamper.py:13,53-63,122-155",
      "material_hex": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
      "expand_rounds": 1000,
      "target_cost": 8,
      "workblock_len": 256000,
      "workblock_sha256_hex": "36224067c2ebd1a40b0dc8908bd34dc4b7cd84be57f68a765dbaf3298bcd9719",
      "stamp_search": "stamp = counter_be32, counter++ until valid",
      "winning_counter": 17,
      "stamp_hex": "0000000000000000000000000000000000000000000000000000000000000011",
      "digest_hex": "00420981fc866c09cb2f28e7503147d56bae0b3a6fc69f00478cb247f8d95b91",
      "target_hex": "0100000000000000000000000000000000000000000000000000000000000000",
      "valid": true,
      "stamp_value": 9
    },
    {
      "id": "VEC-PROP-GET-LIST",
      "title": "Propagation mailbox list request",
      "kind": "frozen",
      "citation": "LXMRouter.py:492-501; LXMPeer.py:15",
      "path": "/get",
      "value": [
        null,
        null
      ],
      "request_hex": "92c0c0"
    },
    {
      "id": "VEC-PROP-GET-DOWNLOAD",
      "title": "Propagation mailbox download request",
      "kind": "frozen",
      "citation": "LXMRouter.py:1521-1539; LXMPeer.py:15",
      "path": "/get",
      "wants_hex": [
        "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
      ],
      "haves_hex": [
        "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f"
      ],
      "transfer_limit_kb": 1000,
      "request_hex": "9391c420202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f91c420404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5fcd03e8"
    },
    {
      "id": "VEC-PROP-GET-ACK",
      "title": "Propagation mailbox acknowledgement and purge request",
      "kind": "frozen",
      "citation": "LXMRouter.py:1569-1581; LXMPeer.py:15",
      "path": "/get",
      "haves_hex": [
        "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
      ],
      "request_hex": "92c091c420000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
    },
    {
      "id": "VEC-PROP-LIST-RESPONSE",
      "title": "Propagation mailbox transient-ID list response",
      "kind": "frozen",
      "citation": "LXMRouter.py:1426-1448,1506-1549",
      "transient_ids_hex": [
        "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
        "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f"
      ],
      "response_hex": "92c420202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3fc420404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f"
    },
    {
      "id": "VEC-PROP-GET-RESPONSE",
      "title": "Propagation mailbox downloaded-message response",
      "kind": "frozen",
      "citation": "LXMRouter.py:1450-1500,1551-1588",
      "messages_hex": [
        "6f6e65",
        "74776f"
      ],
      "response_hex": "92c4036f6e65c40374776f",
      "no_identity_error_hex": "ccf0",
      "no_access_error_hex": "ccf1"
    },
    {
      "id": "VEC-ANN-DELIVERY",
      "title": "Delivery announce app_data",
      "kind": "frozen",
      "citation": "LXMRouter.py:985-1001; LXMF.py:151-200",
      "structure": "msgpack([display_name_utf8_or_None, stamp_cost_or_None, supported_functionality])",
      "app_data_hex": "93c405416c696365089100",
      "first_byte_hex": "93",
      "first_byte_note": "0x93 = msgpack fixarray(3); decoders sniff 0x90-0x9f or 0xdc.",
      "decoded_display_name": "Alice",
      "decoded_stamp_cost": 8,
      "decoded_compression_supported": true
    },
    {
      "id": "VEC-ANN-STAMP-COST-WINDOW",
      "title": "Advertised stamp cost is only emitted for 0 < cost < 255",
      "kind": "frozen",
      "citation": "LXMRouter.py:1042-1045 (emit); LXMRouter.py:378-393 (setter)",
      "structure": "emit_<cost>_hex = get_announce_app_data() with that cost assigned; peer_reads_<cost> = stamp_cost_from_app_data() of those bytes; setter_accepts_<cost> = set_inbound_stamp_cost() return value",
      "display_name_hex": "416c696365",
      "emit_none_hex": "93c405416c696365c09100",
      "peer_reads_none": null,
      "setter_accepts_none": true,
      "setter_stores_none": null,
      "emit_0_hex": "93c405416c696365c09100",
      "peer_reads_0": null,
      "setter_accepts_0": true,
      "setter_stores_0": null,
      "emit_1_hex": "93c405416c696365019100",
      "peer_reads_1": 1,
      "setter_accepts_1": true,
      "setter_stores_1": 1,
      "emit_8_hex": "93c405416c696365089100",
      "peer_reads_8": 8,
      "setter_accepts_8": true,
      "setter_stores_8": 8,
      "emit_254_hex": "93c405416c696365ccfe9100",
      "peer_reads_254": 254,
      "setter_accepts_254": true,
      "setter_stores_254": 254,
      "emit_255_hex": "93c405416c696365c09100",
      "peer_reads_255": null,
      "setter_accepts_255": false,
      "setter_stores_255": null
    },
    {
      "id": "VEC-ANN-PROPAGATION",
      "title": "Propagation node announce app_data (7-element list)",
      "kind": "frozen",
      "citation": "LXMRouter.py:306-318; LXMF.py:202-250",
      "structure": "msgpack([legacy, timebase, enabled, xfer_limit_kb, sync_limit_kb, [prop_cost, prop_flex, peering_cost], metadata])",
      "fixed_timebase": 1700000000,
      "timebase_note": "Field 1 is int(time.time()) in the real protocol.",
      "app_data_hex": "97c2ce6553f100c3cd0100cd2800931003128101c4044e6f6465",
      "valid": true,
      "decoded_pn_name": "Node",
      "decoded_pn_stamp_cost": 16
    },
    {
      "id": "VEC-PN-UPLOAD",
      "title": "Client upload envelope as the node receives it",
      "kind": "frozen",
      "citation": "LXMRouter.py:2234-2255 (propagation_packet); LXStamper.py:84-96 (validate_pn_stamp); LXMRouter.py:2257-2260 (invalid-stamp reject)",
      "structure": "msgpack([timestamp, [lxmf_data || stamp]])",
      "envelope_hex": "92cb41d954fc4000000091c4a8cf0b2a4a8d2a0b6978b71290da7cc80e00070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef5fc030a11181f262d343b424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8ff060d141b222930373e454c535a61686f767d848b9299a0a7aeb5bcc3cad1d8dfe6edf4fb020910171e252c333a410dc63659e6e18fd73017dbd2cf2cfa07a135805a31976bd7ac1d3edeb2c6233c",
      "lxmf_data_hex": "cf0b2a4a8d2a0b6978b71290da7cc80e00070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef5fc030a11181f262d343b424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8ff060d141b222930373e454c535a61686f767d848b9299a0a7aeb5bcc3cad1d8dfe6edf4fb020910171e252c333a41",
      "stamp_hex": "0dc63659e6e18fd73017dbd2cf2cfa07a135805a31976bd7ac1d3edeb2c6233c",
      "stamp_search_rounds": 105,
      "transient_id_hex": "de8802f165d292d0b07b08faf665f910dabf473aee55e904ee457619509c3013",
      "destination_hex": "cf0b2a4a8d2a0b6978b71290da7cc80e",
      "stamp_cost": 8,
      "stamp_value": 8,
      "validator_accepts_at_cost": true,
      "validator_value_at_cost_0": 8,
      "validator_rejects_above_value": true,
      "invalid_stamp_reject_hex": "91ccf5"
    },
    {
      "id": "VEC-PN-GET-EXCHANGE",
      "title": "Node /get responses from the genuine handler over a seeded store",
      "kind": "frozen",
      "citation": "LXMRouter.py:1482-1560 (message_get_request); :1500 (size-ascending list); :1508-1519 (purge on confirmation only); :1549 (stamp stripped)",
      "structure": "response bytes are msgpack.packb(handler return)",
      "store_transient_ids_hex": [
        "1cd127390fc0616caf02ebf5814dfd65a192e22252d3a627b6b7101398b65da1",
        "de8802f165d292d0b07b08faf665f910dabf473aee55e904ee457619509c3013"
      ],
      "list_response_hex": "92c4201cd127390fc0616caf02ebf5814dfd65a192e22252d3a627b6b7101398b65da1c420de8802f165d292d0b07b08faf665f910dabf473aee55e904ee457619509c3013",
      "fetch_limit_kb": 0.2,
      "fetch_response_hex": "91c474cf0b2a4a8d2a0b6978b71290da7cc80e000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60616263",
      "ack_response_hex": "90",
      "list_after_ack_response_hex": "91c420de8802f165d292d0b07b08faf665f910dabf473aee55e904ee457619509c3013",
      "stranger_list_response_hex": "90",
      "store_size_after_ack": 1,
      "purged_file_gone": true
    },
    {
      "id": "VEC-PN-CONTROL",
      "title": "Control destination payloads: stats map, trigger ack, errors",
      "kind": "frozen",
      "citation": "LXMRouter.py:89-91 (paths); :672-676 (control destination and allow list); :769-836 (compile_stats); :838-865 (handlers); LXMPeer.py:24-31 (error codes)",
      "structure": "request/response payloads are msgpack.packb(value)",
      "stats_get_path": "/pn/get/stats",
      "sync_request_path": "/pn/peer/sync",
      "unpeer_request_path": "/pn/peer/unpeer",
      "hops_unknown": 128,
      "stats_response_hex": "de0015ad6964656e746974795f68617368c41011111111111111111111111111111111b064657374696e6174696f6e5f68617368c41022222222222222222222222222222222a6757074696d65cb4045400000000000ae64656c69766572795f6c696d6974cd03e8b170726f7061676174696f6e5f6c696d6974cd0100aa73796e635f6c696d6974cd2800b17461726765745f7374616d705f636f737410b67374616d705f636f73745f666c65786962696c69747903ac70656572696e675f636f737412b06d61785f70656572696e675f636f73741ab16175746f706565725f6d6178646570746804b066726f6d5f7374617469635f6f6e6c79c2ac6d65737361676573746f726583a5636f756e7402a56279746573cd1000a56c696d6974ce1dcd6500a7636c69656e747382d924636c69656e745f70726f7061676174696f6e5f6d657373616765735f726563656976656405d922636c69656e745f70726f7061676174696f6e5f6d657373616765735f73657276656403bd756e7065657265645f70726f7061676174696f6e5f696e636f6d696e6701bd756e7065657265645f70726f7061676174696f6e5f72785f6279746573cd0800ac7374617469635f706565727301b0646973636f76657265645f706565727301ab746f74616c5f706565727302a96d61785f706565727314a5706565727382c41033333333333333333333333333333333de0016a474797065a6737461746963a5737461746500a5616c697665c3a46e616d65a4706e2d62aa6c6173745f6865617264cd03e8b16e6578745f73796e635f617474656d707400b16c6173745f73796e635f617474656d7074cd0384ac73796e635f6261636b6f666600b070656572696e675f74696d6562617365cd0320a36c6572cd04b0a3737472cd9c40ae7472616e736665725f6c696d6974cd0100aa73796e635f6c696d6974cd2800b17461726765745f7374616d705f636f737410b67374616d705f636f73745f666c65786962696c69747903ac70656572696e675f636f737412ab70656572696e675f6b657913b06e6574776f726b5f64697374616e636501a872785f627974657364a874785f6279746573ccc8af616363657074616e63655f72617465cb3ff0000000000000a86d6573736167657384a76f66666572656404a86f7574676f696e6704a8696e636f6d696e6702a9756e68616e646c656400c41044444444444444444444444444444444de0016a474797065aa646973636f7665726564a5737461746500a5616c697665c2a46e616d65c0aa6c6173745f686561726400b16e6578745f73796e635f617474656d707400b16c6173745f73796e635f617474656d707400ac73796e635f6261636b6f666600b070656572696e675f74696d656261736500a36c657200a373747200ae7472616e736665725f6c696d6974c0aa73796e635f6c696d6974c0b17461726765745f7374616d705f636f7374c0b67374616d705f636f73745f666c65786962696c697479c0ac70656572696e675f636f7374c0ab70656572696e675f6b6579c0b06e6574776f726b5f64697374616e6365cc80a872785f627974657300a874785f627974657300af616363657074616e63655f72617465cb0000000000000000a86d6573736167657384a76f66666572656400a86f7574676f696e6700a8696e636f6d696e6700a9756e68616e646c656400",
      "ack_response_hex": "c3",
      "error_no_identity_hex": "ccf0",
      "error_no_access_hex": "ccf1",
      "error_invalid_data_hex": "ccf4",
      "error_not_found_hex": "ccfd"
    }
  ]
}
