{
  "updated": "2026-09-09",
  "compilerSha256": "916cfec09e4253e33b64d4cedd93c141135058e9dcc181aef0f2f9f28c5189fd",
  "referenceTransform": "Only [gpu] becomes [cpu] for the separate CPU oracle comparison. Kernel body and host program are unchanged.",
  "previews": "PNG encoding of actual Metal output; no mock rendering.",
  "lessons": [
    {
      "id": "gpu-gradient",
      "width": 128,
      "height": 128,
      "comparisonMaxChannelError": 0,
      "comparisonTolerance": 1,
      "previewSha256": "9ab186ab2d7c4684fa362c1719ae2624e2a74f9f11ece03551f784f6f3a5865a",
      "routes": {
        "cpu-oracle": {
          "output": "Wrote shader.ppm",
          "rgbSha256": "ebd32e56900500172d79a3a8afd078089779e637ae37b0e1f09d66d161533a8d",
          "sourceSha256": "98a6816d35b028469d27be589ef07574c447783c42bb6e2caf1005dd8723a5c8"
        },
        "metal": {
          "output": "Wrote shader.ppm",
          "rgbSha256": "ebd32e56900500172d79a3a8afd078089779e637ae37b0e1f09d66d161533a8d",
          "sourceSha256": "b3983d5e900977c6c16677b723df3bb26d41ef4c77cccd618d044f05f27a36e7",
          "traceEvents": 8
        }
      }
    },
    {
      "id": "gpu-rings",
      "width": 128,
      "height": 128,
      "comparisonMaxChannelError": 0,
      "comparisonTolerance": 1,
      "previewSha256": "945c302dd2e9009959d72ba9e6dd5f704816986ab312f60f1ac37f2d8d4d58cb",
      "routes": {
        "cpu-oracle": {
          "output": "Wrote shader.ppm",
          "rgbSha256": "b0bede1122e210842205eae42159c9bd6e51308112e40d67b5d524dc0148c9ee",
          "sourceSha256": "98a0b6b9ed9a109912a89a5dcb8e569fa539a2e3752c21a986875e2ee3fbccd7"
        },
        "metal": {
          "output": "Wrote shader.ppm",
          "rgbSha256": "b0bede1122e210842205eae42159c9bd6e51308112e40d67b5d524dc0148c9ee",
          "sourceSha256": "1e4eb71d216d7fe06d1b00770bf023953f674417e275062544215e68e2bdadde",
          "traceEvents": 8
        }
      }
    },
    {
      "id": "gpu-checker",
      "width": 128,
      "height": 128,
      "comparisonMaxChannelError": 0,
      "comparisonTolerance": 1,
      "previewSha256": "58b34b05305d6e0ad71c61f99e87142edaa4d208f5e444987254318d107665de",
      "routes": {
        "cpu-oracle": {
          "output": "Wrote shader.ppm",
          "rgbSha256": "76d770a6293fbcfc2b0eab00628480431930773beb3932bd414da352e21242ba",
          "sourceSha256": "80fbcb887963300e51c32cec4dde1b44a398734687d0e1b6f37c1cea47663691"
        },
        "metal": {
          "output": "Wrote shader.ppm",
          "rgbSha256": "76d770a6293fbcfc2b0eab00628480431930773beb3932bd414da352e21242ba",
          "sourceSha256": "b90b7f5c4d2972b6acdd763cc6b27a547bf8c74de763fbebd390fde9afda6076",
          "traceEvents": 8
        }
      }
    },
    {
      "id": "gpu-blur",
      "width": 128,
      "height": 128,
      "comparisonMaxChannelError": 0,
      "comparisonTolerance": 1,
      "previewSha256": "c4c68ae0ec77acca753ba81a4f1ce0eb349d68b24f8e0487f87d461fed2b34fa",
      "routes": {
        "cpu-oracle": {
          "output": "Wrote shader.ppm",
          "rgbSha256": "015c8cbdbf61e916eb979b705c9ab4ffc00d9450b6c573770eb690467945708e",
          "sourceSha256": "f72792954105c6a9d07f7246d06e8d230e4201b6ba862896eff0020ee44fc3f3"
        },
        "metal": {
          "output": "Wrote shader.ppm",
          "rgbSha256": "015c8cbdbf61e916eb979b705c9ab4ffc00d9450b6c573770eb690467945708e",
          "sourceSha256": "75afd80c7f9127fd0a044bca3bd3e160b460b4abb3c7c4dcf80f71dd7645da45",
          "traceEvents": 16
        }
      }
    }
  ]
}
