El estado vive en el motor: cartas, jugadores, fichas, metas del castillo. Al modelo se le envía un retrato del estado en JSON —jugador, mano, fichas, lo que ha pasado— y devuelve una decisión. El motor comprueba si esa decisión es legal y, si lo es, la aplica. Nunca al revés: el modelo no toca el estado.
Cada efecto de carta es una función escrita a mano sobre el estado. El modelo no sabe cómo funciona el efecto de una carta: solo sabe que existe una opción con ese nombre. Toda la parte que se puede equivocar queda fuera de las reglas, y toda la parte de las reglas no depende de nadie.
El motor es determinista cuando no interviene la IA. Los dados salen de un generador con semilla, así que una partida es repetible: si algo se rompe en el asalto sesenta y tres, se vuelve a jugar el asalto sesenta y tres y se mira. Sin eso, depurar un juego por simulación es imposible.
Cinco textos de instrucciones: uno con las reglas del juego y cuatro perfiles estratégicos distintos —jugador de equipo, repartidor de equipo, jugador conservador, repartidor conservador—, porque el mismo modelo debe parecer un estilo de juego distinto según a quién represente.
estado del juego (motor, con semilla)
→ retrato en JSON · 4 prompts de rol
→ POST /api/generate · format="json" · temperatura 0,25 · sin streaming
→ json.loads estricto · si falla, recortar { … }
→ normalizar contra el vocabulario del juego
→ el motor valida la legalidad · aplica · siguiente jugador
→ 2 fallos seguidos ⇒ IA apagada, heurística local el resto de partida