Handbook
LCDL game tasks — index (alphabetical)
Contracts live under src/forge_lcdl/contracts/
| task_id | Purpose | Key inputs | Outputs (success) | Core validations | private / hidden-info |
|---|---|---|---|---|---|
game_move_explain |
Natural-language explanation for a chosen legal move | player_view, legal_moves, selected_move_id, optional utterance |
move_id, explanation, facts_used, caveats |
selected_move_id must be legal before LLM call; response move_id must match verbatim |
Caller must populate player_view.public/private so secrets are appropriate; private is echoed only if orchestrator trusts the model boundary |
game_move_parse |
Map NL utterance to legal ids | player_view, legal_moves, utterance |
status ∈ {selected,ambiguous,illegal_or_unmatched} + move ids / subsets |
Invented move_id rejected; ambiguity lists subset of legal ids |
Same private caveat as above |
game_move_rank |
Ordinal ranking + plan text | player_view, legal_moves, objective, heuristic_scores (keys ⊆ legal ids), style |
ranked_moves, overall_plan, risk_notes |
Rows use legal move_id; ranks 1…k permutation; numeric confidence [0,1] |
heuristic_scores must align with disclosed position only |
Older board-game scaffolding tasks (board_game_*) live in board_game_tasks_v1.py targeting the game_engine types — keep separate until converged.
Checklist — contract uniformity
Every game_move_* v1 note should expose:
- Invariants — no invented move identifiers.
- Input — required keys and typing.
- Output — fields and enums.
- Hidden information — tasks must receive seat-filtered
player_viewonly.