{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "Commander AI Lab — Per-Game Log Schema v1", "description": "Optional detailed log for a single simulated game.", "type": "object", "required": ["gameIndex", "batchId", "turns"], "properties": { "gameIndex": { "type": "integer" }, "batchId": { "type": "string" }, "gameSeed": { "type": "integer" }, "turns": { "type": "array", "items": { "type": "object", "required": ["turnNumber", "activeSeat", "phases"], "properties": { "turnNumber": { "type": "integer", "minimum": 1 }, "activeSeat": { "type": "integer", "minimum": 0, "maximum": 2 }, "phases": { "type": "array", "items": { "type": "object", "required": ["phase"], "properties": { "phase": { "type": "string", "enum": ["untap", "upkeep", "draw", "main1", "combat_begin", "declare_attackers", "declare_blockers", "combat_damage", "combat_end", "main2", "end", "cleanup"] }, "actions": { "type": "array", "items": { "type": "object", "properties": { "type": { "type": "string", "enum": ["play_land", "cast_spell", "activate_ability", "attack", "block", "trigger", "resolve", "mulligan", "pass_priority"] }, "card": { "type": "string" }, "targets": { "type": "array", "items": { "type": "string" } }, "seat": { "type": "integer" }, "manaSpent": { "type": "string" }, "notes": { "type": "string" } } } }, "boardState": { "type": "object", "description": "Snapshot of board state after this phase (optional, expensive)", "properties": { "players": { "type": "array", "items": { "type": "object", "properties": { "seat": { "type": "integer" }, "life": { "type": "integer" }, "handSize": { "type": "integer" }, "librarySize": { "type": "integer" }, "permanentCount": { "type": "integer" }, "graveyardSize": { "type": "integer" } } } } } } } } } } } }, "outcome": { "type": "object", "properties": { "winningSeat": { "type": ["integer", "null"] }, "winCondition": { "type": "string" }, "totalTurns": { "type": "integer" }, "finalLifeTotals": { "type": "array", "items": { "type": "integer" } } } } } }