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.

Updated

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.

Failure modes

  • TransportFailure — chat transport errors.
  • ParseFailure — assistant output not valid JSON.
  • SchemaFailure — input or output rejected vs contract schemas.
  • GatewayFailure — upstream/provider errors.

Verification

Task-internal validation and JSON schema checks per contract.json verification_policy.

Changelog

  • v1 — Maintained in catalog; see git history for semantic changes.