{
  "format": "shadowrun-animation-viewer-release-v1",
  "version": "1.1.0",
  "date": "2026-10-31",
  "writtenAtTimezone": "America/New_York",
  "viewerUrl": "/snes/shadowrun/graphics/animations/",
  "articleUrl": "/dev-blog/2026-10-31-shadowrun-animation-sequences/",
  "sourceRomSha256": "586551eadaff2693c0f21d9c47a697841989ae312d422fa4bf30823473a40fae",
  "coverage": {
    "appearances": 275,
    "states": 922,
    "sequences": 3486,
    "poseReferences": 12332,
    "framePalettePairs": 3486
  },
  "reusedPublicSpritePngs": 3486,
  "newSpritePngs": 0,
  "zipUploads": 0,
  "sourceRgbaPixelsCompared": 2394624,
  "modelChecksPassed": 10,
  "sourceVerificationSha256": "28297c2f2206fdb1b334097df6e6170db7b51122c32bf93dcfb267fd5450a43e",
  "modelReportSha256": "7964d11bdc9212e0da43b8321d8bfa0633444f94fe3d0513fed5c04decaba037",
  "browserVerification": {
    "status": "passed",
    "testedAtUtc": "2026-10-31T14:06:48.098369Z",
    "browserName": "ChatGPT in-app browser",
    "proofSha256": "d5c82bb13f0780c59b0a8ae220af414e59e83ee5103e5098417105b359c0830e",
    "sourceInputPins": [
      {
        "path": "graphics/animations/index.html",
        "bytes": 4139,
        "sha256": "8806a14fe4fead05108c2f36c9b2dd6bb5133500a70adb47114ed1d28b6422e1"
      },
      {
        "path": "graphics/animations/viewer.mjs",
        "bytes": 10920,
        "sha256": "03e27ffb53f3da6a5fc52fdaab06e9661e6d19907c1829b048290f23ce06de6c"
      },
      {
        "path": "graphics/animations/viewer.css",
        "bytes": 3828,
        "sha256": "38ae2e493db65a02a5c0b390a706aebc8e8a1a59268fc96126085e1aca978f35"
      },
      {
        "path": "graphics/animations/sequences.json",
        "bytes": 1280351,
        "sha256": "8ea1317bb5f4c55ef56dbce36a6680d6e70a6d2c52912976ea2374fdc225e16e"
      },
      {
        "path": "graphics/animations/source-verification.json",
        "bytes": 1396,
        "sha256": "28297c2f2206fdb1b334097df6e6170db7b51122c32bf93dcfb267fd5450a43e"
      }
    ],
    "checks": [
      {
        "id": "desktop-layout",
        "passed": true,
        "observation": "Actual1265px desktop capture shows two viewer columns, complete controls and no horizontal overflow."
      },
      {
        "id": "mobile-layout",
        "passed": true,
        "observation": "Actual390x844 viewport shows one stacked column, readable controls and document width390 matching scroll width390. Viewport reset afterwards."
      },
      {
        "id": "selectors-and-pose-controls",
        "passed": true,
        "observation": "Appearance0 state1 direction3 loaded frame0119-p00. Next selected0127-p00/pose2; Previous and rangeEnd worked; appearance274 loaded palette46/direction6."
      },
      {
        "id": "original-png-loading",
        "passed": true,
        "observation": "Real original sprites and the ready status appeared across selections. A downloaded frame0001-p00 PNG matched the verified source SHA256."
      },
      {
        "id": "preview-play-pause",
        "passed": true,
        "observation": "Play enabled the pressed state and advanced the displayed pose. Pause disabled the pressed state. Chosen preview speed is separate from native timing."
      },
      {
        "id": "nonloop-stop-and-loop-wrap",
        "passed": true,
        "observation": "A looping sequence wrapped from pose4 to pose1. Nonloop state3 replayed and stopped at its third/final pose."
      },
      {
        "id": "page-leave-stop",
        "passed": true,
        "observation": "After leaving a playing loop for the local graphics directory, Back returned a paused/reset viewer. Actual document-hidden events were not available through IAB visibility."
      },
      {
        "id": "download-links-and-source-records",
        "passed": true,
        "observation": "An actual PNG download matched the original SHA256. Allfive served input bodies matched their expected hashes; catalog/source links point to those records."
      }
    ],
    "lifecycle": {
      "pageLeaveStopObserved": true,
      "actualDocumentHiddenEventTested": false,
      "visibilityHandlerCoveredByDeterministicModels": true,
      "backendVisibilityLimitation": "The IAB browser visibility API changes presentation but document.hidden remains false/visibilityState visible. Actual page navigation/return pause was observed; document-visibility handler behavior is supported by the separate deterministic model tests only."
    },
    "screenshot": {
      "url": "/snes/shadowrun/graphics/animations/viewer-1.1.0.jpg",
      "bytes": 145312,
      "sha256": "e8761dcd677d43ab68fbe6ff625adf0fc482745e241d066de6916ee977eab110",
      "width": 1265,
      "height": 1545,
      "format": "JPEG",
      "mediaType": "image/jpeg",
      "extension": ".jpg"
    }
  },
  "inputs": [
    {
      "path": "snes/shadowrun/graphics/animations/index.html",
      "bytes": 4139,
      "sha256": "8806a14fe4fead05108c2f36c9b2dd6bb5133500a70adb47114ed1d28b6422e1"
    },
    {
      "path": "snes/shadowrun/graphics/animations/viewer.mjs",
      "bytes": 10920,
      "sha256": "03e27ffb53f3da6a5fc52fdaab06e9661e6d19907c1829b048290f23ce06de6c"
    },
    {
      "path": "snes/shadowrun/graphics/animations/viewer.css",
      "bytes": 3828,
      "sha256": "38ae2e493db65a02a5c0b390a706aebc8e8a1a59268fc96126085e1aca978f35"
    },
    {
      "path": "snes/shadowrun/graphics/animations/sequences.json",
      "bytes": 1280351,
      "sha256": "8ea1317bb5f4c55ef56dbce36a6680d6e70a6d2c52912976ea2374fdc225e16e"
    },
    {
      "path": "snes/shadowrun/graphics/animations/source-verification.json",
      "bytes": 1396,
      "sha256": "28297c2f2206fdb1b334097df6e6170db7b51122c32bf93dcfb267fd5450a43e"
    }
  ],
  "nativeTimingReproduced": false,
  "fullGraphicsComplete": false,
  "fullGameRebuilt": false,
  "publicDeliveryVerified": false,
  "documentHiddenVerification": {
    "actualBrowserEventTested": false,
    "deterministicModelHandlerCoverage": true,
    "actualLifecycleCheck": "Page leave and return; document-hidden behavior is not browser-accepted."
  },
  "browserAccepted": true,
  "publicationAccepted": false
}
