{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://tamaraspec.org/registry/tcs-taxonomy-0.4.json",
  "title": "TCS Taxonomy Registry",
  "description": "Canonical registry of verbs, events, prop types, beat categories, spectator roles, and failure modes for TCS/SAN interoperability",
  "version": "0.4",
  "verbs": {
    "deal": {
      "id": "deal",
      "description": "Distribute cards to targets",
      "labels": {
        "en": "Deal",
        "es": "Repartir",
        "fr": "Distribuer",
        "de": "Austeilen"
      },
      "aliases": ["distribute"]
    },
    "collect": {
      "id": "collect",
      "description": "Gather cards from sources",
      "labels": {
        "en": "Collect",
        "es": "Recoger",
        "fr": "Rassembler",
        "de": "Sammeln"
      }
    },
    "spread": {
      "id": "spread",
      "description": "Display cards in a spread",
      "labels": {
        "en": "Spread",
        "es": "Extender",
        "fr": "Étaler",
        "de": "Ausbreiten"
      }
    },
    "cut": {
      "id": "cut",
      "description": "Divide deck at point",
      "labels": {
        "en": "Cut",
        "es": "Cortar",
        "fr": "Couper",
        "de": "Abheben"
      }
    },
    "shuffle": {
      "id": "shuffle",
      "description": "Randomize card order",
      "labels": {
        "en": "Shuffle",
        "es": "Barajar",
        "fr": "Battre",
        "de": "Mischen"
      }
    },
    "riffle-shuffle": {
      "id": "riffle-shuffle",
      "description": "Riffle shuffle technique",
      "labels": {
        "en": "Riffle Shuffle",
        "es": "Barajada Riffle",
        "fr": "Mélange Riffle",
        "de": "Riffle-Mischen"
      }
    },
    "overhand-shuffle": {
      "id": "overhand-shuffle",
      "description": "Overhand shuffle technique",
      "labels": {
        "en": "Overhand Shuffle",
        "es": "Barajada por Encima",
        "fr": "Mélange par Dessus",
        "de": "Überhand-Mischen"
      }
    },
    "palm": {
      "id": "palm",
      "description": "Conceal card in palm",
      "labels": {
        "en": "Palm",
        "es": "Palmar",
        "fr": "Palmer",
        "de": "Palmieren"
      }
    },
    "classic-palm": {
      "id": "classic-palm",
      "description": "Classic palm technique for concealing a card",
      "labels": {
        "en": "Classic Palm",
        "es": "Palma Clásica",
        "fr": "Palme Classique",
        "de": "Klassisches Palmieren"
      }
    },
    "steal": {
      "id": "steal",
      "description": "Remove card secretly",
      "labels": {
        "en": "Steal",
        "es": "Robar",
        "fr": "Voler",
        "de": "Stehlen"
      }
    },
    "load": {
      "id": "load",
      "description": "Place card into location",
      "labels": {
        "en": "Load",
        "es": "Cargar",
        "fr": "Charger",
        "de": "Laden"
      },
      "action_contract": {
        "requires": ["source", "target"],
        "parameters": {
          "position": {
            "required": false,
            "description": "Placement order within the target, when material",
            "domain": "string"
          }
        },
        "post_state_invariant": "The same card moves from source to target; absent an explicit state-changing action, card identity and orientation are preserved."
      }
    },
    "force": {
      "id": "force",
      "description": "Control spectator selection",
      "labels": {
        "en": "Force",
        "es": "Forzar",
        "fr": "Forcer",
        "de": "Forcieren"
      }
    },
    "reveal": {
      "id": "reveal",
      "description": "Show card or state",
      "labels": {
        "en": "Reveal",
        "es": "Revelar",
        "fr": "Révéler",
        "de": "Aufdecken"
      }
    },
    "turn": {
      "id": "turn",
      "description": "Flip card orientation",
      "labels": {
        "en": "Turn",
        "es": "Voltear",
        "fr": "Retourner",
        "de": "Wenden"
      },
      "action_contract": {
        "requires": ["target"],
        "parameters": {
          "face": {
            "required": false,
            "description": "Resulting face orientation, when known",
            "domain": ["face_up", "face_down"]
          }
        },
        "post_state_invariant": "The target's face orientation equals face when supplied; this does not reverse packet order or end orientation."
      }
    },
    "flip": {
      "id": "flip",
      "description": "Reverse card order",
      "labels": {
        "en": "Flip",
        "es": "Invertir",
        "fr": "Retourner",
        "de": "Umkehren"
      }
    },
    "separate": {
      "id": "separate",
      "description": "Divide into groups",
      "labels": {
        "en": "Separate",
        "es": "Separar",
        "fr": "Séparer",
        "de": "Trennen"
      }
    },
    "reassemble": {
      "id": "reassemble",
      "description": "Combine groups",
      "labels": {
        "en": "Reassemble",
        "es": "Reensamblar",
        "fr": "Réassembler",
        "de": "Zusammenfügen"
      }
    },
    "double-lift": {
      "id": "double-lift",
      "description": "Lift two cards as one",
      "labels": {
        "en": "Double Lift",
        "es": "Doble Levantamiento",
        "fr": "Double Levée",
        "de": "Doublieren"
      }
    },
    "multiple-turnover": {
      "id": "multiple-turnover",
      "description": "Turn over a top packet while preserving its actual order",
      "labels": {
        "en": "Multiple Turnover",
        "es": "Volteo Múltiple",
        "fr": "Retournement Multiple",
        "de": "Mehrfaches Umdrehen"
      }
    },
    "control": {
      "id": "control",
      "description": "Control card position",
      "labels": {
        "en": "Control",
        "es": "Controlar",
        "fr": "Contrôler",
        "de": "Kontrollieren"
      }
    },
    "take": {
      "id": "take",
      "description": "Take object from source",
      "labels": {
        "en": "Take",
        "es": "Tomar",
        "fr": "Prendre",
        "de": "Nehmen"
      }
    },
    "return": {
      "id": "return",
      "description": "Give back object",
      "labels": {
        "en": "Return",
        "es": "Devolver",
        "fr": "Rendre",
        "de": "Zurückgeben"
      }
    },
    "memorize": {
      "id": "memorize",
      "description": "Remember information",
      "labels": {
        "en": "Memorize",
        "es": "Memorizar",
        "fr": "Mémoriser",
        "de": "Merken"
      }
    },
    "indicate": {
      "id": "indicate",
      "description": "Point to or specify",
      "labels": {
        "en": "Indicate",
        "es": "Indicar",
        "fr": "Indiquer",
        "de": "Zeigen"
      }
    },
    "display": {
      "id": "display",
      "description": "Present for viewing",
      "labels": {
        "en": "Display",
        "es": "Mostrar",
        "fr": "Afficher",
        "de": "Präsentieren"
      }
    },
    "open": {
      "id": "open",
      "description": "Open container or object",
      "labels": {
        "en": "Open",
        "es": "Abrir",
        "fr": "Ouvrir",
        "de": "Öffnen"
      }
    },
    "speak": {
      "id": "speak",
      "description": "Verbalize",
      "labels": {
        "en": "Speak",
        "es": "Hablar",
        "fr": "Parler",
        "de": "Sprechen"
      }
    },
    "burn-card": {
      "id": "burn-card",
      "description": "Remove one or more cards from play as burn cards",
      "labels": {
        "en": "Burn Card",
        "es": "Quemar Carta",
        "fr": "Brûler une Carte",
        "de": "Karte Verbrennen"
      },
      "aliases": ["burn"]
    },
    "deal-community-cards": {
      "id": "deal-community-cards",
      "description": "Deal cards into a shared community-card layout",
      "labels": {
        "en": "Deal Community Cards",
        "es": "Repartir Cartas Comunitarias",
        "fr": "Distribuer les Cartes Communes",
        "de": "Gemeinschaftskarten Geben"
      },
      "aliases": ["community deal"]
    },
    "draw-card": {
      "id": "draw-card",
      "description": "Draw one or more cards from a source",
      "labels": {
        "en": "Draw Card",
        "es": "Robar Carta",
        "fr": "Piocher une Carte",
        "de": "Karte Ziehen"
      },
      "aliases": ["draw"]
    },
    "discard-card": {
      "id": "discard-card",
      "description": "Discard one or more cards from a source",
      "labels": {
        "en": "Discard Card",
        "es": "Descartar Carta",
        "fr": "Défausser une Carte",
        "de": "Karte Abwerfen"
      },
      "aliases": ["discard"]
    },
    "false-deal": {
      "id": "false-deal",
      "description": "Appear to deal one card while secretly dealing another",
      "labels": {
        "en": "False Deal",
        "es": "Reparto Falso",
        "fr": "Donne Fausse",
        "de": "Falsches Geben"
      }
    },
    "down-under-deal": {
      "id": "down-under-deal",
      "description": "Eliminate cards by repeatedly dealing one aside and moving the next under",
      "labels": {
        "en": "Down Under Deal",
        "es": "Reparto Abajo-Arriba",
        "fr": "Donne Dessus-Dessous",
        "de": "Down-Under-Geben"
      },
      "aliases": ["under-down deal"]
    },
    "false-count": {
      "id": "false-count",
      "description": "Appear to count a packet differently from its actual state",
      "labels": {
        "en": "False Count",
        "es": "Cuenta Falsa",
        "fr": "Faux Comptage",
        "de": "Falsches Zählen"
      }
    },
    "cull": {
      "id": "cull",
      "description": "Secretly relocate a selected card while preserving the apparent context",
      "labels": {
        "en": "Cull",
        "es": "Entresaque",
        "fr": "Dégagement",
        "de": "Cull-Kontrolle"
      }
    },
    "locate-by-feel-control": {
      "id": "locate-by-feel-control",
      "description": "Locate a physically altered card by touch and control its position",
      "labels": {
        "en": "Locate By Feel Control",
        "es": "Control por Tacto",
        "fr": "Contrôle au Toucher",
        "de": "Tastkontrolle"
      }
    },
    "rough-and-smooth-cut-control": {
      "id": "rough-and-smooth-cut-control",
      "description": "Cut at a rough-and-smooth treated boundary to control a card position",
      "labels": {
        "en": "Rough And Smooth Cut Control",
        "es": "Control de Corte Áspero-Liso",
        "fr": "Contrôle de Coupe Rugueux-Lisse",
        "de": "Rau-Glatt-Abhebekontrolle"
      }
    },
    "controlled-return-to-position": {
      "id": "controlled-return-to-position",
      "description": "Return a known card to a controlled final position",
      "labels": {
        "en": "Controlled Return To Position",
        "es": "Devolución Controlada a Posición",
        "fr": "Retour Contrôlé en Position",
        "de": "Kontrollierte Rückgabe in Position"
      }
    },
    "deceptive-controlled-return": {
      "id": "deceptive-controlled-return",
      "description": "Appear to return a known card to one position while actually controlling it to another",
      "labels": {
        "en": "Deceptive Controlled Return",
        "es": "Devolución Controlada Engañosa",
        "fr": "Retour Contrôlé Trompeur",
        "de": "Täuschende Kontrollierte Rückgabe"
      }
    },
    "stock-control-shuffle": {
      "id": "stock-control-shuffle",
      "description": "Shuffle while preserving selected stock cards at controlled positions",
      "labels": {
        "en": "Stock Control Shuffle",
        "es": "Barajada de Control de Stock",
        "fr": "Mélange avec Contrôle du Stock",
        "de": "Stock-Kontrollmischung"
      }
    },
    "false-shuffle": {
      "id": "false-shuffle",
      "description": "Appear to shuffle while preserving the required order",
      "labels": {
        "en": "False Shuffle",
        "es": "Barajada Falsa",
        "fr": "Faux Mélange",
        "de": "Falsches Mischen"
      }
    },
    "hindu-shuffle": {
      "id": "hindu-shuffle",
      "description": "Hindu shuffle technique",
      "labels": {
        "en": "Hindu Shuffle",
        "es": "Barajada Hindú",
        "fr": "Mélange Hindou",
        "de": "Hindu-Mischen"
      }
    },
    "mongean-shuffle": {
      "id": "mongean-shuffle",
      "description": "Mongean shuffle deterministic permutation",
      "labels": {
        "en": "Mongean Shuffle",
        "es": "Barajada Mongean",
        "fr": "Mélange Mongean",
        "de": "Mongean-Mischen"
      }
    },
    "in-faro-shuffle": {
      "id": "in-faro-shuffle",
      "description": "Perfect in-faro shuffle permutation",
      "labels": {
        "en": "In-Faro Shuffle",
        "es": "Barajada In-Faro",
        "fr": "Mélange In-Faro",
        "de": "In-Faro-Mischen"
      },
      "aliases": ["in weave shuffle"]
    },
    "out-faro-shuffle": {
      "id": "out-faro-shuffle",
      "description": "Perfect out-faro shuffle permutation",
      "labels": {
        "en": "Out-Faro Shuffle",
        "es": "Barajada Out-Faro",
        "fr": "Mélange Out-Faro",
        "de": "Out-Faro-Mischen"
      },
      "aliases": ["out weave shuffle"]
    },
    "straddle-faro-shuffle": {
      "id": "straddle-faro-shuffle",
      "description": "Faro shuffle variant for an odd packet by straddling one card",
      "labels": {
        "en": "Straddle Faro Shuffle",
        "es": "Barajada Faro con Carta Cabalgada",
        "fr": "Mélange Faro à Cheval",
        "de": "Straddle-Faro-Mischen"
      },
      "aliases": ["odd faro shuffle"]
    },
    "straight-cut": {
      "id": "straight-cut",
      "description": "Complete a deterministic straight cut",
      "labels": {
        "en": "Straight Cut",
        "es": "Corte Directo",
        "fr": "Coupe Simple",
        "de": "Einfaches Abheben"
      },
      "aliases": ["complete cut"]
    },
    "running-cut": {
      "id": "running-cut",
      "description": "Complete a sequence of running cuts",
      "labels": {
        "en": "Running Cut",
        "es": "Corte Continuo",
        "fr": "Coupe Continue",
        "de": "Laufendes Abheben"
      },
      "aliases": ["multiple cut"]
    },
    "false-cut": {
      "id": "false-cut",
      "description": "Appear to cut while preserving the required order",
      "labels": {
        "en": "False Cut",
        "es": "Corte Falso",
        "fr": "Fausse Coupe",
        "de": "Falsches Abheben"
      }
    },
    "reverse-deck": {
      "id": "reverse-deck",
      "description": "Reverse the order of a deck or packet",
      "labels": {
        "en": "Reverse Deck",
        "es": "Invertir Mazo",
        "fr": "Inverser le Jeu",
        "de": "Deck Umkehren"
      }
    },
    "recombine-deck": {
      "id": "recombine-deck",
      "description": "Recombine packets into one deck or packet",
      "labels": {
        "en": "Recombine Deck",
        "es": "Recombinar Mazo",
        "fr": "Recombiner le Jeu",
        "de": "Deck Wieder Zusammensetzen"
      }
    },
    "sort-by-rank": {
      "id": "sort-by-rank",
      "description": "Sort cards by rank",
      "labels": {
        "en": "Sort By Rank",
        "es": "Ordenar por Rango",
        "fr": "Trier par Rang",
        "de": "Nach Rang Sortieren"
      }
    },
    "sort-by-value": {
      "id": "sort-by-value",
      "description": "Sort cards by numeric or configured value",
      "labels": {
        "en": "Sort By Value",
        "es": "Ordenar por Valor",
        "fr": "Trier par Valeur",
        "de": "Nach Wert Sortieren"
      }
    },
    "sort-by-color": {
      "id": "sort-by-color",
      "description": "Sort cards by color",
      "labels": {
        "en": "Sort By Color",
        "es": "Ordenar por Color",
        "fr": "Trier par Couleur",
        "de": "Nach Farbe Sortieren"
      }
    },
    "sort-mates": {
      "id": "sort-mates",
      "description": "Sort cards into matching mate pairs or groups",
      "labels": {
        "en": "Sort Mates",
        "es": "Ordenar Parejas",
        "fr": "Trier les Paires",
        "de": "Partnerkarten Sortieren"
      }
    },
    "sort-by-suit": {
      "id": "sort-by-suit",
      "description": "Sort cards by suit",
      "labels": {
        "en": "Sort By Suit",
        "es": "Ordenar por Palo",
        "fr": "Trier par Couleur de Carte",
        "de": "Nach Farbe der Karte Sortieren"
      }
    },
    "sort-named-stack": {
      "id": "sort-named-stack",
      "description": "Sort cards into a named stack order",
      "labels": {
        "en": "Sort Named Stack",
        "es": "Ordenar Stack Nombrado",
        "fr": "Trier en Chapelet Nommé",
        "de": "Nach Benanntem Stack Sortieren"
      }
    },
    "layout-eliminate": {
      "id": "layout-eliminate",
      "description": "Eliminate a card or option from a displayed layout",
      "labels": {
        "en": "Layout Eliminate",
        "es": "Eliminar de la Disposición",
        "fr": "Éliminer de la Disposition",
        "de": "Aus der Auslage Eliminieren"
      }
    },
    "selection-reveal": {
      "id": "selection-reveal",
      "description": "Reveal the selected card or option",
      "labels": {
        "en": "Selection Reveal",
        "es": "Revelar Selección",
        "fr": "Révéler la Sélection",
        "de": "Auswahl Aufdecken"
      }
    },
    "select-card": {
      "id": "select-card",
      "description": "Establish a spectator's selection by privately noting a card",
      "labels": {
        "en": "Select Card",
        "es": "Seleccionar Carta",
        "fr": "Sélectionner une Carte",
        "de": "Karte Auswählen"
      }
    },
    "conceal-card": {
      "id": "conceal-card",
      "description": "Move a card to a concealment location without making it visible (palm, ditch, or lap)",
      "labels": {
        "en": "Conceal card",
        "es": "Ocultar carta",
        "fr": "Dissimuler une carte",
        "de": "Karte verbergen"
      },
      "action_contract": {
        "requires": ["source", "target"],
        "parameters": {
          "technique": {
            "required": false,
            "description": "Portable technique name, when it matters",
            "domain": "string"
          }
        },
        "post_state_invariant": "The same card is in the target location and is not made visible by this action. It does not change identity, face, end orientation, marks, crimp or jog."
      }
    },
    "cut-into-packets": {
      "id": "cut-into-packets",
      "description": "Divide a deck or packet into a stated number of resulting packets",
      "labels": {
        "en": "Cut into packets",
        "es": "Cortar en paquetes",
        "fr": "Couper en paquets",
        "de": "In Pakete schneiden"
      },
      "action_contract": {
        "requires": ["source"],
        "parameters": {
          "piles": {
            "required": true,
            "description": "Number of resulting packets",
            "domain": "integer >= 2"
          },
          "cut_plan": {
            "required": false,
            "description": "Ordered top/bottom removals with cardinality or remainder descriptors",
            "domain": "array"
          }
        },
        "post_state_invariant": "Every input card occurs in exactly one result packet; within-packet relative order is preserved.",
        "boundary_note": "Packet identity/custody representation depends on TAM-44."
      }
    },
    "mark-card": {
      "id": "mark-card",
      "description": "Apply a physical mark to a card",
      "labels": {
        "en": "Mark card",
        "es": "Marcar carta",
        "fr": "Marquer une carte",
        "de": "Karte markieren"
      },
      "action_contract": {
        "requires": ["target"],
        "parameters": {
          "mark": {
            "required": false,
            "description": "Human-readable description of the physical mark",
            "domain": "string"
          }
        },
        "post_state_invariant": "The target's marked state becomes true. No location, order or orientation change is implied."
      }
    },
    "unmark-card": {
      "id": "unmark-card",
      "description": "Remove a physical mark from a card",
      "labels": {
        "en": "Unmark card",
        "es": "Desmarcar carta",
        "fr": "Démarquer une carte",
        "de": "Markierung entfernen"
      },
      "action_contract": {
        "requires": ["target"],
        "parameters": {
          "mark": {
            "required": false,
            "description": "The particular mark to remove; omitted means remove all marks",
            "domain": "string"
          }
        },
        "post_state_invariant": "The named mark is absent after the action; omitted mark leaves the target unmarked. No location, order or orientation change is implied."
      }
    },
    "crimp-card": {
      "id": "crimp-card",
      "description": "Set a card's physical crimp state",
      "labels": {
        "en": "Crimp card",
        "es": "Doblar carta",
        "fr": "Plier une carte",
        "de": "Karte knicken"
      },
      "action_contract": {
        "requires": ["target"],
        "parameters": {
          "crimped": {
            "required": true,
            "description": "Resulting crimp state",
            "domain": "boolean"
          }
        },
        "post_state_invariant": "The target's crimp state equals crimped; no location, order or face/end orientation change is implied."
      }
    },
    "jog-card": {
      "id": "jog-card",
      "description": "Set a card's physical jog (protrusion) state",
      "labels": {
        "en": "Jog card",
        "es": "Desalinear carta",
        "fr": "Décaler une carte",
        "de": "Karte versetzen"
      },
      "action_contract": {
        "requires": ["target"],
        "parameters": {
          "direction": {
            "required": true,
            "description": "Resulting jog direction; none removes a jog",
            "domain": ["in", "out", "left", "right", "none"]
          }
        },
        "post_state_invariant": "The target's jog equals direction; none removes a jog. No location, order or orientation change is implied."
      }
    },
    "reverse-card-end": {
      "id": "reverse-card-end",
      "description": "Set a card's end-for-end orientation",
      "labels": {
        "en": "Reverse card end",
        "es": "Invertir extremo de carta",
        "fr": "Inverser l'extrémité d'une carte",
        "de": "Kartenende umkehren"
      },
      "action_contract": {
        "requires": ["target"],
        "parameters": {
          "end_orientation": {
            "required": true,
            "description": "Resulting end orientation",
            "domain": ["normal", "reversed"]
          }
        },
        "post_state_invariant": "The target's end orientation equals end_orientation; this does not change face orientation or packet order."
      }
    },
    "spell": {
      "id": "spell",
      "description": "Remove a phrase-derived number of cards one at a time from a source, optionally recording the outcome card",
      "labels": {
        "en": "Spell",
        "es": "Deletrear",
        "fr": "Épeler",
        "de": "Buchstabieren"
      },
      "action_contract": {
        "requires": ["source"],
        "parameters": {
          "count": {
            "required": true,
            "description": "Number of cards removed, top-first, one at a time",
            "domain": "integer >= 1"
          },
          "terminator": {
            "required": false,
            "description": "Which removed card (last-dealt) or which now-top card (next-card) is the procedure's outcome",
            "domain": ["last-dealt", "next-card"]
          }
        },
        "post_state_invariant": "The top count cards are removed from source in order; when terminator is supplied, the outcome card is the last one removed (last-dealt) or the new top of source (next-card). No other card's identity, order or orientation changes. The mechanism that produced count (a spoken phrase, its resolution) is not part of this contract."
      }
    },
    "transfer-custody": {
      "id": "transfer-custody",
      "description": "Hand a prop or packet to a declared participant",
      "labels": {
        "en": "Transfer custody",
        "es": "Transferir custodia",
        "fr": "Transférer la garde",
        "de": "Besitz übertragen"
      },
      "action_contract": {
        "requires": ["target"],
        "parameters": {
          "recipient_ref": {
            "required": true,
            "description": "Participant id in the TAM-45 shared namespace",
            "domain": "string"
          },
          "position": {
            "required": false,
            "description": "Named location for the transferred prop or packet",
            "domain": "string"
          }
        },
        "post_state_invariant": "After this action, the target's custody — state.possession for a whole prop, or the containing packet's custodian_ref (TAM-44/53) — equals recipient_ref. No card order, identity or per-card physical state changes."
      }
    }
  },
  "events": {
    "says_stop": {
      "id": "says_stop",
      "description": "Spectator says 'stop'",
      "labels": {
        "en": "Says Stop",
        "es": "Dice 'Alto'",
        "fr": "Dit 'Stop'",
        "de": "Sagt 'Stop'"
      }
    },
    "indicates_pile": {
      "id": "indicates_pile",
      "description": "Spectator indicates a pile",
      "labels": {
        "en": "Indicates Pile",
        "es": "Indica Montón",
        "fr": "Indique Pile",
        "de": "Zeigt auf Stapel"
      }
    },
    "card_drops": {
      "id": "card_drops",
      "description": "Card falls or is dropped",
      "labels": {
        "en": "Card Drops",
        "es": "Cae Carta",
        "fr": "Carte Tombe",
        "de": "Karte fällt"
      }
    },
    "spectator_chose": {
      "id": "spectator_chose",
      "description": "Spectator makes a choice",
      "labels": {
        "en": "Spectator Chose",
        "es": "Espectador Elige",
        "fr": "Spectateur Choisit",
        "de": "Zuschauer wählt"
      }
    },
    "spectator_chose_A": {
      "id": "spectator_chose_A",
      "description": "Spectator chose option A",
      "labels": {
        "en": "Chose A",
        "es": "Eligió A",
        "fr": "A Choisi A",
        "de": "Wählte A"
      }
    },
    "spectator_chose_B": {
      "id": "spectator_chose_B",
      "description": "Spectator chose option B",
      "labels": {
        "en": "Chose B",
        "es": "Eligió B",
        "fr": "A Choisi B",
        "de": "Wählte B"
      }
    },
    "spectator_chose_C": {
      "id": "spectator_chose_C",
      "description": "Spectator chose option C",
      "labels": {
        "en": "Chose C",
        "es": "Eligió C",
        "fr": "A Choisi C",
        "de": "Wählte C"
      }
    }
  },
  "prop_types": {
    "playing_cards": {
      "id": "playing_cards",
      "description": "Standard playing card deck",
      "labels": {
        "en": "Playing Cards",
        "es": "Cartas",
        "fr": "Cartes à Jouer",
        "de": "Spielkarten"
      },
      "state_schema": {
        "order": {
          "type": "string",
          "enum": ["unknown", "ordered", "shuffled"]
        },
        "orientation": {
          "type": "string",
          "enum": ["face_up", "face_down", "mixed"]
        },
        "count": {
          "type": "number",
          "minimum": 0,
          "maximum": 52
        },
        "reversed_cards": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
      "common_states": ["order", "orientation", "count", "reversed_cards"]
    },
    "playing_card": {
      "id": "playing_card",
      "description": "Single playing card",
      "labels": {
        "en": "Playing Card",
        "es": "Carta",
        "fr": "Carte à Jouer",
        "de": "Spielkarte"
      },
      "state_schema": {
        "identity": {
          "type": "string"
        },
        "orientation": {
          "type": "string",
          "enum": ["face_up", "face_down"]
        }
      },
      "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json#/$defs/playing_card_state",
      "common_states": ["identity", "orientation"]
    },
    "sealed_envelope": {
      "id": "sealed_envelope",
      "description": "Sealed envelope containing prediction",
      "labels": {
        "en": "Sealed Envelope",
        "es": "Sobre Sellado",
        "fr": "Enveloppe Scellée",
        "de": "Verschlossener Umschlag"
      },
      "state_schema": {
        "contents": {
          "type": "string"
        },
        "sealed": {
          "type": "boolean"
        }
      },
      "common_states": ["contents", "sealed"]
    }
  },
  "beat_categories": {
    "pause": {
      "id": "pause",
      "description": "Temporal pause",
      "labels": {
        "en": "Pause",
        "es": "Pausa",
        "fr": "Pause",
        "de": "Pause"
      }
    },
    "gesture": {
      "id": "gesture",
      "description": "Physical gesture or movement",
      "labels": {
        "en": "Gesture",
        "es": "Gesto",
        "fr": "Geste",
        "de": "Geste"
      }
    },
    "look": {
      "id": "look",
      "description": "Direction of gaze or attention",
      "labels": {
        "en": "Look",
        "es": "Mirada",
        "fr": "Regard",
        "de": "Blick"
      }
    },
    "beat": {
      "id": "beat",
      "description": "General timing beat",
      "labels": {
        "en": "Beat",
        "es": "Tiempo",
        "fr": "Temps",
        "de": "Takt"
      }
    },
    "display": {
      "id": "display",
      "description": "Display or show action",
      "labels": {
        "en": "Display",
        "es": "Mostrar",
        "fr": "Afficher",
        "de": "Zeigen"
      }
    },
    "attention": {
      "id": "attention",
      "description": "Call attention to something",
      "labels": {
        "en": "Attention",
        "es": "Atención",
        "fr": "Attention",
        "de": "Aufmerksamkeit"
      }
    },
    "tension": {
      "id": "tension",
      "description": "Build tension or anticipation",
      "labels": {
        "en": "Tension",
        "es": "Tensión",
        "fr": "Tension",
        "de": "Spannung"
      }
    }
  },
  "spectator_roles": {
    "assisting": {
      "id": "assisting",
      "description": "Spectator actively participates (e.g., selects card, handles props)",
      "labels": {
        "en": "Assisting",
        "es": "Asistente",
        "fr": "Assistant",
        "de": "Assistent"
      }
    },
    "observing": {
      "id": "observing",
      "description": "Spectator passively observes",
      "labels": {
        "en": "Observing",
        "es": "Observador",
        "fr": "Observateur",
        "de": "Beobachter"
      }
    },
    "camera_operator": {
      "id": "camera_operator",
      "description": "Camera operator controlling attention",
      "labels": {
        "en": "Camera Operator",
        "es": "Operador de Cámara",
        "fr": "Opérateur de Caméra",
        "de": "Kameramann"
      }
    },
    "stooge": {
      "id": "stooge",
      "description": "Confederate or plant in audience",
      "labels": {
        "en": "Stooge",
        "es": "Cómplice",
        "fr": "Complice",
        "de": "Komplize"
      }
    },
    "remote_viewer": {
      "id": "remote_viewer",
      "description": "Remote viewer (online, recorded)",
      "labels": {
        "en": "Remote Viewer",
        "es": "Espectador Remoto",
        "fr": "Spectateur à Distance",
        "de": "Fernzuschauer"
      }
    }
  },
  "failure_modes": {
    "performer_error": {
      "id": "performer_error",
      "description": "Performer made a mistake in execution",
      "labels": {
        "en": "Performer Error",
        "es": "Error del Artista",
        "fr": "Erreur de l'Artiste",
        "de": "Fehler des Künstlers"
      }
    },
    "structural_fragility": {
      "id": "structural_fragility",
      "description": "Method is inherently fragile under these conditions",
      "labels": {
        "en": "Structural Fragility",
        "es": "Fragilidad Estructural",
        "fr": "Fragilité Structurelle",
        "de": "Strukturelle Fragilität"
      }
    },
    "context_mismatch": {
      "id": "context_mismatch",
      "description": "Method doesn't match performance context",
      "labels": {
        "en": "Context Mismatch",
        "es": "Desajuste de Contexto",
        "fr": "Inadéquation du Contexte",
        "de": "Kontextfehlpassung"
      }
    },
    "inferential_collapse": {
      "id": "inferential_collapse",
      "description": "Spectator reasoning collapses belief",
      "labels": {
        "en": "Inferential Collapse",
        "es": "Colapso Inferencial",
        "fr": "Effondrement Inférentiel",
        "de": "Inferenzieller Zusammenbruch"
      }
    }
  }
}
