forge-lcdl

board_game_choose_move v1

Invariant: The model may only return a chosen_move_id copied from the provided legal_moves list. Invented ids are rejected at validation time.

Input: player_view (JSON object), legal_moves (non-empty list of {move_id, public_summary}), optional coach_hint (string), optional timeout_sec, temperature.

Prompt style: Omit prompt_style or set prompt_style: "minimal" for the original short system prompt and a user envelope containing only player_view, legal_moves, and coach_hint.

Direct LLM variant: prompt_style: "direct" additionally requires rules_digest (short prose for this game) and prior_plies (list of past plies {ply_index?, seat, move_id, public_summary}; may be empty at game start). The runner uses an expanded system prompt that references rules and move history. Build this payload with task_input_choose_move_direct_llm in forge_lcdl.game_lcdl.plan.

Output: {chosen_move_id: string, reason?: string, ...} parsed from assistant JSON. chosen_move_id must equal one of the input move_id values.