{
  "schemaVersion": 1,
  "recordType": "static-runtime-source-inspection",
  "reviewedDate": "2026-09-07",
  "recordedAt": "2026-09-07T05:23:20.915973+00:00",
  "artifactBasis": {
    "directory": "dist",
    "description": "Hashes identify generated local build files inspected at recordedAt, not unverified remote responses. Public paths can be used to compare a deployed build.",
    "sourceDirectory": "recovered-netlify-dist",
    "sourceDifferences": "Build rewrites the line-art remote model URL to /sketch-model.onnx and injects the object-removal sample workflow. recoveredSnapshot fingerprints preserve this distinction.",
    "buildScript": {
      "path": "/scripts/build.mjs",
      "role": "Localizes model URLs and injects the object-removal sample; this file is repository source, not necessarily a public asset.",
      "sha256": "2faf6408e18b71e46502d39ff629ac9769476ccedd1413fa42c707c5e4219b02"
    }
  },
  "evidenceBoundary": {
    "actualBrowserExperimentsRecordedHere": false,
    "networkCaptureRecordedHere": false,
    "inferenceTimingRecordedHere": false,
    "qualityOrAccuracyResultsRecordedHere": false,
    "instruction": "Store actual browser runs, chosen inputs, user-set parameters, screenshot/output files and network findings in separate run records. Never present dimensions derived from code as an observed export."
  },
  "sharedAssets": [
    {
      "path": "/ort.min.js",
      "bytes": 559484,
      "sha256": "bf72399ee0e749222bc7c0dd1cf3da41b66fc7ef89f437127944199d605ecffe"
    },
    {
      "path": "/ort-wasm-simd.wasm",
      "bytes": 10014674,
      "sha256": "9bd07bababc65f53d061f457233eeae501be7ceb8a2adb9eef52d87fe776d865"
    },
    {
      "path": "/assets/index-f6a6374c.js",
      "bytes": 690,
      "sha256": "88c5cd8e4e47f3cf134df7e28857ecdf8815febd90b886692a853036931a6f10"
    },
    {
      "path": "/assets/util-4d3641c7.js",
      "bytes": 31640,
      "sha256": "77b6c13925d5537a75bba45aadbbb74cb82554ba4df0041fb9d4f2b5e85ee3c1"
    }
  ],
  "workflows": [
    {
      "id": "photomodify",
      "route": "/photomodify/",
      "mainBundle": {
        "path": "/assets/index-3bac6127.js",
        "bytes": 11628,
        "sha256": "4841e28a3470aab58c2e491d77df224e16b5e8288a03521507887f324a7a7373",
        "recoveredSnapshot": {
          "path": "/assets/index-3bac6127.js",
          "bytes": 10891,
          "sha256": "fc189a47def83ef1dcc67be889b012947fefee46baa70140589d245277692171",
          "identicalToBuiltFile": false
        }
      },
      "worker": {
        "path": "/assets/photomodify.worker-adeb6e40.js",
        "bytes": 509,
        "sha256": "e74dfd6729ffb62bab3008be32f284e0868007b82f79090ae51568cf37cef880",
        "recoveredSnapshot": {
          "path": "/assets/photomodify.worker-adeb6e40.js",
          "bytes": 509,
          "sha256": "e74dfd6729ffb62bab3008be32f284e0868007b82f79090ae51568cf37cef880",
          "identicalToBuiltFile": true
        }
      },
      "model": {
        "path": "/migan_pipeline_v2.onnx",
        "bytes": 28079181,
        "sha256": "6f1f3530a1a2324b19752018ce756088b07973cda8d7d890034ace5c8a48c40b",
        "recoveredSnapshot": {
          "path": "/migan_pipeline_v2.onnx",
          "bytes": 28079181,
          "sha256": "6f1f3530a1a2324b19752018ce756088b07973cda8d7d890034ace5c8a48c40b",
          "identicalToBuiltFile": true
        }
      },
      "runtime": {
        "engine": "ONNX Runtime Web",
        "backend": "WASM",
        "wasmSimd": true,
        "wasmProxyRequested": true,
        "requestedWasmThreads": 2,
        "threadCountNote": "Requested in code; effective parallelism depends on browser capabilities and isolation.",
        "executionProviderDeclaration": "InferenceSession.create(buffer), with default provider; worker configures WASM proxy and threads."
      },
      "input": {
        "fileInputAccept": "image/*",
        "advertisedFormats": [
          "png",
          "jpg",
          "jpeg",
          "bmp"
        ],
        "advertisedMaximumBytesApprox": 5000000,
        "enforcedFiveMegabyteLimitFoundInReviewedToolModule": false,
        "uiSizeLimitNote": "The old upload copy says no more than 5 MB (object removal says preferably no more than 5 MB). This is copy, not an observed strict validator.",
        "completionSignal": "Worker action done followed by a visible rendered output; verify an actual PNG download separately.",
        "processingPercent": "The displayed inference percentage advances using Math.random and is not measured inference progress.",
        "mediaRequestBoundary": "Reviewed tool modules read user files into Blob/object URLs/canvas and send tensors to a Web Worker. No selected-media HTTP upload call was found in these four modules. This static inspection is not a browser-network capture or a guarantee about the whole page.",
        "outputMimeType": "image/png"
      },
      "label": "Object removal / MI-GAN",
      "trigger": "Wait for model initialization, select a file, paint a red mask on the left image, press Play.",
      "parameters": {
        "brushRadiusDefault": 30,
        "brushRadiusControl": "Ant Design Slider; this bundle supplies defaultValue 30 and no explicit min/max/step. Do not infer actual UI range without inspecting the component/browser.",
        "mask": "Canvas red strokes are converted to an unsigned-byte mask and resized to source width/height. Masked pixels have value 0; retained pixels 255.",
        "inputTensor": {
          "name": "image",
          "type": "uint8",
          "shape": [
            "1",
            "3",
            "sourceHeight",
            "sourceWidth"
          ]
        },
        "maskTensor": {
          "name": "mask",
          "type": "uint8",
          "shape": [
            "1",
            "1",
            "sourceHeight",
            "sourceWidth"
          ]
        }
      },
      "dimensions": {
        "rule": "Source image width and height are preserved in the input tensors and output canvas. The displayed painting surface scales to the viewport; the mask is resampled to source dimensions.",
        "modelInternalResize": "Not inferred by this review; migan_pipeline_v2.onnx may contain its own internal transforms."
      },
      "download": {
        "namePattern": "智能笔刷_<Unix milliseconds>.png",
        "source": "#resultImg src, populated by worker result converted through canvas.toDataURL()"
      },
      "defaultSample": {
        "path": "/home/brush-before.jpg",
        "sourceLicenseVerifiedInThisReview": false,
        "injectedAtBuild": true,
        "maskPathNormalized": [
          [
            0.77,
            0.35
          ],
          [
            0.8,
            0.52
          ]
        ],
        "maskStrokeWidth": "max(18, maskCanvasWidth * 0.035)",
        "autoRunDelayMilliseconds": 700
      }
    },
    {
      "id": "linechange",
      "route": "/linechange/",
      "mainBundle": {
        "path": "/assets/index-7bb7710a.js",
        "bytes": 5558,
        "sha256": "130c36bab8da917486aee403f6ae79eb02e91c25325cdbfce32c785f5d1ebebe",
        "recoveredSnapshot": {
          "path": "/assets/index-7bb7710a.js",
          "bytes": 5558,
          "sha256": "130c36bab8da917486aee403f6ae79eb02e91c25325cdbfce32c785f5d1ebebe",
          "identicalToBuiltFile": true
        }
      },
      "worker": {
        "path": "/assets/linechange.worker-0b3909b2.js",
        "bytes": 560,
        "sha256": "634f7de69eb9de45c7f3abeea976f80bf0abe4ddf4c22f3319150d03171ab56e",
        "recoveredSnapshot": {
          "path": "/assets/linechange.worker-0b3909b2.js",
          "bytes": 593,
          "sha256": "85993e0129cddfc1039d953beaf2823a66fff7af04b7761f6d4221cac97d945a",
          "identicalToBuiltFile": false
        }
      },
      "model": {
        "path": "/sketch-model.onnx",
        "bytes": 17193338,
        "sha256": "1fef40b8f7126d827e30fbebccf95ae9b0b391795df926bf9366a821bad4f498",
        "recoveredSnapshot": {
          "path": "/sketch-model.onnx",
          "bytes": 17193338,
          "sha256": "1fef40b8f7126d827e30fbebccf95ae9b0b391795df926bf9366a821bad4f498",
          "identicalToBuiltFile": true
        }
      },
      "runtime": {
        "engine": "ONNX Runtime Web",
        "backend": "WASM",
        "wasmSimd": true,
        "wasmProxyRequested": true,
        "requestedWasmThreads": 2,
        "threadCountNote": "Requested in code; effective parallelism depends on browser capabilities and isolation.",
        "executionProviderDeclaration": "Explicit wasm"
      },
      "input": {
        "fileInputAccept": "image/*",
        "advertisedFormats": [
          "png",
          "jpg",
          "jpeg",
          "bmp"
        ],
        "advertisedMaximumBytesApprox": 5000000,
        "enforcedFiveMegabyteLimitFoundInReviewedToolModule": false,
        "uiSizeLimitNote": "The old upload copy says no more than 5 MB (object removal says preferably no more than 5 MB). This is copy, not an observed strict validator.",
        "completionSignal": "Worker action done followed by a visible rendered output; verify an actual PNG download separately.",
        "processingPercent": "The displayed inference percentage advances using Math.random and is not measured inference progress.",
        "mediaRequestBoundary": "Reviewed tool modules read user files into Blob/object URLs/canvas and send tensors to a Web Worker. No selected-media HTTP upload call was found in these four modules. This static inspection is not a browser-network capture or a guarantee about the whole page.",
        "outputMimeType": "image/png"
      },
      "label": "Photo to line art",
      "trigger": "After model initialization, selecting an image starts inference automatically.",
      "parameters": {
        "userAdjustableModelParameters": [],
        "normalization": "RGB channels divided by 255, laid out NCHW.",
        "inputTensor": {
          "name": "input",
          "type": "float32",
          "shape": [
            "1",
            "3",
            "processedHeight",
            "processedWidth"
          ]
        },
        "output": "result.output tensor; values converted to raster and channels adjusted when the red component exceeds 150."
      },
      "dimensions": {
        "shortEdge": 768,
        "alignment": 8,
        "widthLessThanHeight": {
          "width": "768",
          "height": "floor((768 / sourceWidth * sourceHeight) / 8) * 8"
        },
        "widthGreaterOrEqualHeight": {
          "width": "floor((768 / sourceHeight * sourceWidth) / 8) * 8",
          "height": "768"
        },
        "note": "Upsamples small images too. There is no maximum-long-edge clamp in the reviewed preprocessing function."
      },
      "download": {
        "namePattern": "放大_<Unix milliseconds>.png",
        "source": "Rendered result data URL; legacy filename says enlargement although this is the line-art tool."
      },
      "defaultSample": {
        "path": "/assets/tool-sample.png",
        "sourceLicenseVerifiedInThisReview": false
      }
    },
    {
      "id": "relight",
      "route": "/relight/",
      "mainBundle": {
        "path": "/assets/index-302b0309.js",
        "bytes": 16941,
        "sha256": "849203f20f7946a4d60b9818de47fb2d59860a5f871f12d04b5e871a43b0ccfc",
        "recoveredSnapshot": {
          "path": "/assets/index-302b0309.js",
          "bytes": 16941,
          "sha256": "849203f20f7946a4d60b9818de47fb2d59860a5f871f12d04b5e871a43b0ccfc",
          "identicalToBuiltFile": true
        }
      },
      "worker": {
        "path": "/assets/relight.worker-329838b4.js",
        "bytes": 584,
        "sha256": "d72e955746d2de9c76898e0d51bb98b07fd4f9c4bbc2d1a5d0a6c8581c2dc60d",
        "recoveredSnapshot": {
          "path": "/assets/relight.worker-329838b4.js",
          "bytes": 584,
          "sha256": "d72e955746d2de9c76898e0d51bb98b07fd4f9c4bbc2d1a5d0a6c8581c2dc60d",
          "identicalToBuiltFile": true
        }
      },
      "model": {
        "path": "/monodepth_fcn_mobilenet.onnx",
        "bytes": 5541400,
        "sha256": "edb6c39bc50982d6c68dc104753cc58685b43a1f5340054dd65c8fc86b0a3ac4",
        "recoveredSnapshot": {
          "path": "/monodepth_fcn_mobilenet.onnx",
          "bytes": 5541400,
          "sha256": "edb6c39bc50982d6c68dc104753cc58685b43a1f5340054dd65c8fc86b0a3ac4",
          "identicalToBuiltFile": true
        }
      },
      "runtime": {
        "engine": "ONNX Runtime Web",
        "backend": "WASM",
        "wasmSimd": true,
        "wasmProxyRequested": true,
        "requestedWasmThreads": 2,
        "threadCountNote": "Requested in code; effective parallelism depends on browser capabilities and isolation.",
        "executionProviderDeclaration": "Explicit wasm"
      },
      "input": {
        "fileInputAccept": "image/*",
        "advertisedFormats": [
          "png",
          "jpg",
          "jpeg",
          "bmp"
        ],
        "advertisedMaximumBytesApprox": 5000000,
        "enforcedFiveMegabyteLimitFoundInReviewedToolModule": false,
        "uiSizeLimitNote": "The old upload copy says no more than 5 MB (object removal says preferably no more than 5 MB). This is copy, not an observed strict validator.",
        "completionSignal": "Worker action done followed by a visible rendered output; verify an actual PNG download separately.",
        "processingPercent": "The displayed inference percentage advances using Math.random and is not measured inference progress.",
        "mediaRequestBoundary": "Reviewed tool modules read user files into Blob/object URLs/canvas and send tensors to a Web Worker. No selected-media HTTP upload call was found in these four modules. This static inspection is not a browser-network capture or a guarantee about the whole page.",
        "outputMimeType": "image/png"
      },
      "label": "Photo relighting",
      "trigger": "After model initialization, selecting an image starts depth inference, then a WebGL scene is rendered; click or drag the image to move the light.",
      "parameters": {
        "depthTensor": {
          "name": "input_0",
          "type": "float32",
          "shape": [
            1,
            3,
            224,
            224
          ],
          "normalization": "RGB / 255"
        },
        "depthOutput": "output_0; depth data divided by 10 and rasterized before mesh construction.",
        "defaultColor": "#ffffffff",
        "defaultStrength": 0.3,
        "strength": {
          "minimum": 0,
          "maximum": 1,
          "step": 0.01
        },
        "lightPositionInput": "click or held mouse drag on the canvas wrapper",
        "lightPositionMapping": {
          "x": "round((2 * offsetX / canvasWidth - 1) * 100) / 100",
          "y": "round((-(2 * offsetY / canvasHeight - 1)) * 100) / 100",
          "z": -1
        },
        "rendering": "WebGL using a depth-derived mesh and diffuse-light shader; original texture plus a scaled lighting contribution."
      },
      "dimensions": {
        "depthInput": [
          224,
          224
        ],
        "depthInputAspectRatio": "Source image is stretched to square for depth inference.",
        "output": "Original source width and height; depth map is resized back to source dimensions."
      },
      "download": {
        "namePattern": "打光_<Unix milliseconds>.png",
        "source": "WebGL canvas.toDataURL(), preserveDrawingBuffer requested."
      },
      "defaultSample": {
        "path": "/assets/tool-sample.png",
        "sourceLicenseVerifiedInThisReview": false
      }
    },
    {
      "id": "animatechange",
      "route": "/animatechange/",
      "mainBundle": {
        "path": "/assets/index-8fb6f7e2.js",
        "bytes": 6402,
        "sha256": "f0e3f5310aeaf1d0ccae6ec92a2ffcd607fbfadf03514ccde9bf1b72fdd318bd",
        "recoveredSnapshot": {
          "path": "/assets/index-8fb6f7e2.js",
          "bytes": 6402,
          "sha256": "f0e3f5310aeaf1d0ccae6ec92a2ffcd607fbfadf03514ccde9bf1b72fdd318bd",
          "identicalToBuiltFile": true
        }
      },
      "worker": {
        "path": "/assets/animatechange.worker-5faeab41.js",
        "bytes": 618,
        "sha256": "77a3c78c7fae4d9f6adda92c2928d78da0396efe221442c239eba06564adef54",
        "recoveredSnapshot": {
          "path": "/assets/animatechange.worker-5faeab41.js",
          "bytes": 618,
          "sha256": "39ffe8fc3879caa95dd68a0f1953936d61dc3d8b4599a4fbc15906f8f0408e0c",
          "identicalToBuiltFile": false
        }
      },
      "model": {
        "path": "/animeganv3_hayao_36.onnx",
        "bytes": 4232723,
        "sha256": "95ba7b219073fd5b12f569bc38056ffd3019cf4caf15b1feb9f73d1286c9f69d",
        "recoveredSnapshot": {
          "path": "/animeganv3_hayao_36.onnx",
          "bytes": 4232723,
          "sha256": "95ba7b219073fd5b12f569bc38056ffd3019cf4caf15b1feb9f73d1286c9f69d",
          "identicalToBuiltFile": true
        }
      },
      "runtime": {
        "engine": "ONNX Runtime Web",
        "backend": "WASM",
        "wasmSimd": true,
        "wasmProxyRequested": true,
        "requestedWasmThreads": 4,
        "threadCountNote": "Requested in code; effective parallelism depends on browser capabilities and isolation.",
        "executionProviderDeclaration": "Explicit wasm"
      },
      "input": {
        "fileInputAccept": "image/*",
        "advertisedFormats": [
          "png",
          "jpg",
          "jpeg",
          "bmp"
        ],
        "advertisedMaximumBytesApprox": 5000000,
        "enforcedFiveMegabyteLimitFoundInReviewedToolModule": false,
        "uiSizeLimitNote": "The old upload copy says no more than 5 MB (object removal says preferably no more than 5 MB). This is copy, not an observed strict validator.",
        "completionSignal": "Worker action done followed by a visible rendered output; verify an actual PNG download separately.",
        "processingPercent": "The displayed inference percentage advances using Math.random and is not measured inference progress.",
        "mediaRequestBoundary": "Reviewed tool modules read user files into Blob/object URLs/canvas and send tensors to a Web Worker. No selected-media HTTP upload call was found in these four modules. This static inspection is not a browser-network capture or a guarantee about the whole page.",
        "outputMimeType": "image/png"
      },
      "label": "Photo to anime / AnimeGANv3 Hayao",
      "trigger": "After model initialization, selecting an image starts the default run; HD button reruns the same original source with multiplier 5.",
      "parameters": {
        "defaultMultiplier": 3,
        "hdMultiplier": 5,
        "baseLongEdge": 512,
        "inputTensor": {
          "name": "AnimeGANv3_input:0",
          "declaredShape": [
            "1",
            "processedHeight",
            "processedWidth",
            "3"
          ],
          "type": "float32",
          "normalization": "Pixel values / 127.5 - 1. The implementation separately rearranges channel data; this record does not assert tensor-layout correctness."
        },
        "outputTensor": "generator_1/main/out_layer:0",
        "userPromptOrStyleSelectorPresent": false
      },
      "dimensions": {
        "defaultLongEdge": 1536,
        "hdLongEdge": 2560,
        "alignment": 8,
        "widthGreaterThanHeight": {
          "width": "floor((512 * multiplier) / 8) * 8",
          "height": "floor((floor(sourceHeight * 512 / sourceWidth) * multiplier) / 8) * 8"
        },
        "widthLessOrEqualHeight": {
          "width": "floor((floor(sourceWidth * 512 / sourceHeight) * multiplier) / 8) * 8",
          "height": "floor((512 * multiplier) / 8) * 8"
        },
        "note": "The short dimension is floored before multiplication and then floored to an 8-pixel multiple. Do not replace this with one final aspect-ratio rounding. Upsamples small inputs too."
      },
      "download": {
        "namePattern": "动漫_<Unix milliseconds>.png",
        "source": "Worker result converted to ImageData, then canvas.toDataURL()."
      },
      "defaultSample": {
        "path": "/assets/tool-sample.png",
        "sourceLicenseVerifiedInThisReview": false
      }
    }
  ],
  "derivedDimensionExamples": [
    {
      "input": "coffee",
      "sourceDimensions": [
        600,
        400
      ],
      "derivedFromCodeNotObservedOutput": true,
      "objectRemovalExpectedCanvas": [
        600,
        400
      ],
      "lineArtExpectedPreprocess": [
        1152,
        768
      ],
      "relightDepthInput": [
        224,
        224
      ],
      "relightExpectedCanvas": [
        600,
        400
      ],
      "animeDefaultExpectedPreprocess": [
        1536,
        1016
      ],
      "animeHdExpectedPreprocess": [
        2560,
        1704
      ]
    },
    {
      "input": "chelsea",
      "sourceDimensions": [
        451,
        300
      ],
      "derivedFromCodeNotObservedOutput": true,
      "objectRemovalExpectedCanvas": [
        451,
        300
      ],
      "lineArtExpectedPreprocess": [
        1152,
        768
      ],
      "relightDepthInput": [
        224,
        224
      ],
      "relightExpectedCanvas": [
        451,
        300
      ],
      "animeDefaultExpectedPreprocess": [
        1536,
        1016
      ],
      "animeHdExpectedPreprocess": [
        2560,
        1696
      ]
    },
    {
      "input": "rocket",
      "sourceDimensions": [
        640,
        427
      ],
      "derivedFromCodeNotObservedOutput": true,
      "objectRemovalExpectedCanvas": [
        640,
        427
      ],
      "lineArtExpectedPreprocess": [
        1144,
        768
      ],
      "relightDepthInput": [
        224,
        224
      ],
      "relightExpectedCanvas": [
        640,
        427
      ],
      "animeDefaultExpectedPreprocess": [
        1536,
        1016
      ],
      "animeHdExpectedPreprocess": [
        2560,
        1704
      ]
    }
  ],
  "legacyOneKCopy": {
    "location": "Recovered minified UI bundles, not article content or tool-quality-content.mjs.",
    "lineArt": {
      "snapshotPath": "recovered-netlify-dist/assets/index-7bb7710a.js",
      "substring": "注意：图像默认以1k大小处理，生成速度取决于电脑性能",
      "actualRule": "Short edge 768, long edge rounded down to an 8-pixel multiple."
    },
    "anime": {
      "snapshotPath": "recovered-netlify-dist/assets/index-8fb6f7e2.js",
      "substring": "注意：图像默认以1k大小处理，生成速度取决于电脑性能。",
      "actualRule": "Default long edge 1536; HD long edge 2560, both with short-edge rounding described above."
    },
    "buildMaintenance": "scripts/build.mjs copies recovered-netlify-dist into dist, then localizeRecoveredModelUrls applies targeted bundle patches. No 1k-copy replacement was present at review time. Do not hand-edit only dist because the next build overwrites it."
  }
}
