{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://tamaraspec.org/registry/tcs-taxonomy-0.5.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.5",
  "semantics_version": "1.0",
  "verbs": {
    "deal": {
      "id": "deal",
      "description": "Transfer cards one at a time from a source onto one or more target piles; at the default pile_position: top each pile receives them reversed, and in departure order at pile_position: bottom",
      "labels": {
        "en": "Deal",
        "es": "Repartir",
        "fr": "Distribuer",
        "de": "Austeilen"
      },
      "family_ref": "true-deals",
      "aliases": [
        "distribute"
      ],
      "action_contract": {
        "requires": [
          "source"
        ],
        "parameters": {
          "count": {
            "required": false,
            "description": "Number of cards transferred",
            "domain": "integer >= 1 | all",
            "default": "all"
          },
          "piles": {
            "required": false,
            "description": "Target pile references receiving cards, top to bottom of the list (post-state-effects.md §2)",
            "domain": "array",
            "default": [
              "target"
            ]
          },
          "distribution": {
            "required": false,
            "description": "How cards are apportioned across piles",
            "domain": [
              "round_robin",
              "pile_by_pile"
            ],
            "default": "round_robin"
          },
          "source_position": {
            "required": false,
            "description": "Position within source the cards are dealt from",
            "domain": "top | bottom | integer >= 1",
            "default": "top"
          },
          "pile_position": {
            "required": false,
            "description": "Insertion position within each receiving pile",
            "domain": [
              "top",
              "bottom"
            ],
            "default": "top"
          },
          "face": {
            "required": false,
            "description": "Resulting face orientation of the dealt cards",
            "domain": [
              "face_up",
              "face_down",
              "kept"
            ],
            "default": "kept"
          }
        },
        "post_state_invariant": "Cards leave source one at a time from source_position and land on the named target pile(s) at pile_position; with pile_position: top each receiving pile's arrival order is the reverse of departure order, and it is kept with pile_position: bottom. No card identity, mark, crimp or jog changes.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "move",
              "select": {
                "position": {
                  "param": "source_position"
                },
                "count": {
                  "param": "count"
                }
              },
              "from": "source",
              "to": {
                "param": "piles"
              },
              "arrival": "singly",
              "at": {
                "param": "pile_position"
              },
              "face": {
                "param": "face"
              },
              "distribution": {
                "param": "distribution"
              }
            }
          ]
        }
      }
    },
    "count": {
      "id": "count",
      "description": "Transfer cards one at a time between the hands, showing each card individually",
      "labels": {
        "en": "Count",
        "es": "Contar",
        "fr": "Compter",
        "de": "Zählen"
      },
      "family_ref": "true-counts",
      "action_contract": {
        "requires": [
          "source",
          "target"
        ],
        "parameters": {
          "count": {
            "required": false,
            "description": "Number of cards transferred, one at a time",
            "domain": "integer >= 1 | all",
            "default": "all"
          },
          "stacking": {
            "required": false,
            "description": "Whether the transferred packet lands onto or under the receiving hand's cards",
            "domain": [
              "onto",
              "under"
            ],
            "default": "onto"
          },
          "side": {
            "required": false,
            "description": "Which side was shown as each card passed",
            "domain": [
              "face",
              "back",
              "visible"
            ],
            "default": "visible"
          }
        },
        "post_state_invariant": "Cards transfer one at a time from source to target in the order stacking specifies (reversed for onto, kept for under), and every card is individually shown to observers, side, during the transfer.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "top",
                "count": {
                  "param": "count"
                }
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "move",
              "select": {
                "position": "top",
                "count": {
                  "param": "count"
                }
              },
              "from": "source",
              "to": "target",
              "arrival": "singly",
              "at": {
                "param": "stacking"
              }
            }
          ]
        }
      }
    },
    "take": {
      "id": "take",
      "description": "Take a block of n ≥ 1 cards from a stated position of a source into the actor's hand in one motion; order kept",
      "labels": {
        "en": "Take",
        "es": "Tomar",
        "fr": "Prendre",
        "de": "Nehmen"
      },
      "family_ref": "true-handling",
      "aliases": [
        "lift",
        "pick-up"
      ],
      "action_contract": {
        "parameters": {
          "count": {
            "required": false,
            "description": "Number of cards taken as one block",
            "domain": "integer >= 1",
            "default": 1
          },
          "position": {
            "required": false,
            "description": "Position within source the block is taken from",
            "domain": "top | bottom | second | center | integer >= 1",
            "default": "top"
          }
        },
        "post_state_invariant": "The block of count cards at position leaves source as one unit, in its own relative order, and arrives in the actor's hand. No card identity, mark, crimp or jog changes.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "move",
              "select": {
                "position": {
                  "param": "position"
                },
                "count": {
                  "param": "count"
                }
              },
              "from": "source",
              "to": "actor_hand",
              "arrival": "block"
            }
          ]
        }
      }
    },
    "place": {
      "id": "place",
      "description": "Put a held block of cards into or onto a target at a position",
      "labels": {
        "en": "Place",
        "es": "Colocar",
        "fr": "Placer",
        "de": "Platzieren"
      },
      "family_ref": "true-handling",
      "aliases": [
        "insert",
        "put"
      ],
      "action_contract": {
        "parameters": {
          "position": {
            "required": false,
            "description": "Placement position within the target",
            "domain": "top | bottom | integer >= 1",
            "default": "top"
          }
        },
        "post_state_invariant": "The actor's whole held block leaves the hand and arrives at the target at position, keeping its own relative order; the target's other cards are otherwise unaffected.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "move",
              "select": {
                "all": true
              },
              "from": "actor_hand",
              "to": "target",
              "arrival": "block",
              "at": {
                "param": "position"
              }
            }
          ]
        }
      }
    },
    "drop": {
      "id": "drop",
      "description": "Cards leave an actor's hands or packet and land at a location",
      "labels": {
        "en": "Drop",
        "es": "Dejar Caer",
        "fr": "Laisser Tomber",
        "de": "Fallenlassen"
      },
      "family_ref": "true-handling",
      "action_contract": {
        "requires": [
          "source",
          "target"
        ],
        "parameters": {
          "face": {
            "required": false,
            "description": "How the dropped cards land",
            "domain": [
              "face_up",
              "face_down",
              "kept"
            ],
            "default": "kept"
          },
          "position": {
            "required": false,
            "description": "Location the cards land at",
            "domain": "top | bottom | integer >= 1",
            "default": "top"
          }
        },
        "post_state_invariant": "The unit held in source leaves it as one block and lands at target at position, oriented per face when supplied; source's remaining order is otherwise unchanged.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "move",
              "select": {
                "all": true
              },
              "from": "source",
              "to": "target",
              "arrival": "block",
              "at": {
                "param": "position"
              },
              "face": {
                "param": "face"
              }
            }
          ]
        }
      }
    },
    "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"
      },
      "family_ref": "true-handling",
      "action_contract": {
        "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.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "set_custody",
              "subject": "target",
              "value": {
                "param": "recipient_ref"
              }
            }
          ]
        },
        "boundary_note": "N4: this structured contract is scoped to playing-cards props. Other prop types get the same custody fact once they have a versioned state_schema_ref (W9). position is descriptive metadata only (e.g. \"left inside jacket pocket\") — it is not itself a state 0.1 term and post_state does not read it; only the custody change named by recipient_ref is reflected in state."
      }
    },
    "spread": {
      "id": "spread",
      "description": "Spread cards so each is individually accessible; order unchanged",
      "labels": {
        "en": "Spread",
        "es": "Extender",
        "fr": "Étaler",
        "de": "Ausbreiten"
      },
      "family_ref": "displays",
      "action_contract": {
        "post_state_invariant": "Every card in target becomes individually accessible and is shown to observers as one collective impression; card order and orientation are unchanged.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "show",
              "subject": "target",
              "select": {
                "all": true
              },
              "side": "visible",
              "mode": "collective"
            }
          ]
        },
        "boundary_note": "A spread's geometry (whether the cards are squared or spread and individually accessible) is not a term in state 0.1. That is also true of every other verb (Q3), so it is not a contract-structured register reason."
      }
    },
    "display": {
      "id": "display",
      "description": "Expose faces to observers without changing order or orientation",
      "labels": {
        "en": "Display",
        "es": "Mostrar",
        "fr": "Afficher",
        "de": "Präsentieren"
      },
      "family_ref": "displays",
      "action_contract": {
        "parameters": {
          "side": {
            "required": false,
            "description": "Which side is shown",
            "domain": [
              "face",
              "back",
              "visible"
            ],
            "default": "face"
          },
          "mode": {
            "required": false,
            "description": "Whether cards are shown singly or as one impression",
            "domain": [
              "individual",
              "collective"
            ],
            "default": "individual"
          },
          "position": {
            "required": false,
            "description": "Position within target the shown card(s) start at",
            "domain": "top | bottom | integer >= 1",
            "default": "top"
          },
          "count": {
            "required": false,
            "description": "Number of cards shown",
            "domain": "integer >= 1 | all",
            "default": "all"
          }
        },
        "post_state_invariant": "The side named by side of target's count cards starting at position (all of them by default) is exposed to observers, per mode; card order and orientation are unchanged by this action.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "show",
              "subject": "target",
              "select": {
                "position": {
                  "param": "position"
                },
                "count": {
                  "param": "count"
                }
              },
              "side": {
                "param": "side"
              },
              "mode": {
                "param": "mode"
              }
            }
          ]
        }
      }
    },
    "turn": {
      "id": "turn",
      "description": "Turn a card or packet over as one unit",
      "labels": {
        "en": "Turn",
        "es": "Voltear",
        "fr": "Retourner",
        "de": "Wenden"
      },
      "family_ref": "true-handling",
      "action_contract": {
        "parameters": {
          "face": {
            "required": false,
            "description": "Resulting face orientation, when known",
            "domain": [
              "face_up",
              "face_down"
            ],
            "default": "unspecified"
          },
          "axis": {
            "required": false,
            "description": "Which axis the unit turns over on; end additionally reverses every card's end orientation",
            "domain": [
              "side",
              "end"
            ],
            "default": "side"
          }
        },
        "post_state_invariant": "The unit's card order reverses and every card's face flips, so the baseline face_orientation flips while reversed_cards membership is unchanged; a single card is the n = 1 case. axis: end additionally reverses every card's end_orientation; the default, side, does not.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "turn_over",
              "subject": "target",
              "axis": {
                "param": "axis"
              },
              "face": {
                "param": "face"
              }
            }
          ]
        }
      }
    },
    "cut": {
      "id": "cut",
      "description": "Complete cut: a rotation at the cut point; no reassembly parameter",
      "labels": {
        "en": "Cut",
        "es": "Cortar",
        "fr": "Couper",
        "de": "Abheben"
      },
      "family_ref": "true-cuts",
      "action_contract": {
        "parameters": {
          "cut_point": {
            "required": false,
            "description": "The number of cards cut off the top; card cut_point+1 comes to the top (required unless cut_points or located_by is given)",
            "domain": "integer >= 1",
            "default": "unspecified"
          },
          "cut_points": {
            "required": false,
            "description": "A run of complete cuts, netting to one rotation at their sum mod n",
            "domain": "array of integers",
            "default": "unspecified"
          },
          "located_by": {
            "required": false,
            "description": "A state trait or physical state used to find the cut point, when the cut is key-located rather than freely chosen",
            "domain": [
              "short",
              "long",
              "wide",
              "thick",
              "corner_short",
              "rough_treated",
              "crimped",
              "jogged",
              "break"
            ],
            "default": "unspecified"
          },
          "key_to": {
            "required": false,
            "description": "Whether the cut point lies directly above (top) or below (bottom) the key card",
            "domain": [
              "top",
              "bottom"
            ],
            "default": "top"
          },
          "break_position": {
            "required": false,
            "description": "The position of a held break within the pile: 0 <= p <= n (required when located_by: break)",
            "domain": "integer >= 0",
            "default": "unspecified"
          },
          "technique": {
            "required": false,
            "description": "Named variant of the cut",
            "domain": "string"
          }
        },
        "post_state_invariant": "target rotates at the point named by cut_point, cut_points or located_by: the cards above it move as a block to the bottom, and the cards at and below it move as a block to the top, each block keeping its own relative order. No card identity, mark, crimp or jog changes, and no reassembly beyond the single rotation is implied.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "rotate",
              "args": {
                "cut_point": {
                  "param": "cut_point"
                },
                "cut_points": {
                  "param": "cut_points"
                },
                "located_by": {
                  "param": "located_by"
                },
                "key_to": {
                  "param": "key_to"
                },
                "break_position": {
                  "param": "break_position"
                }
              }
            }
          ]
        }
      }
    },
    "cut-into-packets": {
      "id": "cut-into-packets",
      "description": "Divide cards into a stated number of packets (an incomplete cut)",
      "labels": {
        "en": "Cut into packets",
        "es": "Cortar en paquetes",
        "fr": "Couper en paquets",
        "de": "In Pakete schneiden"
      },
      "family_ref": "true-cuts",
      "action_contract": {
        "parameters": {
          "piles": {
            "required": true,
            "description": "Number of resulting packets",
            "domain": "integer >= 2"
          },
          "cut_plan": {
            "required": false,
            "description": "Ordered top-first segment sizes; the last may be rest",
            "domain": "array",
            "default": "unspecified"
          }
        },
        "post_state_invariant": "Every input card occurs in exactly one result packet, in contiguous top-to-bottom segments given by cut_plan (or an unstated composition, when cut_plan is omitted); within-packet relative order is preserved.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "split",
              "subject": "source",
              "into": {
                "param": "piles"
              },
              "sizes": {
                "param": "cut_plan"
              }
            }
          ]
        }
      }
    },
    "collect": {
      "id": "collect",
      "description": "Combine packets into one, in the order given by the order parameter (packet ids, top to bottom)",
      "labels": {
        "en": "Collect",
        "es": "Recoger",
        "fr": "Rassembler",
        "de": "Sammeln"
      },
      "family_ref": "true-handling",
      "action_contract": {
        "requires": [
          "target"
        ],
        "parameters": {
          "order": {
            "required": true,
            "description": "Pile references (a pile id, or a qualified card ref; post-state-effects.md §2), top to bottom, giving the stacking order of the combined result",
            "domain": "array"
          }
        },
        "post_state_invariant": "The named source packets become one packet (target), stacked top to bottom in the order order gives; each contributing packet's own internal relative order is preserved.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "merge",
              "sources": {
                "param": "order"
              },
              "into": "target"
            }
          ]
        }
      }
    },
    "separate": {
      "id": "separate",
      "description": "Partition cards by a content criterion",
      "labels": {
        "en": "Separate",
        "es": "Separar",
        "fr": "Séparer",
        "de": "Trennen"
      },
      "family_ref": "true-handling",
      "action_contract": {
        "post_state_invariant": "Every card in source occurs in exactly one resulting packet, grouped by the stated content criterion; within-packet relative order is preserved. The partition criterion itself is free text (decision 3), so this contract is not restated as structured post_state (contract-structured register)."
      }
    },
    "sort": {
      "id": "sort",
      "description": "Openly rearrange cards into the order given by key",
      "labels": {
        "en": "Sort",
        "es": "Ordenar",
        "fr": "Trier",
        "de": "Sortieren"
      },
      "family_ref": "true-handling",
      "action_contract": {
        "requires": [
          "target"
        ],
        "parameters": {
          "key": {
            "required": true,
            "description": "The property cards are sorted by",
            "domain": [
              "rank",
              "suit",
              "color",
              "mates",
              "named_stack"
            ]
          },
          "direction": {
            "required": false,
            "description": "Sort direction, when key is ordered",
            "domain": [
              "ascending",
              "descending"
            ],
            "default": "ascending"
          },
          "rank_order": {
            "required": false,
            "description": "Whether ace sorts low or high",
            "domain": [
              "ace_low",
              "ace_high"
            ],
            "default": "ace_low"
          },
          "suit_order": {
            "required": false,
            "description": "Suit letters in sort order (required for key: suit)",
            "domain": "array of 4 suit letters",
            "default": "unspecified"
          },
          "color_order": {
            "required": false,
            "description": "Which color sorts first",
            "domain": [
              "red_first",
              "black_first"
            ],
            "default": "red_first"
          },
          "stack": {
            "required": false,
            "description": "A name or Atlas pointer for the target order; a label only",
            "domain": "string"
          },
          "stack_order": {
            "required": false,
            "description": "Face labels in target order (required for key: named_stack)",
            "domain": "array of face labels",
            "default": "unspecified"
          }
        },
        "post_state_invariant": "Cards end in the order key (and direction, rank_order, suit_order or color_order, as key requires) specifies; ties are unconstrained, and a card whose face label does not parse against the canonical grammar is free of the ordering constraint (docs/tcs/post-state-effects.md §10).",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "sort",
              "args": {
                "key": {
                  "param": "key"
                },
                "direction": {
                  "param": "direction"
                },
                "rank_order": {
                  "param": "rank_order"
                },
                "suit_order": {
                  "param": "suit_order"
                },
                "color_order": {
                  "param": "color_order"
                },
                "stack_order": {
                  "param": "stack_order"
                }
              }
            }
          ]
        }
      }
    },
    "shuffle": {
      "id": "shuffle",
      "description": "Shuffle by an unstated technique; order unconstrained",
      "labels": {
        "en": "Shuffle",
        "es": "Barajar",
        "fr": "Battre",
        "de": "Mischen"
      },
      "family_ref": "true-shuffles",
      "action_contract": {
        "post_state_invariant": "target's resulting card order is unconstrained; no other state (card identity, marks, crimp, jog) changes.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "unconstrained"
            }
          ]
        }
      }
    },
    "riffle-shuffle": {
      "id": "riffle-shuffle",
      "description": "Interleave two packets, each keeping its relative order",
      "labels": {
        "en": "Riffle Shuffle",
        "es": "Barajada Riffle",
        "fr": "Mélange Riffle",
        "de": "Riffle-Mischen"
      },
      "family_ref": "true-shuffles",
      "action_contract": {
        "parameters": {
          "cut_point": {
            "required": false,
            "description": "The size of the top portion interleaved; unspecified unions over every division",
            "domain": "integer >= 1",
            "default": "unspecified"
          }
        },
        "post_state_invariant": "target's top portion (cut_point cards, or an unstated size) and bottom portion interleave in arbitrary clumps; each portion keeps its own relative order.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "riffle",
              "args": {
                "cut_point": {
                  "param": "cut_point"
                }
              }
            }
          ]
        }
      }
    },
    "overhand-shuffle": {
      "id": "overhand-shuffle",
      "description": "Run blocks off the top; block order reversed, order within each block kept",
      "labels": {
        "en": "Overhand Shuffle",
        "es": "Barajada por Encima",
        "fr": "Mélange par Dessus",
        "de": "Überhand-Mischen"
      },
      "family_ref": "true-shuffles",
      "action_contract": {
        "parameters": {
          "technique": {
            "required": false,
            "description": "Named variant; hindu absorbs 0.4's hindu-shuffle (D5)",
            "domain": [
              "overhand",
              "hindu"
            ]
          }
        },
        "post_state_invariant": "target's cards leave the top in a run of blocks; the blocks arrive in reverse of the order they were run off in, and each block keeps its own internal relative order.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "block_reverse"
            }
          ]
        }
      }
    },
    "mongean-shuffle": {
      "id": "mongean-shuffle",
      "description": "Alternate cards to the top and bottom of the receiving pile",
      "labels": {
        "en": "Mongean Shuffle",
        "es": "Barajada Mongean",
        "fr": "Mélange Mongean",
        "de": "Mongean-Mischen"
      },
      "family_ref": "true-shuffles",
      "action_contract": {
        "parameters": {
          "second_card": {
            "required": false,
            "description": "Whether the second dealt card goes above or below the first",
            "domain": [
              "above",
              "below"
            ],
            "default": "above"
          }
        },
        "post_state_invariant": "target's cards alternate to the top and bottom of the receiving pile, one at a time, in the Mongean pattern given by second_card.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "mongean",
              "args": {
                "second_card": {
                  "param": "second_card"
                }
              }
            }
          ]
        }
      }
    },
    "faro-shuffle": {
      "id": "faro-shuffle",
      "description": "A perfect alternating weave of two halves",
      "labels": {
        "en": "Faro Shuffle",
        "es": "Barajada Faro",
        "fr": "Mélange Faro",
        "de": "Faro-Mischen"
      },
      "family_ref": "true-shuffles",
      "action_contract": {
        "parameters": {
          "weave": {
            "required": false,
            "description": "Which half retains the top and bottom card of the combined packet (required when n is even)",
            "domain": [
              "in",
              "out"
            ]
          },
          "straddle": {
            "required": false,
            "description": "Which half is larger, for an odd packet (required when n is odd)",
            "domain": [
              "top",
              "bottom"
            ]
          }
        },
        "post_state_invariant": "The two halves interleave card-for-card. For an even packet, weave: out keeps the original top and bottom cards outermost, and weave: in moves them to second from the top and second from the bottom. For an odd packet, the halves differ by one card, the larger half named by straddle supplies both the top and the bottom card, and every card interleaves.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "faro",
              "args": {
                "weave": {
                  "param": "weave"
                },
                "straddle": {
                  "param": "straddle"
                }
              }
            }
          ]
        }
      }
    },
    "false-shuffle": {
      "id": "false-shuffle",
      "description": "A shuffling motion, such as a riffle or an overhand run, that returns the deck to its starting order",
      "labels": {
        "en": "False Shuffle",
        "es": "Barajada Falsa",
        "fr": "Faux Mélange",
        "de": "Falsches Mischen"
      },
      "family_ref": "false-shuffles",
      "action_contract": {
        "post_state_invariant": "target's card order after the riffle or overhand motion equals its order before it; no card identity, mark, crimp or jog changes.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "identity"
            }
          ]
        }
      },
      "presents_as": "shuffle"
    },
    "stock-control-shuffle": {
      "id": "stock-control-shuffle",
      "description": "Top and bottom stocks preserved; the rest unconstrained",
      "labels": {
        "en": "Stock Control Shuffle",
        "es": "Barajada de Control de Stock",
        "fr": "Mélange avec Contrôle du Stock",
        "de": "Stock-Kontrollmischung"
      },
      "family_ref": "false-shuffles",
      "action_contract": {
        "parameters": {
          "retain_top_count": {
            "required": false,
            "description": "Number of cards at the top of target whose order is preserved",
            "domain": "integer >= 0",
            "default": 0
          },
          "retain_bottom_count": {
            "required": false,
            "description": "Number of cards at the bottom of target whose order is preserved",
            "domain": "integer >= 0",
            "default": 0
          },
          "technique": {
            "required": false,
            "description": "Which honest shuffling motion is imitated",
            "domain": "string"
          }
        },
        "post_state_invariant": "The top retain_top_count cards and the bottom retain_bottom_count cards of target keep their relative order and position; the cards between them end in an unconstrained order.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "unconstrained",
              "range": {
                "from_top": {
                  "param": "retain_top_count"
                },
                "from_bottom": {
                  "param": "retain_bottom_count"
                }
              }
            }
          ]
        }
      },
      "presents_as": "shuffle"
    },
    "false-cut": {
      "id": "false-cut",
      "description": "A cutting motion at a false break point that returns the deck to its starting order",
      "labels": {
        "en": "False Cut",
        "es": "Corte Falso",
        "fr": "Fausse Coupe",
        "de": "Falsches Abheben"
      },
      "family_ref": "false-cuts",
      "action_contract": {
        "parameters": {
          "cut_point": {
            "required": false,
            "description": "The position the false break is actually at",
            "domain": "integer >= 1",
            "default": "unspecified"
          },
          "break_position": {
            "required": false,
            "description": "The physical break (finger break, crimp) the false cut works from",
            "domain": "integer >= 1"
          },
          "technique": {
            "required": false,
            "description": "Named variant of the false cut",
            "domain": "string"
          }
        },
        "post_state_invariant": "target's card order after the cutting motion at the apparent break point equals its order before it; no card identity, mark, crimp or jog changes.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "identity"
            }
          ]
        }
      },
      "presents_as": "cut"
    },
    "false-deal": {
      "id": "false-deal",
      "description": "A card from a stated position other than the top is dealt",
      "labels": {
        "en": "False Deal",
        "es": "Reparto Falso",
        "fr": "Donne Fausse",
        "de": "Falsches Geben"
      },
      "family_ref": "false-deals",
      "action_contract": {
        "requires": [
          "source"
        ],
        "parameters": {
          "source_position": {
            "required": true,
            "description": "The position the dealt card actually comes from",
            "domain": "second | bottom | center | integer >= 2"
          },
          "count": {
            "required": false,
            "description": "Number of cards dealt this way",
            "domain": "integer >= 1",
            "default": 1
          },
          "piles": {
            "required": false,
            "description": "Target pile references receiving cards (post-state-effects.md §2)",
            "domain": "array",
            "default": [
              "target"
            ]
          },
          "distribution": {
            "required": false,
            "description": "How cards are apportioned across piles",
            "domain": [
              "round_robin",
              "pile_by_pile"
            ],
            "default": "round_robin"
          },
          "pile_position": {
            "required": false,
            "description": "Insertion position within each receiving pile",
            "domain": [
              "top",
              "bottom"
            ],
            "default": "top"
          },
          "face": {
            "required": false,
            "description": "Resulting face orientation of the dealt cards",
            "domain": [
              "face_up",
              "face_down",
              "kept"
            ],
            "default": "kept"
          }
        },
        "post_state_invariant": "The card(s) at source_position in source (not the top) move to the named target pile(s); source's remaining relative order is otherwise unchanged.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "move",
              "select": {
                "position": {
                  "param": "source_position"
                },
                "count": {
                  "param": "count"
                }
              },
              "from": "source",
              "to": {
                "param": "piles"
              },
              "arrival": "singly",
              "at": {
                "param": "pile_position"
              },
              "face": {
                "param": "face"
              },
              "distribution": {
                "param": "distribution"
              }
            }
          ]
        }
      },
      "presents_as": "deal",
      "presents_as_parameters": {
        "source_position": "top"
      }
    },
    "false-count": {
      "id": "false-count",
      "description": "A count whose real transfers or number differ from the cards shown",
      "labels": {
        "en": "False Count",
        "es": "Cuenta Falsa",
        "fr": "Faux Comptage",
        "de": "Falsches Zählen"
      },
      "family_ref": "false-counts",
      "action_contract": {
        "requires": [
          "source",
          "target"
        ],
        "parameters": {
          "count": {
            "required": true,
            "description": "The number of cards shown (the beats); the real number transferred is the size of source in state, not this value",
            "domain": "integer >= 1"
          },
          "side": {
            "required": false,
            "description": "Which side was shown as each beat passed",
            "domain": [
              "face",
              "back",
              "visible"
            ],
            "default": "visible"
          },
          "technique": {
            "required": false,
            "description": "Named variant of the false count",
            "domain": "string"
          }
        },
        "post_state_invariant": "Every card actually in source transfers to target, one at a time; separately, count individual beats are shown to observers, which may repeat or omit cards when count differs from source's real size (docs/tcs/post-state-effects.md §14).",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "show",
              "subject": "source",
              "select": {
                "any": {
                  "param": "count"
                }
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "move",
              "select": {
                "all": true
              },
              "from": "source",
              "to": "target",
              "arrival": "unordered"
            }
          ]
        }
      },
      "presents_as": "count"
    },
    "double-lift": {
      "id": "double-lift",
      "description": "n ≥ 2 top cards taken as one block, kept in relative order",
      "labels": {
        "en": "Double Lift",
        "es": "Doble Levantamiento",
        "fr": "Double Levée",
        "de": "Doublieren"
      },
      "family_ref": "false-handling",
      "action_contract": {
        "parameters": {
          "count": {
            "required": true,
            "description": "Number of cards actually taken as one block (n >= 2)",
            "domain": "integer >= 2"
          },
          "position": {
            "required": false,
            "description": "Position within source the block is taken from",
            "domain": "top | bottom | integer >= 1",
            "default": "top"
          }
        },
        "post_state_invariant": "The count cards at position leave source as one block, in their own relative order, and arrive in the actor's hand.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "move",
              "select": {
                "position": {
                  "param": "position"
                },
                "count": {
                  "param": "count"
                }
              },
              "from": "source",
              "to": "actor_hand",
              "arrival": "block"
            }
          ]
        }
      },
      "presents_as": "take",
      "presents_as_parameters": {
        "count": 1,
        "position": "top"
      }
    },
    "false-insert": {
      "id": "false-insert",
      "description": "A card apparently inserted at one position ends up at another",
      "labels": {
        "en": "False Insert",
        "es": "Inserción Falsa",
        "fr": "Insertion Fausse",
        "de": "Falsches Einlegen"
      },
      "family_ref": "false-handling",
      "action_contract": {
        "parameters": {
          "position": {
            "required": true,
            "description": "The position the card actually ends up at",
            "domain": "top | bottom | integer >= 1"
          },
          "apparent_position": {
            "required": true,
            "description": "The position shown to observers as the card is inserted",
            "domain": "top | bottom | integer >= 1"
          }
        },
        "post_state_invariant": "The actor's held card leaves the hand and is at position in target; apparent_position is shown to observers but is not where the card actually ends up.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "move",
              "select": {
                "all": true
              },
              "from": "actor_hand",
              "to": "target",
              "arrival": "block",
              "at": {
                "param": "position"
              }
            }
          ]
        }
      },
      "presents_as": "place",
      "presents_as_parameters": {
        "position": {
          "param": "apparent_position"
        }
      }
    },
    "cull": {
      "id": "cull",
      "description": "Secretly move a card to a stated position during a spread or shuffle",
      "labels": {
        "en": "Cull",
        "es": "Entresaque",
        "fr": "Dégagement",
        "de": "Cull-Kontrolle"
      },
      "family_ref": "concealment",
      "action_contract": {
        "requires": [
          "source",
          "target"
        ],
        "parameters": {
          "card": {
            "required": false,
            "description": "The culled card, named by token, when it is not found by a state trait",
            "domain": "string"
          },
          "located_by": {
            "required": false,
            "description": "A state trait or physical state used to locate the culled card",
            "domain": [
              "short",
              "long",
              "wide",
              "thick",
              "corner_short",
              "rough_treated",
              "crimped",
              "jogged"
            ]
          },
          "position": {
            "required": true,
            "description": "Position within target the card is culled to",
            "domain": "top | bottom | integer >= 1"
          },
          "technique": {
            "required": false,
            "description": "Portable technique name, when it matters (e.g. overhand-shuffle for a shuffle cull)",
            "domain": "string"
          }
        },
        "post_state_invariant": "One card, located by located_by, secretly moves from source to position within target during a spread or shuffle; no other card's identity, order or physical state changes.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "show",
              "subject": "source",
              "select": {
                "all": true
              },
              "side": "visible",
              "mode": "collective"
            },
            {
              "op": "move",
              "select": {
                "card": {
                  "param": "card"
                },
                "located_by": {
                  "param": "located_by"
                }
              },
              "from": "source",
              "to": "target",
              "arrival": "singly",
              "at": {
                "param": "position"
              }
            }
          ]
        }
      },
      "presents_as": "spread"
    },
    "force": {
      "id": "force",
      "description": "The performer fixes which card a spectator's selection act yields",
      "labels": {
        "en": "Force",
        "es": "Forzar",
        "fr": "Forcer",
        "de": "Forcieren"
      },
      "family_ref": "forces",
      "action_contract": {
        "parameters": {
          "technique": {
            "required": false,
            "description": "Named forcing technique",
            "domain": "string"
          }
        },
        "post_state_invariant": "The spectator's later selection act yields the declared target card, regardless of any freedom the selection act appears to offer. TCS's post-condition vocabulary describes prop state, not a relation to a later act, so this stays a register entry (decision 3) rather than structured post_state."
      },
      "presents_as": "take"
    },
    "conceal-card": {
      "id": "conceal-card",
      "description": "Move a card to a concealment location without exposing it (palm, ditch, or lap)",
      "labels": {
        "en": "Conceal card",
        "es": "Ocultar carta",
        "fr": "Dissimuler une carte",
        "de": "Karte verbergen"
      },
      "family_ref": "concealment",
      "action_contract": {
        "parameters": {
          "card": {
            "required": false,
            "description": "The concealed card, named by token, when position does not identify it",
            "domain": "string"
          },
          "position": {
            "required": false,
            "description": "Position within source the card is taken from, when card is absent",
            "domain": "top | bottom | integer >= 1",
            "default": "top"
          },
          "technique": {
            "required": false,
            "description": "Portable technique name, when it matters",
            "domain": "string"
          }
        },
        "post_state_invariant": "The same card (named by card, or found at position) 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.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "move",
              "select": {
                "card": {
                  "param": "card"
                },
                "position": {
                  "param": "position"
                }
              },
              "from": "source",
              "to": "target",
              "arrival": "singly"
            }
          ]
        }
      },
      "presents_as": "none"
    },
    "load": {
      "id": "load",
      "description": "Secretly place a card into a target location",
      "labels": {
        "en": "Load",
        "es": "Cargar",
        "fr": "Charger",
        "de": "Laden"
      },
      "family_ref": "concealment",
      "action_contract": {
        "parameters": {
          "card": {
            "required": false,
            "description": "The loaded card, named by token, when position does not identify it",
            "domain": "string"
          },
          "position": {
            "required": false,
            "description": "Placement position within the target",
            "domain": "top | bottom | integer >= 1",
            "default": "top"
          },
          "technique": {
            "required": false,
            "description": "Portable technique name, when it matters",
            "domain": "string"
          },
          "source_position": {
            "required": false,
            "description": "Position within source the card(s) are removed from",
            "domain": "top | bottom | integer >= 1",
            "default": "top"
          },
          "count": {
            "required": false,
            "description": "Number of cards loaded, when card is absent",
            "domain": "integer >= 1 | all",
            "default": 1
          }
        },
        "post_state_invariant": "The card named by card — or, when card is absent, the count cards at source_position of source — move as one block to position within target; card identity and orientation are preserved.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "move",
              "select": {
                "card": {
                  "param": "card"
                },
                "position": {
                  "param": "source_position"
                },
                "count": {
                  "param": "count"
                }
              },
              "from": "source",
              "to": "target",
              "arrival": "block",
              "at": {
                "param": "position"
              }
            }
          ]
        }
      },
      "presents_as": "none"
    },
    "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"
      },
      "family_ref": "preparation",
      "action_contract": {
        "parameters": {
          "mark": {
            "required": true,
            "description": "Human-readable description of the physical mark; the reserved value all may not be used as a literal mark name (unmark-card's mark: all clears every mark, not one literally named \"all\")",
            "domain": "string"
          }
        },
        "post_state_invariant": "The target's marks gain mark. No location, order or orientation change is implied.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "set_card_state",
              "subject": "target",
              "field": "marks_add",
              "value": {
                "param": "mark"
              }
            }
          ]
        }
      }
    },
    "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"
      },
      "family_ref": "preparation",
      "action_contract": {
        "parameters": {
          "mark": {
            "required": false,
            "description": "The particular mark to remove; the reserved value all (the default) clears every mark instead of removing a literal mark named \"all\" (no mark may ever be literally named all — see mark-card's own mark parameter)",
            "domain": "string",
            "default": "all"
          }
        },
        "post_state_invariant": "The named mark is absent after the action; mark: all (the default) leaves the target unmarked. No location, order or orientation change is implied.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "set_card_state",
              "subject": "target",
              "field": "marks_remove",
              "value": {
                "param": "mark"
              }
            }
          ]
        }
      }
    },
    "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"
      },
      "family_ref": "preparation",
      "action_contract": {
        "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.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "set_card_state",
              "subject": "target",
              "field": "crimped",
              "value": {
                "param": "crimped"
              }
            }
          ]
        }
      }
    },
    "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"
      },
      "family_ref": "preparation",
      "action_contract": {
        "parameters": {
          "direction": {
            "required": true,
            "description": "Resulting jog direction; none removes a jog. left/right/in/out are performer-relative and hand-independent (docs/tcs/handedness.md); grip_side/off_side (TAM-75) are relative to whichever hand currently grips the target's packet (hand/actor_hand) and are never resolved by TCS itself.",
            "domain": [
              "in",
              "out",
              "left",
              "right",
              "grip_side",
              "off_side",
              "none"
            ]
          }
        },
        "post_state_invariant": "The target's jog equals direction; none removes a jog. No location, order or orientation change is implied.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "set_card_state",
              "subject": "target",
              "field": "jog",
              "value": {
                "param": "direction"
              }
            }
          ]
        }
      }
    },
    "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"
      },
      "family_ref": "preparation",
      "action_contract": {
        "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.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "set_card_state",
              "subject": "target",
              "field": "end_orientation",
              "value": {
                "param": "end_orientation"
              }
            }
          ]
        }
      }
    },
    "down-under-deal": {
      "id": "down-under-deal",
      "description": "Alternately deal a card aside and move the next card under",
      "labels": {
        "en": "Down Under Deal",
        "es": "Reparto Abajo-Arriba",
        "fr": "Donne Dessus-Dessous",
        "de": "Down-Under-Geben"
      },
      "family_ref": "true-deals",
      "aliases": [
        "under-down deal"
      ],
      "action_contract": {
        "requires": [
          "source",
          "target"
        ],
        "parameters": {
          "start": {
            "required": false,
            "description": "Whether the first card goes to the display pile (down) or under the source (under)",
            "domain": [
              "down",
              "under"
            ],
            "default": "down"
          },
          "remaining": {
            "required": false,
            "description": "How many cards stop the cycle, once source is reduced to this size",
            "domain": "integer >= 0",
            "default": 1
          }
        },
        "post_state_invariant": "source's cards alternate: one moves to target (down) or to the bottom of source (under), starting with start, switching kind every step, and repeating until source's size reaches remaining; each moved card's own identity, mark, crimp and jog are unchanged. The end state is two piles.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "cycle",
              "subject": "source",
              "to": "target",
              "start": {
                "param": "start"
              },
              "stop": {
                "remaining": {
                  "param": "remaining"
                }
              },
              "alternate": true
            }
          ]
        }
      }
    },
    "open": {
      "id": "open",
      "description": "Open a container",
      "labels": {
        "en": "Open",
        "es": "Abrir",
        "fr": "Ouvrir",
        "de": "Öffnen"
      },
      "family_ref": "true-handling",
      "action_contract": {
        "post_state_invariant": "target's container state becomes open (e.g. sealed_envelope.sealed becomes false), exposing its contents. sealed_envelope has no versioned state_schema_ref (decision 3), so this stays a register entry rather than structured post_state."
      }
    }
  },
  "composites": {
    "multiple-turnover": {
      "id": "multiple-turnover",
      "description": "n ≥ 2 cards taken as one block, turned over as a unit, and replaced; presents (via substitution) as a single card turned over",
      "labels": {
        "en": "Multiple Turnover"
      },
      "atlas_ref": "technique:multiple-turnover",
      "family_ref": "false-handling",
      "requires": [
        "source",
        "hand"
      ],
      "parameters": {
        "count": {
          "required": false,
          "description": "Cards taken as one block and turned",
          "domain": "integer >= 2",
          "default": 2
        }
      },
      "body": [
        {
          "verb": "registry:double-lift",
          "source": "source",
          "hand": "hand",
          "arguments": {
            "count": {
              "param": "count"
            }
          }
        },
        {
          "verb": "registry:turn",
          "target": "hand",
          "hand": "hand"
        },
        {
          "verb": "registry:place",
          "target": "source",
          "hand": "hand",
          "arguments": {
            "position": "top"
          }
        }
      ],
      "net_contract": {
        "post_state_invariant": "The top count cards of source move to the actor's hand as one block, turn face up (or down) as a unit, and return to source at top in the same relative order.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "move",
              "select": {
                "position": "top",
                "count": {
                  "param": "count"
                }
              },
              "from": "source",
              "to": "actor_hand",
              "arrival": "block"
            },
            {
              "op": "turn_over",
              "subject": "actor_hand"
            },
            {
              "op": "move",
              "select": {
                "all": true
              },
              "from": "actor_hand",
              "to": "source",
              "arrival": "block",
              "at": "top"
            }
          ]
        }
      },
      "examples": [
        {
          "arguments": {},
          "piles": {
            "source": [
              "A",
              "B",
              "C",
              "D",
              "E"
            ]
          },
          "hands": {
            "source": "left",
            "hand": "right"
          },
          "expect": {
            "piles": {
              "source": [
                "B",
                "A",
                "C",
                "D",
                "E"
              ]
            },
            "shown": [],
            "deceptive_in": [
              "state"
            ],
            "reversed_cards": [
              "A",
              "B"
            ]
          }
        }
      ]
    },
    "elmsley-count": {
      "id": "elmsley-count",
      "description": "Four-beat false count: on the second beat the counted card goes secretly under the packet while the next block of cards is taken as one; presents as an honest count of four",
      "labels": {
        "en": "Elmsley Count"
      },
      "atlas_ref": "technique:elmsley-count",
      "family_ref": "false-counts",
      "requires": [
        "source",
        "target"
      ],
      "parameters": {
        "block": {
          "required": false,
          "description": "Cards taken as one on beat two; source holds block + 2",
          "domain": "integer >= 2",
          "default": 2
        },
        "side": {
          "required": false,
          "description": "Side seen at each beat",
          "domain": [
            "face",
            "back",
            "visible"
          ],
          "default": "visible"
        }
      },
      "body": [
        {
          "verb": "registry:count",
          "source": "source",
          "target": "target",
          "arguments": {
            "count": 1,
            "side": {
              "param": "side"
            }
          }
        },
        {
          "simultaneous": [
            {
              "verb": "registry:load",
              "source": "target",
              "target": "source",
              "visibility": "hidden",
              "arguments": {
                "source_position": "bottom",
                "position": "bottom"
              }
            },
            {
              "verb": "registry:double-lift",
              "source": "source",
              "hand": "target",
              "arguments": {
                "count": {
                  "param": "block"
                }
              }
            }
          ]
        },
        {
          "verb": "registry:display",
          "target": "target",
          "arguments": {
            "position": "top",
            "count": 1,
            "side": {
              "param": "side"
            },
            "mode": "individual"
          }
        },
        {
          "verb": "registry:count",
          "source": "source",
          "target": "target",
          "arguments": {
            "count": 1,
            "side": {
              "param": "side"
            }
          }
        },
        {
          "verb": "registry:count",
          "source": "source",
          "target": "target",
          "arguments": {
            "count": 1,
            "side": {
              "param": "side"
            }
          }
        }
      ],
      "net_contract": {
        "post_state_invariant": "Every card of source ends in target, in the order: first card, last card, then the block (cards 2..block+1); four single beats are shown: the first card, the block's top card, the last card, the first card again.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "top",
                "count": 2
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "bottom",
                "count": 1
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "top",
                "count": 1
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "move",
              "select": {
                "all": true
              },
              "from": "source",
              "to": "target",
              "arrival": "block"
            },
            {
              "op": "move",
              "select": {
                "position": "second",
                "count": {
                  "param": "block"
                }
              },
              "from": "target",
              "to": "target",
              "arrival": "block",
              "at": "bottom"
            }
          ]
        }
      },
      "presents_as": "count",
      "presents_as_parameters": {
        "count": 4,
        "side": {
          "param": "side"
        }
      },
      "examples": [
        {
          "arguments": {},
          "piles": {
            "source": [
              "A",
              "B",
              "C",
              "D"
            ],
            "target": []
          },
          "expect": {
            "piles": {
              "source": [],
              "target": [
                "A",
                "D",
                "B",
                "C"
              ]
            },
            "shown": [
              "A",
              "B",
              "D",
              "A"
            ],
            "deceptive_in": [
              "state",
              "trace"
            ]
          }
        },
        {
          "arguments": {
            "block": 3
          },
          "piles": {
            "source": [
              "A",
              "B",
              "C",
              "D",
              "E"
            ],
            "target": []
          },
          "expect": {
            "piles": {
              "source": [],
              "target": [
                "A",
                "E",
                "B",
                "C",
                "D"
              ]
            },
            "shown": [
              "A",
              "B",
              "E",
              "A"
            ],
            "deceptive_in": [
              "state",
              "trace"
            ]
          }
        }
      ]
    },
    "jordan-count": {
      "id": "jordan-count",
      "description": "Four-beat false count: on the third beat the first card goes secretly under the packet while a block is taken as one; presents as an honest count of four",
      "labels": {
        "en": "Jordan Count"
      },
      "atlas_ref": "technique:jordan-count",
      "family_ref": "false-counts",
      "requires": [
        "source",
        "target"
      ],
      "parameters": {
        "remainder": {
          "required": false,
          "description": "Cards taken as one block on beat three (the third card plus the block after it); source holds remainder + 2",
          "domain": "integer >= 2",
          "default": 2
        },
        "side": {
          "required": false,
          "description": "Side seen at each beat",
          "domain": [
            "face",
            "back",
            "visible"
          ],
          "default": "visible"
        }
      },
      "body": [
        {
          "verb": "registry:count",
          "source": "source",
          "target": "target",
          "arguments": {
            "count": 1,
            "side": {
              "param": "side"
            }
          }
        },
        {
          "verb": "registry:count",
          "source": "source",
          "target": "target",
          "arguments": {
            "count": 1,
            "side": {
              "param": "side"
            }
          }
        },
        {
          "simultaneous": [
            {
              "verb": "registry:load",
              "source": "target",
              "target": "source",
              "visibility": "hidden",
              "arguments": {
                "source_position": "bottom",
                "position": "bottom"
              }
            },
            {
              "verb": "registry:double-lift",
              "source": "source",
              "hand": "target",
              "arguments": {
                "count": {
                  "param": "remainder"
                }
              }
            }
          ]
        },
        {
          "verb": "registry:display",
          "target": "target",
          "arguments": {
            "position": "top",
            "count": 1,
            "side": {
              "param": "side"
            },
            "mode": "individual"
          }
        },
        {
          "verb": "registry:count",
          "source": "source",
          "target": "target",
          "arguments": {
            "count": 1,
            "side": {
              "param": "side"
            }
          }
        }
      ],
      "net_contract": {
        "post_state_invariant": "Every card of source ends in target, in the order: first card, then the block (positions 3..source-size), then the second card; four single beats are shown: the first two cards, the block's first card, and the first card again.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "top",
                "count": 2
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": 3,
                "count": 1
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "top",
                "count": 1
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "move",
              "select": {
                "all": true
              },
              "from": "source",
              "to": "target",
              "arrival": "block"
            },
            {
              "op": "move",
              "select": {
                "position": "second",
                "count": 1
              },
              "from": "target",
              "to": "target",
              "arrival": "block",
              "at": "bottom"
            }
          ]
        }
      },
      "presents_as": "count",
      "presents_as_parameters": {
        "count": 4,
        "side": {
          "param": "side"
        }
      },
      "examples": [
        {
          "arguments": {},
          "piles": {
            "source": [
              "A",
              "B",
              "C",
              "D"
            ],
            "target": []
          },
          "expect": {
            "piles": {
              "source": [],
              "target": [
                "A",
                "C",
                "D",
                "B"
              ]
            },
            "shown": [
              "A",
              "B",
              "C",
              "A"
            ],
            "deceptive_in": [
              "state",
              "trace"
            ]
          }
        }
      ]
    },
    "hamman-count": {
      "id": "hamman-count",
      "description": "A false count that exchanges the whole receiving-hand block for the remainder of the source packet under cover of a simultaneous two-hand action, then recounts; the original order is restored",
      "labels": {
        "en": "Hamman Count"
      },
      "atlas_ref": "technique:hamman-count",
      "family_ref": "false-counts",
      "requires": [
        "source",
        "target"
      ],
      "parameters": {
        "beats": {
          "required": true,
          "description": "The exchange beat k: single counts before, and again after, the exchange",
          "domain": "integer >= 1"
        },
        "block": {
          "required": true,
          "description": "The second packet's size (n = beats + block), independent of beats; only its cover card is ever shown. double-lift requires >= 2, since a 1-card packet would conceal nothing",
          "domain": "integer >= 2"
        },
        "side": {
          "required": false,
          "description": "Side seen at each beat",
          "domain": [
            "face",
            "back",
            "visible"
          ],
          "default": "visible"
        }
      },
      "body": [
        {
          "repeat": {
            "times": {
              "param": "beats"
            },
            "steps": [
              {
                "verb": "registry:count",
                "source": "source",
                "target": "target",
                "arguments": {
                  "count": 1,
                  "side": {
                    "param": "side"
                  }
                }
              }
            ]
          }
        },
        {
          "simultaneous": [
            {
              "verb": "registry:load",
              "source": "target",
              "target": "source",
              "visibility": "hidden",
              "arguments": {
                "source_position": "top",
                "count": "all",
                "position": "top"
              }
            },
            {
              "verb": "registry:double-lift",
              "source": "source",
              "hand": "target",
              "arguments": {
                "count": {
                  "param": "block"
                }
              }
            }
          ]
        },
        {
          "verb": "registry:display",
          "target": "target",
          "arguments": {
            "position": "top",
            "count": 1,
            "side": {
              "param": "side"
            },
            "mode": "individual"
          }
        },
        {
          "repeat": {
            "times": {
              "param": "beats"
            },
            "steps": [
              {
                "verb": "registry:count",
                "source": "source",
                "target": "target",
                "arguments": {
                  "count": 1,
                  "side": {
                    "param": "side"
                  }
                }
              }
            ]
          }
        }
      ],
      "net_contract": {
        "post_state_invariant": "Every card of source ends in target, in its original relative order; 2 * beats + 1 single beats are shown: the first beats cards, the next card, then the first beats cards again in reverse.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "top",
                "count": {
                  "param": "beats"
                }
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "move",
              "select": {
                "position": "top",
                "count": {
                  "param": "beats"
                }
              },
              "from": "source",
              "to": "target",
              "arrival": "singly",
              "at": "top"
            },
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "top",
                "count": 1
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "show",
              "subject": "target",
              "select": {
                "position": "top",
                "count": {
                  "param": "beats"
                }
              },
              "side": {
                "param": "side"
              },
              "mode": "individual"
            },
            {
              "op": "move",
              "select": {
                "all": true
              },
              "from": "target",
              "to": "source",
              "arrival": "singly",
              "at": "top"
            },
            {
              "op": "move",
              "select": {
                "all": true
              },
              "from": "source",
              "to": "target",
              "arrival": "block"
            }
          ]
        }
      },
      "examples": [
        {
          "arguments": {
            "beats": 3,
            "block": 4
          },
          "piles": {
            "source": [
              "A",
              "B",
              "C",
              "D",
              "E",
              "F",
              "G"
            ],
            "target": []
          },
          "expect": {
            "piles": {
              "source": [],
              "target": [
                "A",
                "B",
                "C",
                "D",
                "E",
                "F",
                "G"
              ]
            },
            "shown": [
              "A",
              "B",
              "C",
              "D",
              "C",
              "B",
              "A"
            ],
            "deceptive_in": [
              "state",
              "trace"
            ]
          }
        }
      ]
    },
    "flushtration-count": {
      "id": "flushtration-count",
      "description": "Four beats of a false display-only count: the bottom card is shown face up each time while the top card is actually dealt away; the display phase only, a routine's honest recount is a separate count",
      "labels": {
        "en": "Flushtration Count"
      },
      "atlas_ref": "technique:flushtration-count",
      "family_ref": "false-counts",
      "requires": [
        "source",
        "target"
      ],
      "body": [
        {
          "repeat": {
            "times": 4,
            "steps": [
              {
                "verb": "registry:display",
                "target": "source",
                "arguments": {
                  "position": "bottom",
                  "count": 1,
                  "side": "face"
                }
              },
              {
                "verb": "registry:deal",
                "source": "source",
                "target": "target",
                "arguments": {
                  "count": 1
                }
              }
            ]
          }
        }
      ],
      "net_contract": {
        "post_state_invariant": "The bottom card of source is shown face up four times, unchanged each time; the top four cards of source move singly to target, landing reversed.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "bottom",
                "count": 1
              },
              "side": "face",
              "mode": "individual"
            },
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "bottom",
                "count": 1
              },
              "side": "face",
              "mode": "individual"
            },
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "bottom",
                "count": 1
              },
              "side": "face",
              "mode": "individual"
            },
            {
              "op": "show",
              "subject": "source",
              "select": {
                "position": "bottom",
                "count": 1
              },
              "side": "face",
              "mode": "individual"
            },
            {
              "op": "move",
              "select": {
                "position": "top",
                "count": 4
              },
              "from": "source",
              "to": "target",
              "arrival": "singly",
              "at": "top"
            }
          ]
        }
      },
      "presents_as": "count",
      "presents_as_parameters": {
        "count": 4,
        "side": "face"
      },
      "examples": [
        {
          "arguments": {},
          "piles": {
            "source": [
              "A",
              "B",
              "C",
              "D"
            ],
            "target": []
          },
          "expect": {
            "piles": {
              "source": [],
              "target": [
                "D",
                "C",
                "B",
                "A"
              ]
            },
            "shown": [
              "D",
              "D",
              "D",
              "D"
            ],
            "deceptive_in": [
              "trace"
            ]
          }
        }
      ]
    },
    "triple-cut": {
      "id": "triple-cut",
      "description": "An honest cut that divides a packet into three segments and reassembles them in a stated order",
      "labels": {
        "en": "Triple Cut"
      },
      "atlas_ref": "technique:triple-cut",
      "family_ref": "true-cuts",
      "requires": [
        "target"
      ],
      "parameters": {
        "cut_plan": {
          "required": true,
          "description": "Ordered top-first sizes for the upper, middle and lower segments; the last may be rest",
          "domain": "array",
          "items": "integer >= 1 | rest",
          "min_items": 3,
          "max_items": 3
        },
        "order": {
          "required": true,
          "description": "A permutation of upper, middle, lower (top first) giving the reassembly order",
          "domain": "array",
          "items": [
            "upper",
            "middle",
            "lower"
          ],
          "min_items": 3,
          "max_items": 3,
          "unique_items": true
        }
      },
      "locals": [
        "middle",
        "lower"
      ],
      "body": [
        {
          "verb": "registry:cut-into-packets",
          "source": "target",
          "arguments": {
            "piles": 3,
            "cut_plan": {
              "param": "cut_plan"
            }
          },
          "yields": [
            "upper",
            "middle",
            "lower"
          ]
        },
        {
          "verb": "registry:collect",
          "target": "target",
          "arguments": {
            "order": {
              "param": "order"
            }
          }
        }
      ],
      "net_contract": {
        "post_state_invariant": "target splits into three top-first segments per cut_plan, then reassembles as one packet stacked top to bottom per order.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "split",
              "subject": "target",
              "into": 3,
              "sizes": {
                "param": "cut_plan"
              }
            },
            {
              "op": "merge",
              "sources": {
                "param": "order"
              },
              "into": "target"
            }
          ]
        }
      },
      "examples": [
        {
          "arguments": {
            "cut_plan": [
              3,
              3,
              "rest"
            ],
            "order": [
              "lower",
              "middle",
              "upper"
            ]
          },
          "piles": {
            "target": [
              "1",
              "2",
              "3",
              "4",
              "5",
              "6",
              "7",
              "8",
              "9"
            ]
          },
          "expect": {
            "piles": {
              "target": [
                "7",
                "8",
                "9",
                "4",
                "5",
                "6",
                "1",
                "2",
                "3"
              ]
            }
          }
        }
      ]
    },
    "jay-ose-false-cut": {
      "id": "jay-ose-false-cut",
      "description": "A false cut built from two cut-into-packets splits and two collects; the packet's order is unchanged, though it presents as an honest cut",
      "labels": {
        "en": "Jay Ose False Cut"
      },
      "atlas_ref": "technique:jay-ose",
      "family_ref": "false-cuts",
      "requires": [
        "target"
      ],
      "parameters": {
        "first_packet": {
          "required": true,
          "description": "Size of the first (top) packet cut from target",
          "domain": "integer >= 1"
        },
        "second_packet": {
          "required": true,
          "description": "Size of the packet cut from the first packet, on the second cut",
          "domain": "integer >= 1"
        }
      },
      "locals": [
        "lower",
        "middle"
      ],
      "body": [
        {
          "verb": "registry:cut-into-packets",
          "source": "target",
          "arguments": {
            "piles": 2,
            "cut_plan": [
              {
                "param": "first_packet"
              },
              "rest"
            ]
          },
          "yields": [
            "upper",
            "lower"
          ]
        },
        {
          "verb": "registry:cut-into-packets",
          "source": "upper",
          "arguments": {
            "piles": 2,
            "cut_plan": [
              {
                "param": "second_packet"
              },
              "rest"
            ]
          },
          "yields": [
            "top",
            "middle"
          ]
        },
        {
          "verb": "registry:collect",
          "target": "lower",
          "arguments": {
            "order": [
              "middle",
              "lower"
            ]
          }
        },
        {
          "verb": "registry:collect",
          "target": "top",
          "arguments": {
            "order": [
              "top",
              "lower"
            ]
          }
        }
      ],
      "net_contract": {
        "post_state_invariant": "target's order is unchanged.",
        "post_state": {
          "state_schema_ref": "https://tamaraspec.org/schema/tcs-playing-cards-state-0.1.json",
          "effects": [
            {
              "op": "permute",
              "subject": "target",
              "permutation": "identity"
            }
          ]
        }
      },
      "presents_as": "cut",
      "presents_as_parameters": {
        "cut_point": {
          "param": "first_packet"
        }
      },
      "examples": [
        {
          "arguments": {
            "first_packet": 6,
            "second_packet": 3
          },
          "piles": {
            "target": [
              "1",
              "2",
              "3",
              "4",
              "5",
              "6",
              "7",
              "8",
              "9"
            ]
          },
          "expect": {
            "piles": {
              "target": [
                "1",
                "2",
                "3",
                "4",
                "5",
                "6",
                "7",
                "8",
                "9"
              ]
            },
            "deceptive_in": [
              "state"
            ]
          }
        }
      ]
    }
  },
  "action_families": {
    "shuffles": {
      "id": "shuffles",
      "description": "Randomizing or apparently-randomizing techniques that mix a packet's order.",
      "labels": {
        "en": "Shuffles"
      },
      "literature_note": "Card College vol. 2, \"Shuffles\""
    },
    "true-shuffles": {
      "id": "true-shuffles",
      "description": "A shuffle whose resulting order is genuinely unconstrained or as declared.",
      "labels": {
        "en": "True Shuffles"
      },
      "parent_id": "shuffles",
      "literature_note": "Card College vol. 2, \"True Shuffles\""
    },
    "false-shuffles": {
      "id": "false-shuffles",
      "description": "A shuffle that appears to mix the packet while its order is fully or partly retained.",
      "labels": {
        "en": "False Shuffles"
      },
      "parent_id": "shuffles",
      "literature_note": "Card College vol. 2, \"False Shuffles\""
    },
    "cuts": {
      "id": "cuts",
      "description": "Techniques that rotate or reposition a packet at a chosen point.",
      "labels": {
        "en": "Cuts"
      },
      "literature_note": "Card College vol. 2, \"Cuts\""
    },
    "true-cuts": {
      "id": "true-cuts",
      "description": "A cut whose resulting order is exactly the rotation it appears to be.",
      "labels": {
        "en": "True Cuts"
      },
      "parent_id": "cuts",
      "literature_note": "Card College vol. 2, \"True Cuts\""
    },
    "false-cuts": {
      "id": "false-cuts",
      "description": "A cut that appears to rotate the packet while its order is unchanged.",
      "labels": {
        "en": "False Cuts"
      },
      "parent_id": "cuts",
      "literature_note": "Card College vol. 2, \"False Cuts\""
    },
    "deals": {
      "id": "deals",
      "description": "Transferring cards one at a time from a source to one or more destinations.",
      "labels": {
        "en": "Deals"
      },
      "literature_note": "Card College vol. 1, \"Dealing\""
    },
    "true-deals": {
      "id": "true-deals",
      "description": "A deal that transfers exactly the cards it appears to.",
      "labels": {
        "en": "True Deals"
      },
      "parent_id": "deals",
      "literature_note": "Card College vol. 1, \"Dealing\""
    },
    "false-deals": {
      "id": "false-deals",
      "description": "A deal that transfers a different card than the position it appears to deal from.",
      "labels": {
        "en": "False Deals"
      },
      "parent_id": "deals",
      "literature_note": "Card College vol. 1/vol. 3, \"Second and Bottom Dealing\""
    },
    "counts": {
      "id": "counts",
      "description": "Displaying cards one at a time to establish how many are in a packet.",
      "labels": {
        "en": "Counts"
      },
      "literature_note": "Card College vol. 3, \"Counting Techniques\""
    },
    "true-counts": {
      "id": "true-counts",
      "description": "A count whose shown tally matches the actual number of cards.",
      "labels": {
        "en": "True Counts"
      },
      "parent_id": "counts",
      "literature_note": "Card College vol. 3, \"Counting Techniques\""
    },
    "false-counts": {
      "id": "false-counts",
      "description": "A count whose shown tally differs from the actual number of cards.",
      "labels": {
        "en": "False Counts"
      },
      "parent_id": "counts",
      "literature_note": "Card College vol. 3, \"False Counts\" (Elmsley, Jordan, Hamman, Flushtration counts)"
    },
    "handling": {
      "id": "handling",
      "description": "General packet and pile manipulation not covered by a more specific family.",
      "labels": {
        "en": "Handling"
      },
      "literature_note": "Card College vol. 1, basic packet/pile handling"
    },
    "true-handling": {
      "id": "true-handling",
      "description": "Ordinary packet/pile handling with no apparent-vs-actual discrepancy.",
      "labels": {
        "en": "True Handling"
      },
      "parent_id": "handling",
      "literature_note": "Card College vol. 1, basic packet/pile handling"
    },
    "false-handling": {
      "id": "false-handling",
      "description": "Packet/pile handling that presents as a smaller or different unit than it actually is.",
      "labels": {
        "en": "False Handling"
      },
      "parent_id": "handling",
      "literature_note": "Card College vol. 1, \"Double Lifts\" and false-handling technique"
    },
    "concealment": {
      "id": "concealment",
      "description": "Secretly relocating or holding out a card from the visible packet.",
      "labels": {
        "en": "Concealment"
      },
      "literature_note": "Card College vol. 1, \"Palming\""
    },
    "forces": {
      "id": "forces",
      "description": "Fixing which card a spectator's apparently free selection yields.",
      "labels": {
        "en": "Forces"
      },
      "literature_note": "Card College vol. 4, \"Forcing\"; Annemann, 202 Methods of Forcing"
    },
    "displays": {
      "id": "displays",
      "description": "Exposing cards to observers without changing their order or orientation.",
      "labels": {
        "en": "Displays"
      },
      "literature_note": "Card College vol. 1, \"Displays\""
    },
    "preparation": {
      "id": "preparation",
      "description": "Marking or conditioning a card's physical state for later reference.",
      "labels": {
        "en": "Preparation"
      },
      "literature_note": "Vernon-derived \"get-ready\"/preparation-move terminology"
    }
  },
  "events": {
    "says": {
      "id": "says",
      "description": "Actor speaks; the spoken content is not recorded here",
      "labels": {
        "en": "Says",
        "es": "Dice",
        "fr": "Dit",
        "de": "Sagt"
      },
      "event_class": "signal",
      "parameters": {
        "cue": {
          "required": false,
          "description": "Optional literal timing/branch token, e.g. 'stop'",
          "domain": "string"
        }
      }
    },
    "indicates": {
      "id": "indicates",
      "description": "Actor points to or specifies a card, packet or pile",
      "labels": {
        "en": "Indicates",
        "es": "Indica",
        "fr": "Indique",
        "de": "Zeigt"
      },
      "event_class": "signal",
      "parameters": {
        "target_ref": {
          "required": false,
          "description": "Id of the indicated card, packet or pile",
          "domain": "string"
        }
      }
    },
    "spectator_chose": {
      "id": "spectator_chose",
      "description": "Spectator makes a choice",
      "labels": {
        "en": "Spectator Chose",
        "es": "Espectador Elige",
        "fr": "Spectateur Choisit",
        "de": "Zuschauer wählt"
      },
      "event_class": "signal"
    },
    "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"
      },
      "event_class": "signal"
    },
    "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"
      },
      "event_class": "signal"
    },
    "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"
      },
      "event_class": "signal"
    },
    "notes_card": {
      "id": "notes_card",
      "description": "Spectator privately notes a card, establishing a selection",
      "labels": {
        "en": "Notes Card",
        "es": "Anota Carta",
        "fr": "Note une Carte",
        "de": "Merkt Karte"
      },
      "event_class": "mental",
      "parameters": {
        "card_ref": {
          "required": false,
          "description": "Id of the noted card, when known",
          "domain": "string"
        }
      }
    },
    "thinks_of_card": {
      "id": "thinks_of_card",
      "description": "Spectator thinks of a card without any physical act",
      "labels": {
        "en": "Thinks Of Card",
        "es": "Piensa en Carta",
        "fr": "Pense à une Carte",
        "de": "Denkt an Karte"
      },
      "event_class": "mental"
    }
  },
  "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"
      }
    }
  }
}
