{
  "version": 1,
  "title": "Counterweight Choir",
  "subtitle": "Realistic weight-swap mobile puzzle — structural Art Bible and implementation guide",
  "theme": {
    "background": "#f4f1e8",
    "surface": "#292d31",
    "paper": "#f4f1e8",
    "ink": "#292d31",
    "muted": "#a8adb3",
    "accent": "#1557ff",
    "danger": "#dd5b45",
    "gold": "#b7d62e"
  },
  "overview": [
    {
      "label": "Fantasy",
      "text": "Restore a credible gallery-scale kinetic sculpture by swapping physical counterweights in the right order.",
      "sourceRefs": [
        "ENV-SCULPTURE-GALLERY",
        "M-SWAP"
      ]
    },
    {
      "label": "Genre",
      "text": "Portrait tactile order puzzle with immediate drag readability and authored causal depth.",
      "sourceRefs": [
        "SCR-GAMEPLAY",
        "M-PREVIEW"
      ]
    },
    {
      "label": "Core loop",
      "text": "Read target pose, pick weight, preview settle, place or swap, watch shutter, match sculpture.",
      "sourceRefs": [
        "UI-TARGET-CARD",
        "M-PICK",
        "M-SWAP",
        "M-CHECK"
      ]
    },
    {
      "label": "Consequence",
      "text": "Each committed swap changes the mobile and future legal hooks, making visible order matter.",
      "sourceRefs": [
        "P-ORDER",
        "M-SETTLE",
        "V-HOOK-CHANGE"
      ]
    },
    {
      "label": "Visual identity",
      "text": "Architectural daylight, anodized metal, fine cable, porcelain, stone, acrylic, white panels, cobalt action.",
      "sourceRefs": [
        "ENV-ARCHITECTURAL-BACKDROP",
        "E-BEAM",
        "E-WEIGHT-1"
      ]
    },
    {
      "label": "Hard exclusions",
      "text": "No weight numbers, equations, torque, M/H/L, resonance tokens, phrase rail, calibration UI, or soft toy blobs.",
      "sourceRefs": [
        "SCR-GAMEPLAY",
        "UI-PRIMARY"
      ]
    }
  ],
  "gameplayFlow": [
    {
      "step": 1,
      "title": "Read the pose",
      "description": "Compare the dense complete mobile with the compact target thumbnail and move budget.",
      "assetId": "ART-GAMEPLAY",
      "sourceRefs": [
        "UI-TARGET-CARD",
        "UI-MOVE-COUNT"
      ]
    },
    {
      "step": 2,
      "title": "Pick a weight",
      "description": "Select one physical counterweight; legal open rings halo and occupied hooks say Swap.",
      "assetId": "ART-ONBOARDING",
      "sourceRefs": [
        "M-PICK",
        "E-WEIGHT-2",
        "E-HOOK"
      ]
    },
    {
      "step": 3,
      "title": "Preview the settle",
      "description": "Ghost the exact final hierarchy, displaced weight, target changes, and future shutter state.",
      "assetId": "ART-GAMEPLAY-STATES",
      "sourceRefs": [
        "M-PREVIEW",
        "V-GHOST",
        "V-HOOK-CHANGE"
      ]
    },
    {
      "step": 4,
      "title": "Place or swap",
      "description": "Release on an open ring; an occupied destination exchanges both weights atomically.",
      "assetId": "ART-GAMEPLAY",
      "sourceRefs": [
        "M-SWAP",
        "M-SETTLE"
      ]
    },
    {
      "step": 5,
      "title": "Watch what opens",
      "description": "Affected beams settle leaf to root and reveal or close the next physical hook.",
      "assetId": "ART-GAMEPLAY-STATES",
      "sourceRefs": [
        "ST-HOOK-REVEAL",
        "E-SHUTTER",
        "P-ORDER"
      ]
    },
    {
      "step": 6,
      "title": "Match or recover",
      "description": "Complete the pose, or inspect mismatches and use Undo or Retry without penalty.",
      "assetId": "ART-SUCCESS",
      "sourceRefs": [
        "M-CHECK",
        "M-UNDO",
        "M-RETRY"
      ]
    }
  ],
  "tutorial": [
    {
      "title": "Target",
      "instruction": "Match the pictured mobile before moves reach zero.",
      "sourceRefs": [
        "UI-TARGET-CARD",
        "UI-MOVE-COUNT"
      ]
    },
    {
      "title": "Physical cues",
      "instruction": "Size, silhouette, material, and separate dots distinguish weights without printed values.",
      "sourceRefs": [
        "E-WEIGHT-1",
        "E-WEIGHT-2",
        "E-WEIGHT-3"
      ]
    },
    {
      "title": "Select",
      "instruction": "Open rings halo; closed destinations remain physically shuttered.",
      "sourceRefs": [
        "M-PICK",
        "E-HOOK",
        "E-SHUTTER"
      ]
    },
    {
      "title": "Preview",
      "instruction": "The translucent mobile is the exact post-release state, including the displaced weight.",
      "sourceRefs": [
        "M-PREVIEW",
        "V-GHOST"
      ]
    },
    {
      "title": "Swap",
      "instruction": "Dropping on an occupied open hook exchanges both visible counterweights for one move.",
      "sourceRefs": [
        "M-SWAP",
        "UI-HOOK-BADGE"
      ]
    },
    {
      "title": "Reveal",
      "instruction": "After settle, the affected shutter explicitly shows Opens or Closed.",
      "sourceRefs": [
        "ST-HOOK-REVEAL",
        "V-HOOK-CHANGE"
      ]
    },
    {
      "title": "Blocked",
      "instruction": "Physical obstruction is outlined; the weight returns and no move is used.",
      "sourceRefs": [
        "ST-PREVIEW-BLOCKED",
        "V-BOUNCE"
      ]
    },
    {
      "title": "Recover",
      "instruction": "Undo restores the exact prior sculpture; Retry restores the authored start.",
      "sourceRefs": [
        "M-UNDO",
        "M-RETRY"
      ]
    }
  ],
  "entityCards": [
    {
      "title": "Counterweights",
      "description": "Seven to ten credible porcelain, stone, and metal forms use scale, silhouette, and dots without numbers.",
      "sourceRefs": [
        "E-WEIGHT-1",
        "E-WEIGHT-2",
        "E-WEIGHT-3",
        "E-TRAY"
      ]
    },
    {
      "title": "Beam and bearing",
      "description": "Slender anodized beam and oversized bearing communicate pose without degree ticks.",
      "sourceRefs": [
        "E-BEAM",
        "E-PIVOT",
        "E-TARGET-ARC"
      ]
    },
    {
      "title": "Hooks and shutter",
      "description": "Open, occupied, one-way, and covered destinations differ physically and textually.",
      "sourceRefs": [
        "E-HOOK",
        "E-SHUTTER",
        "E-ONEWAY"
      ]
    },
    {
      "title": "Glass and bell",
      "description": "Clear blockers have strong edges; one real bell confirms only completed restoration.",
      "sourceRefs": [
        "E-GLASS",
        "E-BELL"
      ]
    }
  ],
  "systemCards": [
    {
      "title": "Exact ghost",
      "description": "Preview and commit share one deterministic resolver, so visible settled state is trustworthy.",
      "sourceRefs": [
        "M-PREVIEW",
        "M-SETTLE",
        "V-GHOST"
      ]
    },
    {
      "title": "Occupied swap",
      "description": "A drop on an occupied open ring exchanges both physical counterweights for one move.",
      "sourceRefs": [
        "M-SWAP",
        "UI-HOOK-BADGE"
      ]
    },
    {
      "title": "Order changes access",
      "description": "Settled linked beams open or close physical shutters, changing the next legal hook.",
      "sourceRefs": [
        "P-ORDER",
        "E-SHUTTER",
        "V-HOOK-CHANGE"
      ]
    },
    {
      "title": "Forgiving recovery",
      "description": "Blocked previews cost nothing; Undo and Retry support immediate experimentation.",
      "sourceRefs": [
        "V-BOUNCE",
        "M-UNDO",
        "M-RETRY"
      ]
    }
  ],
  "screenAssetIds": [
    "ART-ONBOARDING",
    "ART-HOME",
    "ART-GAMEPLAY",
    "ART-GAMEPLAY-STATES",
    "ART-PAUSE",
    "ART-SUCCESS",
    "ART-FAILURE",
    "ART-SETTINGS",
    "ART-ACCESSIBILITY",
    "ART-LEGAL"
  ],
  "implementationNotes": [
    {
      "label": "Layout",
      "text": "Keep target, seven-to-ten-weight mobile, staging rail, moves, Undo, and Retry visible at 360x800.",
      "sourceRefs": [
        "SCR-GAMEPLAY",
        "UI-WEIGHT-TRAY"
      ]
    },
    {
      "label": "Touch",
      "text": "Visible forms can stay slender while invisible weight/hook hit regions remain at least 64x64.",
      "sourceRefs": [
        "E-HOOK",
        "A-TAP"
      ]
    },
    {
      "label": "Type",
      "text": "Modern grotesk, 17 px body minimum, tabular UI counts, 35 percent expansion, 150 percent reflow.",
      "sourceRefs": [
        "A-TEXT",
        "UI-MOVE-COUNT"
      ]
    },
    {
      "label": "Motion",
      "text": "Settle within 500 ms; reduced motion uses stepped before/after frames and no camera movement.",
      "sourceRefs": [
        "M-SETTLE",
        "A-MOTION"
      ]
    },
    {
      "label": "Access",
      "text": "Scale, material, dots, geometry, labels, speech, and optional haptics repeat critical state.",
      "sourceRefs": [
        "A-COLOR",
        "A-READER",
        "A-HAPTIC"
      ]
    },
    {
      "label": "Export",
      "text": "Rebuild UI natively; preserve sRGB sources, layered sculpture pieces, baked light, and shared resolver.",
      "sourceRefs": [
        "ENV-SCULPTURE-GALLERY",
        "UI-SETTING-ROW"
      ]
    }
  ],
  "sourceRefs": [
    "SCR-ONBOARDING",
    "SCR-HOME",
    "SCR-GAMEPLAY",
    "SCR-PAUSE",
    "SCR-SUCCESS",
    "SCR-FAILURE",
    "SCR-SETTINGS",
    "SCR-ACCESSIBILITY",
    "SCR-LEGAL",
    "ST-FRESH",
    "ST-SELECTED",
    "ST-DRAGGING",
    "ST-PREVIEW-SAFE",
    "ST-PREVIEW-BLOCKED",
    "ST-SETTLING",
    "ST-HOOK-REVEAL",
    "ST-TARGET-MATCH",
    "ST-PAUSED",
    "ST-SUCCESS",
    "ST-FAILURE",
    "ST-ERROR",
    "ST-LOADING",
    "ST-DISABLED",
    "ST-INTERRUPTED",
    "M-PICK",
    "M-DRAG",
    "M-PREVIEW",
    "M-SWAP",
    "M-SETTLE",
    "M-CHECK",
    "M-UNDO",
    "M-RETRY",
    "E-BEAM",
    "E-PIVOT",
    "E-HOOK",
    "E-WEIGHT-1",
    "E-WEIGHT-2",
    "E-WEIGHT-3",
    "E-SHUTTER",
    "E-ONEWAY",
    "E-GLASS",
    "E-TARGET-ARC",
    "E-BELL",
    "E-TRAY",
    "ENV-SCULPTURE-GALLERY",
    "ENV-GALLERY-ARCHIVE",
    "ENV-ARCHITECTURAL-BACKDROP",
    "UI-TARGET-CARD",
    "UI-MOVE-COUNT",
    "UI-WEIGHT-TRAY",
    "UI-HOOK-BADGE",
    "UI-PRIMARY",
    "UI-FROST-SHEET",
    "UI-LEVEL-PATH",
    "UI-HOW-TO",
    "UI-SETTING-ROW",
    "UI-ERROR-SHEET",
    "UI-LEGAL-LIST",
    "A-COLOR",
    "A-MOTION",
    "A-TEXT",
    "A-HAPTIC",
    "A-READER",
    "A-TAP",
    "V-GHOST",
    "V-HOOK-CHANGE",
    "V-BOUNCE",
    "V-TARGET-LOCK",
    "V-SETTLE",
    "V-SUCCESS"
  ]
}
