{
  "date": "2026-09-30",
  "executedAt": "2026-09-30T10:28:43.745Z",
  "environment": {
    "browser": "Desktop Chromium",
    "version": "151.0.7922.34",
    "os": "linux",
    "node": "v24.19.0",
    "baseURL": "http://127.0.0.1:4192",
    "mobileHardwareTested": false
  },
  "methodology": "Actual tool UI, synthetic fixtures. Offline actions used a prepared tab; merge was warmed once online. No cold-start offline claim. Network payload monitor observes page requests; offline gating additionally prevents an upload dependency during recorded offline actions.",
  "fixtures": {
    "generator": {
      "PyMuPDF": "1.26.6",
      "Pillow": "12.3.0"
    },
    "fixtures": [
      {
        "name": "merge-a.pdf",
        "bytes": 1097,
        "sha256": "8252d900dbd23cfced91d1d0269a29a0c580dd104809ffc6a69245ec8020aa10",
        "pages": 1,
        "textCharacters": 68
      },
      {
        "name": "merge-b.pdf",
        "bytes": 1095,
        "sha256": "2236954bf5e89a5582419290fb36b4e5914ebbbe02cace9cf5de7114bc10c684",
        "pages": 1,
        "textCharacters": 68
      },
      {
        "name": "selectable-text.pdf",
        "bytes": 1114,
        "sha256": "4d506417edee4ee2cce3314bf8a9ca46f6f1806c11c45e677f790804bc6d1f5c",
        "pages": 1,
        "textCharacters": 85
      },
      {
        "name": "synthetic-exif-gps.jpg",
        "bytes": 13837,
        "sha256": "f249587cce42f1dd3ff91b9011c6fbb12919b7cc78fc213321508b0220e8b88d",
        "width": 640,
        "height": 480,
        "exifTags": 6,
        "gpsPresent": true
      },
      {
        "name": "synthetic-scan-four-pages.pdf",
        "bytes": 514519,
        "sha256": "aac4c44d47daec178cbcbae92785c31e29a1855ec657e397035c781a058f9c98",
        "pages": 4,
        "textCharacters": 0
      }
    ]
  },
  "results": [
    {
      "action": "compress",
      "fixture": "synthetic-scan-four-pages.pdf",
      "targetKb": 100,
      "targetBytes": 102400,
      "resultLabel": "synthetic-scan-four-pages-100kb.pdf\n502 KB \u2192 95 KB \u00b7 cap 100 KB \u00b7 flattened pages\nDownload PDF\nCheck first-page readability",
      "name": "scan-100kb.pdf",
      "bytes": 97702,
      "sha256": "0c495af4f3e1f871300333a06649de5ce1542cb05395a082745bcade880cd056",
      "verification": {
        "pages": 4,
        "textCharacters": 0,
        "pageText": [
          "",
          "",
          "",
          ""
        ],
        "pageDimensions": [
          [
            595.0,
            842.0
          ],
          [
            595.0,
            842.0
          ],
          [
            595.0,
            842.0
          ],
          [
            595.0,
            842.0
          ]
        ]
      }
    },
    {
      "action": "compress",
      "fixture": "synthetic-scan-four-pages.pdf",
      "targetKb": 200,
      "targetBytes": 204800,
      "resultLabel": "synthetic-scan-four-pages-200kb.pdf\n502 KB \u2192 137 KB \u00b7 cap 200 KB \u00b7 flattened pages\nDownload PDF\nCheck first-page readability",
      "name": "scan-200kb.pdf",
      "bytes": 140004,
      "sha256": "722c4afc8dc877915cb0ed418493ead71e76a028e47e7a050f23ad68735ce456",
      "verification": {
        "pages": 4,
        "textCharacters": 0,
        "pageText": [
          "",
          "",
          "",
          ""
        ],
        "pageDimensions": [
          [
            595.0,
            842.0
          ],
          [
            595.0,
            842.0
          ],
          [
            595.0,
            842.0
          ],
          [
            595.0,
            842.0
          ]
        ]
      }
    },
    {
      "action": "compress",
      "fixture": "selectable-text.pdf",
      "targetKb": 100,
      "targetBytes": 102400,
      "resultLabel": "selectable-text-100kb.pdf\n1.1 KB \u2192 1.1 KB \u00b7 cap 100 KB \u00b7 text kept\nDownload PDF\nCheck first-page readability",
      "name": "text-100kb.pdf",
      "bytes": 1080,
      "sha256": "2602cccd9c43819ddab7c07f314c1b4c36f70776b63fbffbc97a809d0b2f7507",
      "verification": {
        "pages": 1,
        "textCharacters": 84,
        "pageText": [
          "Selectable text fixture / ABC-2041\nThe compact path should preserve searchable text."
        ],
        "pageDimensions": [
          [
            595.0,
            842.0
          ]
        ]
      }
    },
    {
      "action": "merge-warmup",
      "fixtures": [
        "merge-a.pdf",
        "merge-b.pdf"
      ],
      "offline": false,
      "name": "merged-online-warmup.pdf",
      "bytes": 1420,
      "sha256": "2253dd86109cf3a17b14380a9e11cf9234609142e1055f16bb2028333b533949",
      "verification": {
        "pages": 2,
        "textCharacters": 134,
        "pageText": [
          "ALPHA / FIRST PAGE\nSynthetic merge fixture. Verify this page order.",
          "BETA / SECOND PAGE\nSynthetic merge fixture. Verify this page order."
        ],
        "pageDimensions": [
          [
            595.0,
            842.0
          ],
          [
            595.0,
            842.0
          ]
        ]
      }
    },
    {
      "action": "merge",
      "fixtures": [
        "merge-a.pdf",
        "merge-b.pdf"
      ],
      "offline": true,
      "status": "passed",
      "name": "merged-offline.pdf",
      "bytes": 1419,
      "sha256": "84338ab96b107009413c5c8ba4e8d2332d4232554e7f4fa55985ce8a707e3e26",
      "verification": {
        "pages": 2,
        "textCharacters": 134,
        "pageText": [
          "ALPHA / FIRST PAGE\nSynthetic merge fixture. Verify this page order.",
          "BETA / SECOND PAGE\nSynthetic merge fixture. Verify this page order."
        ],
        "pageDimensions": [
          [
            595.0,
            842.0
          ],
          [
            595.0,
            842.0
          ]
        ]
      }
    },
    {
      "action": "exif",
      "fixture": "synthetic-exif-gps.jpg",
      "offline": true,
      "name": "exif-scrubbed.png",
      "bytes": 26841,
      "sha256": "a95b52e86945a4b00305cf2edf85e215c89bc8d0d653462c28a0df6fc3ee6631",
      "verification": {
        "format": "PNG",
        "width": 640,
        "height": 480,
        "exifTags": 0,
        "gpsPresent": false,
        "sourceCommentMarkerPresent": false,
        "pngInfoKeys": []
      }
    },
    {
      "action": "split",
      "fixture": "merged-offline.pdf",
      "offline": true,
      "status": "passed",
      "name": "split-offline-page-1.pdf",
      "bytes": 1024,
      "sha256": "4800eef5c42ce6c2bf2c48abedd79756cc240347eada43fa03b959390365f6ea",
      "verification": {
        "pages": 1,
        "textCharacters": 67,
        "pageText": [
          "ALPHA / FIRST PAGE\nSynthetic merge fixture. Verify this page order."
        ],
        "pageDimensions": [
          [
            595.0,
            842.0
          ]
        ]
      }
    },
    {
      "action": "split",
      "fixture": "merged-offline.pdf",
      "offline": true,
      "status": "passed",
      "name": "split-offline-page-2.pdf",
      "bytes": 1022,
      "sha256": "2bd63f39e4b4a0706daa4b67ae522bb927769d25368d44760fccf55951318c63",
      "verification": {
        "pages": 1,
        "textCharacters": 67,
        "pageText": [
          "BETA / SECOND PAGE\nSynthetic merge fixture. Verify this page order."
        ],
        "pageDimensions": [
          [
            595.0,
            842.0
          ]
        ]
      }
    }
  ],
  "processingRequestsWithBodies": [],
  "failedRequestsDuringProcessing": [],
  "limitations": [
    "No physical iPhone or Android device was tested.",
    "Input fixtures are synthetic, not a distribution of customer documents.",
    "Output PDF hashes may differ across runs because PDF libraries add creation timestamps.",
    "Compression privacy was checked for page request bodies during processing; compression was run online to load renderer assets. Merge, split and EXIF actions additionally ran with the browser context offline.",
    "Network observations cover these local preview cases, not every production configuration, browser extension or future deployment."
  ],
  "verificationEnvironment": {
    "PyMuPDF": "1.26.6",
    "Pillow": "12.3.0"
  }
}
