{
  "schemaVersion": 1,
  "status": "draft-not-runtime-ready",
  "reviewDate": "2026-10-29",
  "purpose": "One reviewed raster art/state/layout contract for web and Unity, preserving R3 references and later approved interaction changes.",
  "originalReferences": [
    "art-source/v10/review/toy-city-r3.png",
    "art-source/v10/review/comic-toy-r3.png",
    "art-source/v10/review/comic-clean-r3.png"
  ],
  "referenceRule": "Never overwrite the original references. Regenerated assets are candidates, not recovered original layers. Review and record changed regions before freezing a reproducible new screen.",
  "candidateCanvas": {
    "logicalWidth": 432,
    "logicalHeight": 960,
    "coordinateOrigin": "top-left",
    "sourceScale": 2,
    "status": "preserves-current-runtime-ratio-pending-art-freeze",
    "screenshotComparison": "Fixed dimensions, safe area, language, business state and animation time; original R3 crops have varying widths and must never be non-uniformly stretched for comparison."
  },
  "families": {
    "toy-city": {"ui": "toy", "building": "toy", "portrait": "toy"},
    "comic-toy": {"ui": "comic", "building": "toy", "portrait": "comic"},
    "comic-clean": {"ui": "comic", "building": "comic", "portrait": "comic"}
  },
  "naming": "{family}/{category}/{component}/{locale-or-shared}/{state}.png",
  "sourcePolicy": {
    "masterFormat": "PNG RGBA",
    "runtimeWebCopy": "lossless WebP only when decoded RGBA equals master",
    "unityCopy": "same PNG master",
    "noSilentVectorFallback": true,
    "noRepaintClaims": true,
    "originalGeneratedAtlasAndPromptsRetained": true,
    "noFullScreenScreenshotHotspots": true
  },
  "spriteRequiredFields": [
    "id", "family", "category", "locale", "state", "sourceFile", "sourceSHA256",
    "exportFile", "exportSHA256", "pixelWidth", "pixelHeight", "logicalWidth",
    "logicalHeight", "contentRect", "trimRect", "alphaPadding", "pivot",
    "stretchPolicy", "borderIfSliced", "labelSafeRect", "visibleInStates",
    "referenceRegion", "provenanceType", "reviewStatus"
  ],
  "nodeRequiredFields": [
    "id", "spriteId", "x", "y", "width", "height", "anchor", "pivot",
    "zIndex", "hitRect", "stateBinding", "languageBinding", "accessibleLabel"
  ],
  "provenanceTypes": [
    "unchanged-complete-reference-crop",
    "candidate-generated-independent-RGBA",
    "candidate-original-layer-if-available",
    "existing-runtime-reuse-declared"
  ],
  "stretchPolicy": {
    "default": "none-preserve-aspect",
    "fixedArt": ["cta-with-word-art", "control-icon", "selection-corner", "burst-decoration", "localized-title"],
    "nineSliceOnly": "Explicitly reviewed flexible plain panel/border; never whole baked text or asymmetric burst decorations.",
    "stateCanvas": "All states of one component share dimensions, padding and pivot."
  },
  "textPolicy": {
    "fixedArtLabels": "Full raster word-art per locale where exact appearance is required.",
    "dynamic": "Real values plus fixed licensed font/TMP asset or digit sprite set; exact metrics and material preset are part of delivery.",
    "notAllowed": ["system-font-substitution-in-fixed-art", "baked-example-values-presented-as-live", "English rendered by stretching Chinese button art"]
  },
  "requiredStateMatrix": {
    "button": ["normal", "pressed", "disabled"],
    "fighterHomeCard": ["normal", "selected", "pressed", "locked"],
    "fighterCombatCard": ["ready", "selected", "cooling", "dead", "disabled"],
    "roomTemplate": ["normal", "selected", "pressed", "disabled"],
    "placedRoom": ["normal", "selected", "valid-preview", "invalid-preview"],
    "toggle": ["on", "off"],
    "foldout": ["expanded", "collapsed"],
    "pause": ["entry-settings", "battle-paused", "developer-expanded-help-collapsed"],
    "dialog": ["confirm", "cancel"],
    "toast": ["error", "informational"],
    "help": ["collapsed", "expanded"]
  },
  "proposedUnityBaseline": {
    "system": "uGUI",
    "canvasScaler": "Scale With Screen Size; freeze reference resolution and adaptation before final art validation",
    "canvasPixelPerfect": "Evaluate for screen-space alignment, not a guarantee of visual identity",
    "spriteMesh": "Full Rect for rectangular UI baseline",
    "imageType": "Simple except explicit approved Sliced panels",
    "spriteAtlasRotation": false,
    "spriteAtlasPaddingPixels": 4,
    "baselineCompression": "None for exact reference comparison; platform optimized variants reviewed separately",
    "maxTextureSize": "No automatic downscale below source size",
    "filterMode": "Chosen for smooth cartoon target scale; do not force Point solely because requirement says pixel-perfect",
    "validationStatus": "Not tested in a Unity project"
  },
  "acceptance": {
    "resource": ["decoded-RGBA-equality-for-web-lossless-copy", "SHA256", "dimensions", "alpha-on-light-and-dark", "state-coverage", "shared-pivot-and-canvas"],
    "screen": ["same-resolution-state-language-time", "reference-and-render-overlay", "difference-heatmap", "per-control-geometry-and-stroke-review", "separate-layout-and-resampling-differences"],
    "blocking": ["missing-requested-state", "silent-vector-substitution", "non-uniform-scaling-of-fixed-art", "reference-overwritten-to-hide-discrepancy", "claimed-Unity-pass-without-engine-validation"]
  },
  "sprites": [],
  "nodes": [],
  "missing": ["Reviewed independent raster UI controls and all support screens/states are not yet frozen in this draft contract."]
}
