{
  "id": "workflow-lab-20261008",
  "measuredAt": "2026-10-08T13:00:02.253Z",
  "runtime": {
    "node": "v24.19.0",
    "platform": "win32",
    "arch": "x64",
    "canvas": "1.0.9"
  },
  "method": "Actual KitForma runExpandedTool and processImage engines. Native @napi-rs/canvas adapter; not a browser UI or browser codec run.",
  "csv": {
    "validCases": [
      {
        "id": "quoted-separators",
        "inputFile": "quoted-separators.input.csv",
        "outputFile": "quoted-separators.output.csv",
        "inputDelimiter": "semicolon",
        "outputDelimiter": "comma",
        "dataRecords": 2,
        "columns": 3,
        "cellsIncludingHeader": 9,
        "exactExpectedOutput": true,
        "semanticCellsPreserved": true,
        "literalReplacementPreservesCells": false
      },
      {
        "id": "comma-to-tab",
        "inputFile": "comma-to-tab.input.csv",
        "outputFile": "comma-to-tab.output.tsv",
        "inputDelimiter": "comma",
        "outputDelimiter": "tab",
        "dataRecords": 2,
        "columns": 3,
        "cellsIncludingHeader": 9,
        "exactExpectedOutput": true,
        "semanticCellsPreserved": true,
        "literalReplacementPreservesCells": false
      },
      {
        "id": "empty-and-space",
        "inputFile": "empty-and-space.input.tsv",
        "outputFile": "empty-and-space.output.csv",
        "inputDelimiter": "tab",
        "outputDelimiter": "semicolon",
        "dataRecords": 2,
        "columns": 3,
        "cellsIncludingHeader": 9,
        "exactExpectedOutput": true,
        "semanticCellsPreserved": true,
        "literalReplacementPreservesCells": true
      },
      {
        "id": "utf8-and-bom",
        "inputFile": "utf8-and-bom.input.csv",
        "outputFile": "utf8-and-bom.output.csv",
        "inputDelimiter": "semicolon",
        "outputDelimiter": "comma",
        "dataRecords": 2,
        "columns": 3,
        "cellsIncludingHeader": 9,
        "exactExpectedOutput": true,
        "semanticCellsPreserved": true,
        "literalReplacementPreservesCells": false
      }
    ],
    "negativeControl": {
      "id": "unclosed-quote",
      "rejected": true,
      "code": "csv-quote",
      "message": "Invalid CSV quoting or row structure. Check the delimiter and closing quotes."
    },
    "totalDataRecords": 8,
    "totalCellsIncludingHeaders": 36
  },
  "resize": {
    "source": {
      "width": 2400,
      "height": 1600
    },
    "bounds": {
      "width": 900,
      "height": 900
    },
    "results": [
      {
        "name": "geometry-fit.png",
        "width": 900,
        "height": 600,
        "bytes": 10372,
        "targetMissed": false,
        "id": "fit",
        "circle": {
          "width": 298,
          "height": 298
        },
        "keepRatio": true,
        "crop": null
      },
      {
        "name": "geometry-crop.png",
        "width": 900,
        "height": 900,
        "bytes": 16612,
        "targetMissed": false,
        "id": "crop",
        "circle": {
          "width": 448,
          "height": 448
        },
        "keepRatio": true,
        "crop": {
          "left": 400,
          "top": 0,
          "width": 1600,
          "height": 1600
        }
      },
      {
        "name": "geometry-stretch.png",
        "width": 900,
        "height": 900,
        "bytes": 14297,
        "targetMissed": false,
        "id": "stretch",
        "circle": {
          "width": 300,
          "height": 448
        },
        "keepRatio": false,
        "crop": null
      }
    ]
  },
  "compression": {
    "qualityOnly": true,
    "targetKB": null,
    "dimensions": {
      "width": 1200,
      "height": 800
    },
    "profiles": 2,
    "results": [
      {
        "name": "flat-q40.jpg",
        "width": 1200,
        "height": 800,
        "bytes": 10185,
        "targetMissed": false,
        "profile": "flat",
        "quality": 40,
        "inputBytes": 15877,
        "changePercent": -35.85,
        "below100000Bytes": true
      },
      {
        "name": "flat-q60.jpg",
        "width": 1200,
        "height": 800,
        "bytes": 11158,
        "targetMissed": false,
        "profile": "flat",
        "quality": 60,
        "inputBytes": 15877,
        "changePercent": -29.72,
        "below100000Bytes": true
      },
      {
        "name": "flat-q80.jpg",
        "width": 1200,
        "height": 800,
        "bytes": 13209,
        "targetMissed": false,
        "profile": "flat",
        "quality": 80,
        "inputBytes": 15877,
        "changePercent": -16.8,
        "below100000Bytes": true
      },
      {
        "name": "flat-q95.jpg",
        "width": 1200,
        "height": 800,
        "bytes": 18334,
        "targetMissed": false,
        "profile": "flat",
        "quality": 95,
        "inputBytes": 15877,
        "changePercent": 15.48,
        "below100000Bytes": true
      },
      {
        "name": "texture-q40.jpg",
        "width": 1200,
        "height": 800,
        "bytes": 92894,
        "targetMissed": false,
        "profile": "texture",
        "quality": 40,
        "inputBytes": 1506669,
        "changePercent": -93.83,
        "below100000Bytes": true
      },
      {
        "name": "texture-q60.jpg",
        "width": 1200,
        "height": 800,
        "bytes": 148323,
        "targetMissed": false,
        "profile": "texture",
        "quality": 60,
        "inputBytes": 1506669,
        "changePercent": -90.16,
        "below100000Bytes": false
      },
      {
        "name": "texture-q80.jpg",
        "width": 1200,
        "height": 800,
        "bytes": 267600,
        "targetMissed": false,
        "profile": "texture",
        "quality": 80,
        "inputBytes": 1506669,
        "changePercent": -82.24,
        "below100000Bytes": false
      },
      {
        "name": "texture-q95.jpg",
        "width": 1200,
        "height": 800,
        "bytes": 515771,
        "targetMissed": false,
        "profile": "texture",
        "quality": 95,
        "inputBytes": 1506669,
        "changePercent": -65.77,
        "below100000Bytes": false
      }
    ]
  },
  "limitations": [
    "Four tiny valid CSV cases and one malformed input; not a conformance suite, spreadsheet import test, or throughput benchmark.",
    "Expected CSV output strings and semantic cells are hand-specified; the production parser also checks round trips. BOM and final record terminator are not retained by CSV serialization.",
    "Two artificial image profiles; no photographs, EXIF, transparency, animation, HEIC, or color-management test.",
    "Native Canvas encoders can differ from browsers and other versions. Byte counts and hashes describe these saved files only.",
    "Circle bounds count exact teal pixels and exclude antialiased edge pixels; comparison tolerance is two pixels.",
    "No OCR, paid services, upload-destination acceptance test, visual quality score, or competitor comparison."
  ],
  "files": {
    "quoted-separators.input.csv": {
      "bytes": 86,
      "sha256": "babd5f464c75f6847ac9549980e2aa6dd98d46e464cae63f754154b08fe425c2"
    },
    "quoted-separators.output.csv": {
      "bytes": 84,
      "sha256": "fc0f6362ec1d88fafc3102a23ab50a66b905e2f07a85ced48a44602b0298d9ab"
    },
    "quoted-separators.cells.json": {
      "bytes": 168,
      "sha256": "db4ad42bfc6c6eafa03cd91c5d80e94fb32e9a04341501b6f142cccb4ae7ed18"
    },
    "comma-to-tab.input.csv": {
      "bytes": 76,
      "sha256": "eddbead5e6321bf930a302ec123290e33becd598bdabf96ed0519c5602e6aef8"
    },
    "comma-to-tab.output.tsv": {
      "bytes": 74,
      "sha256": "1bae700e495de34144d1c652cc27ee6d02705bd94bc8450a9667c6e92ee3fa86"
    },
    "comma-to-tab.cells.json": {
      "bytes": 160,
      "sha256": "d9cf223a8ec352b5c50ab71781e6acb6fac35733c823d5cf2e8124103a033092"
    },
    "empty-and-space.input.tsv": {
      "bytes": 49,
      "sha256": "150246b774ee11d3a044193d32bac0c4f0ccce7932c8d1a76669698653bf0532"
    },
    "empty-and-space.output.csv": {
      "bytes": 49,
      "sha256": "abed88c54d5429a1f91835fe8ba25faea867e2cc0031747fd773db0789b4f9ec"
    },
    "empty-and-space.cells.json": {
      "bytes": 136,
      "sha256": "45835bbfefa2e9f6f8c19e24992d43d74ec3e0316c4226a8b476dbbe39be1c21"
    },
    "utf8-and-bom.input.csv": {
      "bytes": 68,
      "sha256": "d29d308b2f436991039e3b62c77cc54512ae241180d52b976b06750ab8b2dbf9"
    },
    "utf8-and-bom.output.csv": {
      "bytes": 61,
      "sha256": "43a1110d79ee227c7cc1fbf2ca237946c4435dd6b0c01b6ade033272f547e31f"
    },
    "utf8-and-bom.cells.json": {
      "bytes": 148,
      "sha256": "5a3f0aaa1351450dbf2009315e7b3c1637c8ef7f2ff68574c9046c92af5d7c7d"
    },
    "unclosed-quote.input.csv": {
      "bytes": 26,
      "sha256": "872482d11b0957ddab77556e615bdc80a3d696930de741e0525048d74228f652"
    },
    "unclosed-quote.result.json": {
      "bytes": 166,
      "sha256": "870e14a72da274f14105bf2ff578d5e456de81a726b5ca257944f186b7aed570"
    },
    "geometry-source.png": {
      "bytes": 37678,
      "sha256": "36ce144b13693ae7b1a561027ea88a4292ca26ff1fdfb0c31d6f4d05eabb38df",
      "width": 2400,
      "height": 1600
    },
    "geometry-crop-input.png": {
      "bytes": 31363,
      "sha256": "ffcf3f53ef1e3f2c36771fd905500d946b527dbeaf5a52c4bf743f0bd3fc3d37",
      "width": 1600,
      "height": 1600
    },
    "geometry-fit.png": {
      "bytes": 10372,
      "sha256": "26dba44be4573386dcc3d07aa01e7c53475e6b624dd82b3de3569075ecf2d39b",
      "width": 900,
      "height": 600
    },
    "geometry-crop.png": {
      "bytes": 16612,
      "sha256": "6faa838f911d40fbe1c47776b2893d8cf8c16eedd22cf6bcb6519a5e9eb1720c",
      "width": 900,
      "height": 900
    },
    "geometry-stretch.png": {
      "bytes": 14297,
      "sha256": "ff024d644fc3df7edb82ac5e45f97c84387e96b54589fcdf32f3185193719151",
      "width": 900,
      "height": 900
    },
    "flat-source.png": {
      "bytes": 15877,
      "sha256": "78eabd2f20aeabcfa036aba5da5b08999971a7580f888fb5760feb49b51acebc",
      "width": 1200,
      "height": 800
    },
    "flat-q40.jpg": {
      "bytes": 10185,
      "sha256": "85fb4a53bcd976ed48a79dfe93bd4f1c1751c868b0059d7d8020f35131692631",
      "width": 1200,
      "height": 800
    },
    "flat-q60.jpg": {
      "bytes": 11158,
      "sha256": "d214ceead00edce462ef59672586657bbab1e38cce5d9b95fcac063e9fbfebbf",
      "width": 1200,
      "height": 800
    },
    "flat-q80.jpg": {
      "bytes": 13209,
      "sha256": "df84f3ffcae267d421a99998c122251c933baefdc87f0bd7ef138ae4fd9695f1",
      "width": 1200,
      "height": 800
    },
    "flat-q95.jpg": {
      "bytes": 18334,
      "sha256": "1b89aa7b87de482f9b0c82ffa06844b316be3a2d40fe0ed8f7ec122fd6b1aff0",
      "width": 1200,
      "height": 800
    },
    "texture-source.png": {
      "bytes": 1506669,
      "sha256": "dff8d164aaa4ba16915f361266620f653d70212b414b2a2837740ed8ca43749d",
      "width": 1200,
      "height": 800
    },
    "texture-q40.jpg": {
      "bytes": 92894,
      "sha256": "c61372fc79f703ddf43322a9d101d1a6bbb1e73cdadb8f02247f2f51a6628052",
      "width": 1200,
      "height": 800
    },
    "texture-q60.jpg": {
      "bytes": 148323,
      "sha256": "8d4d11ddccf4a3d25e4b62816e0f80c6cb94fb2aab2481d10f07381d19ea1ca5",
      "width": 1200,
      "height": 800
    },
    "texture-q80.jpg": {
      "bytes": 267600,
      "sha256": "4df2c37864d3838abbc514a4cfefb8cd5bfb4e3ed080e507b069c215b3856e92",
      "width": 1200,
      "height": 800
    },
    "texture-q95.jpg": {
      "bytes": 515771,
      "sha256": "785889e937448e8e4ed3af65d3be7074c4f1cc2cc3ee3df056a836152fd78093",
      "width": 1200,
      "height": 800
    },
    "resize-comparison.png": {
      "bytes": 68198,
      "sha256": "dd9f53808ce93252c50c6eff686958fdbaceebb99d99c23ab313daaf430f6899"
    },
    "compression-comparison.png": {
      "bytes": 136428,
      "sha256": "c49ed6d528a5ce17e84b0828f7060c106f0cb3443b8300c5532266df4fb0dd7a"
    }
  }
}
