{
  "schemaVersion": 1,
  "publishedDate": "2026-10-07",
  "media": {
    "videoCount": 13,
    "decodedVideoOutputs": 40,
    "totalAssetBytes": 251503678,
    "faststartVerified": true,
    "comparisonTimingPreserved": true,
    "sourceFilesModified": false,
    "visualReview": "passed",
    "visualReviewRecord": "visual-review.json",
    "reviewedHeroIds": [
      "harrisburg-1946",
      "hoboken-1966",
      "detroit-1950"
    ]
  },
  "tutorial": {
    "kit_version": "1.0.0",
    "test_date": "2026-10-07",
    "status": "passed",
    "environment": {
      "python": "3.11.14 (main, Dec  9 2025, 19:02:23) [Clang 21.1.4 ]",
      "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.43",
      "packages": {
        "torch": "2.1.2+cpu",
        "torchvision": "0.16.2+cpu",
        "numpy": "1.26.4",
        "gfpgan": "1.3.8",
        "basicsr": "1.4.2",
        "facexlib": "0.3.0",
        "opencv-python": "4.8.1.78",
        "scipy": "1.11.4",
        "Pillow": "10.2.0"
      },
      "ffmpeg": [
        "ffmpeg version 8.0.1-3ubuntu2+esm4 Copyright (c) 2000-2025 the FFmpeg developers",
        "built with gcc 15 (Ubuntu 15.2.0-16ubuntu1)",
        "configuration: --prefix=/usr --extra-version=3ubuntu2+esm4 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-pocketsphinx --disable-libcaca --disable-libmfx --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libdvdnav --enable-libdvdread --enable-libjack --enable-libjxl --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-librsvg --enable-shared"
      ],
      "ffprobe": "ffprobe version 8.0.1-3ubuntu2+esm4 Copyright (c) 2007-2025 the FFmpeg developers"
    },
    "cpu": {
      "model": "Intel Core i7-6950X @ 3.00 GHz",
      "inference_threads": 4,
      "precision": "float32",
      "gpu_used": false
    },
    "source": {
      "project": "GFPGAN",
      "repository": "https://github.com/TencentARC/GFPGAN",
      "software_tag": "v1.3.8",
      "commit": "2eac2033893ca7f427f4035d80fe95b92649ac56",
      "filename": "gfpgan-source.tar.gz",
      "url": "https://github.com/TencentARC/GFPGAN/archive/2eac2033893ca7f427f4035d80fe95b92649ac56.tar.gz",
      "sha256": "88ac7def64de24528f60f90f1ad167e2a0be44169502c4d609661425f89be2f8",
      "license": "https://github.com/TencentARC/GFPGAN/blob/2eac2033893ca7f427f4035d80fe95b92649ac56/LICENSE"
    },
    "model_assets": [
      {
        "role": "face_restoration",
        "model": "GFPGAN v1.4",
        "filename": "GFPGANv1.4.pth",
        "url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth",
        "sha256": "e2cd4703ab14f4d01fd1383a8a8b266f9a5833dacee8e6a79d3bf21a1b6be5ad",
        "notices": "https://github.com/TencentARC/GFPGAN/blob/2eac2033893ca7f427f4035d80fe95b92649ac56/LICENSE"
      },
      {
        "role": "face_detection",
        "model": "RetinaFace ResNet50",
        "filename": "detection_Resnet50_Final.pth",
        "url": "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth",
        "sha256": "6d1de9c2944f2ccddca5f5e010ea5ae64a39845a86311af6fdf30841b0a5a16d",
        "notices": "https://github.com/xinntao/facexlib/blob/v0.3.0/LICENSE"
      },
      {
        "role": "face_parsing_mask",
        "model": "ParseNet",
        "filename": "parsing_parsenet.pth",
        "url": "https://github.com/xinntao/facexlib/releases/download/v0.2.2/parsing_parsenet.pth",
        "sha256": "3d558d8d0e42c20224f13cf5a29c79eba2d59913419f945545d8cf7b72920de2",
        "notices": "https://github.com/xinntao/facexlib/blob/v0.3.0/LICENSE"
      }
    ],
    "settings": {
      "model": "GFPGANv1.4",
      "architecture": "clean",
      "upscale": 1,
      "background_model": "off",
      "device": "cpu",
      "precision": "float32",
      "threads": 4,
      "seed": 0,
      "whole_image": true,
      "all_detected_faces": true,
      "blend": "upstream face parsing mask; no additional intensity blend",
      "temporal_model": false
    },
    "installation": {
      "fresh_virtual_environments": 2,
      "user_installer_verified": true,
      "independent_installer": "Root coordinator ran setup.sh cpu in a new kit .venv/.runtime; exit 0, source and all model hashes verified, core imports passed.",
      "measured_environment_runtime_size": "About 2.1 GiB; allow at least 3 GB plus package-manager cache."
    },
    "tests": [
      {
        "name": "fresh_environment_cpu_image",
        "status": "passed",
        "width": 640,
        "height": 360,
        "faces_detected": 1,
        "elapsed_seconds": 10.184,
        "process_peak_rss_mib": 1645.6,
        "output_sha256": "3a59a1a4534e397d6a6167049257a84067527e6a18445c4f038cbbe880511851",
        "source_unchanged": true,
        "same_output_hash_in_two_fresh_environments": true
      },
      {
        "name": "cpu_face_video_model_stage",
        "status": "passed",
        "width": 640,
        "height": 360,
        "frame_count": 60,
        "frame_rate": "30000/1001",
        "duration_seconds": 2.002,
        "faces_per_frame": 1,
        "elapsed_seconds": 317.724,
        "process_peak_rss_mib": 1775.4,
        "source_unchanged": true,
        "staged_png_bytes": 23941160,
        "scope": "All 60 frames processed by real GFPGAN v1.4; delivery reassembled separately after a color-tag fix."
      },
      {
        "name": "final_face_video_delivery",
        "status": "passed",
        "frame_count": 60,
        "frame_rate": "30000/1001",
        "duration_seconds": 2.002,
        "silent": true,
        "bt709_tags_verified": true,
        "delivery_reassembly_seconds": 0.371,
        "output_sha256": "e76d10df77eb2a973ffbb49b6b808e29327f54d00b3d7e3cc4cd373f244d9ea9"
      },
      {
        "name": "final_wrapper_cpu_audio_noface_video",
        "status": "passed",
        "frame_count": 8,
        "frame_rate": "24000/1001",
        "duration_seconds": 0.33366666666666667,
        "audio_codec": "aac",
        "no_face_staged_pixels_unchanged": true,
        "bt709_tags_verified": true,
        "elapsed_seconds": 6.879,
        "process_peak_rss_mib": 1174.8
      },
      {
        "name": "format_timing_hash_protection_tests",
        "status": "passed",
        "test_count": 10,
        "checks": [
          "rational CFR",
          "decoded VFR rejection",
          "HDR rejection",
          "10-bit rejection",
          "interlaced rejection",
          "rotation/non-square-pixel rejection",
          "offset/mismatched audio rejection",
          "real FFmpeg AAC fixture",
          "existing output preservation",
          "changed model hash rejection"
        ]
      },
      {
        "name": "notebook_structure",
        "status": "passed",
        "nbformat": 4,
        "every_code_cell_compiles": true,
        "saved_outputs": false,
        "colab_runtime_executed": false
      },
      {
        "name": "visual_inspection",
        "status": "passed",
        "scope": "Source/restored image and paused restored video frame inspected. Clearer generated face; coat/house remain soft. Full-speed human temporal review is not claimed."
      },
      {
        "name": "independent_reader_installed_kit_image",
        "status": "passed",
        "width": 640,
        "height": 360,
        "faces_detected": 1,
        "elapsed_seconds": 9.961,
        "process_peak_rss_mib": 1693.7,
        "source_unchanged": true,
        "output_sha256": "3a59a1a4534e397d6a6167049257a84067527e6a18445c4f038cbbe880511851",
        "matches_recorded_reference": true
      }
    ],
    "not_tested": [
      "GPU",
      "Colab hosted runtime",
      "macOS",
      "native Windows",
      "WSL2",
      "long footage",
      "multiple-face footage",
      "HDR/log/high bit depth",
      "VFR conversion"
    ],
    "commands": {
      "setup": "bash setup.sh cpu",
      "image": ".venv/bin/python restore.py image sample-image.png --output runs/image-v14",
      "preflight": ".venv/bin/python restore.py preflight sample-video.mp4",
      "video": ".venv/bin/python restore.py video sample-video.mp4 --output runs/video-v14",
      "tests": ".venv/bin/python -m unittest -v test_restore.py"
    },
    "downloads": {
      "zip": "https://stockfilm.com/research/ai-restoration/assets/stockfilm-gfpgan-starter.zip",
      "notebook": "https://stockfilm.com/research/ai-restoration/assets/stockfilm-gfpgan-colab.ipynb",
      "release": "https://stockfilm.com/research/ai-restoration/assets/kit-release.json"
    },
    "historical_experiments": "This new test recipe does not identify the historical comparison checkpoint or settings.",
    "wrapper_sha256": "7dfbb99a069f771d23a2db848c2a6463a30d3f040602b1eb2b0e5dc1f37ef60a"
  }
}
