{
  "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."
  }
}