{
  "scope": "synthetic_offline_capacity_and_crypto_probe",
  "productionReady": false,
  "algorithm": "DEFLATE before AES-256-GCM; 12-byte nonce and 16-byte tag; Base64URL then 720-character slices",
  "notes": [
    "Synthetic compact rows with varying names/specifications/quantities/prices/batches; not customer data or a universal compression ratio.",
    "No production keys saved or logged. This does not implement APP authorization, key provisioning, signatures, camera scanning or a production frame protocol.",
    "Frame counts exclude a finalized signature/key-envelope protocol, whose extra overhead must be measured separately."
  ],
  "checks": [
    "authorized round trip matches original bytes",
    "wrong key rejected",
    "ciphertext modification rejected",
    "out-of-order and duplicate parts reconstruct",
    "missing part blocks completeness",
    "every synthetic frame produces a QR at M"
  ],
  "rows": [
    {
      "items": 10,
      "plainBytes": 940,
      "compressedBytes": 407,
      "aesGcmEnvelopeBytes": 435,
      "base64urlChars": 580,
      "framesAt720Chars": 1,
      "largestQrVersion": 19,
      "maxFrameBytes": 608
    },
    {
      "items": 100,
      "plainBytes": 8393,
      "compressedBytes": 2225,
      "aesGcmEnvelopeBytes": 2253,
      "base64urlChars": 3004,
      "framesAt720Chars": 5,
      "largestQrVersion": 22,
      "maxFrameBytes": 748
    },
    {
      "items": 1000,
      "plainBytes": 83824,
      "compressedBytes": 20569,
      "aesGcmEnvelopeBytes": 20597,
      "base64urlChars": 27463,
      "framesAt720Chars": 39,
      "largestQrVersion": 22,
      "maxFrameBytes": 750
    }
  ]
}
