{
  "$comment": "SHIPRTCL v0.1 fingerprint conformance vectors. Generated by scripts/gen-vectors.mjs; do not edit by hand.",
  "spec": "https://shiprtcl.org/spec/#4-structural-fingerprint",
  "version": "0.1",
  "vectors": [
    {
      "name": "whitepaper-example",
      "description": "The worked example from the whitepaper §5.",
      "mediaType": "application/json",
      "body": "{\"event\":\"payment_success\",\"customer\":{\"email\":\"user@example.com\",\"id\":9812},\"amount\":49.50,\"items\":[\"sku_1\",\"sku_2\"]}",
      "canonical": "[[\"\",\"OBJ\"],[\"/amount\",\"NUM\"],[\"/customer\",\"OBJ\"],[\"/customer/email\",\"STR\"],[\"/customer/id\",\"NUM\"],[\"/event\",\"STR\"],[\"/items\",\"ARR\"],[\"/items/~*\",\"STR\"]]",
      "fingerprint": "sr1:sha256:687cb54f1c77c419347a344b75fb970457eca760500bfec3f3d326c88171b0ae"
    },
    {
      "name": "value-independence",
      "description": "Same structure as whitepaper-example with different values and key order. MUST produce the same fingerprint.",
      "mediaType": "application/json",
      "body": "{\"items\":[\"x\"],\"amount\":1,\"customer\":{\"id\":0,\"email\":\"\"},\"event\":\"refund\"}",
      "canonical": "[[\"\",\"OBJ\"],[\"/amount\",\"NUM\"],[\"/customer\",\"OBJ\"],[\"/customer/email\",\"STR\"],[\"/customer/id\",\"NUM\"],[\"/event\",\"STR\"],[\"/items\",\"ARR\"],[\"/items/~*\",\"STR\"]]",
      "fingerprint": "sr1:sha256:687cb54f1c77c419347a344b75fb970457eca760500bfec3f3d326c88171b0ae"
    },
    {
      "name": "integer-vs-float",
      "description": "Integers and floats are both NUM.",
      "mediaType": "application/json",
      "body": "{\"a\":1,\"b\":1.5,\"c\":-0,\"d\":1e21}",
      "canonical": "[[\"\",\"OBJ\"],[\"/a\",\"NUM\"],[\"/b\",\"NUM\"],[\"/c\",\"NUM\"],[\"/d\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:5ff2a8908c01aab082f0e04815070ab721a88c1b65a43199528fe46e691bb04e"
    },
    {
      "name": "empty-containers",
      "description": "Empty arrays and objects contribute only their own entry.",
      "mediaType": "application/json",
      "body": "{\"list\":[],\"obj\":{}}",
      "canonical": "[[\"\",\"OBJ\"],[\"/list\",\"ARR\"],[\"/obj\",\"OBJ\"]]",
      "fingerprint": "sr1:sha256:052c52b4c0bd7c3e3ffe828e1dd48643034f512a4a918b5225452c6f41a7b652"
    },
    {
      "name": "null-and-bool",
      "description": "NULL and BOOL markers.",
      "mediaType": "application/json",
      "body": "{\"a\":null,\"b\":true,\"c\":false}",
      "canonical": "[[\"\",\"OBJ\"],[\"/a\",\"NULL\"],[\"/b\",\"BOOL\"],[\"/c\",\"BOOL\"]]",
      "fingerprint": "sr1:sha256:cfd7de2cc4462e800fd29922e926ce824689bfb21323531e164c42e2c522bda0"
    },
    {
      "name": "array-of-objects-union",
      "description": "Element shapes are unioned; keys present in only some elements still appear.",
      "mediaType": "application/json",
      "body": "{\"items\":[{\"sku\":\"a\",\"qty\":1},{\"sku\":\"b\",\"note\":\"gift\"}]}",
      "canonical": "[[\"\",\"OBJ\"],[\"/items\",\"ARR\"],[\"/items/~*\",\"OBJ\"],[\"/items/~*/note\",\"STR\"],[\"/items/~*/qty\",\"NUM\"],[\"/items/~*/sku\",\"STR\"]]",
      "fingerprint": "sr1:sha256:21a2d71d0a9f393ad8096a249f98febb72a7daad9ae7fee8480d2ecd8985bb22"
    },
    {
      "name": "mixed-array",
      "description": "Type markers at one path are unioned and sorted.",
      "mediaType": "application/json",
      "body": "{\"v\":[1,\"two\",null,true,{\"x\":1},[2]]}",
      "canonical": "[[\"\",\"OBJ\"],[\"/v\",\"ARR\"],[\"/v/~*\",\"ARR|BOOL|NULL|NUM|OBJ|STR\"],[\"/v/~*/x\",\"NUM\"],[\"/v/~*/~*\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:07adbbe28f78b6b7832e088ceae1f616ac94885afbc049598ae9e6f7e9073996"
    },
    {
      "name": "nested-arrays",
      "description": "Wildcards nest.",
      "mediaType": "application/json",
      "body": "{\"m\":[[1,2],[3]]}",
      "canonical": "[[\"\",\"OBJ\"],[\"/m\",\"ARR\"],[\"/m/~*\",\"ARR\"],[\"/m/~*/~*\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:1df94c14d5f9508997d44ec98d3d029521e97c2d69f76cdcdb5750c06738db97"
    },
    {
      "name": "map-numeric-keys",
      "description": "An object whose keys are all numeric is a MAP (rule 2).",
      "mediaType": "application/json",
      "body": "{\"by_id\":{\"101\":{\"n\":1},\"102\":{\"n\":2,\"x\":true}}}",
      "canonical": "[[\"\",\"OBJ\"],[\"/by_id\",\"MAP\"],[\"/by_id/~*\",\"OBJ\"],[\"/by_id/~*/n\",\"NUM\"],[\"/by_id/~*/x\",\"BOOL\"]]",
      "fingerprint": "sr1:sha256:9305aadbc62794cec71d35ad3d857440556f0ae4a85ed562d85bdf53d47633d3"
    },
    {
      "name": "map-uuid-keys",
      "description": "UUID keys make a MAP.",
      "mediaType": "application/json",
      "body": "{\"sessions\":{\"3f2b8a1e-9c4d-4b7a-8e2f-1a2b3c4d5e6f\":1}}",
      "canonical": "[[\"\",\"OBJ\"],[\"/sessions\",\"MAP\"],[\"/sessions/~*\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:5fcecb791637de6dde22ab3e8c81dbc3b794452add214cf6007fb5d6e9d71a02"
    },
    {
      "name": "map-email-keys",
      "description": "Email keys make a MAP, so addresses never appear in shapes.",
      "mediaType": "application/json",
      "body": "{\"scores\":{\"a@example.com\":1,\"b@example.org\":2}}",
      "canonical": "[[\"\",\"OBJ\"],[\"/scores\",\"MAP\"],[\"/scores/~*\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:14afd3ab3eb6da7b8eabfc4316723e241c6101acf130eeef8a38cb3908c091ef"
    },
    {
      "name": "map-prefixed-id-keys",
      "description": "Prefixed opaque ids (letters, underscore, 8+ alphanumerics with a digit) make a MAP.",
      "mediaType": "application/json",
      "body": "{\"prices\":{\"price_1NxYz2AbCdEf\":{\"unit\":100}}}",
      "canonical": "[[\"\",\"OBJ\"],[\"/prices\",\"MAP\"],[\"/prices/~*\",\"OBJ\"],[\"/prices/~*/unit\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:044af72b56205267a69c785cefb1cc71a876119f7539f2f4c00ec2dd6ad05d2d"
    },
    {
      "name": "not-a-map",
      "description": "snake_case keys are not dynamic.",
      "mediaType": "application/json",
      "body": "{\"meta\":{\"order_reference\":\"x\",\"billing_address\":\"y\"}}",
      "canonical": "[[\"\",\"OBJ\"],[\"/meta\",\"OBJ\"],[\"/meta/billing_address\",\"STR\"],[\"/meta/order_reference\",\"STR\"]]",
      "fingerprint": "sr1:sha256:b19e7b249b576aceaec6d61b5fc7a6d980494ad387c5e4b0c4c14bd6199c65d4"
    },
    {
      "name": "map-hint",
      "description": "A contract mapHint forces MAP regardless of keys.",
      "mediaType": "application/json",
      "body": "{\"metadata\":{\"campaign\":\"x\",\"utm_source\":\"y\"}}",
      "mapHints": [
        "/metadata"
      ],
      "canonical": "[[\"\",\"OBJ\"],[\"/metadata\",\"MAP\"],[\"/metadata/~*\",\"STR\"]]",
      "fingerprint": "sr1:sha256:e70b6fdeeaa84526c39cbebc99ac545d4c7fd960dc96f620b023d2bb816577e8"
    },
    {
      "name": "too-many-keys",
      "description": "More than 256 keys is always a MAP (rule 3).",
      "mediaType": "application/json",
      "body": "{\"wide\":{\"k0\":0,\"k1\":1,\"k2\":2,\"k3\":3,\"k4\":4,\"k5\":5,\"k6\":6,\"k7\":7,\"k8\":8,\"k9\":9,\"k10\":10,\"k11\":11,\"k12\":12,\"k13\":13,\"k14\":14,\"k15\":15,\"k16\":16,\"k17\":17,\"k18\":18,\"k19\":19,\"k20\":20,\"k21\":21,\"k22\":22,\"k23\":23,\"k24\":24,\"k25\":25,\"k26\":26,\"k27\":27,\"k28\":28,\"k29\":29,\"k30\":30,\"k31\":31,\"k32\":32,\"k33\":33,\"k34\":34,\"k35\":35,\"k36\":36,\"k37\":37,\"k38\":38,\"k39\":39,\"k40\":40,\"k41\":41,\"k42\":42,\"k43\":43,\"k44\":44,\"k45\":45,\"k46\":46,\"k47\":47,\"k48\":48,\"k49\":49,\"k50\":50,\"k51\":51,\"k52\":52,\"k53\":53,\"k54\":54,\"k55\":55,\"k56\":56,\"k57\":57,\"k58\":58,\"k59\":59,\"k60\":60,\"k61\":61,\"k62\":62,\"k63\":63,\"k64\":64,\"k65\":65,\"k66\":66,\"k67\":67,\"k68\":68,\"k69\":69,\"k70\":70,\"k71\":71,\"k72\":72,\"k73\":73,\"k74\":74,\"k75\":75,\"k76\":76,\"k77\":77,\"k78\":78,\"k79\":79,\"k80\":80,\"k81\":81,\"k82\":82,\"k83\":83,\"k84\":84,\"k85\":85,\"k86\":86,\"k87\":87,\"k88\":88,\"k89\":89,\"k90\":90,\"k91\":91,\"k92\":92,\"k93\":93,\"k94\":94,\"k95\":95,\"k96\":96,\"k97\":97,\"k98\":98,\"k99\":99,\"k100\":100,\"k101\":101,\"k102\":102,\"k103\":103,\"k104\":104,\"k105\":105,\"k106\":106,\"k107\":107,\"k108\":108,\"k109\":109,\"k110\":110,\"k111\":111,\"k112\":112,\"k113\":113,\"k114\":114,\"k115\":115,\"k116\":116,\"k117\":117,\"k118\":118,\"k119\":119,\"k120\":120,\"k121\":121,\"k122\":122,\"k123\":123,\"k124\":124,\"k125\":125,\"k126\":126,\"k127\":127,\"k128\":128,\"k129\":129,\"k130\":130,\"k131\":131,\"k132\":132,\"k133\":133,\"k134\":134,\"k135\":135,\"k136\":136,\"k137\":137,\"k138\":138,\"k139\":139,\"k140\":140,\"k141\":141,\"k142\":142,\"k143\":143,\"k144\":144,\"k145\":145,\"k146\":146,\"k147\":147,\"k148\":148,\"k149\":149,\"k150\":150,\"k151\":151,\"k152\":152,\"k153\":153,\"k154\":154,\"k155\":155,\"k156\":156,\"k157\":157,\"k158\":158,\"k159\":159,\"k160\":160,\"k161\":161,\"k162\":162,\"k163\":163,\"k164\":164,\"k165\":165,\"k166\":166,\"k167\":167,\"k168\":168,\"k169\":169,\"k170\":170,\"k171\":171,\"k172\":172,\"k173\":173,\"k174\":174,\"k175\":175,\"k176\":176,\"k177\":177,\"k178\":178,\"k179\":179,\"k180\":180,\"k181\":181,\"k182\":182,\"k183\":183,\"k184\":184,\"k185\":185,\"k186\":186,\"k187\":187,\"k188\":188,\"k189\":189,\"k190\":190,\"k191\":191,\"k192\":192,\"k193\":193,\"k194\":194,\"k195\":195,\"k196\":196,\"k197\":197,\"k198\":198,\"k199\":199,\"k200\":200,\"k201\":201,\"k202\":202,\"k203\":203,\"k204\":204,\"k205\":205,\"k206\":206,\"k207\":207,\"k208\":208,\"k209\":209,\"k210\":210,\"k211\":211,\"k212\":212,\"k213\":213,\"k214\":214,\"k215\":215,\"k216\":216,\"k217\":217,\"k218\":218,\"k219\":219,\"k220\":220,\"k221\":221,\"k222\":222,\"k223\":223,\"k224\":224,\"k225\":225,\"k226\":226,\"k227\":227,\"k228\":228,\"k229\":229,\"k230\":230,\"k231\":231,\"k232\":232,\"k233\":233,\"k234\":234,\"k235\":235,\"k236\":236,\"k237\":237,\"k238\":238,\"k239\":239,\"k240\":240,\"k241\":241,\"k242\":242,\"k243\":243,\"k244\":244,\"k245\":245,\"k246\":246,\"k247\":247,\"k248\":248,\"k249\":249,\"k250\":250,\"k251\":251,\"k252\":252,\"k253\":253,\"k254\":254,\"k255\":255,\"k256\":256}}",
      "canonical": "[[\"\",\"OBJ\"],[\"/wide\",\"MAP\"],[\"/wide/~*\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:695a278361b09cb92e644e012ec9c3f44e16c1cbca56c9b4801e4b311169123d"
    },
    {
      "name": "pointer-escaping",
      "description": "RFC 6901 escaping: \"~\" → \"~0\", \"/\" → \"~1\". Dots are ordinary characters.",
      "mediaType": "application/json",
      "body": "{\"a/b\":1,\"c~d\":2,\"e.f\":3,\"~*\":4}",
      "canonical": "[[\"\",\"OBJ\"],[\"/a~1b\",\"NUM\"],[\"/c~0d\",\"NUM\"],[\"/e.f\",\"NUM\"],[\"/~0*\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:a164e6cec1c7b68a7d09ac08344b55c18d1cfa9e60c38f69edf5872354b70d03"
    },
    {
      "name": "unicode-nfc",
      "description": "Keys are NFC-normalized: decomposed \"e\\u0301\" equals composed \"\\u00e9\".",
      "mediaType": "application/json",
      "body": "{\"caf\\u0065\\u0301\":1}",
      "canonical": "[[\"\",\"OBJ\"],[\"/café\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:41f021b7791160648c4ba7fe5ab85cc54bb43a03467fffe2a7c0d774ae573744"
    },
    {
      "name": "code-point-order",
      "description": "Paths sort by Unicode code point, not UTF-16 code unit.",
      "mediaType": "application/json",
      "body": "{\"\\uffff\":1,\"\\ud83d\\ude00\":2,\"z\":3}",
      "canonical": "[[\"\",\"OBJ\"],[\"/z\",\"NUM\"],[\"/￿\",\"NUM\"],[\"/😀\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:ee38c027dc43386dbfd20adc6de395a289b4c5bee527a0a25b99c98f221d60fb"
    },
    {
      "name": "root-array",
      "description": "A root array.",
      "mediaType": "application/json",
      "body": "[{\"a\":1}]",
      "canonical": "[[\"\",\"ARR\"],[\"/~*\",\"OBJ\"],[\"/~*/a\",\"NUM\"]]",
      "fingerprint": "sr1:sha256:1447c02bc73868e9ceb659ee923cb983861ea446d3eeb416afac7eaad51da59f"
    },
    {
      "name": "root-scalar",
      "description": "A root scalar.",
      "mediaType": "application/json",
      "body": "\"hello\"",
      "canonical": "[[\"\",\"STR\"]]",
      "fingerprint": "sr1:sha256:bd9f761121e8319bc9cb3629ba00e606459c7bf05f4255494d6a3c746c8cedb8"
    },
    {
      "name": "csv",
      "description": "CSV: header row, every cell STR, root ARR.",
      "mediaType": "text/csv",
      "body": "id,zip,amount\n1,01234,9.50\n2,\"10001\",3\n",
      "canonical": "[[\"\",\"ARR\"],[\"/~*\",\"OBJ\"],[\"/~*/amount\",\"STR\"],[\"/~*/id\",\"STR\"],[\"/~*/zip\",\"STR\"]]",
      "fingerprint": "sr1:sha256:536832db8b0c62b978fc3ce55478bc88001d407d2dc78b5763bbd33cfd91ea25"
    },
    {
      "name": "form-urlencoded",
      "description": "Form bodies: every value STR; key[] and repeated keys become ARR.",
      "mediaType": "application/x-www-form-urlencoded",
      "body": "From=%2B15550001&Body=hi&MediaUrl[]=a&tag=x&tag=y",
      "canonical": "[[\"\",\"OBJ\"],[\"/Body\",\"STR\"],[\"/From\",\"STR\"],[\"/MediaUrl\",\"ARR\"],[\"/MediaUrl/~*\",\"STR\"],[\"/tag\",\"ARR\"],[\"/tag/~*\",\"STR\"]]",
      "fingerprint": "sr1:sha256:ac8210d87dcd04a1831bb500afb580792e63063bde40c43aec2d789baa0aef7d"
    }
  ]
}
