{
  "petCount": 50,
  "frameCount": 3547,
  "geometryPassed": true,
  "pets": [
    {
      "petId": "212th-airborne-trooper",
      "sha256": "67ba3398b189cbbf91be9f6006cb5c26a079cd05fb8cb2a25c421d5fd1442f02",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.37\u00d7"
      ],
      "visualReview": {
        "sha256": "67ba3398b189cbbf91be9f6006cb5c26a079cd05fb8cb2a25c421d5fd1442f02",
        "status": "needs-repair",
        "notes": "Helmet scale is fairly stable through idle and locomotion, but failed frame 8 has an enlarged helmet/body compared with the opening pose. Review the shared family source and preserve matching variant geometry."
      }
    },
    {
      "petId": "212th-clone-trooper",
      "sha256": "1d3a2e826c546d4375928e0e12f3cb8cd9c2325c778786ccf961654501a91704",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.37\u00d7"
      ],
      "visualReview": {
        "sha256": "1d3a2e826c546d4375928e0e12f3cb8cd9c2325c778786ccf961654501a91704",
        "status": "needs-repair",
        "notes": "Helmet scale is fairly stable through idle and locomotion, but failed frame 8 has an enlarged helmet/body compared with the opening pose. Review the shared family source and preserve matching variant geometry."
      }
    },
    {
      "petId": "501st-clone-trooper",
      "sha256": "bd5c246fca2846bc7301ddfd9f3ba7dc0ba124c0b34bed4fa1294296bdc31d8c",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.37\u00d7"
      ],
      "visualReview": {
        "sha256": "bd5c246fca2846bc7301ddfd9f3ba7dc0ba124c0b34bed4fa1294296bdc31d8c",
        "status": "needs-repair",
        "notes": "Helmet scale is fairly stable through idle and locomotion, but failed frame 8 has an enlarged helmet/body compared with the opening pose. Review the shared family source and preserve matching variant geometry."
      }
    },
    {
      "petId": "aang",
      "sha256": "5cf81afedf00f2a4052e71f4e28495f4c4749c6728ea49ac8fd017f9e9054a51",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Jump 1\u21922: area changes 1.69\u00d7",
        "Jump 4\u21925: area changes 1.81\u00d7",
        "Working 4\u21925: area changes 1.38\u00d7"
      ],
      "visualReview": {
        "sha256": "5cf81afedf00f2a4052e71f4e28495f4c4749c6728ea49ac8fd017f9e9054a51",
        "status": "needs-repair",
        "notes": "Jump poses, particularly frames 1 and 5, use a much smaller character than idle. Preserve intentional gliding locomotion; do not impose a walking gait."
      }
    },
    {
      "petId": "agamemnon",
      "sha256": "541483d0f84e033ef5e05aa8b0d650d41524f9ca6905f64ce7900538e29a83ad",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 4\u21925: area changes 1.45\u00d7"
      ],
      "visualReview": {
        "sha256": "541483d0f84e033ef5e05aa8b0d650d41524f9ca6905f64ce7900538e29a83ad",
        "status": "needs-repair",
        "notes": "Run volume varies around frames 3/7 versus 5/8. Failed frames 5\u20136 enlarge the head substantially. Rebuild these poses around a locked head/body model."
      }
    },
    {
      "petId": "alex",
      "sha256": "7f14cf65982c861d669ccfe1e8170b69557d005f0201ac257f2ab27397bc7f46",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Working 1\u21922: area changes 1.41\u00d7",
        "Working 5\u21926: area changes 1.41\u00d7"
      ],
      "visualReview": {
        "sha256": "7f14cf65982c861d669ccfe1e8170b69557d005f0201ac257f2ab27397bc7f46",
        "status": "needs-repair",
        "notes": "Failed frames 4\u20136 enlarge the head; working frames 1/6 shrink the body to accommodate the raised tool. Review frames 3\u20134 also change head scale. Keep tool clearance without resizing the character."
      }
    },
    {
      "petId": "aloy",
      "sha256": "c0e03b3ee7325c09355a4d8e30e731cf275e268d730cd622158a4624f485a982",
      "spriteVersion": 1,
      "frameCount": 57,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Frame 2:4: asymmetric alpha center 10.5px",
        "Frame 3:4: asymmetric alpha center 10.5px",
        "Frame 5:5: asymmetric alpha center 10.3px",
        "Jump 4\u21925: area changes 1.47\u00d7",
        "Failed 3\u21924: area changes 1.47\u00d7",
        "Failed 6\u21927: area changes 1.46\u00d7"
      ],
      "visualReview": {
        "sha256": "c0e03b3ee7325c09355a4d8e30e731cf275e268d730cd622158a4624f485a982",
        "status": "needs-repair",
        "notes": "The existing selected run order is preserved. Head/body volume still varies between run poses; jump frame 4 and failed frames 3/6 need source-proportion review. Reordering alone cannot repair this."
      }
    },
    {
      "petId": "capyboba",
      "sha256": "88dcfe524fbe45a3192b11d57938b49bdc623353904ab2a9deb39e42de74c48a",
      "spriteVersion": 1,
      "frameCount": 57,
      "palette": 60,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Jump 1\u21922: area changes 1.35\u00d7",
        "Jump 2\u21923: area changes 1.36\u00d7"
      ],
      "visualReview": {
        "sha256": "88dcfe524fbe45a3192b11d57938b49bdc623353904ab2a9deb39e42de74c48a",
        "status": "needs-repair",
        "notes": "The cup/body appears smaller in the running state than idle; jump frames 2\u20133 change its volume. Treat the cup as a locked shape rather than fitting each pose independently."
      }
    },
    {
      "petId": "cherno-alpha",
      "sha256": "351dbe7f51675850528ed1f4c9374e17b10cc4d547373870ba2d7c789d915ac1",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Look 4\u21925: area changes 1.38\u00d7",
        "Look 12\u219213: area changes 1.43\u00d7",
        "Look 13\u219214: area changes 1.39\u00d7"
      ],
      "visualReview": {
        "sha256": "351dbe7f51675850528ed1f4c9374e17b10cc4d547373870ba2d7c789d915ac1",
        "status": "needs-repair",
        "notes": "The jump sequence shrinks the tower and body compared with standing poses. Keep the robot's construction scale through the jump; silhouette width can legitimately change when turning."
      }
    },
    {
      "petId": "clone-trooper",
      "sha256": "3fbb01bdb5ad9a16863f9472f73c8254b8fa387beab3c2d097890529f8c8ad09",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.37\u00d7"
      ],
      "visualReview": {
        "sha256": "3fbb01bdb5ad9a16863f9472f73c8254b8fa387beab3c2d097890529f8c8ad09",
        "status": "needs-repair",
        "notes": "Helmet scale is fairly stable through idle and locomotion, but failed frame 8 has an enlarged helmet/body compared with the opening pose. Review the shared family source and preserve matching variant geometry."
      }
    },
    {
      "petId": "commander-gree",
      "sha256": "32bd2cfe54b87e41bd97b27d64775f3a0d8142bbd9847537e109e799fcee84f0",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 62,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.37\u00d7"
      ],
      "visualReview": {
        "sha256": "32bd2cfe54b87e41bd97b27d64775f3a0d8142bbd9847537e109e799fcee84f0",
        "status": "needs-repair",
        "notes": "Helmet scale is fairly stable through idle and locomotion, but failed frame 8 has an enlarged helmet/body compared with the opening pose. Review the shared family source and preserve matching variant geometry."
      }
    },
    {
      "petId": "cute-cat",
      "sha256": "120271fb9113331ac75a0b2124d8e4a5b8c02cbf3ba59c84285028440c3237f2",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [],
      "visualReview": {
        "sha256": "120271fb9113331ac75a0b2124d8e4a5b8c02cbf3ba59c84285028440c3237f2",
        "status": "no-obvious-scale-defect",
        "notes": "No obvious character-scale discontinuity in the fixed-scale contact sheet. Crouching and stretching read as intentional pose changes. This is not a full real-time motion or direction-semantic approval."
      }
    },
    {
      "petId": "gipsy-danger",
      "sha256": "87c0418d4ba93604dc955e0a260ccf03885934478d1205fe6408439ff7ce7e4b",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 3\u21924: area changes 1.35\u00d7"
      ],
      "visualReview": {
        "sha256": "87c0418d4ba93604dc955e0a260ccf03885934478d1205fe6408439ff7ce7e4b",
        "status": "needs-review",
        "notes": "Idle and running are comparatively consistent. Check the narrower look poses against the same torso reference before approval; foreshortening and crouching should not be mistaken for an automatic scale failure."
      }
    },
    {
      "petId": "grace",
      "sha256": "2d76d8cc9558394fa3645d6a87fe109813873ff8ef459e8bba06bd4136e3aee7",
      "spriteVersion": 1,
      "frameCount": 57,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [],
      "visualReview": {
        "sha256": "2d76d8cc9558394fa3645d6a87fe109813873ff8ef459e8bba06bd4136e3aee7",
        "status": "needs-repair",
        "notes": "Running helmet proportions vary around frames 2/8; jump frames 3\u20134 appear smaller than 1/5. Failed entry versus seated poses also needs locked helmet/body scale."
      }
    },
    {
      "petId": "green-mm",
      "sha256": "c9fc656a5f48b7ae866348fdae183ede2e251c375164c8ce882565367c8ab330",
      "spriteVersion": 1,
      "frameCount": 57,
      "palette": 60,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run right 8\u21921: area changes 1.44\u00d7",
        "Run left 8\u21921: area changes 1.44\u00d7"
      ],
      "visualReview": {
        "sha256": "c9fc656a5f48b7ae866348fdae183ede2e251c375164c8ce882565367c8ab330",
        "status": "needs-repair",
        "notes": "The green body expands in run frames 4/8 relative to surrounding frames, producing a likely loop pop. Preserve body diameter while changing the arms and legs."
      }
    },
    {
      "petId": "hopper",
      "sha256": "5f08bee7bf6158c757c51b59440690a7e1bd592c09fef25bd8282506b373363a",
      "spriteVersion": 1,
      "frameCount": 57,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run right 3\u21924: area changes 1.37\u00d7",
        "Run right 8\u21921: area changes 1.50\u00d7",
        "Run left 3\u21924: area changes 1.37\u00d7",
        "Run left 8\u21921: area changes 1.50\u00d7",
        "Frame 6:4: asymmetric alpha center 12.3px"
      ],
      "visualReview": {
        "sha256": "5f08bee7bf6158c757c51b59440690a7e1bd592c09fef25bd8282506b373363a",
        "status": "needs-repair",
        "notes": "Run frames 4/8 become much smaller than 2/6, including the keyboard prop. Lock both character and prop size; deliberate compact overall stature is not itself a defect."
      }
    },
    {
      "petId": "invincible",
      "sha256": "1b54d53f77ad9efee6969f1f8218da57b620feacd8108bccca20b090cd692a8d",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [],
      "visualReview": {
        "sha256": "1b54d53f77ad9efee6969f1f8218da57b620feacd8108bccca20b090cd692a8d",
        "status": "needs-review",
        "notes": "Flight poses are more consistent than the chibi variant. Jump entry/exit and failed frame 5 need head/body scale review against idle. Flight should retain its intentional non-walking motion."
      }
    },
    {
      "petId": "invincible-chibi",
      "sha256": "e170bd107aca61431ec750776227a9436f09ffd55e849660a3646aa076d010b0",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run right 3\u21924: area changes 2.16\u00d7",
        "Run right 5\u21926: area changes 1.59\u00d7",
        "Run left 3\u21924: area changes 2.16\u00d7",
        "Run left 5\u21926: area changes 1.59\u00d7",
        "Jump 1\u21922: area changes 1.66\u00d7",
        "Jump 4\u21925: area changes 1.64\u00d7"
      ],
      "visualReview": {
        "sha256": "e170bd107aca61431ec750776227a9436f09ffd55e849660a3646aa076d010b0",
        "status": "needs-repair",
        "notes": "Flight frames 3/6/7 use markedly different head/body volume from stretched frames 4/5. Jump crouches also change head size. These need a shared-model redraw, not a silhouette-fit resize."
      }
    },
    {
      "petId": "kashyyyk-scout-trooper",
      "sha256": "ab5630b2354a9ed80a646a40afab040e716d104aa9a6139d96817f3875882bdd",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 63,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.37\u00d7"
      ],
      "visualReview": {
        "sha256": "ab5630b2354a9ed80a646a40afab040e716d104aa9a6139d96817f3875882bdd",
        "status": "needs-repair",
        "notes": "Helmet scale is fairly stable through idle and locomotion, but failed frame 8 has an enlarged helmet/body compared with the opening pose. Review the shared family source and preserve matching variant geometry."
      }
    },
    {
      "petId": "keyleth",
      "sha256": "6773dcf70d6a57fbec6a320ff6227a369af3ab44fc381bc4964fece38c75225a",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Jump 1\u21922: area changes 1.42\u00d7",
        "Jump 2\u21923: area changes 1.55\u00d7",
        "Jump 3\u21924: area changes 1.45\u00d7",
        "Jump 4\u21925: area changes 1.50\u00d7"
      ],
      "visualReview": {
        "sha256": "6773dcf70d6a57fbec6a320ff6227a369af3ab44fc381bc4964fece38c75225a",
        "status": "needs-repair",
        "notes": "Run heads appear larger than idle; jump frames 1/3/5 alternate in proportion with 2/4. Keep head and costume construction consistent while preserving actual crouch height."
      }
    },
    {
      "petId": "korra",
      "sha256": "e6a48e15e1745cb9c1c10898161211eb6e83fb165f4e9533331f58ff322f6caa",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Jump 1\u21922: area changes 2.03\u00d7",
        "Jump 2\u21923: area changes 1.44\u00d7",
        "Jump 3\u21924: area changes 1.47\u00d7",
        "Jump 4\u21925: area changes 1.56\u00d7",
        "Failed 2\u21923: area changes 1.89\u00d7",
        "Failed 3\u21924: area changes 1.53\u00d7",
        "Failed 8\u21921: area changes 1.47\u00d7"
      ],
      "visualReview": {
        "sha256": "e6a48e15e1745cb9c1c10898161211eb6e83fb165f4e9533331f58ff322f6caa",
        "status": "needs-repair",
        "notes": "Jump frames 1/3/5 enlarge the character relative to 2/4. Waiting is visibly thinner/smaller, and failed poses change proportions. Separate elemental effects from character measurements."
      }
    },
    {
      "petId": "kratos",
      "sha256": "ebef34a4aaa44ad772dc89c8017addb30260e05690471ba940062c26eba54097",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Jump 1\u21922: area changes 1.44\u00d7",
        "Jump 4\u21925: area changes 1.50\u00d7",
        "Failed 3\u21924: area changes 1.38\u00d7",
        "Failed 7\u21928: area changes 1.65\u00d7"
      ],
      "visualReview": {
        "sha256": "ebef34a4aaa44ad772dc89c8017addb30260e05690471ba940062c26eba54097",
        "status": "needs-repair",
        "notes": "The selected run order (1,8,7,6,5,4,2,3 relative to the pre-reorder source) is preserved. Jump and seated failed frames 4\u20137 visibly enlarge the head/body relative to idle. Source anatomy, not playback size, remains the issue."
      }
    },
    {
      "petId": "maryanne",
      "sha256": "e6907f54e1f6fc5addef85a8dc9259cd9712db4f11e3596869d321da56623194",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 5\u21926: area changes 1.39\u00d7"
      ],
      "visualReview": {
        "sha256": "e6907f54e1f6fc5addef85a8dc9259cd9712db4f11e3596869d321da56623194",
        "status": "needs-repair",
        "notes": "Most standing and look poses retain a recognizable model. Seated failed frames 4\u20136 enlarge the head/hair significantly. Compare head construction independently of asymmetric hair mass."
      }
    },
    {
      "petId": "mira",
      "sha256": "c0701d354b9cb73d29f52e261ed053a7f05d8102d95903f96fda8b47b517898b",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run right 5\u21926: area changes 1.78\u00d7",
        "Run left 5\u21926: area changes 1.78\u00d7",
        "Jump 3\u21924: area changes 1.46\u00d7"
      ],
      "visualReview": {
        "sha256": "c0701d354b9cb73d29f52e261ed053a7f05d8102d95903f96fda8b47b517898b",
        "status": "needs-repair",
        "notes": "Run frames 6\u20137 shrink compared with frame 5; the working row uses a much smaller character. Review poses lose substantial costume color/detail. Requires source-model and costume repair."
      }
    },
    {
      "petId": "mizu",
      "sha256": "12f66d204d2f8d28b7761b94aa1458104f5f01d5b935d81824e19d0dd9e0663c",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 2\u21923: area changes 1.58\u00d7",
        "Failed 6\u21927: area changes 1.47\u00d7"
      ],
      "visualReview": {
        "sha256": "12f66d204d2f8d28b7761b94aa1458104f5f01d5b935d81824e19d0dd9e0663c",
        "status": "needs-repair",
        "notes": "Failed frames 3\u20136 enlarge the hat/head/cape relative to the entry poses. Jump proportions also need comparison with the standing model; do not use hat width alone as body size."
      }
    },
    {
      "petId": "mr-monopoly",
      "sha256": "e30266a168766b11fc05c400e9ccd54f22a395a3816f6c2b869659283683d161",
      "spriteVersion": 1,
      "frameCount": 57,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run right 8\u21921: area changes 1.57\u00d7",
        "Run left 8\u21921: area changes 1.57\u00d7",
        "Failed 6\u21927: area changes 1.46\u00d7",
        "Frame 9:3: asymmetric alpha center 10.5px"
      ],
      "visualReview": {
        "sha256": "e30266a168766b11fc05c400e9ccd54f22a395a3816f6c2b869659283683d161",
        "status": "needs-repair",
        "notes": "Run frame 8 shrinks relative to frame 6. Failed frames 3\u20136 enlarge the head compared with entry/exit. Lock the head and hat scale through seated poses."
      }
    },
    {
      "petId": "nezha",
      "sha256": "362837b67be214bb7896ff6650a4a3c0408e57462d5b6c25b99067a1f280d7f4",
      "spriteVersion": 1,
      "frameCount": 57,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run right 1\u21922: area changes 1.50\u00d7",
        "Run right 5\u21926: area changes 1.36\u00d7",
        "Run left 1\u21922: area changes 1.50\u00d7",
        "Run left 5\u21926: area changes 1.36\u00d7",
        "Frame 4:4: asymmetric alpha center 12.0px",
        "Jump 3\u21924: area changes 1.41\u00d7",
        "Jump 4\u21925: area changes 1.36\u00d7",
        "Failed 3\u21924: area changes 1.59\u00d7",
        "Failed 4\u21925: area changes 1.42\u00d7",
        "Frame 8:5: asymmetric alpha center 11.0px"
      ],
      "visualReview": {
        "sha256": "362837b67be214bb7896ff6650a4a3c0408e57462d5b6c25b99067a1f280d7f4",
        "status": "needs-repair",
        "notes": "Run frame 2 enlarges the head relative to frame 1. Jump frames 1/5 differ in scale from 2/4. Preserve expressive motion but rebuild around fixed head/body proportions."
      }
    },
    {
      "petId": "omni-man",
      "sha256": "4aaac2c49658930b79412b1d8ed349de9282a22ae821679ca19d0cc3a8bf92ce",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run left 8\u21921: area changes 1.61\u00d7"
      ],
      "visualReview": {
        "sha256": "4aaac2c49658930b79412b1d8ed349de9282a22ae821679ca19d0cc3a8bf92ce",
        "status": "needs-repair",
        "notes": "Left-flight frames 2/6/8 are larger and proportionally different from nearby poses and the corresponding right-flight row. Review directional source consistency before any mirror repair; cape motion alone is not a scale defect."
      }
    },
    {
      "petId": "optimus-prime",
      "sha256": "31e9c22dbc695b9af7599e7e9bea02d82459d8a957aae325c8f15ee7f301713c",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [],
      "visualReview": {
        "sha256": "31e9c22dbc695b9af7599e7e9bea02d82459d8a957aae325c8f15ee7f301713c",
        "status": "needs-repair",
        "notes": "Robot-to-truck transformation during locomotion is intentional and must not be normalized away. Jump and failed robot poses change chest/head proportions relative to idle and need a locked robot reference."
      }
    },
    {
      "petId": "paul-atreides",
      "sha256": "9c23a3759551db845f1cab4262e67b07653e3ab60f60faf4e9714d1e0c7e045c",
      "spriteVersion": 1,
      "frameCount": 57,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Frame 2:8: asymmetric alpha center 10.5px",
        "Run right 5\u21926: area changes 1.57\u00d7",
        "Run right 6\u21927: area changes 1.41\u00d7",
        "Frame 3:8: asymmetric alpha center 10.5px",
        "Run left 5\u21926: area changes 1.57\u00d7",
        "Run left 6\u21927: area changes 1.41\u00d7",
        "Failed 2\u21923: area changes 1.36\u00d7",
        "Failed 3\u21924: area changes 1.37\u00d7",
        "Failed 5\u21926: area changes 1.40\u00d7"
      ],
      "visualReview": {
        "sha256": "9c23a3759551db845f1cab4262e67b07653e3ab60f60faf4e9714d1e0c7e045c",
        "status": "needs-repair",
        "notes": "Run frames 6/8 shrink; failed entry/exit are smaller than the seated middle poses. Repair head/body proportions at source rather than equalizing pose height."
      }
    },
    {
      "petId": "percy",
      "sha256": "25bc004ae5e24cedffcab1332c89492c14ea3ef525e3b6c08a8abfa0342d0ad9",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Jump 5\u21921: area changes 1.41\u00d7",
        "Failed 8\u21921: area changes 1.85\u00d7"
      ],
      "visualReview": {
        "sha256": "25bc004ae5e24cedffcab1332c89492c14ea3ef525e3b6c08a8abfa0342d0ad9",
        "status": "needs-repair",
        "notes": "Jump frame 1 and failed frames 6\u20138 enlarge the head/body relative to standing poses. Preserve crouch compression without enlarging anatomy."
      }
    },
    {
      "petId": "princeton-tiger",
      "sha256": "e90754f0d2d48719854478016a4f3b4acc62a2a1aabc8ffeb8dfdb346ff35d54",
      "spriteVersion": 1,
      "frameCount": 57,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Frame 2:2: asymmetric alpha center 17.0px",
        "Frame 2:6: asymmetric alpha center 14.6px",
        "Run right 8\u21921: area changes 1.44\u00d7",
        "Frame 3:2: asymmetric alpha center 17.0px",
        "Frame 3:6: asymmetric alpha center 14.6px",
        "Run left 8\u21921: area changes 1.44\u00d7",
        "Frame 5:2: asymmetric alpha center 10.3px"
      ],
      "visualReview": {
        "sha256": "e90754f0d2d48719854478016a4f3b4acc62a2a1aabc8ffeb8dfdb346ff35d54",
        "status": "needs-repair",
        "notes": "Right-run frames 5\u20136 turn the face left; the counterpart inherits this direction change. Head size also varies around frames 2/8. Needs direction and anatomy review, not blind cyclic reordering."
      }
    },
    {
      "petId": "rocky",
      "sha256": "d3251d492f02582689f884ca06154ab21ec7e81c8015a5bf215d851f38320dbe",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run right 6\u21927: area changes 1.65\u00d7",
        "Run right 7\u21928: area changes 1.59\u00d7",
        "Run left 6\u21927: area changes 1.65\u00d7",
        "Run left 7\u21928: area changes 1.59\u00d7",
        "Failed 8\u21921: area changes 1.56\u00d7"
      ],
      "visualReview": {
        "sha256": "d3251d492f02582689f884ca06154ab21ec7e81c8015a5bf215d851f38320dbe",
        "status": "needs-repair",
        "notes": "Run frame 7 shrinks the torso between larger neighboring poses. Lock the central body volume while articulating the limbs."
      }
    },
    {
      "petId": "rumi",
      "sha256": "f3f0d9d1c46911f22338383f27a712eee67a2f60c6240782c9508cdb90570c84",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run right 5\u21926: area changes 1.45\u00d7",
        "Run right 7\u21928: area changes 1.36\u00d7",
        "Run left 5\u21926: area changes 1.45\u00d7",
        "Run left 7\u21928: area changes 1.36\u00d7",
        "Failed 5\u21926: area changes 1.43\u00d7"
      ],
      "visualReview": {
        "sha256": "f3f0d9d1c46911f22338383f27a712eee67a2f60c6240782c9508cdb90570c84",
        "status": "needs-repair",
        "notes": "Run frames 6\u20137 shrink relative to 5/8; failed middle poses enlarge the body. Review poses lose normal costume rendering. Needs source-model and costume repair."
      }
    },
    {
      "petId": "seal",
      "sha256": "b7745f905f8cbe3275d36c42e631898e8b92f9d3a03fe784620614ac4df999e6",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 63,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [],
      "visualReview": {
        "sha256": "b7745f905f8cbe3275d36c42e631898e8b92f9d3a03fe784620614ac4df999e6",
        "status": "needs-review",
        "notes": "Primary motion reads as intentional squash/stretch. Look poses appear smaller/narrower than idle; compare the stable body core before deciding whether this is foreshortening or real scale drift."
      }
    },
    {
      "petId": "sharkkitty-calico",
      "sha256": "14ff6463bce0ce80afb2cc17220ce1b84464d0280fd9a7416e0999615c57dcf8",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run left 6\u21927: area changes 1.44\u00d7",
        "Run left 7\u21928: area changes 1.55\u00d7"
      ],
      "visualReview": {
        "sha256": "14ff6463bce0ce80afb2cc17220ce1b84464d0280fd9a7416e0999615c57dcf8",
        "status": "needs-repair",
        "notes": "Left-run frame 7 contains detached-looking body fragments and changes volume. Compare it against the corresponding intact right-run pose before repairing the directional row; preserve the three coat variants."
      }
    },
    {
      "petId": "sharkkitty-gray",
      "sha256": "1cd2521e1e391789c8ef6eb3443ba8fa6dcca5036350f5a3755d3cfa9700e599",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run left 6\u21927: area changes 1.44\u00d7",
        "Run left 7\u21928: area changes 1.55\u00d7"
      ],
      "visualReview": {
        "sha256": "1cd2521e1e391789c8ef6eb3443ba8fa6dcca5036350f5a3755d3cfa9700e599",
        "status": "needs-repair",
        "notes": "Left-run frame 7 contains detached-looking body fragments and changes volume. Compare it against the corresponding intact right-run pose before repairing the directional row; preserve the three coat variants."
      }
    },
    {
      "petId": "sharkkitty-tuxedo",
      "sha256": "a3754b1fc15f6005496c483dbe600605eab89d5d133d5e97d11de5158e35a7d8",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run left 6\u21927: area changes 1.44\u00d7",
        "Run left 7\u21928: area changes 1.55\u00d7"
      ],
      "visualReview": {
        "sha256": "a3754b1fc15f6005496c483dbe600605eab89d5d133d5e97d11de5158e35a7d8",
        "status": "needs-repair",
        "notes": "Left-run frame 7 contains detached-looking body fragments and changes volume. Compare it against the corresponding intact right-run pose before repairing the directional row; preserve the three coat variants."
      }
    },
    {
      "petId": "shock-trooper",
      "sha256": "f06912e9b3d1235da7b2a314c50e4479c5d063c5b3012d0d428674a36d4e03a6",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.37\u00d7"
      ],
      "visualReview": {
        "sha256": "f06912e9b3d1235da7b2a314c50e4479c5d063c5b3012d0d428674a36d4e03a6",
        "status": "needs-repair",
        "notes": "Helmet scale is fairly stable through idle and locomotion, but failed frame 8 has an enlarged helmet/body compared with the opening pose. Review the shared family source and preserve matching variant geometry."
      }
    },
    {
      "petId": "space-marine",
      "sha256": "19ba7d7e26a0bde8dab8bb387f9e4ddaf0a865d1da3afd2519c022cd4f078b04",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.62\u00d7",
        "Look 2\u21923: duplicate frame",
        "Look 3\u21924: duplicate frame",
        "Look 10\u219211: duplicate frame",
        "Look 11\u219212: duplicate frame",
        "Look 14\u219215: duplicate frame",
        "Look 15\u219216: duplicate frame"
      ],
      "visualReview": {
        "sha256": "19ba7d7e26a0bde8dab8bb387f9e4ddaf0a865d1da3afd2519c022cd4f078b04",
        "status": "needs-repair",
        "notes": "Idle and running are relatively consistent. Seated failed frames 4\u20138 enlarge the helmet/armor, particularly frame 8. Several look directions repeat exactly. Repair the base model before propagating changes to all six color variants."
      }
    },
    {
      "petId": "space-marine-blood-angels",
      "sha256": "de91f46060f8f8ca1d1fe01ab3b82f9d360030eb1c0fb51886bab5e2de02fa1b",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 63,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.62\u00d7",
        "Look 2\u21923: duplicate frame",
        "Look 3\u21924: duplicate frame",
        "Look 10\u219211: duplicate frame",
        "Look 11\u219212: duplicate frame",
        "Look 14\u219215: duplicate frame",
        "Look 15\u219216: duplicate frame"
      ],
      "visualReview": {
        "sha256": "de91f46060f8f8ca1d1fe01ab3b82f9d360030eb1c0fb51886bab5e2de02fa1b",
        "status": "needs-repair",
        "notes": "Idle and running are relatively consistent. Seated failed frames 4\u20138 enlarge the helmet/armor, particularly frame 8. Several look directions repeat exactly. Repair the base model before propagating changes to all six color variants."
      }
    },
    {
      "petId": "space-marine-dark-angels",
      "sha256": "249e430710bb660a2f4a3fc79d5534daa4d005c5933823798256791e4f82ad82",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 63,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.62\u00d7",
        "Look 2\u21923: duplicate frame",
        "Look 3\u21924: duplicate frame",
        "Look 10\u219211: duplicate frame",
        "Look 11\u219212: duplicate frame",
        "Look 14\u219215: duplicate frame",
        "Look 15\u219216: duplicate frame"
      ],
      "visualReview": {
        "sha256": "249e430710bb660a2f4a3fc79d5534daa4d005c5933823798256791e4f82ad82",
        "status": "needs-repair",
        "notes": "Idle and running are relatively consistent. Seated failed frames 4\u20138 enlarge the helmet/armor, particularly frame 8. Several look directions repeat exactly. Repair the base model before propagating changes to all six color variants."
      }
    },
    {
      "petId": "space-marine-imperial-fists",
      "sha256": "b87bfcd9be971a1c586446dad6506b68d6146f29fd4adf0d21ee20db3541a3b1",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 63,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.62\u00d7",
        "Look 2\u21923: duplicate frame",
        "Look 3\u21924: duplicate frame",
        "Look 10\u219211: duplicate frame",
        "Look 11\u219212: duplicate frame",
        "Look 14\u219215: duplicate frame",
        "Look 15\u219216: duplicate frame"
      ],
      "visualReview": {
        "sha256": "b87bfcd9be971a1c586446dad6506b68d6146f29fd4adf0d21ee20db3541a3b1",
        "status": "needs-repair",
        "notes": "Idle and running are relatively consistent. Seated failed frames 4\u20138 enlarge the helmet/armor, particularly frame 8. Several look directions repeat exactly. Repair the base model before propagating changes to all six color variants."
      }
    },
    {
      "petId": "space-marine-salamanders",
      "sha256": "76ec0c840b22915ce516a8ae04feeb37abeea59bd52fdaf764a19eb5b15b7312",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 63,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.62\u00d7",
        "Look 2\u21923: duplicate frame",
        "Look 3\u21924: duplicate frame",
        "Look 10\u219211: duplicate frame",
        "Look 11\u219212: duplicate frame",
        "Look 14\u219215: duplicate frame",
        "Look 15\u219216: duplicate frame"
      ],
      "visualReview": {
        "sha256": "76ec0c840b22915ce516a8ae04feeb37abeea59bd52fdaf764a19eb5b15b7312",
        "status": "needs-repair",
        "notes": "Idle and running are relatively consistent. Seated failed frames 4\u20138 enlarge the helmet/armor, particularly frame 8. Several look directions repeat exactly. Repair the base model before propagating changes to all six color variants."
      }
    },
    {
      "petId": "space-marine-space-wolves",
      "sha256": "79dbf2cde10bceec5f369259e1824a7ce882e80c5ab27a290777051c6ad8221f",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 63,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Failed 8\u21921: area changes 1.62\u00d7",
        "Look 2\u21923: duplicate frame",
        "Look 3\u21924: duplicate frame",
        "Look 10\u219211: duplicate frame",
        "Look 11\u219212: duplicate frame",
        "Look 14\u219215: duplicate frame",
        "Look 15\u219216: duplicate frame"
      ],
      "visualReview": {
        "sha256": "79dbf2cde10bceec5f369259e1824a7ce882e80c5ab27a290777051c6ad8221f",
        "status": "needs-repair",
        "notes": "Idle and running are relatively consistent. Seated failed frames 4\u20138 enlarge the helmet/armor, particularly frame 8. Several look directions repeat exactly. Repair the base model before propagating changes to all six color variants."
      }
    },
    {
      "petId": "steve",
      "sha256": "a6ac7db581bc3edc718ff1dd2e01478591d1b50af2e7cc298a7d687f35a16c43",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run left 3\u21924: area changes 1.46\u00d7",
        "Run left 4\u21925: area changes 1.44\u00d7",
        "Jump 4\u21925: area changes 1.35\u00d7",
        "Failed 8\u21921: area changes 1.43\u00d7",
        "Working 1\u21922: area changes 1.51\u00d7",
        "Working 5\u21926: area changes 1.43\u00d7"
      ],
      "visualReview": {
        "sha256": "a6ac7db581bc3edc718ff1dd2e01478591d1b50af2e7cc298a7d687f35a16c43",
        "status": "needs-repair",
        "notes": "Left-run frames 4/8 are bulkier than neighboring poses. Failed seated poses enlarge the head; working 1/6 are smaller than 2\u20135 and review 3/4 enlarge the head. Multiple state-scale corrections remain."
      }
    },
    {
      "petId": "sun-wukong",
      "sha256": "aca3bc40ed63c17fe44a88820f19cb3ee84217478dc09b156f11b7380c66482d",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Jump 1\u21922: area changes 1.35\u00d7",
        "Jump 4\u21925: area changes 1.38\u00d7",
        "Failed 4\u21925: area changes 1.36\u00d7",
        "Failed 5\u21926: area changes 1.62\u00d7",
        "Look 6\u21927: duplicate frame",
        "Look 10\u219211: duplicate frame"
      ],
      "visualReview": {
        "sha256": "aca3bc40ed63c17fe44a88820f19cb3ee84217478dc09b156f11b7380c66482d",
        "status": "needs-repair",
        "notes": "Running uses a larger head than idle; failed frame 5 is oversized. Repeated look directions also need inspection. Preserve staff extent without changing character scale."
      }
    },
    {
      "petId": "t95e5",
      "sha256": "254a165e8e8f3025d9c711eb3df193a3ba5dca02bcdf2e8837a82517eed5fe54",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [],
      "visualReview": {
        "sha256": "254a165e8e8f3025d9c711eb3df193a3ba5dca02bcdf2e8837a82517eed5fe54",
        "status": "needs-review",
        "notes": "The tank hull appears smaller in working/jump/look states than idle. Compare the hull independently of turret orientation. Tracked motion is intentional; humanoid leg-cycle checks do not apply."
      }
    },
    {
      "petId": "vex",
      "sha256": "72b30a671f5bc79c28302e0972a7b416d6edeb3b8d77a8c08131daa80763422b",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [],
      "visualReview": {
        "sha256": "72b30a671f5bc79c28302e0972a7b416d6edeb3b8d77a8c08131daa80763422b",
        "status": "needs-repair",
        "notes": "Jump entry/exit and failed frames 4\u20135 shrink the head/body instead of only changing posture. Preserve the model through airborne and crouched states."
      }
    },
    {
      "petId": "zoey",
      "sha256": "e075a21aa57670282f53857e20c5c2af36e162cc848c62bb1372fb6303f87127",
      "spriteVersion": 2,
      "frameCount": 74,
      "palette": 64,
      "geometryPassed": true,
      "failures": [],
      "reviewSignals": [
        "Run right 6\u21927: area changes 1.55\u00d7",
        "Run right 7\u21928: area changes 1.58\u00d7",
        "Run right 8\u21921: area changes 1.52\u00d7",
        "Run left 6\u21927: area changes 1.55\u00d7",
        "Run left 7\u21928: area changes 1.58\u00d7",
        "Run left 8\u21921: area changes 1.52\u00d7",
        "Failed 2\u21923: area changes 1.53\u00d7",
        "Failed 3\u21924: area changes 1.49\u00d7",
        "Failed 7\u21928: area changes 1.60\u00d7",
        "Working 5\u21926: area changes 1.44\u00d7"
      ],
      "visualReview": {
        "sha256": "e075a21aa57670282f53857e20c5c2af36e162cc848c62bb1372fb6303f87127",
        "status": "needs-repair",
        "notes": "Run frames 6/8 shrink around frame 7; working frames 1/6 shrink relative to frame 4. Review poses lose costume fill/detail. Needs anatomy and costume consistency repair."
      }
    }
  ]
}
