{"@self_hash":"sha256:93c3fa8b6578b8b15ef5a823c80e05dec5c02e7d49655058bbf4b717a746fb16","@encoding":"cambridge-tcg/universal/v1","@kind":"play_module_index","@content_hash":"sha256:373bb5197e2488d50ae1d67a184daff035c2b889f297178f1f5ed235805add28","@retrieved_at":{"iso8601":"2026-05-13T19:43:08.210Z","unix_epoch_seconds":1778701388},"_note_opaque":["resources[].blurb"],"_links":{"canonical":"/api/v1/play/index.json","html_sibling":"/play/spec","methodology":"/methodology/play-module","connections":["docs/connections/the-play-substrate.md","docs/connections/the-play-structure.md","docs/connections/the-play-interconnect.md"],"manifest":"/api/v1/manifest","see_also":{"tutorial":"/api/v1/play/tutorial","glossary":"/api/v1/play/glossary","archetypes":"/api/v1/play/archetypes","game_state_schema":"/api/v1/play/game-state-schema","effect_grammar":"/api/v1/play/effect-grammar","deck_validate":"/api/v1/play/deck/validate","example_match":"/api/v1/play/example-match"},"openapi":"/api/openapi.json#/paths/~1api~1v1~1play~1index.json/get"},"module":"play","module_methodology_url":"/methodology/play-module","resource_count":31,"counts":{"shipped":30,"designed":1,"planned":0},"layers":["L0_doc","L1_contract","L2_pure_fn","L3_runtime","L4_engine","UI","policy"],"archetypes":["hobbyist","collector","competitor"],"fun_first_stance":"The play module carries no commerce affordances. Ratings are skill, not money. Prize pools live under future play-to-earn opt-in (L4+, separate kingdom).","resources":[{"id":"methodology_play_module","path_or_file":"/methodology/play-module","kind":"methodology_page","layer":"L0_doc","status":"shipped","blurb":"The play module's methodology page — four player kinds + three archetypes + assumption table.","url":"/methodology/play-module","composes_with":[],"serves_archetypes":["hobbyist","collector","competitor"]},{"id":"guide_how_to_play","path_or_file":"/guides/how-to-play","kind":"html_page","layer":"L0_doc","status":"shipped","blurb":"SEO-rich English beginner's guide; ~15-minute read; complete OPTCG rules.","url":"/guides/how-to-play","composes_with":["api_tutorial"],"serves_archetypes":["hobbyist"]},{"id":"research_mechanics","path_or_file":"docs/research/optcg-mechanics-and-engine-design.md","kind":"design_doc","layer":"L0_doc","status":"shipped","blurb":"Deep-dive synthesis: official Bandai rules + hobbyist-sim landscape + seven design choices for future engine.","composes_with":["api_tutorial","api_glossary","lib_effect_tokens"],"serves_archetypes":["competitor"]},{"id":"research_l3_design","path_or_file":"docs/research/play-engine-l3-design.md","kind":"design_doc","layer":"L0_doc","status":"shipped","blurb":"L3 runtime substrate spec — event-sourced wire format, state machine, async-mode timers.","composes_with":["lib_types"],"serves_archetypes":["competitor"]},{"id":"api_tutorial","path_or_file":"/api/v1/play/tutorial","kind":"json_endpoint","layer":"L1_contract","status":"shipped","blurb":"Machine-readable OPTCG tutorial in math-mirror form. Nine sections with typed rule_structure + examples + keyword cross-refs.","url":"/api/v1/play/tutorial","composes_with":["api_glossary","api_game_state_schema","api_tutorial_section"],"serves_archetypes":["hobbyist","competitor"]},{"id":"api_tutorial_section","path_or_file":"/api/v1/play/tutorial/[section_id]","kind":"json_endpoint","layer":"L1_contract","status":"shipped","blurb":"Single tutorial section by id (deep link from glossary cross-refs). 404 with helpful body when id absent.","url":"/api/v1/play/tutorial","composes_with":["api_tutorial","api_glossary"],"serves_archetypes":["hobbyist","competitor"]},{"id":"api_glossary","path_or_file":"/api/v1/play/glossary","kind":"json_endpoint","layer":"L1_contract","status":"shipped","blurb":"Multi-cultural OPTCG term glossary — 21 terms each with English + Japanese (kanji/kana + romaji) + structural definition decoderable without natural-language knowledge.","url":"/api/v1/play/glossary","composes_with":["api_tutorial","api_effect_grammar","api_glossary_term"],"serves_archetypes":["hobbyist","collector","competitor"]},{"id":"api_glossary_term","path_or_file":"/api/v1/play/glossary/[term_id]","kind":"json_endpoint","layer":"L1_contract","status":"shipped","blurb":"Single glossary term by id (deep link from tutorial cross-refs). 404 with helpful body when id absent.","url":"/api/v1/play/glossary","composes_with":["api_glossary","api_tutorial"],"serves_archetypes":["hobbyist","collector","competitor"]},{"id":"api_archetypes","path_or_file":"/api/v1/play/archetypes","kind":"json_endpoint","layer":"L1_contract","status":"shipped","blurb":"Three player archetypes (hobbyist / collector / competitor) typed taxonomy. financial_boundary block declares fun-first stance.","url":"/api/v1/play/archetypes","composes_with":["page_welcome"],"serves_archetypes":["hobbyist","collector","competitor"]},{"id":"api_game_state_schema","path_or_file":"/api/v1/play/game-state-schema","kind":"json_endpoint","layer":"L1_contract","status":"shipped","blurb":"Canonical OPTCG match-state shape — nine zones, five phases, four combat steps with strict-greater damage rule, three win conditions.","url":"/api/v1/play/game-state-schema","composes_with":["api_effect_grammar","lib_types"],"serves_archetypes":["competitor"]},{"id":"api_effect_grammar","path_or_file":"/api/v1/play/effect-grammar","kind":"json_endpoint","layer":"L1_contract","status":"shipped","blurb":"Card-text effect-token vocabulary — 12 structural markers + 4 keywords + 4 effect categories + 7 targeting-language phrases.","url":"/api/v1/play/effect-grammar","composes_with":["lib_effect_tokens","api_glossary"],"serves_archetypes":["collector","competitor"]},{"id":"api_example_match","path_or_file":"/api/v1/play/example-match","kind":"json_endpoint","layer":"L1_contract","status":"shipped","blurb":"Sample MatchEvent + Intent sequence demonstrating lib/play/types.ts. First consumer of the L3 type skeleton; gives agents and engine builders a concrete shape to test against.","url":"/api/v1/play/example-match","composes_with":["lib_types","api_game_state_schema","research_l3_design"],"serves_archetypes":["competitor"]},{"id":"lib_deck_legality","path_or_file":"apps/storefront/src/lib/play/deck-legality.ts","kind":"library_file","layer":"L2_pure_fn","status":"shipped","blurb":"Pure function checkDeckLegality(declaration, cardMetadataLookup) → DeckLegalityResult. Returns ALL violations with stable codes.","composes_with":["api_deck_validate"],"serves_archetypes":["hobbyist","competitor"]},{"id":"lib_effect_tokens","path_or_file":"apps/storefront/src/lib/play/effect-tokens.ts","kind":"library_file","layer":"L2_pure_fn","status":"shipped","blurb":"Pure function parseEffectText(rawEffect) → ParsedEffect. Walks card-text, emits typed tokens, preserves body_opaque for 20% residue.","composes_with":["api_effect_grammar"],"serves_archetypes":["collector","competitor"]},{"id":"lib_types","path_or_file":"apps/storefront/src/lib/play/types.ts","kind":"library_file","layer":"L2_pure_fn","status":"shipped","blurb":"TypeScript L3 type skeleton — 10 vocabulary unions + 5 state-shape interfaces + MatchEvent 28-variant union + Intent 14-variant union. First consumer: /api/v1/play/example-match.","composes_with":["api_game_state_schema","research_l3_design","api_example_match"],"serves_archetypes":["competitor"]},{"id":"lib_tutorial_sections","path_or_file":"apps/storefront/src/lib/play/tutorial-sections.ts","kind":"library_file","layer":"L2_pure_fn","status":"shipped","blurb":"Tutorial section catalog (9 sections, typed). Imported by the collection endpoint /api/v1/play/tutorial and the per-section endpoint /api/v1/play/tutorial/[section_id].","composes_with":["api_tutorial","api_tutorial_section"],"serves_archetypes":["hobbyist","competitor"]},{"id":"lib_glossary_terms","path_or_file":"apps/storefront/src/lib/play/glossary-terms.ts","kind":"library_file","layer":"L2_pure_fn","status":"shipped","blurb":"Glossary term catalog (21 terms, typed). Imported by the collection endpoint /api/v1/play/glossary and the per-term endpoint /api/v1/play/glossary/[term_id].","composes_with":["api_glossary","api_glossary_term"],"serves_archetypes":["hobbyist","collector","competitor"]},{"id":"lib_resources","path_or_file":"apps/storefront/src/lib/play/resources.ts","kind":"library_file","layer":"L2_pure_fn","status":"shipped","blurb":"THIS file. Single source of truth for the play module's resource catalog. /play/spec and /api/v1/play/index.json both consume from here.","composes_with":["page_spec","api_play_index"],"serves_archetypes":["competitor"]},{"id":"api_deck_validate","path_or_file":"/api/v1/play/deck/validate","kind":"json_endpoint","layer":"L2_pure_fn","status":"shipped","blurb":"POST endpoint exposing the deck-legality validator. Substrate-honest about color-check graceful degradation.","url":"/api/v1/play/deck/validate","composes_with":["lib_deck_legality","page_deck_check"],"serves_archetypes":["hobbyist","competitor"]},{"id":"match_runtime","path_or_file":"/api/v1/play/match/[id] + websocket","kind":"json_endpoint","layer":"L3_runtime","status":"designed","blurb":"Live tabletop runtime — event-sourced match state, server-as-sequencer, async-friendly. Designed but not yet built (~3-4 weeks).","composes_with":["lib_types","research_l3_design","api_example_match"],"serves_archetypes":["hobbyist","competitor"]},{"id":"page_lobby","path_or_file":"/play","kind":"html_page","layer":"UI","status":"shipped","blurb":"The lobby. Public rooms, private rooms by code.","url":"/play","composes_with":[],"serves_archetypes":["hobbyist","competitor"]},{"id":"page_welcome","path_or_file":"/play/welcome","kind":"html_page","layer":"UI","status":"shipped","blurb":"Polymorphic landing — three archetypes × player kinds; 17 paths visible.","url":"/play/welcome","composes_with":["api_archetypes"],"serves_archetypes":["hobbyist","collector","competitor"]},{"id":"page_casual","path_or_file":"/play/casual","kind":"html_page","layer":"UI","status":"shipped","blurb":"Hobbyist's opinionated entry. Rating hidden by default; friendly matches; adventure mode; fun-first explicit.","url":"/play/casual","composes_with":["page_lobby","page_adventure"],"serves_archetypes":["hobbyist"]},{"id":"page_compete","path_or_file":"/play/compete","kind":"html_page","layer":"UI","status":"shipped","blurb":"Competitor's opinionated entry. Shipped-vs-planned status table; agent ladder live; tournament substrate planned.","url":"/play/compete","composes_with":[],"serves_archetypes":["competitor"]},{"id":"page_adventure","path_or_file":"/play/adventure","kind":"html_page","layer":"UI","status":"shipped","blurb":"Single-player PvE against AI opponents, scaling difficulty.","url":"/play/adventure","composes_with":["page_adventure_level"],"serves_archetypes":["hobbyist"]},{"id":"page_adventure_level","path_or_file":"/play/adventure/[levelId]","kind":"html_page","layer":"UI","status":"shipped","blurb":"A single adventure level — one PvE match against the scripted opponent for this level.","url":"/play/adventure","composes_with":["page_adventure"],"serves_archetypes":["hobbyist"]},{"id":"page_deck_check","path_or_file":"/play/deck-check","kind":"html_page","layer":"UI","status":"shipped","blurb":"HTML adoption site for the deck-legality validator. Paste card IDs; see typed violations + substrate-honest perimeter.","url":"/play/deck-check","composes_with":["api_deck_validate"],"serves_archetypes":["hobbyist","competitor"]},{"id":"page_spec","path_or_file":"/play/spec","kind":"html_page","layer":"UI","status":"shipped","blurb":"Play module's own directory of itself — rendered from lib/play/resources.ts; HTML sibling of /api/v1/play/index.json.","url":"/play/spec","composes_with":["api_play_index","lib_resources"],"serves_archetypes":["competitor"]},{"id":"page_match","path_or_file":"/play/[code]","kind":"html_page","layer":"UI","status":"shipped","blurb":"Existing match page. Client-side state today; L3+ upgrades to event-sourced server-authoritative.","composes_with":[],"serves_archetypes":["hobbyist","competitor"]},{"id":"api_play_index","path_or_file":"/api/v1/play/index.json","kind":"json_endpoint","layer":"UI","status":"shipped","blurb":"Machine-readable directory of every play resource. Sister to /play/spec (HTML); both render from lib/play/resources.ts.","url":"/api/v1/play/index.json","composes_with":["page_spec","lib_resources"],"serves_archetypes":["competitor"]},{"id":"policy_fun_first","path_or_file":"Fun-first boundary","kind":"design_doc","layer":"policy","status":"shipped","blurb":"The play module is for fun only. No earnings, commission, store credit on play surfaces. Ratings are skill, not money. Prize pools live under future play-to-earn opt-in.","url":"/methodology/play-module","composes_with":[],"serves_archetypes":["hobbyist","collector","competitor"]}]}