Repository navigation
Expand file tree
/
Copy pathpython-frame.json
More file actions
576 lines (576 loc) · 48.7 KB
/
Copy pathpython-frame.json
File metadata and controls
576 lines (576 loc) · 48.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
{
"description": "Python SDK (cachekit-py) auto-mode storage container: CK v3 frame. Python-SDK-internal \u2014 other SDKs identify and reject, never decode. See spec/wire-format.md 'SDK Storage Containers (auto mode)'.",
"frame_layout": "MAGIC 'CK' (0x43 0x4B) | VERSION u8 (0x03) | HDR_LEN u32 big-endian | HEADER (UTF-8 JSON: {s, m, v}) | PAYLOAD (raw bytes)",
"generator": "mixed provenance \u2014 vectors carrying a per-vector 'generator' field record their own; all others: legacy vectors: cachekit 0.11.1 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate (unchanged since); *_bin twins carry their own per-vector 'generator' field",
"frame_vectors": [
{
"name": "raw_payload_frame",
"description": "Minimal frame: SerializationWrapper.wrap over raw bytes. Parse-level vector.",
"frame_hex": "434b030000004d7b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022636f6d70726573736564223a2066616c73657d2c202276223a2022322e30227d68656c6c6f2c2063616368656b697421",
"expected_header": {
"s": "default",
"m": {
"format": "msgpack",
"compressed": false
},
"v": "2.0"
},
"expected_payload_hex": "68656c6c6f2c2063616368656b697421"
},
{
"name": "default_saas_write_msgpack_bytestorage",
"description": "Exact stored bytes for a default @cache write (StandardSerializer, integrity on): CK v3 frame wrapping the ByteStorage envelope of the MessagePack-encoded value. This is what any backend \u2014 including the SaaS \u2014 receives from cachekit-py in auto mode.",
"value_json": {
"user_id": 42,
"name": "cachekit",
"active": true
},
"frame_hex": "434b030000007d7b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94dc0022ccf011cc83cca7757365725f69642acca46e616d65cca863616368656b6974cca6616374697665ccc398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"expected_header": {
"s": "default",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack"
},
"v": "2.0"
},
"expected_payload_hex": "94dc0022ccf011cc83cca7757365725f69642acca46e616d65cca863616368656b6974cca6616374697665ccc398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"payload_envelope": {
"encoding": "rmp_serde::to_vec positional fixarray(4); Vec<u8>/[u8;8] fields encode as msgpack arrays of integers",
"envelope_encoding": "int-array",
"compressed_data_hex": "f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3",
"checksum_hex": "daf468618e624bfe",
"original_size": 32,
"format": "msgpack",
"inner_msgpack_hex": "83a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3"
}
},
{
"name": "arrow_dataframe_write",
"description": "DataFrame write via ArrowSerializer: CK v3 frame wrapping the Arrow envelope [8-byte xxHash3-64 checksum][Arrow IPC file]. Arrow IPC bytes are NOT canonical across pyarrow versions (this vector: pyarrow 25.0.0) \u2014 verify frame structure and envelope detection only, never IPC bytes.",
"frame_hex": "434b03000000777b2273223a20226172726f77222c20226d223a207b22666f726d6174223a20226172726f77222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226172726f77227d2c202276223a2022322e30227dcb67c5c798cf52284152524f57310000ffffffff080300001000000000000a000e000600050008000a000000000104001000000000000a000c000000040008000a0000005c02000004000000010000000c00000008000c0004000800080000003402000004000000260200007b22696e6465785f636f6c756d6e73223a205b7b226b696e64223a202272616e6765222c20226e616d65223a206e756c6c2c20227374617274223a20302c202273746f70223a20322c202273746570223a20317d5d2c2022636f6c756d6e5f696e6465786573223a205b7b226e616d65223a206e756c6c2c20226669656c645f6e616d65223a206e756c6c2c202270616e6461735f74797065223a2022756e69636f6465222c20226e756d70795f74797065223a2022737472222c20226d65746164617461223a207b22656e636f64696e67223a20225554462d38227d7d5d2c2022636f6c756d6e73223a205b7b226e616d65223a20226964222c20226669656c645f6e616d65223a20226964222c202270616e6461735f74797065223a2022696e743634222c20226e756d70795f74797065223a2022696e743634222c20226d65746164617461223a206e756c6c7d2c207b226e616d65223a202273636f7265222c20226669656c645f6e616d65223a202273636f7265222c202270616e6461735f74797065223a2022666c6f61743634222c20226e756d70795f74797065223a2022666c6f61743634222c20226d65746164617461223a206e756c6c7d5d2c202261747472696275746573223a207b7d2c202263726561746f72223a207b226c696272617279223a202270796172726f77222c202276657273696f6e223a202232352e302e30227d2c202270616e6461735f76657273696f6e223a2022332e302e33227d00000600000070616e6461730000020000004800000004000000d0ffffff00000103100000001c00000004000000000000000500000073636f7265000600080006000600000000000200100014000800060007000c00000010001000000000000102100000001c0000000400000000000000020000006964000008000c0008000700080000000000000140000000ffffffffd000000014000000000000000c0018000600050008000c000c000000000304001c0000005000000000000000000000000c001e001000040008000c000c00000070000000240000001800000002000000000000000000000000000600080007000600000000000001040000000000000000000000000000000000000000000000000000002100000000000000280000000000000000000000000000002800000000000000210000000000000000000000020000000200000000000000000000000000000002000000000000000000000000000000100000000000000028b52ffd20108100000100000000000000020000000000000000000000000000100000000000000028b52ffd2010810000000000000000f83f000000000000044000000000000000ffffffff00000000100000000c001400060008000c0010000c00000000000400380000002400000004000000010000001803000000000000d80000000000000050000000000000000000000000000a000c000000040008000a0000005c02000004000000010000000c00000008000c0004000800080000003402000004000000260200007b22696e6465785f636f6c756d6e73223a205b7b226b696e64223a202272616e6765222c20226e616d65223a206e756c6c2c20227374617274223a20302c202273746f70223a20322c202273746570223a20317d5d2c2022636f6c756d6e5f696e6465786573223a205b7b226e616d65223a206e756c6c2c20226669656c645f6e616d65223a206e756c6c2c202270616e6461735f74797065223a2022756e69636f6465222c20226e756d70795f74797065223a2022737472222c20226d65746164617461223a207b22656e636f64696e67223a20225554462d38227d7d5d2c2022636f6c756d6e73223a205b7b226e616d65223a20226964222c20226669656c645f6e616d65223a20226964222c202270616e6461735f74797065223a2022696e743634222c20226e756d70795f74797065223a2022696e743634222c20226d65746164617461223a206e756c6c7d2c207b226e616d65223a202273636f7265222c20226669656c645f6e616d65223a202273636f7265222c202270616e6461735f74797065223a2022666c6f61743634222c20226e756d70795f74797065223a2022666c6f61743634222c20226d65746164617461223a206e756c6c7d5d2c202261747472696275746573223a207b7d2c202263726561746f72223a207b226c696272617279223a202270796172726f77222c202276657273696f6e223a202232352e302e30227d2c202270616e6461735f76657273696f6e223a2022332e302e33227d00000600000070616e6461730000020000004800000004000000d0ffffff00000103100000001c00000004000000000000000500000073636f7265000600080006000600000000000200100014000800060007000c00000010001000000000000102100000001c0000000400000000000000020000006964000008000c0008000700080000000000000140000000300300004152524f5731",
"expected_header": {
"s": "arrow",
"m": {
"format": "arrow",
"encoding": "utf-8",
"compressed": true,
"original_type": "arrow"
},
"v": "2.0"
},
"arrow_detection": {
"checksum_len": 8,
"checksum_hex": "cb67c5c798cf5228",
"ipc_magic_offset": 8,
"ipc_magic": "ARROW1"
}
},
{
"name": "default_saas_write_msgpack_bytestorage_bin",
"description": "Default @cache write (StandardSerializer, integrity on) from a protocol 1.1 wheel: the ByteStorage envelope's compressed_data is msgpack bin (serde_bytes) instead of the legacy array of integers. Readers MUST accept both encodings; the legacy encoding stays pinned by default_saas_write_msgpack_bytestorage. When this vector carries 'twin_of', that field \u2014 not this text \u2014 is the claim that the two differ only in envelope encoding, and verify enforces it.",
"value_json": {
"user_id": 42,
"name": "cachekit",
"active": true
},
"frame_hex": "434b030000007d7b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"expected_header": {
"s": "default",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack"
},
"v": "2.0"
},
"expected_payload_hex": "94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"payload_envelope": {
"encoding": "rmp_serde positional fixarray(4); compressed_data encodes as msgpack bin (serde_bytes, protocol 1.1); checksum [u8;8] stays an array of integers",
"envelope_encoding": "bin",
"compressed_data_hex": "f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3",
"checksum_hex": "daf468618e624bfe",
"original_size": 32,
"format": "msgpack",
"inner_msgpack_hex": "83a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3"
},
"twin_of": "default_saas_write_msgpack_bytestorage",
"generator": "cachekit 0.17.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate-bin-twin"
},
{
"name": "auto_serializer_write",
"description": "The same value written by AutoSerializer (@cache(serializer=\"auto\")). Its payload and metadata equal default_saas_write_msgpack_bytestorage_bin's and only the recorded name differs (s: auto), so a reader configured with \"default\" that skipped the serializer-name check would decode it to the value. Planted under that reader, it MUST be a miss (spec/cache-key-format.md).",
"value_json": {
"user_id": 42,
"name": "cachekit",
"active": true
},
"frame_hex": "434b030000007a7b2273223a20226175746f222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"expected_header": {
"s": "auto",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack"
},
"v": "2.0"
},
"expected_payload_hex": "94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"payload_envelope": {
"encoding": "rmp_serde positional fixarray(4); compressed_data encodes as msgpack bin (serde_bytes, protocol 1.1); checksum [u8;8] stays an array of integers",
"envelope_encoding": "bin",
"compressed_data_hex": "f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3",
"checksum_hex": "daf468618e624bfe",
"original_size": 32,
"format": "msgpack",
"inner_msgpack_hex": "83a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3"
},
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "standard_serializer_instance_write",
"description": "The same value written by a StandardSerializer() instance (@cache(serializer=StandardSerializer())). The frame records the bare class name, StandardSerializer, over default_saas_write_msgpack_bytestorage_bin's payload and metadata, while the key carries the identity <custom>:StandardSerializer (code x8542). A reader configured with \"default\" MUST miss on it, and a reader configured with an instance of the class MUST read it, which one that compares its key identity instead of the recorded name does not.",
"value_json": {
"user_id": 42,
"name": "cachekit",
"active": true
},
"frame_hex": "434b03000000887b2273223a20225374616e6461726453657269616c697a6572222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"expected_header": {
"s": "StandardSerializer",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack"
},
"v": "2.0"
},
"expected_payload_hex": "94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"payload_envelope": {
"encoding": "rmp_serde positional fixarray(4); compressed_data encodes as msgpack bin (serde_bytes, protocol 1.1); checksum [u8;8] stays an array of integers",
"envelope_encoding": "bin",
"compressed_data_hex": "f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3",
"checksum_hex": "daf468618e624bfe",
"original_size": 32,
"format": "msgpack",
"inner_msgpack_hex": "83a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3"
},
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "std_alias_write",
"description": "{\"pair\": (1, \"two\")}, a map holding a tuple, written under the alias std: byte for byte what the canonical name default writes, so the alias records default and writes StandardSerializer's bytes, which hold the tuple as an array. AutoSerializer writes the same value differently (pythonic_alias_write), so a writer that picks the serializer by the raw spelling fails one of the two.",
"value_json": {
"pair": [
1,
"two"
]
},
"frame_hex": "434b030000007d7b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94c40dc081a4706169729201a374776f98ccdd4d3e2b58ccad58250ca76d73677061636b",
"expected_header": {
"s": "default",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack"
},
"v": "2.0"
},
"expected_payload_hex": "94c40dc081a4706169729201a374776f98ccdd4d3e2b58ccad58250ca76d73677061636b",
"payload_envelope": {
"encoding": "rmp_serde positional fixarray(4); compressed_data encodes as msgpack bin (serde_bytes, protocol 1.1); checksum [u8;8] stays an array of integers",
"envelope_encoding": "bin",
"compressed_data_hex": "c081a4706169729201a374776f",
"checksum_hex": "dd4d3e2b58ad5825",
"original_size": 12,
"format": "msgpack",
"inner_msgpack_hex": "81a4706169729201a374776f"
},
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "pythonic_alias_write",
"description": "{\"pair\": (1, \"two\")} written under the alias pythonic: byte for byte what the canonical name auto writes, so the alias records auto and writes AutoSerializer's bytes, which mark the tuple ({\"__tuple__\": true, \"value\": [1, \"two\"]}). StandardSerializer writes the same value differently (std_alias_write).",
"value_json": {
"pair": {
"__tuple__": true,
"value": [
1,
"two"
]
}
},
"frame_hex": "434b030000007a7b2273223a20226175746f222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94c420f00f81a47061697282a95f5f7475706c655f5fc3a576616c75659201a374776f98ccfd136dcca1cc812345ccc91ea76d73677061636b",
"expected_header": {
"s": "auto",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack"
},
"v": "2.0"
},
"expected_payload_hex": "94c420f00f81a47061697282a95f5f7475706c655f5fc3a576616c75659201a374776f98ccfd136dcca1cc812345ccc91ea76d73677061636b",
"payload_envelope": {
"encoding": "rmp_serde positional fixarray(4); compressed_data encodes as msgpack bin (serde_bytes, protocol 1.1); checksum [u8;8] stays an array of integers",
"envelope_encoding": "bin",
"compressed_data_hex": "f00f81a47061697282a95f5f7475706c655f5fc3a576616c75659201a374776f",
"checksum_hex": "fd136da1812345c9",
"original_size": 30,
"format": "msgpack",
"inner_msgpack_hex": "81a47061697282a95f5f7475706c655f5fc3a576616c75659201a374776f"
},
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "integrity_checking_off_write",
"description": "The same value written by StandardSerializer with integrity checking off (@cache(integrity_checking=False), key suffix 0s): the payload is the value's plain MessagePack, with no ByteStorage envelope, and the header records compressed false, which is what an encrypted write of it authenticates in its AAD (spec/encryption.md: the AAD inputs reflect what the write produced).",
"value_json": {
"user_id": 42,
"name": "cachekit",
"active": true
},
"frame_hex": "434b030000007e7b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a2066616c73652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d83a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3",
"expected_header": {
"s": "default",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": false,
"original_type": "msgpack"
},
"v": "2.0"
},
"expected_payload_hex": "83a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "arrow_compression_off_write",
"description": "DataFrame write via an ArrowSerializer(compression=None) instance: CK v3 frame wrapping [8-byte xxHash3-64 checksum][Arrow IPC file] with uncompressed buffers. The header records compressed false and the bare class name ArrowSerializer; spec/encryption.md gives this write's AAD inputs as (\"arrow\", false, original_type=\"arrow\"). Arrow IPC bytes are NOT canonical across pyarrow versions (this vector: pyarrow 25.0.0) \u2014 verify frame structure and envelope detection only, never IPC bytes.",
"frame_hex": "434b03000000827b2273223a20224172726f7753657269616c697a6572222c20226d223a207b22666f726d6174223a20226172726f77222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a2066616c73652c20226f726967696e616c5f74797065223a20226172726f77227d2c202276223a2022322e30227d94f3165d68ca34a14152524f57310000ffffffff080300001000000000000a000e000600050008000a000000000104001000000000000a000c000000040008000a0000005c02000004000000010000000c00000008000c0004000800080000003402000004000000260200007b22696e6465785f636f6c756d6e73223a205b7b226b696e64223a202272616e6765222c20226e616d65223a206e756c6c2c20227374617274223a20302c202273746f70223a20322c202273746570223a20317d5d2c2022636f6c756d6e5f696e6465786573223a205b7b226e616d65223a206e756c6c2c20226669656c645f6e616d65223a206e756c6c2c202270616e6461735f74797065223a2022756e69636f6465222c20226e756d70795f74797065223a2022737472222c20226d65746164617461223a207b22656e636f64696e67223a20225554462d38227d7d5d2c2022636f6c756d6e73223a205b7b226e616d65223a20226964222c20226669656c645f6e616d65223a20226964222c202270616e6461735f74797065223a2022696e743634222c20226e756d70795f74797065223a2022696e743634222c20226d65746164617461223a206e756c6c7d2c207b226e616d65223a202273636f7265222c20226669656c645f6e616d65223a202273636f7265222c202270616e6461735f74797065223a2022666c6f61743634222c20226e756d70795f74797065223a2022666c6f61743634222c20226d65746164617461223a206e756c6c7d5d2c202261747472696275746573223a207b7d2c202263726561746f72223a207b226c696272617279223a202270796172726f77222c202276657273696f6e223a202232352e302e30227d2c202270616e6461735f76657273696f6e223a2022332e302e33227d00000600000070616e6461730000020000004800000004000000d0ffffff00000103100000001c00000004000000000000000500000073636f7265000600080006000600000000000200100014000800060007000c00000010001000000000000102100000001c0000000400000000000000020000006964000008000c0008000700080000000000000140000000ffffffffb800000014000000000000000c0016000600050008000c000c0000000003040018000000200000000000000000000a0018000c00040008000a0000005c0000001000000002000000000000000000000004000000000000000000000000000000000000000000000000000000100000000000000010000000000000000000000000000000100000000000000010000000000000000000000002000000020000000000000000000000000000000200000000000000000000000000000001000000000000000200000000000000000000000000f83f0000000000000440ffffffff00000000100000000c001400060008000c0010000c00000000000400380000002400000004000000010000001803000000000000c00000000000000020000000000000000000000000000a000c000000040008000a0000005c02000004000000010000000c00000008000c0004000800080000003402000004000000260200007b22696e6465785f636f6c756d6e73223a205b7b226b696e64223a202272616e6765222c20226e616d65223a206e756c6c2c20227374617274223a20302c202273746f70223a20322c202273746570223a20317d5d2c2022636f6c756d6e5f696e6465786573223a205b7b226e616d65223a206e756c6c2c20226669656c645f6e616d65223a206e756c6c2c202270616e6461735f74797065223a2022756e69636f6465222c20226e756d70795f74797065223a2022737472222c20226d65746164617461223a207b22656e636f64696e67223a20225554462d38227d7d5d2c2022636f6c756d6e73223a205b7b226e616d65223a20226964222c20226669656c645f6e616d65223a20226964222c202270616e6461735f74797065223a2022696e743634222c20226e756d70795f74797065223a2022696e743634222c20226d65746164617461223a206e756c6c7d2c207b226e616d65223a202273636f7265222c20226669656c645f6e616d65223a202273636f7265222c202270616e6461735f74797065223a2022666c6f61743634222c20226e756d70795f74797065223a2022666c6f61743634222c20226d65746164617461223a206e756c6c7d5d2c202261747472696275746573223a207b7d2c202263726561746f72223a207b226c696272617279223a202270796172726f77222c202276657273696f6e223a202232352e302e30227d2c202270616e6461735f76657273696f6e223a2022332e302e33227d00000600000070616e6461730000020000004800000004000000d0ffffff00000103100000001c00000004000000000000000500000073636f7265000600080006000600000000000200100014000800060007000c00000010001000000000000102100000001c0000000400000000000000020000006964000008000c0008000700080000000000000140000000300300004152524f5731",
"expected_header": {
"s": "ArrowSerializer",
"m": {
"format": "arrow",
"encoding": "utf-8",
"compressed": false,
"original_type": "arrow"
},
"v": "2.0"
},
"arrow_detection": {
"checksum_len": 8,
"checksum_hex": "94f3165d68ca34a1",
"ipc_magic_offset": 8,
"ipc_magic": "ARROW1"
},
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "std_recorded_as_given_frame",
"description": "Constructed: default_saas_write_msgpack_bytestorage_bin's payload and metadata under the recorded name std, the frame a writer that records an alias as given would store. A reader configured with \"default\" MUST miss on it, since it records std, not the canonical name; one that resolves the recorded name through its own alias table before it compares returns the value.",
"value_json": {
"user_id": 42,
"name": "cachekit",
"active": true
},
"frame_hex": "434b03000000797b2273223a2022737464222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"expected_header": {
"s": "std",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack"
},
"v": "2.0"
},
"expected_payload_hex": "94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"payload_envelope": {
"encoding": "rmp_serde positional fixarray(4); compressed_data encodes as msgpack bin (serde_bytes, protocol 1.1); checksum [u8;8] stays an array of integers",
"envelope_encoding": "bin",
"compressed_data_hex": "f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3",
"checksum_hex": "daf468618e624bfe",
"original_size": 32,
"format": "msgpack",
"inner_msgpack_hex": "83a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3"
},
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
}
],
"error_vectors": [
{
"name": "truncated_frame",
"frame_hex": "434b03",
"error": "shorter than the 7-byte fixed prefix (magic + version + header length)",
"rejected_by": "prefix_length",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "unsupported_frame_version",
"frame_hex": "434b04000000027b7d",
"error": "frame version 4 (only version 3 is defined)",
"rejected_by": "version",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "header_overrun",
"frame_hex": "434b03000000ff7b7d",
"error": "declared header length (255) exceeds the bytes present in the frame",
"rejected_by": "header_length",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "ck_frame_fed_to_interop_reader",
"frame_hex": "434b030000004d7b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022636f6d70726573736564223a2066616c73657d2c202276223a2022322e30227d68656c6c6f2c2063616368656b697421",
"error": "not a single well-formed MessagePack document: 0x43 is fixint 67, so the frame is one 1-byte document plus trailing bytes. Interop readers MUST consume exactly one document and reject trailing bytes; on failure, a 0x43 0x4B prefix SHOULD be reported as 'Python-SDK-internal auto-mode entry \u2014 not an interop value'"
},
{
"name": "truncated_frame_one_short",
"frame_hex": "434b03000000",
"error": "6 bytes, one short of the 7-byte fixed prefix: the default write's magic, version and the first three bytes of its header length",
"rejected_by": "prefix_length",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "unsupported_frame_version_2",
"frame_hex": "434b020000007d7b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"error": "default_saas_write_msgpack_bytestorage_bin with frame version 2, one below the only defined version. A reader that rejects only versions above 3 returns the value, because header and payload are intact",
"rejected_by": "version",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "header_overrun_by_one",
"frame_hex": "434b030000007e7b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d",
"error": "default_saas_write_msgpack_bytestorage_bin's prefix and header with no payload, the declared header length one past the bytes present. A reader that slices the header to the bytes present gets the real header and an empty payload",
"rejected_by": "header_length",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "bare_envelope_fed_to_frame_reader",
"frame_hex": "94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"error": "default_saas_write_msgpack_bytestorage_bin's payload alone: a bare ByteStorage envelope, cachekit-ts's default auto-mode container. cachekit-py MUST NOT decode another SDK's container; it has no CK magic",
"rejected_by": "magic",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "plain_msgpack_fed_to_frame_reader",
"frame_hex": "83a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c3",
"error": "default_saas_write_msgpack_bytestorage_bin's value as plain MessagePack, the container of cachekit-rs and of cachekit-ts with compression off. cachekit-py MUST NOT decode another SDK's container; it has no CK magic",
"rejected_by": "magic",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "unsupported_frame_version_4",
"frame_hex": "434b040000007d7b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"error": "default_saas_write_msgpack_bytestorage_bin with frame version 4, one above the only defined version. A reader that rejects only versions below 3 returns the value, because header and payload are intact",
"rejected_by": "version",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "serializer_name_missing",
"frame_hex": "434b030000006d7b226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"error": "default_saas_write_msgpack_bytestorage_bin with no serializer name in its header (no 's'). An entry that records no serializer name is a mismatch for every reader, so a miss. A reader that treats a nameless frame as a match returns the value, because the payload is intact",
"rejected_by": "serializer_name",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "serializer_name_empty",
"frame_hex": "434b03000000767b2273223a2022222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b227d2c202276223a2022322e30227d94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"error": "default_saas_write_msgpack_bytestorage_bin with an empty serializer name ('s': \"\"), which records no name either: a mismatch for every reader, so a miss. A reader that checks only that 's' is present returns the value",
"rejected_by": "serializer_name",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
}
],
"encrypted_reader": {
"master_key_hex": "1111111111111111111111111111111111111111111111111111111111111111",
"tenant_id": "00000000-0000-4000-8000-00000000000a",
"tenant_source": "reader",
"cache_key": "python-frame-vector"
},
"encrypted_read_vectors": [
{
"name": "forged_plaintext_encrypted_false",
"description": "default_saas_write_msgpack_bytestorage_bin's plaintext payload under a header that adds \"encrypted\": false. An attacker with backend write access can write this frame. An encrypted cache MUST NOT let the header downgrade it to the plaintext read path, and MUST fail closed.",
"frame_hex": "434b03000000917b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b222c2022656e63727970746564223a2066616c73657d2c202276223a2022322e30227d94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"expected_header": {
"s": "default",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack",
"encrypted": false
},
"v": "2.0"
},
"expected_payload_hex": "94c422f01183a7757365725f69642aa46e616d65a863616368656b6974a6616374697665c398ccdaccf46861cc8e624bccfe20a76d73677061636b",
"header_claims": "plaintext",
"outcome": "fail_closed",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "forged_plaintext_orjson",
"description": "the same value written by cachekit-py's orjson serializer with encryption off: the header names another serializer (s: orjson) and claims no encryption. An encrypted cache MUST fail closed, whether it refuses the serializer name or the plaintext claim first.",
"frame_hex": "434b030000007b7b2273223a20226f726a736f6e222c20226d223a207b22666f726d6174223a20226f726a736f6e222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a2066616c73652c20226f726967696e616c5f74797065223a20226f726a736f6e227d2c202276223a2022322e30227d208963cc6973b4127b22616374697665223a747275652c226e616d65223a2263616368656b6974222c22757365725f6964223a34327d",
"expected_header": {
"s": "orjson",
"m": {
"format": "orjson",
"encoding": "utf-8",
"compressed": false,
"original_type": "orjson"
},
"v": "2.0"
},
"expected_payload_hex": "208963cc6973b4127b22616374697665223a747275652c226e616d65223a2263616368656b6974222c22757365725f6964223a34327d",
"header_claims": "plaintext",
"outcome": "fail_closed",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "ciphertext_key_not_in_keyring",
"description": "the value sealed by cachekit-py for the reader's tenant under another master key, one the reader's keyring lacks (its key_fingerprint names that key). The ciphertext does not authenticate under the reader's key, so the read MUST fail closed, whatever its tamper policy.",
"frame_hex": "434b03000001237b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b222c2022656e63727970746564223a20747275652c202274656e616e745f6964223a202230303030303030302d303030302d343030302d383030302d303030303030303030303061222c2022656e6372797074696f6e5f616c676f726974686d223a20224145532d3235362d47434d222c20226b65795f66696e6765727072696e74223a20226337383732643939646465386466373732363562376636313031646430646465227d2c202276223a2022322e30227d2ee0c1cd440e58cf00000000599c098a00612ea8f89fab1968dcc497e57ea48d72d1a4a043ef749b82310e237c09ac5df9d26339016672916f02e5c951a946e977a3a8fcd56cd6bf561048938770288cf4ebbec91a1cd2",
"expected_header": {
"s": "default",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack",
"encrypted": true,
"tenant_id": "00000000-0000-4000-8000-00000000000a",
"encryption_algorithm": "AES-256-GCM",
"key_fingerprint": "c7872d99dde8df77265b7f6101dd0dde"
},
"v": "2.0"
},
"expected_payload_hex": "2ee0c1cd440e58cf00000000599c098a00612ea8f89fab1968dcc497e57ea48d72d1a4a043ef749b82310e237c09ac5df9d26339016672916f02e5c951a946e977a3a8fcd56cd6bf561048938770288cf4ebbec91a1cd2",
"header_claims": "ciphertext",
"outcome": "fail_closed",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "ciphertext_other_tenant",
"description": "the value sealed by cachekit-py under the reader's master key for tenant 00000000-0000-4000-8000-00000000000b. A reader that resolves its own tenant (00000000-0000-4000-8000-00000000000a) derives another key and builds another AAD, so the ciphertext does not authenticate and the read MUST fail closed. A reader that takes the tenant from the unauthenticated header decrypts it.",
"frame_hex": "434b03000001237b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b222c2022656e63727970746564223a20747275652c202274656e616e745f6964223a202230303030303030302d303030302d343030302d383030302d303030303030303030303062222c2022656e6372797074696f6e5f616c676f726974686d223a20224145532d3235362d47434d222c20226b65795f66696e6765727072696e74223a20223062643338336362353530313633333932376633383133323832366532613363227d2c202276223a2022322e30227d2ee0c1cd440e58d000000000203bd9f2aa9fbcce7bdb457dcfe5a7525b3f0bc1e8cdc335f917de5c4406b55d51235d9f439b9f75ec6bdcba52f4608e76c4bbf5a2c66d8218b6d25dbe86c77e53bdd6ee2b761d94dadb11",
"expected_header": {
"s": "default",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack",
"encrypted": true,
"tenant_id": "00000000-0000-4000-8000-00000000000b",
"encryption_algorithm": "AES-256-GCM",
"key_fingerprint": "0bd383cb5501633927f38132826e2a3c"
},
"v": "2.0"
},
"expected_payload_hex": "2ee0c1cd440e58d000000000203bd9f2aa9fbcce7bdb457dcfe5a7525b3f0bc1e8cdc335f917de5c4406b55d51235d9f439b9f75ec6bdcba52f4608e76c4bbf5a2c66d8218b6d25dbe86c77e53bdd6ee2b761d94dadb11",
"header_claims": "ciphertext",
"outcome": "fail_closed",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "ciphertext_plain_msgpack_not_envelope",
"description": "the value's plain MessagePack (default_saas_write_msgpack_bytestorage_bin's inner value, with no ByteStorage envelope), sealed under the reader's own key, tenant and AAD, in the frame of a real encrypted default write, whose header claims format msgpack, compressed true and original_type msgpack. The reader is configured for a ByteStorage envelope, and the container after decryption is the configured one and a parse mismatch hard-fails (spec/encryption.md), so the read MUST fail closed. A reader that falls back to plain MessagePack, or picks the container by looking at the bytes, returns the value. Sealed with a fixed nonce by tools/python-frame-reference.py, which checks that the same frame over the envelope reads back as the value.",
"frame_hex": "434b03000001237b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b222c2022656e63727970746564223a20747275652c202274656e616e745f6964223a202230303030303030302d303030302d343030302d383030302d303030303030303030303061222c2022656e6372797074696f6e5f616c676f726974686d223a20224145532d3235362d47434d222c20226b65795f66696e6765727072696e74223a20223536653635363638303265306432303137346265313137353464343632346463227d2c202276223a2022322e30227da0a1a2a3a4a5a6a7a8a9aaabab6a056afdeb7aadd867f67f07a496e4487bd53588d0a4d64aa5199b749254209a94f25a8a629cac9636b8ef80a3f8d5",
"expected_header": {
"s": "default",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack",
"encrypted": true,
"tenant_id": "00000000-0000-4000-8000-00000000000a",
"encryption_algorithm": "AES-256-GCM",
"key_fingerprint": "56e6566802e0d20174be11754d4624dc"
},
"v": "2.0"
},
"expected_payload_hex": "a0a1a2a3a4a5a6a7a8a9aaabab6a056afdeb7aadd867f67f07a496e4487bd53588d0a4d64aa5199b749254209a94f25a8a629cac9636b8ef80a3f8d5",
"header_claims": "ciphertext",
"outcome": "fail_closed",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "ciphertext_plain_msgpack_claims_uncompressed",
"description": "ciphertext_plain_msgpack_not_envelope with its header and AAD claiming compressed false, which plain MessagePack is: the ciphertext authenticates under the reader's own key and AAD. The reader is configured for a ByteStorage envelope and the container after decryption is the configured one, never one the stored flag picks (spec/encryption.md), so the read MUST fail closed. A reader that takes the container from the flag reads plain MessagePack and returns the value. Sealed with a fixed nonce by tools/python-frame-reference.py, which checks that the same frame over the envelope reads back as the value.",
"frame_hex": "434b03000001247b2273223a202264656661756c74222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a2066616c73652c20226f726967696e616c5f74797065223a20226d73677061636b222c2022656e63727970746564223a20747275652c202274656e616e745f6964223a202230303030303030302d303030302d343030302d383030302d303030303030303030303061222c2022656e6372797074696f6e5f616c676f726974686d223a20224145532d3235362d47434d222c20226b65795f66696e6765727072696e74223a20223536653635363638303265306432303137346265313137353464343632346463227d2c202276223a2022322e30227da0a1a2a3a4a5a6a7a8a9aaabab6a056afdeb7aadd867f67f07a496e4487bd53588d0a4d64aa5199b74925420ccfd1ae0413d4f16a2e2a438939ae1b4",
"expected_header": {
"s": "default",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": false,
"original_type": "msgpack",
"encrypted": true,
"tenant_id": "00000000-0000-4000-8000-00000000000a",
"encryption_algorithm": "AES-256-GCM",
"key_fingerprint": "56e6566802e0d20174be11754d4624dc"
},
"v": "2.0"
},
"expected_payload_hex": "a0a1a2a3a4a5a6a7a8a9aaabab6a056afdeb7aadd867f67f07a496e4487bd53588d0a4d64aa5199b74925420ccfd1ae0413d4f16a2e2a438939ae1b4",
"header_claims": "ciphertext",
"outcome": "fail_closed",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "ciphertext_serializer_name_auto",
"description": "the reader's own encrypted write of the value, sealed by cachekit-py under its key, tenant and AAD, with the header's serializer name changed to auto. The name is not an AAD input, so the ciphertext still authenticates and decrypts to the default write's envelope, which the default serializer decodes to the value; generate checks that the same frame recording default reads back as the value. A reader configured with \"default\" MUST miss on it, as on the plaintext name-check frames (spec/cache-key-format.md); one that compares the name only on plaintext entries returns the value.",
"frame_hex": "434b03000001207b2273223a20226175746f222c20226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b222c2022656e63727970746564223a20747275652c202274656e616e745f6964223a202230303030303030302d303030302d343030302d383030302d303030303030303030303061222c2022656e6372797074696f6e5f616c676f726974686d223a20224145532d3235362d47434d222c20226b65795f66696e6765727072696e74223a20223536653635363638303265306432303137346265313137353464343632346463227d2c202276223a2022322e30227d7e1fe675ce59126c000000000e76957ecae4efc3119fbd1740efd5539dda7c3e9b556fdcefeaa741a3ff0e8733efafb61949713572cd2bc6f77fb2cf5fbbbb931965ebce85ffb1b7b06a62e2996d3a33e85657e3a3c8f1",
"expected_header": {
"s": "auto",
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack",
"encrypted": true,
"tenant_id": "00000000-0000-4000-8000-00000000000a",
"encryption_algorithm": "AES-256-GCM",
"key_fingerprint": "56e6566802e0d20174be11754d4624dc"
},
"v": "2.0"
},
"expected_payload_hex": "7e1fe675ce59126c000000000e76957ecae4efc3119fbd1740efd5539dda7c3e9b556fdcefeaa741a3ff0e8733efafb61949713572cd2bc6f77fb2cf5fbbbb931965ebce85ffb1b7b06a62e2996d3a33e85657e3a3c8f1",
"header_claims": "ciphertext",
"outcome": "fail_closed",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
},
{
"name": "ciphertext_serializer_name_missing",
"description": "ciphertext_serializer_name_auto's write with no serializer name in its header. An entry that records no serializer name is a mismatch for every reader, so the read MUST miss; one that checks for a name only on plaintext entries decrypts it and returns the value.",
"frame_hex": "434b03000001137b226d223a207b22666f726d6174223a20226d73677061636b222c2022656e636f64696e67223a20227574662d38222c2022636f6d70726573736564223a20747275652c20226f726967696e616c5f74797065223a20226d73677061636b222c2022656e63727970746564223a20747275652c202274656e616e745f6964223a202230303030303030302d303030302d343030302d383030302d303030303030303030303061222c2022656e6372797074696f6e5f616c676f726974686d223a20224145532d3235362d47434d222c20226b65795f66696e6765727072696e74223a20223536653635363638303265306432303137346265313137353464343632346463227d2c202276223a2022322e30227d7e1fe675ce59126c000000000e76957ecae4efc3119fbd1740efd5539dda7c3e9b556fdcefeaa741a3ff0e8733efafb61949713572cd2bc6f77fb2cf5fbbbb931965ebce85ffb1b7b06a62e2996d3a33e85657e3a3c8f1",
"expected_header": {
"m": {
"format": "msgpack",
"encoding": "utf-8",
"compressed": true,
"original_type": "msgpack",
"encrypted": true,
"tenant_id": "00000000-0000-4000-8000-00000000000a",
"encryption_algorithm": "AES-256-GCM",
"key_fingerprint": "56e6566802e0d20174be11754d4624dc"
},
"v": "2.0"
},
"expected_payload_hex": "7e1fe675ce59126c000000000e76957ecae4efc3119fbd1740efd5539dda7c3e9b556fdcefeaa741a3ff0e8733efafb61949713572cd2bc6f77fb2cf5fbbbb931965ebce85ffb1b7b06a62e2996d3a33e85657e3a3c8f1",
"header_claims": "ciphertext",
"outcome": "fail_closed",
"generator": "cachekit 0.22.0 (PyPI wheel; Rust core via PyO3), generated by tools/python-frame-reference.py generate"
}
]
}