{
  "schemaVersion": 1,
  "generated": "2026-08-15",
  "assetVersion": 187,
  "sourceOfTruth": "sites/tools/assets/runtime.js (bands/proven/rates/deviceEvidence/hardCaps/CANCEL) + sites/tools/assets/tools/all-tools.js (TOOL_OP, per-tool op/cancel/buildZip call sites) + sites/tools/assets/tools/editor.js (Save cancel descriptor, low-memory plan consumers)",
  "note": "Directive §13 / P1-DESIGN §7. This is the public, machine-readable capability record for unboundpdf.com, published at /capabilities.json since 2026-08-15; /about/, /changelog/ and llms.txt point at it. A tool may claim a capability here ONLY with a source pointer that proves it, and the build refuses to emit this file if any field contradicts the code that ships. Read every size and page figure as an OBSERVED COMPLETION -- the largest document an operation was measured finishing on a dated benchmark -- never as a limit, a maximum or a boundary: across 124 measured runs on three browser engines nothing stopped, so no boundary was located. Peak-memory figures are single samples of a quantity that does not reproduce (13-82% spread) and are labelled as such. Coverage is the 43 tool pages (33 single-document PDF tools, plus the four W5-E1 image tools and the six W5-E2 legal-pack tools, 2026-08-21); the four /make/ guided chains (make.js, own CANCEL-driven runner, make.js:658-689) are pseudo-tools layered on top of these and are NOT separately registered here. largeDocumentBenchmark: 6 measured, 37 unknown.",
  "tools": {
    "merge-pdf": {
      "tool": "merge-pdf",
      "opClass": "multi-doc",
      "processingEngine": {
        "value": [
          "pdf.js",
          "pdf-lib",
          "canvas"
        ],
        "note": "pdf.js opens each input for thumbnails/page counts (T.openPdfjs, T.renderThumb, all-tools.js:853-856) and pdf-lib does the actual merge (PDFDocument.copyPages/save)",
        "source": "sites/tools/assets/tools/all-tools.js:853-856 (intake) + merge-pdf run body (PDFLib)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf-lib.min.js"
      },
      "offlineSupport": {
        "value": "verified-offline-run",
        "source": "_qa/test_offline.mjs (kills the HTTP server + sets context offline, reloads the cached tool page, merges two real PDFs, reopens the output -- 40/40 x3 runs, wired into _qa/gate.sh)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "measured",
        "fixture": "600p+1000p merge",
        "peakRssMB": {
          "loMB": 767,
          "hiMB": 2143
        },
        "postStep4": null,
        "ratePerPage_s": [
          0.003,
          0.004
        ],
        "ratePerMB_s": [
          0.008,
          0.009
        ],
        "device": "desktop-chromium-2026-08-13",
        "date": "2026-08-13",
        "source": "oom-matrix-results.md §3",
        "crossEngine": {
          "date": "2026-08-15",
          "deviceClass": "desktop-m4",
          "device": "Apple M4, 16 GB unified, macOS 26.3.1",
          "engines": {
            "chromium": {
              "runs": 8,
              "peakRssMB_singleSampleLowerBound": 896,
              "peakOn": "scan-100p",
              "peakMinusBrowserFloorMB": 489,
              "slowestRunMs": 2384,
              "slowestOn": "scan-300p"
            },
            "firefox": {
              "runs": 6,
              "peakRssMB_singleSampleLowerBound": 1620,
              "peakOn": "scan-300p",
              "peakMinusBrowserFloorMB": 545,
              "slowestRunMs": 2707,
              "slowestOn": "scan-300p"
            },
            "webkit": {
              "runs": 6,
              "peakRssMB_singleSampleLowerBound": 1237,
              "peakOn": "mixed-500p",
              "peakMinusBrowserFloorMB": 793,
              "slowestRunMs": 2631,
              "slowestOn": "mixed-500p"
            }
          },
          "totalRuns": 20,
          "outputsVerifiedInPoppler": "20 of 20 byte-producing runs reopened in poppler (independent PDF stack): page count + page-1 raster for PDFs, entry count for ZIPs",
          "browserFloorMB": {
            "chromium": 407,
            "firefox": 1075,
            "webkit": 444
          },
          "peakRssVarianceWarning": "SINGLE SAMPLE, LOWER BOUND -- NOT an envelope. Peak RSS does not reproduce: a 5x repeat of one cell under identical conditions spread 627-709 MB (+13.1%) while wall time held to 9.8-10.3 s, and an independent 4x repeat by the step-12 checker spread 924-1681 MB (+82%) with byte-identical output (check-step12.md §1). Where two samples of the same cell exist, the figure below is simply the LOWER of the two -- the conservative choice for a lower bound. (It is NOT always the no-extraction sample: of 16 paired cells, 15 rose on the second run and one fell by 394 MB.) No public copy may state any of these as a bound or a guarantee.",
          "note": "peakRssMB_singleSampleLowerBound is the whole browser process tree at 500 ms sampling and INCLUDES that browser's own idle floor (browserFloorMB = the smallest peak observed anywhere in the matrix for that engine); peakMinusBrowserFloorMB is the document-attributable figure. slowestRunMs is null for open-path tools because their wall time is a harness settle constant, not a product number -- read firstPaint/firstThumb in the report instead.",
          "source": "research/unboundpdf/large-doc-runtime/bench-matrix-results.md §3-§4 (machine-readable: bench-matrix-results.json)"
        }
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1600,
              "mb": 634.6,
              "sizeDriven": true,
              "fixture": "600p+1000p merge"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/test_cancel.mjs",
        "_qa/test_offline.mjs",
        "_qa/test_make.mjs"
      ],
      "lastBenchmarked": "2026-08-15",
      "version": {
        "assetVersion": 187
      }
    },
    "split-pdf": {
      "tool": "split-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": true,
        "consumers": [
          "thumbGrid band (all-tools.js:513,926)"
        ],
        "source": "sites/tools/assets/tools/all-tools.js + sites/tools/assets/tools/editor.js (ctx.plan / pagePlan() read sites listed in consumers)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "the ZIP file this build writes stores its file count in a 16-bit field, so it cannot hold more than 65,535 entries. This is a ZIP32 FORMAT fact, not a boundary we measured or one this product imposes on documents: no run has ever reached it, and it must not be read as a size or memory limit",
          "source": "pdf-engine.js buildZip — ZIP32 EOCD, uint16 entry count; call site: sites/tools/assets/tools/all-tools.js:979 (T.buildZip(entries))"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "split-by-size": {
      "tool": "split-by-size",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "the ZIP file this build writes stores its file count in a 16-bit field, so it cannot hold more than 65,535 entries. This is a ZIP32 FORMAT fact, not a boundary we measured or one this product imposes on documents: no run has ever reached it, and it must not be read as a size or memory limit",
          "source": "pdf-engine.js buildZip — ZIP32 EOCD, uint16 entry count; call site: sites/tools/assets/tools/all-tools.js:1300 (T.buildZip(entries))"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "split-by-bookmarks": {
      "tool": "split-by-bookmarks",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "the ZIP file this build writes stores its file count in a 16-bit field, so it cannot hold more than 65,535 entries. This is a ZIP32 FORMAT fact, not a boundary we measured or one this product imposes on documents: no run has ever reached it, and it must not be read as a size or memory limit",
          "source": "pdf-engine.js buildZip — ZIP32 EOCD, uint16 entry count; call site: sites/tools/assets/tools/all-tools.js:1424 (T.buildZip(entries))"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "organize-pdf": {
      "tool": "organize-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": true,
        "consumers": [
          "thumbGrid band (all-tools.js:513,1156)"
        ],
        "source": "sites/tools/assets/tools/all-tools.js + sites/tools/assets/tools/editor.js (ctx.plan / pagePlan() read sites listed in consumers)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "measured",
        "fixture": "text-3000p",
        "peakRssMB": {
          "loMB": 688,
          "hiMB": 721
        },
        "postStep4": null,
        "ratePerPage_s": null,
        "ratePerMB_s": null,
        "device": "desktop-chromium-2026-08-13",
        "date": "2026-08-13",
        "source": "oom-matrix-results.md §3",
        "crossEngine": {
          "date": "2026-08-15",
          "deviceClass": "desktop-m4",
          "device": "Apple M4, 16 GB unified, macOS 26.3.1",
          "engines": {
            "chromium": {
              "runs": 7,
              "peakRssMB_singleSampleLowerBound": 811,
              "peakOn": "scan-300p",
              "peakMinusBrowserFloorMB": 404,
              "slowestRunMs": null,
              "slowestOn": null
            },
            "firefox": {
              "runs": 5,
              "peakRssMB_singleSampleLowerBound": 1510,
              "peakOn": "scan-300p",
              "peakMinusBrowserFloorMB": 435,
              "slowestRunMs": null,
              "slowestOn": null
            },
            "webkit": {
              "runs": 5,
              "peakRssMB_singleSampleLowerBound": 1034,
              "peakOn": "scan-300p",
              "peakMinusBrowserFloorMB": 590,
              "slowestRunMs": null,
              "slowestOn": null
            }
          },
          "totalRuns": 17,
          "outputsVerifiedInPoppler": "0 of 0 byte-producing runs reopened in poppler (independent PDF stack): page count + page-1 raster for PDFs, entry count for ZIPs",
          "browserFloorMB": {
            "chromium": 407,
            "firefox": 1075,
            "webkit": 444
          },
          "peakRssVarianceWarning": "SINGLE SAMPLE, LOWER BOUND -- NOT an envelope. Peak RSS does not reproduce: a 5x repeat of one cell under identical conditions spread 627-709 MB (+13.1%) while wall time held to 9.8-10.3 s, and an independent 4x repeat by the step-12 checker spread 924-1681 MB (+82%) with byte-identical output (check-step12.md §1). Where two samples of the same cell exist, the figure below is simply the LOWER of the two -- the conservative choice for a lower bound. (It is NOT always the no-extraction sample: of 16 paired cells, 15 rose on the second run and one fell by 394 MB.) No public copy may state any of these as a bound or a guarantee.",
          "note": "peakRssMB_singleSampleLowerBound is the whole browser process tree at 500 ms sampling and INCLUDES that browser's own idle floor (browserFloorMB = the smallest peak observed anywhere in the matrix for that engine); peakMinusBrowserFloorMB is the document-attributable figure. slowestRunMs is null for open-path tools because their wall time is a harness settle constant, not a product number -- read firstPaint/firstThumb in the report instead.",
          "source": "research/unboundpdf/large-doc-runtime/bench-matrix-results.md §3-§4 (machine-readable: bench-matrix-results.json)"
        }
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "The reorder/delete grid holds at most 200 thumbnails; pages beyond the 200th pass through untouched (with an on-screen capNote) and cannot be reordered or deleted in that session.",
          "source": "sites/tools/assets/tools/all-tools.js:1157,1172-1176 (organize-pdf setup, max:200 + capNote path, post step-4)"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "2026-08-15",
      "version": {
        "assetVersion": 187
      }
    },
    "rotate-pdf": {
      "tool": "rotate-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": true,
        "consumers": [
          "thumbGrid band (all-tools.js:513,1056)"
        ],
        "source": "sites/tools/assets/tools/all-tools.js + sites/tools/assets/tools/editor.js (ctx.plan / pagePlan() read sites listed in consumers)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "add-page-numbers": {
      "tool": "add-page-numbers",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "jpg-to-pdf": {
      "tool": "jpg-to-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "pdf-to-jpg": {
      "tool": "pdf-to-jpg",
      "opClass": "raster-export",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": true,
        "consumers": [
          "thumbGrid band (all-tools.js:513,1605)",
          "export batch size (all-tools.js:1651, ctx.plan.batch)"
        ],
        "source": "sites/tools/assets/tools/all-tools.js + sites/tools/assets/tools/editor.js (ctx.plan / pagePlan() read sites listed in consumers)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "measured",
        "fixture": "scan-1000p",
        "peakRssMB": {
          "loMB": 1807,
          "hiMB": 2721
        },
        "postStep4": {
          "loMB": 534,
          "hiMB": 582,
          "note": "scan-100p after the batched render→encode→release pipeline; 534 MB is the intake floor (bytes + pdf.js parse), 582 MB the export peak"
        },
        "ratePerPage_s": [
          0.074,
          0.108
        ],
        "ratePerMB_s": [
          0.18,
          0.272
        ],
        "device": "desktop-chromium-2026-08-13",
        "date": "2026-08-13",
        "source": "oom-matrix-results.md §3 + step-4 remeasurement",
        "crossEngine": {
          "date": "2026-08-15",
          "deviceClass": "desktop-m4",
          "device": "Apple M4, 16 GB unified, macOS 26.3.1",
          "engines": {
            "chromium": {
              "runs": 9,
              "peakRssMB_singleSampleLowerBound": 1500,
              "peakOn": "text-1000p",
              "peakMinusBrowserFloorMB": 1093,
              "slowestRunMs": 23080,
              "slowestOn": "mixed-500p"
            },
            "firefox": {
              "runs": 5,
              "peakRssMB_singleSampleLowerBound": 1609,
              "peakOn": "mixed-500p",
              "peakMinusBrowserFloorMB": 534,
              "slowestRunMs": 23830,
              "slowestOn": "mixed-500p"
            },
            "webkit": {
              "runs": 5,
              "peakRssMB_singleSampleLowerBound": 1463,
              "peakOn": "text-1000p",
              "peakMinusBrowserFloorMB": 1019,
              "slowestRunMs": 28806,
              "slowestOn": "text-1000p"
            }
          },
          "totalRuns": 19,
          "outputsVerifiedInPoppler": "19 of 19 byte-producing runs reopened in poppler (independent PDF stack): page count + page-1 raster for PDFs, entry count for ZIPs",
          "browserFloorMB": {
            "chromium": 407,
            "firefox": 1075,
            "webkit": 444
          },
          "peakRssVarianceWarning": "SINGLE SAMPLE, LOWER BOUND -- NOT an envelope. Peak RSS does not reproduce: a 5x repeat of one cell under identical conditions spread 627-709 MB (+13.1%) while wall time held to 9.8-10.3 s, and an independent 4x repeat by the step-12 checker spread 924-1681 MB (+82%) with byte-identical output (check-step12.md §1). Where two samples of the same cell exist, the figure below is simply the LOWER of the two -- the conservative choice for a lower bound. (It is NOT always the no-extraction sample: of 16 paired cells, 15 rose on the second run and one fell by 394 MB.) No public copy may state any of these as a bound or a guarantee.",
          "note": "peakRssMB_singleSampleLowerBound is the whole browser process tree at 500 ms sampling and INCLUDES that browser's own idle floor (browserFloorMB = the smallest peak observed anywhere in the matrix for that engine); peakMinusBrowserFloorMB is the document-attributable figure. slowestRunMs is null for open-path tools because their wall time is a harness settle constant, not a product number -- read firstPaint/firstThumb in the report instead.",
          "source": "research/unboundpdf/large-doc-runtime/bench-matrix-results.md §3-§4 (machine-readable: bench-matrix-results.json)"
        }
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            }
          ],
          "source": "runtime.js PROVEN.mobile + device-results-iphone-20260813.md + device-results-mi-20260813.md"
        },
        "deviceEvidence": [
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              10,
              20
            ],
            "note": "ZIP download landed",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": null,
            "secondsUpperBound": 120,
            "note": "images <60s + conversion <60s: an upper bound on two sub-steps, not a stopwatch; no lower bound was observed",
            "source": "device-results-mi-20260813.md"
          }
        ]
      },
      "knownLimitations": [
        {
          "text": "the ZIP file this build writes stores its file count in a 16-bit field, so it cannot hold more than 65,535 entries. This is a ZIP32 FORMAT fact, not a boundary we measured or one this product imposes on documents: no run has ever reached it, and it must not be read as a size or memory limit",
          "source": "pdf-engine.js buildZip — ZIP32 EOCD, uint16 entry count; call site: sites/tools/assets/tools/all-tools.js:1700 (T.buildZip(entries))"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/test_cancel.mjs",
        "_qa/test_make.mjs"
      ],
      "lastBenchmarked": "2026-08-15",
      "version": {
        "assetVersion": 187
      }
    },
    "pdf-to-word": {
      "tool": "pdf-to-word",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "pdf-lib"
        ],
        "note": "pdf.js reads text/layout; pdf-lib's PDFName/stream lookups (DCTDecode) power the embedded-image fast path",
        "source": "sites/tools/assets/tools/all-tools.js pdf-to-word block (T.openPdfjs intake + PDFLib.PDFName.of(\"XObject\"/\"Filter\"/\"Width\"/\"Height\") DCTDecode lookups)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf-lib.min.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "word-to-pdf": {
      "tool": "word-to-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "docx-preview",
          "dompdf.js",
          "paged.js"
        ],
        "source": "sites/tools/assets/vendor/docx-preview/docx-preview.min.js + sites/tools/assets/dompdf.js + sites/tools/assets/vendor/pagedjs/paged.min.js + sites/tools/assets/tools/t/word-to-pdf.js -- verified against check-w2-3.md round 3",
        "note": "W2-3 (2026-08-20): word-to-pdf reads the .docx with docx-preview (Apache-2.0, vendored) into a DOM, then dompdf.js (shared vector DOM->PDF renderer, W2-1) lays it out and draws it as real text/vector shapes -- the document's own page size, margins, pictures, tables, text boxes, running headers/footers with recalculated page numbers, headings as bookmarks and links as clickable annotations. paged.js (vendor/pagedjs, W2-2) provides the CSS Paged Media layout when the converted markup declares it. This replaces the pre-W2-3 mammoth text-only Lite path; the old ['pdf.js','canvas'] value described neither the old nor the new architecture (word-to-pdf never opens a PDF with pdf.js -- there is no PDF to read, the input is a .docx). Independent checker verdict SHIP, BADGE OFF (check-w2-3.md round 3): 184/184, real Word-oracle page-count parity on two real .docx files, zero foreign requests."
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "after-current-page",
        "cancelId": "page",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/t/word-to-pdf.js call site (W2-3: the conversion is a real page-by-page vector render through assets/dompdf.js, which honours the AbortSignal between pages, so the run is no longer a single uninterruptible rebuild; measured in _qa/test_word_to_pdf.mjs -- cancel at 231 ms into a 90-section document produced NO result)"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/test_word_to_pdf.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "html-to-pdf": {
      "tool": "html-to-pdf",
      "opClass": "raster-export",
      "processingEngine": {
        "value": [
          "dompdf.js",
          "pdf-lib",
          "paged.js"
        ],
        "note": "W2-1 (2026-08-19): dompdf.js is the shared VECTOR DOM->PDF renderer -- it lays out the page and draws real text/vector shapes directly (Liberation-embedded via text-embed.js when a run leaves WinAnsi); pdf-lib assembles and writes the PDF bytes. html2canvas is loaded and used ONLY for subtrees dompdf.js declines to lay out natively (masks it can't resolve, a CSS gradient background, etc. -- named in report.rasterized/report.approximations), never for the whole document. W2-2 (2026-08-19) added paged.js (vendor/pagedjs/paged.min.js, MIT, same-origin) as a lazily-loaded CSS Paged Media layer: loaded ONLY when the source document declares a paged-media feature (@page, running headers/footers, page-break rules), and only then does dompdf.js read paged.js's own '.pagedjs_page' boxes for per-page geometry instead of a plain height split; a document with no paged-media CSS never fetches it. Named @page page sizes (e.g. @page wide{size:...} selected with page: wide) are an upstream paged.js 0.4.3 gap -- not honoured; every page comes out at the one size dompdf.js resolves (check-w2-2.md S2c). This replaces the pre-W2-1 architecture (whole-page html2canvas raster + invisible OCR-style text layer) that opClass 'raster-export' was originally written to describe; opClass itself is unchanged because core.js's TOOL_OP (frozen) still maps this tool to raster-export and the S4 drift guard enforces that match.",
        "source": "sites/tools/assets/dompdf.js (renderer, W2-1+W2-2) + sites/tools/assets/vendor/pagedjs/paged.min.js (CSS Paged Media, W2-2, lazy/same-origin) + sites/tools/assets/tools/t/html-to-pdf.js (tool wiring) -- verified against check-w2-1.md round 2 and check-w2-2.md"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'raster-export' has a measured band (see observedCompletions/opClassBand) from representative tool 'pdf-to-jpg', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            }
          ],
          "source": "runtime.js PROVEN.mobile + device-results-iphone-20260813.md + device-results-mi-20260813.md"
        },
        "deviceEvidence": [
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              10,
              20
            ],
            "note": "ZIP download landed",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": null,
            "secondsUpperBound": 120,
            "note": "images <60s + conversion <60s: an upper bound on two sub-steps, not a stopwatch; no lower bound was observed",
            "source": "device-results-mi-20260813.md"
          }
        ]
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "pdf-to-excel": {
      "tool": "pdf-to-excel",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "pdf-editor": {
      "tool": "pdf-editor",
      "opClass": "editor",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": true,
        "consumers": [
          "editor page-cache eviction (editor.js:2659 EVICT_N)",
          "canvas-area clamp (editor.js:2748-2750)"
        ],
        "source": "sites/tools/assets/tools/all-tools.js + sites/tools/assets/tools/editor.js (ctx.plan / pagePlan() read sites listed in consumers)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "note": "Save path only (editor.js:5377, UR.CANCEL.ITEM) -- the background page-build path has none; see knownLimitations",
        "source": "sites/tools/assets/tools/editor.js:5371-5384 (UR.run({ tool, op:\"editor\", cancel: UR.CANCEL.ITEM, ... }) on Save, shared verbatim by all three editor-backed tools)"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "measured",
        "fixture": "scan-300p",
        "peakRssMB": {
          "loMB": 1347,
          "hiMB": 2074
        },
        "postStep4": null,
        "ratePerPage_s": [
          0.073,
          0.09
        ],
        "ratePerMB_s": [
          0.12,
          0.185
        ],
        "device": "desktop-chromium-2026-08-13",
        "date": "2026-08-13",
        "note": "Flipped unknown -> measured by step 12: this tool now has its OWN fixture runs (25 across three engines, across every large fixture including the 1000-page one), not merely a band inherited from its op class. The guarded peakRssMB/ratePerPage_s fields mirror runtime.js BANDS.editor / RATES.desktop.editor verbatim (that mirroring IS the drift guard); step 12's own newer numbers are in crossEngine below and are deliberately NOT written into the guarded fields, because those fields exist to stay identical to the shipped runtime tables. Step 12 also measured the step-6 fix holding cross-engine: first painted page <= ~520 ms on chromium/webkit and <= 592 ms on firefox at every fixture size measured, including the 1000-page one, against step 2's 73,394 ms on scan-1000p.",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3-§4 (band) + bench-matrix-results.md §3-§4 (this tool's own runs) + check-step11.md §4 (the note this replaces understated the evidence)",
        "crossEngine": {
          "date": "2026-08-15",
          "deviceClass": "desktop-m4",
          "device": "Apple M4, 16 GB unified, macOS 26.3.1",
          "engines": {
            "chromium": {
              "runs": 11,
              "peakRssMB_singleSampleLowerBound": 1466,
              "peakOn": "scan-100p",
              "peakMinusBrowserFloorMB": 1059,
              "slowestRunMs": null,
              "slowestOn": null
            },
            "firefox": {
              "runs": 7,
              "peakRssMB_singleSampleLowerBound": 1905,
              "peakOn": "scan-300p",
              "peakMinusBrowserFloorMB": 830,
              "slowestRunMs": null,
              "slowestOn": null
            },
            "webkit": {
              "runs": 7,
              "peakRssMB_singleSampleLowerBound": 1090,
              "peakOn": "mixed-500p",
              "peakMinusBrowserFloorMB": 646,
              "slowestRunMs": null,
              "slowestOn": null
            }
          },
          "totalRuns": 25,
          "outputsVerifiedInPoppler": "0 of 0 byte-producing runs reopened in poppler (independent PDF stack): page count + page-1 raster for PDFs, entry count for ZIPs",
          "browserFloorMB": {
            "chromium": 407,
            "firefox": 1075,
            "webkit": 444
          },
          "peakRssVarianceWarning": "SINGLE SAMPLE, LOWER BOUND -- NOT an envelope. Peak RSS does not reproduce: a 5x repeat of one cell under identical conditions spread 627-709 MB (+13.1%) while wall time held to 9.8-10.3 s, and an independent 4x repeat by the step-12 checker spread 924-1681 MB (+82%) with byte-identical output (check-step12.md §1). Where two samples of the same cell exist, the figure below is simply the LOWER of the two -- the conservative choice for a lower bound. (It is NOT always the no-extraction sample: of 16 paired cells, 15 rose on the second run and one fell by 394 MB.) No public copy may state any of these as a bound or a guarantee.",
          "note": "peakRssMB_singleSampleLowerBound is the whole browser process tree at 500 ms sampling and INCLUDES that browser's own idle floor (browserFloorMB = the smallest peak observed anywhere in the matrix for that engine); peakMinusBrowserFloorMB is the document-attributable figure. slowestRunMs is null for open-path tools because their wall time is a harness settle constant, not a product number -- read firstPaint/firstThumb in the report instead.",
          "source": "research/unboundpdf/large-doc-runtime/bench-matrix-results.md §3-§4 (machine-readable: bench-matrix-results.json)"
        }
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            },
            {
              "pages": 1000,
              "mb": 2.32,
              "sizeDriven": true,
              "fixture": "text-1000p"
            }
          ],
          "source": "runtime.js PROVEN.mobile + device-results-iphone-20260813.md + device-results-mi-20260813.md"
        },
        "deviceEvidence": [
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "editor",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              10,
              20
            ],
            "note": "page 1 visible; no crash",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "editor",
            "fixture": "text-1000p",
            "pages": 1000,
            "mb": 2.31,
            "outcome": "complete-degraded",
            "seconds": null,
            "note": "page 1 visible; scrolling janky",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "editor",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              30,
              40
            ],
            "note": "scroll okay",
            "source": "device-results-mi-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "editor",
            "fixture": "text-1000p",
            "pages": 1000,
            "mb": 2.31,
            "outcome": "complete-degraded",
            "seconds": [
              10,
              20
            ],
            "note": "loaded; scroll slow on v133",
            "source": "device-results-mi-20260813.md"
          }
        ]
      },
      "knownLimitations": [
        {
          "text": "Editor pages beyond ~300 open but scroll slowly on a phone (comfort degradation, not a failure).",
          "source": "runtime.js CAUTIONS.mobile.editor; device-results-iphone-20260813.md test E + device-results-mi-20260813.md test E"
        },
        {
          "text": "Open item: the mobile time estimator for this op class is derived from a scanned fixture and over-predicts on text-heavy documents by roughly 10-20x; latent because this op class renders no pre-flight panel today.",
          "source": "research/unboundpdf/large-doc-runtime/check-step7.md F3"
        },
        {
          "text": "Save is cancellable (item granularity), but the separate background page-build that runs while the document loads has no cancel affordance of its own -- it deliberately avoids UnboundRun.run()'s one-run-per-page mutex so it never blocks the user's own Save.",
          "source": "sites/tools/assets/tools/editor.js:800-804 (comment, background build) + editor.js:5377 (Save's own UR.run call)"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/editor-flow.mjs",
        "_qa/mobile-editor.mjs",
        "_qa/mem-editor-scroll.mjs",
        "_qa/test_ghostclick.mjs",
        "_qa/test_reeditable.mjs",
        "_qa/test_subsetfonts.mjs",
        "_qa/test_softflow.mjs",
        "_qa/test_linepreserve.mjs"
      ],
      "lastBenchmarked": "2026-08-15",
      "version": {
        "assetVersion": 187
      }
    },
    "watermark-pdf": {
      "tool": "watermark-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "crop-pdf": {
      "tool": "crop-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "resize-pdf": {
      "tool": "resize-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "deskew-pdf": {
      "tool": "deskew-pdf",
      "opClass": "raster-export",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "after-current-page",
        "cancelId": "page",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'raster-export' has a measured band (see observedCompletions/opClassBand) from representative tool 'pdf-to-jpg', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            }
          ],
          "source": "runtime.js PROVEN.mobile + device-results-iphone-20260813.md + device-results-mi-20260813.md"
        },
        "deviceEvidence": [
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              10,
              20
            ],
            "note": "ZIP download landed",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": null,
            "secondsUpperBound": 120,
            "note": "images <60s + conversion <60s: an upper bound on two sub-steps, not a stopwatch; no lower bound was observed",
            "source": "device-results-mi-20260813.md"
          }
        ]
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "redact-pdf": {
      "tool": "redact-pdf",
      "opClass": "raster-export",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'raster-export' has a measured band (see observedCompletions/opClassBand) from representative tool 'pdf-to-jpg', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            }
          ],
          "source": "runtime.js PROVEN.mobile + device-results-iphone-20260813.md + device-results-mi-20260813.md"
        },
        "deviceEvidence": [
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              10,
              20
            ],
            "note": "ZIP download landed",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": null,
            "secondsUpperBound": 120,
            "note": "images <60s + conversion <60s: an upper bound on two sub-steps, not a stopwatch; no lower bound was observed",
            "source": "device-results-mi-20260813.md"
          }
        ]
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "edit-metadata": {
      "tool": "edit-metadata",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "none-during-final-rebuild",
        "cancelId": "rebuild-final",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "fill-sign": {
      "tool": "fill-sign",
      "opClass": "editor",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": true,
        "consumers": [
          "editor page-cache eviction (editor.js:2659 EVICT_N)",
          "canvas-area clamp (editor.js:2748-2750)"
        ],
        "source": "sites/tools/assets/tools/all-tools.js + sites/tools/assets/tools/editor.js (ctx.plan / pagePlan() read sites listed in consumers)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "note": "Save path only (editor.js:5377, UR.CANCEL.ITEM) -- the background page-build path has none; see knownLimitations",
        "source": "sites/tools/assets/tools/editor.js:5371-5384 (UR.run({ tool, op:\"editor\", cancel: UR.CANCEL.ITEM, ... }) on Save, shared verbatim by all three editor-backed tools)"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked by this tool; op class 'editor' DOES have a measured band (BANDS.editor, runtime.js) from the oom-matrix desktop run, but no editor-backed tool surfaces a pre-flight panel today (check-step7.md §5), so no tool-level claim is made",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 + check-step7.md §5"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            },
            {
              "pages": 1000,
              "mb": 2.32,
              "sizeDriven": true,
              "fixture": "text-1000p"
            }
          ],
          "source": "runtime.js PROVEN.mobile + device-results-iphone-20260813.md + device-results-mi-20260813.md"
        },
        "deviceEvidence": [
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "editor",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              10,
              20
            ],
            "note": "page 1 visible; no crash",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "editor",
            "fixture": "text-1000p",
            "pages": 1000,
            "mb": 2.31,
            "outcome": "complete-degraded",
            "seconds": null,
            "note": "page 1 visible; scrolling janky",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "editor",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              30,
              40
            ],
            "note": "scroll okay",
            "source": "device-results-mi-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "editor",
            "fixture": "text-1000p",
            "pages": 1000,
            "mb": 2.31,
            "outcome": "complete-degraded",
            "seconds": [
              10,
              20
            ],
            "note": "loaded; scroll slow on v133",
            "source": "device-results-mi-20260813.md"
          }
        ]
      },
      "knownLimitations": [
        {
          "text": "Editor pages beyond ~300 open but scroll slowly on a phone (comfort degradation, not a failure).",
          "source": "runtime.js CAUTIONS.mobile.editor; device-results-iphone-20260813.md test E + device-results-mi-20260813.md test E"
        },
        {
          "text": "Open item: the mobile time estimator for this op class is derived from a scanned fixture and over-predicts on text-heavy documents by roughly 10-20x; latent because this op class renders no pre-flight panel today.",
          "source": "research/unboundpdf/large-doc-runtime/check-step7.md F3"
        },
        {
          "text": "Save is cancellable (item granularity), but the separate background page-build that runs while the document loads has no cancel affordance of its own -- it deliberately avoids UnboundRun.run()'s one-run-per-page mutex so it never blocks the user's own Save.",
          "source": "sites/tools/assets/tools/editor.js:800-804 (comment, background build) + editor.js:5377 (Save's own UR.run call)"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/editor-flow.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "sign-pdf": {
      "tool": "sign-pdf",
      "opClass": "editor",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": true,
        "consumers": [
          "editor page-cache eviction (editor.js:2659 EVICT_N)",
          "canvas-area clamp (editor.js:2748-2750)"
        ],
        "source": "sites/tools/assets/tools/all-tools.js + sites/tools/assets/tools/editor.js (ctx.plan / pagePlan() read sites listed in consumers)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "note": "Save path only (editor.js:5377, UR.CANCEL.ITEM) -- the background page-build path has none; see knownLimitations",
        "source": "sites/tools/assets/tools/editor.js:5371-5384 (UR.run({ tool, op:\"editor\", cancel: UR.CANCEL.ITEM, ... }) on Save, shared verbatim by all three editor-backed tools)"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked by this tool; op class 'editor' DOES have a measured band (BANDS.editor, runtime.js) from the oom-matrix desktop run, but no editor-backed tool surfaces a pre-flight panel today (check-step7.md §5), so no tool-level claim is made",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 + check-step7.md §5"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            },
            {
              "pages": 1000,
              "mb": 2.32,
              "sizeDriven": true,
              "fixture": "text-1000p"
            }
          ],
          "source": "runtime.js PROVEN.mobile + device-results-iphone-20260813.md + device-results-mi-20260813.md"
        },
        "deviceEvidence": [
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "editor",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              10,
              20
            ],
            "note": "page 1 visible; no crash",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "editor",
            "fixture": "text-1000p",
            "pages": 1000,
            "mb": 2.31,
            "outcome": "complete-degraded",
            "seconds": null,
            "note": "page 1 visible; scrolling janky",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "editor",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              30,
              40
            ],
            "note": "scroll okay",
            "source": "device-results-mi-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "editor",
            "fixture": "text-1000p",
            "pages": 1000,
            "mb": 2.31,
            "outcome": "complete-degraded",
            "seconds": [
              10,
              20
            ],
            "note": "loaded; scroll slow on v133",
            "source": "device-results-mi-20260813.md"
          }
        ]
      },
      "knownLimitations": [
        {
          "text": "Editor pages beyond ~300 open but scroll slowly on a phone (comfort degradation, not a failure).",
          "source": "runtime.js CAUTIONS.mobile.editor; device-results-iphone-20260813.md test E + device-results-mi-20260813.md test E"
        },
        {
          "text": "Open item: the mobile time estimator for this op class is derived from a scanned fixture and over-predicts on text-heavy documents by roughly 10-20x; latent because this op class renders no pre-flight panel today.",
          "source": "research/unboundpdf/large-doc-runtime/check-step7.md F3"
        },
        {
          "text": "Save is cancellable (item granularity), but the separate background page-build that runs while the document loads has no cancel affordance of its own -- it deliberately avoids UnboundRun.run()'s one-run-per-page mutex so it never blocks the user's own Save.",
          "source": "sites/tools/assets/tools/editor.js:800-804 (comment, background build) + editor.js:5377 (Save's own UR.run call)"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/editor-flow.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "remove-annotations": {
      "tool": "remove-annotations",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "compress-pdf": {
      "tool": "compress-pdf",
      "opClass": "requant",
      "processingEngine": {
        "value": [
          "pdf.js",
          "jpeg-requant"
        ],
        "source": "sites/tools/assets/tools/all-tools.js compress-pdf setup (jpeg-requant.js); Maximum mode instead uses the raster-export (pdf.js + canvas) path -- see modeCaveat on largeDocumentBenchmark"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "jpeg-requant-worker.js exists in the asset tree but is default-OFF, opt-in only -- never enabled for a public run today.",
        "source": "sites/tools/assets/jpeg-requant-worker.js (present, unwired) + P1-DESIGN.md §5.1"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in jpeg-requant.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "measured",
        "fixture": "scan-1000p",
        "peakRssMB": {
          "loMB": 720,
          "hiMB": 1359
        },
        "postStep4": null,
        "ratePerPage_s": [
          0.071,
          0.086
        ],
        "ratePerMB_s": [
          0.12,
          0.179
        ],
        "device": "desktop-chromium-2026-08-13",
        "date": "2026-08-13",
        "source": "oom-matrix-results.md §3",
        "modeCaveat": {
          "text": "In Maximum (rasterize) mode this tool's real op class is 'raster-export', not 'requant' -- the measured band there is 1807-2721 MB, not the requant band above.",
          "source": "sites/tools/assets/tools/all-tools.js:1960 (op: mMax.input.checked ? \"raster-export\" : \"requant\") + TOOL_OP comment all-tools.js:351-353"
        },
        "crossEngine": {
          "date": "2026-08-15",
          "deviceClass": "desktop-m4",
          "device": "Apple M4, 16 GB unified, macOS 26.3.1",
          "engines": {
            "chromium": {
              "runs": 18,
              "peakRssMB_singleSampleLowerBound": 949,
              "peakOn": "scan-300p",
              "peakMinusBrowserFloorMB": 542,
              "slowestRunMs": 27054,
              "slowestOn": "mixed-500p"
            },
            "firefox": {
              "runs": 11,
              "peakRssMB_singleSampleLowerBound": 1598,
              "peakOn": "mixed-500p",
              "peakMinusBrowserFloorMB": 523,
              "slowestRunMs": 25422,
              "slowestOn": "scan-300p"
            },
            "webkit": {
              "runs": 11,
              "peakRssMB_singleSampleLowerBound": 1336,
              "peakOn": "mixed-500p",
              "peakMinusBrowserFloorMB": 892,
              "slowestRunMs": 18513,
              "slowestOn": "mixed-500p"
            }
          },
          "totalRuns": 40,
          "outputsVerifiedInPoppler": "37 of 37 byte-producing runs reopened in poppler (independent PDF stack): page count + page-1 raster for PDFs, entry count for ZIPs",
          "browserFloorMB": {
            "chromium": 407,
            "firefox": 1075,
            "webkit": 444
          },
          "peakRssVarianceWarning": "SINGLE SAMPLE, LOWER BOUND -- NOT an envelope. Peak RSS does not reproduce: a 5x repeat of one cell under identical conditions spread 627-709 MB (+13.1%) while wall time held to 9.8-10.3 s, and an independent 4x repeat by the step-12 checker spread 924-1681 MB (+82%) with byte-identical output (check-step12.md §1). Where two samples of the same cell exist, the figure below is simply the LOWER of the two -- the conservative choice for a lower bound. (It is NOT always the no-extraction sample: of 16 paired cells, 15 rose on the second run and one fell by 394 MB.) No public copy may state any of these as a bound or a guarantee.",
          "note": "peakRssMB_singleSampleLowerBound is the whole browser process tree at 500 ms sampling and INCLUDES that browser's own idle floor (browserFloorMB = the smallest peak observed anywhere in the matrix for that engine); peakMinusBrowserFloorMB is the document-attributable figure. slowestRunMs is null for open-path tools because their wall time is a harness settle constant, not a product number -- read firstPaint/firstThumb in the report instead.",
          "source": "research/unboundpdf/large-doc-runtime/bench-matrix-results.md §3-§4 (machine-readable: bench-matrix-results.json)"
        }
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": [
            {
              "pages": 300,
              "mb": 118.99,
              "sizeDriven": true,
              "fixture": "scan-300p"
            }
          ],
          "source": "runtime.js PROVEN.mobile + device-results-iphone-20260813.md + device-results-mi-20260813.md"
        },
        "deviceEvidence": [
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "requant",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": null,
            "note": "fast; no memory-kill banner",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "requant",
            "fixture": "scan-300p",
            "pages": 300,
            "mb": 118.99,
            "outcome": "complete",
            "seconds": [
              30,
              40
            ],
            "note": "no white flash, no reload",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "requant",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              40,
              60
            ],
            "note": "load fast",
            "source": "device-results-mi-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "requant",
            "fixture": "scan-300p",
            "pages": 300,
            "mb": 118.99,
            "outcome": "complete",
            "seconds": [
              60,
              100
            ],
            "note": "no crash/reload",
            "source": "device-results-mi-20260813.md"
          }
        ]
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/test_cancel.mjs",
        "_qa/test_make.mjs"
      ],
      "lastBenchmarked": "2026-08-15",
      "version": {
        "assetVersion": 187
      }
    },
    "repair-pdf": {
      "tool": "repair-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf-lib",
          "pdf-repair.js (first-party)",
          "pdf-textops.js",
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/t/repair-pdf.js -- strategies 1 and 2 and every acceptance re-load are PDFLib.PDFDocument.load/save; strategy 2.5 is the first-party rebuilder sites/tools/assets/pdf-repair.js (lazily loaded, same-origin, only on this page), which reuses pdf-textops.js's tokenizer read-only; pdf.js + canvas are strategy 3 (T.openPdfjs + T.renderPageToCanvas) and the text sampling that measures acceptance"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "after-current-page",
        "cancelId": "page",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/test_readiness.mjs",
        "_qa/test_repair_pdf.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      },
      "capabilityCompleteness": {
        "value": "full",
        "gaps": [
          "A page whose font programs are no longer in the bytes comes back WITHOUT its text: the pages are recovered and the missing text is named in the result chip (\"pages recovered; the text could not be\"), never redrawn in a substitute face -- the tool never substitutes a font it did not find (measured on _qa/fixtures/repair-pdf/truncated-tail.pdf: 51 of 51 pages, 0 characters, said so on the page).",
          "When the first three strategies all fail, strategy 3 rebuilds the document from page renders: the pages come back as images and the text stops being selectable. The result names that rather than implying the text survived.",
          "An encrypted file is refused BY NAME: without the document's password nothing about the output can be measured, so nothing is claimed -- the result reads \"Could not be recovered -- the file is encrypted and still needs the document's password\" instead of a strategy label (_qa/fixtures/repair-pdf/encrypted-damaged.pdf, lane E5)."
        ],
        "provenBy": "_qa/test_repair_pdf.mjs",
        "source": "research/unboundpdf/full-capability/check-w3-5.md + check-w3-5-badge-revisit.md §3 -- 7 of the 8 damage fixtures come back as real text PDFs (six at 100.0% word recall, garbage-mid at 98.0%, every one qpdf --check clean) and the eighth returns all 51 pages with its missing text named"
      }
    },
    "flatten-pdf": {
      "tool": "flatten-pdf",
      "opClass": "raster-export",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": [
          "none-during-final-rebuild",
          "supported"
        ],
        "cancelId": [
          "rebuild-final",
          "item"
        ],
        "note": "mode-dependent -- see tool's own mode toggle",
        "source": "sites/tools/assets/tools/all-tools.js (flatten-pdf urun descriptor function, form-flatten vs rasterize)"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'raster-export' has a measured band (see observedCompletions/opClassBand) from representative tool 'pdf-to-jpg', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            }
          ],
          "source": "runtime.js PROVEN.mobile + device-results-iphone-20260813.md + device-results-mi-20260813.md"
        },
        "deviceEvidence": [
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              10,
              20
            ],
            "note": "ZIP download landed",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": null,
            "secondsUpperBound": 120,
            "note": "images <60s + conversion <60s: an upper bound on two sub-steps, not a stopwatch; no lower bound was observed",
            "source": "device-results-mi-20260813.md"
          }
        ]
      },
      "knownLimitations": [
        {
          "text": "This tool's real op class depends on the mode chosen: 'Flatten form fields' is structural/REBUILD_FINAL, 'Rasterize everything' is raster-export/ITEM. largeDocumentBenchmark is 'unknown' for both (no fixture run isolated this tool specifically), so no number is overstated here, but the two modes are NOT the same memory profile.",
          "source": "sites/tools/assets/tools/all-tools.js:2848-2851 (op: mForm.input.checked ? \"structural\" : \"raster-export\")"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/test_flatten_scrub.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "extract-images": {
      "tool": "extract-images",
      "opClass": "raster-export",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'raster-export' has a measured band (see observedCompletions/opClassBand) from representative tool 'pdf-to-jpg', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            }
          ],
          "source": "runtime.js PROVEN.mobile + device-results-iphone-20260813.md + device-results-mi-20260813.md"
        },
        "deviceEvidence": [
          {
            "device": "iphone-14",
            "browser": "safari",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": [
              10,
              20
            ],
            "note": "ZIP download landed",
            "source": "device-results-iphone-20260813.md"
          },
          {
            "device": "mi-generic",
            "browser": "chrome",
            "op": "raster-export",
            "fixture": "scan-100p",
            "pages": 100,
            "mb": 39.76,
            "outcome": "complete",
            "seconds": null,
            "secondsUpperBound": 120,
            "note": "images <60s + conversion <60s: an upper bound on two sub-steps, not a stopwatch; no lower bound was observed",
            "source": "device-results-mi-20260813.md"
          }
        ]
      },
      "knownLimitations": [
        {
          "text": "the ZIP file this build writes stores its file count in a 16-bit field, so it cannot hold more than 65,535 entries. This is a ZIP32 FORMAT fact, not a boundary we measured or one this product imposes on documents: no run has ever reached it, and it must not be read as a size or memory limit",
          "source": "pdf-engine.js buildZip — ZIP32 EOCD, uint16 entry count; call site: sites/tools/assets/tools/all-tools.js:3131 (T.buildZip(entries))"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "ocr-pdf": {
      "tool": "ocr-pdf",
      "opClass": "ocr",
      "processingEngine": {
        "value": [
          "pdf.js",
          "tesseract.js"
        ],
        "source": "sites/tools/assets/tools/all-tools.js ocr-pdf setup (T.openPdfjs + Tesseract worker)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "tesseract"
        ],
        "note": "first-party worker: none. Tesseract's OWN internal worker is vendor code, never asserted as a first-party capability.",
        "source": "check-step7.md P1-DESIGN §7 seed note"
      },
      "wasm": {
        "value": true,
        "note": "Tesseract's own Wasm binary -- the only Wasm in the product",
        "source": "sites/tools/assets/tesseract/tesseract-core-lstm.wasm + tesseract-core-simd-lstm.wasm (binary presence, not a text grep) + tesseract/worker.min.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "after-current-page",
        "cancelId": "page",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "measured",
        "fixture": "scan-300p",
        "peakRssMB": {
          "loMB": 1279,
          "hiMB": 1669
        },
        "postStep4": null,
        "ratePerPage_s": [
          1.489,
          1.489
        ],
        "ratePerMB_s": [
          3.754,
          3.754
        ],
        "device": "desktop-chromium-2026-08-13",
        "date": "2026-08-13",
        "source": "oom-matrix-results.md §3",
        "crossEngine": {
          "date": "2026-08-15",
          "deviceClass": "desktop-m4",
          "device": "Apple M4, 16 GB unified, macOS 26.3.1",
          "engines": {
            "chromium": {
              "runs": 1,
              "peakRssMB_singleSampleLowerBound": 849,
              "peakOn": "scan-100p",
              "peakMinusBrowserFloorMB": 442,
              "slowestRunMs": 94196,
              "slowestOn": "scan-100p"
            },
            "firefox": {
              "runs": 1,
              "peakRssMB_singleSampleLowerBound": 1401,
              "peakOn": "scan-100p",
              "peakMinusBrowserFloorMB": 326,
              "slowestRunMs": 1179349,
              "slowestOn": "scan-100p"
            },
            "webkit": {
              "runs": 1,
              "peakRssMB_singleSampleLowerBound": 1176,
              "peakOn": "scan-100p",
              "peakMinusBrowserFloorMB": 732,
              "slowestRunMs": 88856,
              "slowestOn": "scan-100p"
            }
          },
          "totalRuns": 3,
          "outputsVerifiedInPoppler": "3 of 3 byte-producing runs reopened in poppler (independent PDF stack): page count + page-1 raster for PDFs, entry count for ZIPs",
          "browserFloorMB": {
            "chromium": 407,
            "firefox": 1075,
            "webkit": 444
          },
          "peakRssVarianceWarning": "SINGLE SAMPLE, LOWER BOUND -- NOT an envelope. Peak RSS does not reproduce: a 5x repeat of one cell under identical conditions spread 627-709 MB (+13.1%) while wall time held to 9.8-10.3 s, and an independent 4x repeat by the step-12 checker spread 924-1681 MB (+82%) with byte-identical output (check-step12.md §1). Where two samples of the same cell exist, the figure below is simply the LOWER of the two -- the conservative choice for a lower bound. (It is NOT always the no-extraction sample: of 16 paired cells, 15 rose on the second run and one fell by 394 MB.) No public copy may state any of these as a bound or a guarantee.",
          "note": "peakRssMB_singleSampleLowerBound is the whole browser process tree at 500 ms sampling and INCLUDES that browser's own idle floor (browserFloorMB = the smallest peak observed anywhere in the matrix for that engine); peakMinusBrowserFloorMB is the document-attributable figure. slowestRunMs is null for open-path tools because their wall time is a harness settle constant, not a product number -- read firstPaint/firstThumb in the report instead.",
          "source": "research/unboundpdf/large-doc-runtime/bench-matrix-results.md §3-§4 (machine-readable: bench-matrix-results.json)"
        }
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 300,
              "mb": 118.99,
              "sizeDriven": true,
              "fixture": "scan-300p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/test_cancel.mjs"
      ],
      "lastBenchmarked": "2026-08-15",
      "version": {
        "assetVersion": 187
      }
    },
    "compare-pdf": {
      "tool": "compare-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "not-wired",
        "cancelId": null,
        "note": "no urun()/UnboundRun.run() call site for this tool",
        "source": "sites/tools/assets/tools/all-tools.js (grep for urun()/UnboundRun.run -- zero hits in this tool's block)"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "This tool never calls UnboundRun.run() -- there is no progress panel, no Stop button, and no cancellation of any kind once a comparison starts.",
          "source": "sites/tools/assets/tools/all-tools.js compare-pdf setup (zero urun(/UR.run( call sites)"
        }
      ],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "protect-pdf": {
      "tool": "protect-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf-lib"
        ],
        "note": "pdf-lib's encrypt()/decrypt() does the whole job; no canvas render and no pdf.js parse happen on this path",
        "source": "sites/tools/assets/tools/all-tools.js:2417-2436 (protect-pdf: T.loadPdf -> doc.encrypt -> doc.save -> PDFLib.PDFDocument.load self-check) / unlock-pdf's analogous block"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [],
        "note": "no worker of any kind",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf-lib.min.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "none-during-final-rebuild",
        "cancelId": "rebuild-final",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/test_readiness.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "unlock-pdf": {
      "tool": "unlock-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf-lib"
        ],
        "note": "pdf-lib's encrypt()/decrypt() does the whole job; no canvas render and no pdf.js parse happen on this path",
        "source": "sites/tools/assets/tools/all-tools.js:2417-2436 (protect-pdf: T.loadPdf -> doc.encrypt -> doc.save -> PDFLib.PDFDocument.load self-check) / unlock-pdf's analogous block"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [],
        "note": "no worker of any kind",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf-lib.min.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "none-during-final-rebuild",
        "cancelId": "rebuild-final",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs",
        "_qa/test_readiness.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "pdf-a": {
      "tool": "pdf-a",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "none-during-final-rebuild",
        "cancelId": "rebuild-final",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      },
      "capabilityCompleteness": {
        "value": "full",
        "gaps": [
          "DeviceCMYK content is reported, not converted to sRGB -- the file is delivered without a conformance claim, naming rule UBA2B-009 (ISO 19005-2 clause 6.2.4.3). Needs a colour-transform engine (lcms2-WASM, PROGRAM-PLAN §5 backlog).",
          "A composite (CID) font with no embedded font program is refused by name rather than substituted, because a Latin substitute would put the wrong glyphs on the page."
        ],
        "provenBy": "_qa/test_pdf_a.mjs",
        "source": "research/unboundpdf/full-capability/w3-4-verapdf.md"
      }
    },
    "pptx-to-pdf": {
      "tool": "pptx-to-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "canvas"
        ],
        "source": "sites/tools/assets/tools/all-tools.js/editor.js (T.openPdfjs + canvas render call sites for this tool)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite; the checker's one-off manual compress-pdf run was not wired into a regression gate and is not treated as a standing proof)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/all-tools.js + editor.js)"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/all-tools.js call site"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not directly benchmarked; op class 'structural' has a measured band (see observedCompletions/opClassBand) from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md §3 (6-of-33 coverage) + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [],
      "verificationChecks": [
        "_qa/audit.mjs (×3 engines)",
        "_qa/compat.mjs",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs",
        "_qa/gen-quality-probe.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "passport-photo": {
      "tool": "passport-photo",
      "opClass": "raster-export",
      "processingEngine": {
        "value": [
          "canvas",
          "photo-engine.js",
          "pdf-lib"
        ],
        "source": "sites/tools/assets/tools/t/passport-photo.js (canvas draw + assets/photo-engine.js geometry/metadata + PDFLib for the print sheet)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [],
        "note": "first-party worker: none. This tool runs entirely on the calling thread.",
        "source": "sites/tools/assets/tools/t/passport-photo.js (no Worker construction in this tool's block)"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in sites/tools/assets/photo-engine.js and sites/tools/assets/tools/t/passport-photo.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/t/passport-photo.js)"
      },
      "cancellationSupport": {
        "value": "restart-required",
        "cancelId": "restart",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/t/passport-photo.js call site (cancel: \"RESTART\")"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse === true -- a full restart is required, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not benchmarked. This tool shipped in W5-E1 (2026-08-21) after the step-12 benchmark matrix was measured, so no run of its own exists and no op-class band is claimed on its behalf.",
        "source": "research/unboundpdf/full-capability/WAVE5-EXPANSION-PLAN.md §E1 (build date) + research/unboundpdf/large-doc-runtime/bench-matrix-results.md (matrix predates this tool)"
      },
      "observedCompletions": {
        "note": "op-class rows, NOT this tool's own run: the figures below are the runtime's PROVEN table for this op class, measured with a PDF fixture on a different tool before this one existed. Nothing about this tool has been benchmarked -- read them as the class's record, not as a statement about this tool, and never as a boundary.",
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "sites/tools/assets/runtime.js PROVEN.desktop['raster-export'] (op-class row; see note)"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            }
          ],
          "source": "sites/tools/assets/runtime.js PROVEN.mobile['raster-export'] (op-class row; see note)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "Produces a photo at the preset's stated dimensions and DPI; it makes no judgement about whether an authority will accept the photo, and checks nothing about expression, lighting, glasses, headwear or background quality.",
          "source": "sites/tools/assets/tools/t/passport-photo.js (limitNote string, visible on the page) + _qa/test_passport-photo.mjs (asserts the string is present)"
        },
        {
          "text": "Head-height guides are drawn only for presets with a published chin-to-crown rule; the two stamp sizes and a custom size get no head guide because none is published for them.",
          "source": "sites/tools/assets/photo-engine.js PRESETS (head:null rows) + headGuides() returning null"
        },
        {
          "text": "Automatic head placement uses the browser's own FaceDetector where one exists; in browsers without it the user aligns to the guides by hand and the tool says so rather than claiming a detection.",
          "source": "sites/tools/assets/tools/t/passport-photo.js detectFace() (returns null when window.FaceDetector is absent)"
        },
        {
          "text": "A background colour is painted behind the photo, so it only changes the picture where the source has transparency; the page says to run an opaque photo through Remove Background first.",
          "source": "sites/tools/assets/tools/t/passport-photo.js alphaNote string"
        }
      ],
      "verificationChecks": [
        "_qa/test_passport-photo.mjs (real browser, real fixture; output dimensions/DPI read back out of the encoded bytes)",
        "_qa/pages.mjs",
        "_qa/test_claims.mjs",
        "_qa/test_modules.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "remove-background": {
      "tool": "remove-background",
      "opClass": "raster-export",
      "processingEngine": {
        "value": [
          "onnxruntime-web (wasm)",
          "MODNet",
          "canvas"
        ],
        "source": "sites/tools/assets/bgremove-engine.js (dynamic import of assets/vendor/onnxruntime/ort.min.mjs, InferenceSession over assets/vendor/modnet/modnet_photographic_portrait_matting.onnx)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [],
        "note": "first-party worker: none. This tool runs entirely on the calling thread.",
        "source": "sites/tools/assets/tools/t/remove-background.js (no Worker construction in this tool's block)"
      },
      "wasm": {
        "value": true,
        "source": "sites/tools/assets/vendor/onnxruntime/ort-wasm-simd-threaded.wasm is loaded by bgremove-engine.js (ort.env.wasm.wasmPaths) -- this tool runs WebAssembly by construction"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/t/remove-background.js)"
      },
      "cancellationSupport": {
        "value": "restart-required",
        "cancelId": "restart",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/t/remove-background.js call site (cancel: \"RESTART\")"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse === true -- a full restart is required, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not benchmarked. This tool shipped in W5-E1 (2026-08-21) after the step-12 benchmark matrix was measured, so no run of its own exists and no op-class band is claimed on its behalf.",
        "source": "research/unboundpdf/full-capability/WAVE5-EXPANSION-PLAN.md §E1 (build date) + research/unboundpdf/large-doc-runtime/bench-matrix-results.md (matrix predates this tool)"
      },
      "observedCompletions": {
        "note": "op-class rows, NOT this tool's own run: the figures below are the runtime's PROVEN table for this op class, measured with a PDF fixture on a different tool before this one existed. Nothing about this tool has been benchmarked -- read them as the class's record, not as a statement about this tool, and never as a boundary.",
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "sites/tools/assets/runtime.js PROVEN.desktop['raster-export'] (op-class row; see note)"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            }
          ],
          "source": "sites/tools/assets/runtime.js PROVEN.mobile['raster-export'] (op-class row; see note)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "Portrait model only. Measured on a portrait and a complex-hair close-up it produces a clean cut-out; on a product flat-lay it drops most of the subject, so it is not offered as a general background remover.",
          "source": "research/unboundpdf/full-capability/w5-bgremove-spike.md §4 (per-image results) + the tool's own scope note"
        },
        {
          "text": "First use downloads the runtime and the model from this origin before anything can run; nothing is fetched until the user presses the button that states the size.",
          "source": "sites/tools/assets/tools/t/remove-background.js (engineBtn gate) + bgremove-engine.js ASSET_BYTES (re-measured against the files on disk by _qa/test_remove-background.mjs)"
        },
        {
          "text": "Several seconds per photo on a current laptop and longer on an older device -- an asynchronous job with a progress line, not a live preview.",
          "source": "research/unboundpdf/full-capability/w5-bgremove-spike.md §3 (measured inference times, single-thread wasm)"
        },
        {
          "text": "Output is always PNG: a JPEG cannot carry an alpha channel, so a transparent result cannot be represented in that format.",
          "source": "sites/tools/assets/tools/t/remove-background.js (PNG-only export path)"
        }
      ],
      "verificationChecks": [
        "_qa/test_remove-background.mjs (real browser, real fixture; cut-out measured against the fixture's known face box, asset byte table re-measured on disk)",
        "_qa/pages.mjs",
        "_qa/test_claims.mjs",
        "_qa/test_licenses.mjs",
        "_qa/test_modules.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "remove-watermark-pdf": {
      "tool": "remove-watermark-pdf",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf-lib",
          "watermark-remove.js"
        ],
        "source": "sites/tools/assets/tools/t/remove-watermark-pdf.js (window.UBWatermark over PDFLib: content-stream tokenizer, object sweep, output-byte verification)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [],
        "note": "first-party worker: none. This tool runs entirely on the calling thread.",
        "source": "sites/tools/assets/tools/t/remove-watermark-pdf.js (no Worker construction in this tool's block)"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in sites/tools/assets/watermark-remove.js and sites/tools/assets/tools/t/remove-watermark-pdf.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/t/remove-watermark-pdf.js)"
      },
      "cancellationSupport": {
        "value": "restart-required",
        "cancelId": "restart",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/t/remove-watermark-pdf.js call site (cancel: \"RESTART\")"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse === true -- a full restart is required, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not benchmarked. This tool shipped in W5-E1 (2026-08-21) after the step-12 benchmark matrix was measured, so no run of its own exists and no op-class band is claimed on its behalf.",
        "source": "research/unboundpdf/full-capability/WAVE5-EXPANSION-PLAN.md §E1 (build date) + research/unboundpdf/large-doc-runtime/bench-matrix-results.md (matrix predates this tool)"
      },
      "observedCompletions": {
        "note": "op-class rows, NOT this tool's own run: the figures below are the runtime's PROVEN table for this op class, measured with a PDF fixture on a different tool before this one existed. Nothing about this tool has been benchmarked -- read them as the class's record, not as a statement about this tool, and never as a boundary.",
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "sites/tools/assets/runtime.js PROVEN.desktop['structural'] (op-class row; see note)"
        },
        "mobile": {
          "runs": null,
          "source": "sites/tools/assets/runtime.js PROVEN.mobile['structural'] (op-class row; see note)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "Removes watermarks that exist as OBJECTS: /Watermark and /Stamp annotations, form XObjects drawn over pages, and repeated content-stream blocks carrying a watermark trait (partial transparency, rotation, or text far larger than body text).",
          "source": "sites/tools/assets/watermark-remove.js analyze() (the three candidate kinds) + _qa/test_remove-watermark-pdf.mjs (one fixture per kind)"
        },
        {
          "text": "Refuses by name on a file whose mark is baked into a page image: a page that is a single scanned or rasterised image has no watermark object, and the tool names those pages instead of returning a re-saved copy.",
          "source": "sites/tools/assets/watermark-remove.js analyze().refusal + _qa/test_remove-watermark-pdf.mjs (scan-flattened.pdf must be refused)"
        },
        {
          "text": "A repeated block is nominated only when it carries a physical watermark trait; a running header that merely repeats on every page is not treated as a watermark.",
          "source": "sites/tools/assets/watermark-remove.js watermarkTraits() (repetition alone never qualifies) + the suite's body-text survival check"
        },
        {
          "text": "The 'verified' claim is produced by re-loading the SAVED file and re-scanning it independently of the code that made the edit; when that scan still finds the mark, the result says the verification did not pass rather than reporting success.",
          "source": "sites/tools/assets/watermark-remove.js verifyRemoval() + _qa/test_remove-watermark-pdf.mjs (negative control: a candidate whose text survives must read not-verified)"
        }
      ],
      "verificationChecks": [
        "_qa/test_remove-watermark-pdf.mjs (three watermark-kind fixtures + a flattened scan, verified with qpdf/pdftotext as independent oracles)",
        "_qa/pages.mjs",
        "_qa/test_claims.mjs",
        "_qa/test_modules.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "resize-image": {
      "tool": "resize-image",
      "opClass": "raster-export",
      "processingEngine": {
        "value": [
          "canvas",
          "photo-engine.js"
        ],
        "source": "sites/tools/assets/tools/t/resize-image.js (canvas drawImage/toBlob + assets/photo-engine.js for reading and writing the file's own dimension/resolution/EXIF fields)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [],
        "note": "first-party worker: none. This tool runs entirely on the calling thread.",
        "source": "sites/tools/assets/tools/t/resize-image.js (no Worker construction in this tool's block)"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in sites/tools/assets/photo-engine.js and sites/tools/assets/tools/t/resize-image.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN §6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- architecture, not proof",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation was probed offline by the implementer's repeatable suite)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer found for this tool (grep sites/tools/assets/tools/t/resize-image.js)"
      },
      "cancellationSupport": {
        "value": "restart-required",
        "cancelId": "restart",
        "source": "sites/tools/assets/runtime.js CANCEL + sites/tools/assets/tools/t/resize-image.js call site (cancel: \"RESTART\")"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse === true -- a full restart is required, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not benchmarked. This tool shipped in W5-E1 (2026-08-21) after the step-12 benchmark matrix was measured, so no run of its own exists and no op-class band is claimed on its behalf.",
        "source": "research/unboundpdf/full-capability/WAVE5-EXPANSION-PLAN.md §E1 (build date) + research/unboundpdf/large-doc-runtime/bench-matrix-results.md (matrix predates this tool)"
      },
      "observedCompletions": {
        "note": "op-class rows, NOT this tool's own run: the figures below are the runtime's PROVEN table for this op class, measured with a PDF fixture on a different tool before this one existed. Nothing about this tool has been benchmarked -- read them as the class's record, not as a statement about this tool, and never as a boundary.",
        "desktop": {
          "runs": [
            {
              "pages": 1000,
              "mb": 396.72,
              "sizeDriven": true,
              "fixture": "scan-1000p"
            }
          ],
          "source": "sites/tools/assets/runtime.js PROVEN.desktop['raster-export'] (op-class row; see note)"
        },
        "mobile": {
          "runs": [
            {
              "pages": 100,
              "mb": 39.77,
              "sizeDriven": true,
              "fixture": "scan-100p"
            }
          ],
          "source": "sites/tools/assets/runtime.js PROVEN.mobile['raster-export'] (op-class row; see note)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "A target file size is offered for JPG and WebP only; PNG has no quality dial, and the page says so instead of pretending to hit a target it cannot.",
          "source": "sites/tools/assets/tools/t/resize-image.js modeNote (PNG branch)"
        },
        {
          "text": "When the size target cannot be reached at the encoder's lowest quality, the result says the target was NOT reached and reports the size actually produced.",
          "source": "sites/tools/assets/tools/t/resize-image.js (reachedTarget === false branch) + _qa/test_resize-image.mjs (an unreachable target must be reported as a failure)"
        },
        {
          "text": "Camera metadata is not carried over unless the user asks: the output is encoded fresh from the pixels, so EXIF (including GPS) is absent by default.",
          "source": "sites/tools/assets/tools/t/resize-image.js (keepMeta default off) + _qa/test_resize-image.mjs (default output must carry no EXIF APP1)"
        },
        {
          "text": "Format support follows the browser's own encoder; where a format cannot be encoded the tool reports it by name rather than producing a broken file.",
          "source": "sites/tools/assets/tools/t/resize-image.js encodeAt() (null-blob branch)"
        }
      ],
      "verificationChecks": [
        "_qa/test_resize-image.mjs (real browser, real fixtures; output dimensions and byte count read back out of the encoded file, EXIF-orientation fixture measured)",
        "_qa/pages.mjs",
        "_qa/test_claims.mjs",
        "_qa/test_modules.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "bates-numbering": {
      "tool": "bates-numbering",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "pdf-lib"
        ],
        "source": "sites/tools/assets/tools/t/bates-numbering.js (T.openPdfjs at intake for the page count; pdf-lib PDFDocument.load/save + stamp-engine.js drawBlock for the stamp)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN 6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- and this tool fetches a TIER-2 engine module on first use, which an offline first visit would not have. Architecture, not proof.",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation is probed offline by _qa/test_offline.mjs)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer in sites/tools/assets/tools/t/bates-numbering.js"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + the single urun() call site in sites/tools/assets/tools/t/bates-numbering.js"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not benchmarked; op class 'structural' has a measured band from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md 3 + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "A Bates label is drawn with a base-14 (WinAnsi) font. A character that font cannot carry is named and the run is refused, rather than being drawn as \"?\".",
          "source": "sites/tools/assets/stamp-engine.js winAnsiSafe() + _qa/test_stamp_engine.mjs section 5"
        },
        {
          "text": "The stamp is placed in the frame the reader sees, for page /Rotate values of 0, 90, 180 and 270 only. A page with any other /Rotate is normalised to the nearest quarter turn.",
          "source": "sites/tools/assets/stamp-engine.js normAngle()/visibleFrame() + _qa/test_stamp_engine.mjs section 6 (144 rotate x angle x position combinations measured with poppler)"
        },
        {
          "text": "A number wider than the chosen digit width is printed in full rather than shortened, so the run stays correct while the column width varies.",
          "source": "sites/tools/assets/stamp-engine.js batesLabel()/batesOverflows() + _qa/test_stamp_engine.mjs section 1"
        }
      ],
      "verificationChecks": [
        "_qa/test_stamp_engine.mjs",
        "_qa/test_bates_numbering.mjs",
        "_qa/audit.mjs (x3 engines)",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "exhibit-stamper": {
      "tool": "exhibit-stamper",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "pdf-lib"
        ],
        "source": "sites/tools/assets/tools/t/exhibit-stamper.js (T.openPdfjs at intake; pdf-lib PDFDocument.load/insertPage/save + stamp-engine.js drawBlock)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN 6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- and this tool fetches a TIER-2 engine module on first use, which an offline first visit would not have. Architecture, not proof.",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation is probed offline by _qa/test_offline.mjs)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer in sites/tools/assets/tools/t/exhibit-stamper.js"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + the single urun() call site in sites/tools/assets/tools/t/exhibit-stamper.js"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not benchmarked; op class 'structural' has a measured band from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md 3 + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "The label sequence past Z is the bijective base-26 one (Z, AA, AB), which is what an exhibit index uses. There is no option for A1/A2 style continuation.",
          "source": "sites/tools/assets/stamp-engine.js numberToLetters() + _qa/test_stamp_engine.mjs section 2"
        },
        {
          "text": "The stamp angle is one of four right angles. Arbitrary angles are not offered, because only the four are verified by rendering.",
          "source": "sites/tools/assets/stamp-engine.js normAngle() + _qa/test_stamp_engine.mjs section 6"
        },
        {
          "text": "A cover sheet copies page one's size. A file whose pages differ in size still ends up with one cover at the first page's size.",
          "source": "sites/tools/assets/tools/t/exhibit-stamper.js cover-sheet branch + _qa/test_exhibit_stamper.mjs"
        }
      ],
      "verificationChecks": [
        "_qa/test_stamp_engine.mjs",
        "_qa/test_exhibit_stamper.mjs",
        "_qa/audit.mjs (x3 engines)",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "redaction-log": {
      "tool": "redaction-log",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "pdf-lib"
        ],
        "source": "sites/tools/assets/tools/t/redaction-log.js (pdf-lib load/save; redaction-audit.js for the marks; redact-engine.js rawByteVerify for the verification; stamp-engine.js for SHA-256 and CSV)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN 6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- and this tool fetches a TIER-2 engine module on first use, which an offline first visit would not have. Architecture, not proof.",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation is probed offline by _qa/test_offline.mjs)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer in sites/tools/assets/tools/t/redaction-log.js"
      },
      "cancellationSupport": {
        "value": "after-current-page",
        "cancelId": "page",
        "source": "sites/tools/assets/runtime.js CANCEL + the single urun() call site in sites/tools/assets/tools/t/redaction-log.js"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not benchmarked; op class 'structural' has a measured band from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md 3 + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "Without the original document the log records each redaction mark and whether extractable text remains under it. It cannot say what was removed.",
          "source": "sites/tools/assets/tools/t/redaction-log.js verification-line branch + _qa/test_redaction_log.mjs"
        },
        {
          "text": "The verification against the original uses at most the first 400 differing text runs as needles; when there are more, the log says so and gives the full count.",
          "source": "sites/tools/assets/tools/t/redaction-log.js needle cap + _qa/test_redaction_log.mjs"
        },
        {
          "text": "A page drawn through a Form XObject cannot be read as text records, so it is reported as \"could not be fully checked\" rather than clear.",
          "source": "sites/tools/assets/redaction-audit.js LIMITATIONS + _qa/test_redaction_verifier.mjs"
        }
      ],
      "verificationChecks": [
        "_qa/test_redaction_log.mjs",
        "_qa/test_redact_engine.mjs",
        "_qa/audit.mjs (x3 engines)",
        "_qa/pages.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "redaction-verifier": {
      "tool": "redaction-verifier",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "pdf-lib"
        ],
        "source": "sites/tools/assets/tools/t/redaction-verifier.js (T.openPdfjs at intake; pdf-lib + pdf-textops.js via redaction-audit.js for the content-stream scan)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN 6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- and this tool fetches a TIER-2 engine module on first use, which an offline first visit would not have. Architecture, not proof.",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation is probed offline by _qa/test_offline.mjs)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer in sites/tools/assets/tools/t/redaction-verifier.js"
      },
      "cancellationSupport": {
        "value": "after-current-page",
        "cancelId": "page",
        "source": "sites/tools/assets/runtime.js CANCEL + the single urun() call site in sites/tools/assets/tools/t/redaction-verifier.js"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not benchmarked; op class 'structural' has a measured band from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md 3 + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "This detects text that is still present. It cannot see what was removed, and a result with no findings is not evidence that a redaction was performed.",
          "source": "sites/tools/assets/redaction-audit.js LIMITATIONS[0] + _qa/test_redaction_verifier.mjs controls"
        },
        {
          "text": "Text drawn inside a Form XObject, as vector outlines, or with a Type 3 font is not readable as text records; those pages are reported as \"could not check\", never as clear.",
          "source": "sites/tools/assets/redaction-audit.js LIMITATIONS[1] + sites/tools/assets/pdf-textops.js notes.formXObjects"
        },
        {
          "text": "A filled rectangle over text is reported whatever it was drawn for. A black table cell and a redaction box have the same geometry.",
          "source": "sites/tools/assets/redaction-audit.js LIMITATIONS[2] + the control fixtures in _qa/fixtures/redaction-audit/"
        },
        {
          "text": "Character-level naming of the covered text holds for upright text runs. For a rotated or skewed run the whole record is reported instead, and the finding carries precise:false.",
          "source": "sites/tools/assets/redaction-audit.js coveredText() + _qa/test_redaction_verifier.mjs"
        }
      ],
      "verificationChecks": [
        "_qa/test_redaction_verifier.mjs",
        "_qa/audit.mjs (x3 engines)",
        "_qa/pages.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "extract-text": {
      "tool": "extract-text",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js"
        ],
        "source": "sites/tools/assets/tools/t/extract-text.js (T.openPdfjs at intake; UBPdfTables.analyzePage per page; text-export.js renders the .txt/.md)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN 6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- and this tool fetches a TIER-2 engine module on first use, which an offline first visit would not have. Architecture, not proof.",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation is probed offline by _qa/test_offline.mjs)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer in sites/tools/assets/tools/t/extract-text.js"
      },
      "cancellationSupport": {
        "value": "after-current-page",
        "cancelId": "page",
        "source": "sites/tools/assets/runtime.js CANCEL + the single urun() call site in sites/tools/assets/tools/t/extract-text.js"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not benchmarked; op class 'structural' has a measured band from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md 3 + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "A page that is a photograph of text carries no text to extract. OCR PDF can add a text layer first; this tool does not run OCR itself.",
          "source": "sites/tools/assets/tools/t/extract-text.js empty-result branch + _qa/test_extract_text.mjs"
        },
        {
          "text": "Heading levels are ranked from the sizes pdf-tables.js reports, and the result states whether those came from document structure or from font sizes.",
          "source": "sites/tools/assets/text-export.js headingRanks()/summarize() + _qa/test_extract_text.mjs"
        },
        {
          "text": "A hyphen at a line break is left exactly as it is. Joining the two halves would guess at whether the word was hyphenated to begin with.",
          "source": "sites/tools/assets/text-export.js blockText() comment + _qa/test_extract_text.mjs"
        }
      ],
      "verificationChecks": [
        "_qa/test_extract_text.mjs",
        "_qa/test_pdf_tables.mjs",
        "_qa/audit.mjs (x3 engines)",
        "_qa/pages.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    },
    "headers-footers": {
      "tool": "headers-footers",
      "opClass": "structural",
      "processingEngine": {
        "value": [
          "pdf.js",
          "pdf-lib"
        ],
        "source": "sites/tools/assets/tools/t/headers-footers.js (T.openPdfjs at intake; pdf-lib PDFDocument.load/save + stamp-engine.js drawBlock per slot)"
      },
      "workerEnabled": {
        "value": false,
        "vendorWorkers": [
          "pdf.js"
        ],
        "note": "first-party worker: none. pdf.js's own parse worker is vendor code, recorded but never asserted as a first-party capability.",
        "source": "P1-DESIGN.md §7 seed note"
      },
      "wasm": {
        "value": false,
        "source": "grep 'WebAssembly' = 0 hits in pdf.min.js/pdf.worker.min.js/pdf-lib.min.js/jpeg-requant.js/all-tools.js"
      },
      "offlineSupport": {
        "value": "shell-cached-unverified",
        "note": "the app shell for this tool page is cached (service-worker tier per P1-DESIGN 6.1-6.4), but no automated probe has run THIS tool's own operation with the network killed -- and this tool fetches a TIER-2 engine module on first use, which an offline first visit would not have. Architecture, not proof.",
        "source": "research/unboundpdf/large-doc-runtime/check-step10.md (only merge-pdf's own operation is probed offline by _qa/test_offline.mjs)"
      },
      "lowMemoryMode": {
        "value": false,
        "source": "no ctx.plan/pagePlan() consumer in sites/tools/assets/tools/t/headers-footers.js"
      },
      "cancellationSupport": {
        "value": "supported",
        "cancelId": "item",
        "source": "sites/tools/assets/runtime.js CANCEL + the single urun() call site in sites/tools/assets/tools/t/headers-footers.js"
      },
      "resumeSupport": {
        "value": "restart-required",
        "source": "sites/tools/assets/runtime.js CANCEL table comment (RESUMABLE.refuse=true -- pdf-lib/pdf.js require a full restart, never claimed otherwise, directive §7)"
      },
      "largeDocumentBenchmark": {
        "status": "unknown",
        "value": null,
        "note": "not benchmarked; op class 'structural' has a measured band from representative tool 'organize-pdf', not from this tool's own fixture run",
        "source": "research/unboundpdf/large-doc-runtime/oom-matrix-results.md 3 + check-step10.md"
      },
      "observedCompletions": {
        "desktop": {
          "runs": [
            {
              "pages": 3000,
              "mb": null,
              "sizeDriven": false,
              "fixture": "text-3000p"
            }
          ],
          "source": "runtime.js PROVEN.desktop + oom-matrix-results.md §3"
        },
        "mobile": {
          "runs": null,
          "source": "no mobile run exists for this op class -- absent on purpose (runtime.js PROVEN comment)"
        },
        "deviceEvidence": null
      },
      "knownLimitations": [
        {
          "text": "Slot text is drawn with a base-14 (WinAnsi) font. A character that font cannot carry is named and the run is refused rather than drawn as \"?\".",
          "source": "sites/tools/assets/stamp-engine.js winAnsiSafe() + _qa/test_stamp_engine.mjs section 5"
        },
        {
          "text": "An unknown {token} is printed exactly as typed rather than blanked, so a mistyped token is visible instead of silently eating the text.",
          "source": "sites/tools/assets/stamp-engine.js expand() + _qa/test_stamp_engine.mjs section 3"
        },
        {
          "text": "Slot text is drawn on one line. Text longer than the page width is not wrapped or shrunk to fit.",
          "source": "sites/tools/assets/tools/t/headers-footers.js drawBlock call + _qa/test_headers_footers.mjs"
        }
      ],
      "verificationChecks": [
        "_qa/test_stamp_engine.mjs",
        "_qa/test_headers_footers.mjs",
        "_qa/audit.mjs (x3 engines)",
        "_qa/pages.mjs",
        "_qa/quality-all.mjs"
      ],
      "lastBenchmarked": "unknown",
      "version": {
        "assetVersion": 187
      }
    }
  },
  "publishedAt": "2026-08-22"
}
