KitForma file checks lab — measured 8 October 2026

Original measurements: results.json and results.csv.
CSV inputs/outputs and exact cell arrays are included.
Images: geometry-source.png (2400x1600), geometry-{fit,crop,stretch}.png,
flat-source.png and texture-source.png (both 1200x800), plus four JPEG qualities each.

REPRODUCE
1. Extract this archive into an empty directory. Install Node.js 24 or newer.
2. Run: npm install
3. Run: node run-lab.mjs
4. Inspect rerun/results.json and rerun/results.csv.
The rerun writes only to rerun/ and preserves the published results.
The one declared dependency is @napi-rs/canvas 1.0.9. npm install uses the network.
The experiment itself does not upload data or call a service.
Original runtime: {"node":"v24.19.0","platform":"win32","arch":"x64","canvas":"1.0.9"}.

engine.mjs is an esbuild snapshot of the actual KitForma engines.
engine-sources.json contains source and bundle SHA-256 hashes; source/ contains
the input TypeScript files. HEIC code is not exercised and no HEIC dependency is installed.
KitForma code is MIT licensed; the bundled font license is LICENSE_LIBERATION.

METHOD
Four valid tiny CSV cases each have two data records, three columns and a header.
Hand-written expected outputs AND hand-written semantic matrices are asserted.
One unclosed quote is expected to be rejected. Literal replacement is a negative
comparison on the same samples; it is not a competing product.
CSV output uses CRLF between records, strips an initial BOM and omits the final
record terminator; embedded line endings stay part of cells.
The geometric input is newly generated for this run. Fit and stretch call
processImage directly. Crop first uses drawImage with x=400,y=0,w=1600,h=1600,
then processImage. Resize alone does not crop.
JPEG quality values are 40,60,80,95. No targetKB is used, so dimensions stay fixed.
Bytes come from saved buffers; dimensions come from decoding output files.
The 100000-byte comparison is an illustrative strict limit, not a website policy.

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.

Official references, reviewed 8 October 2026:
https://www.rfc-editor.org/rfc/rfc4180
https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob
https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage
