Multi-agent pipeline to generate a complete board game design from a theme, integrated with the game-rules MCP for data persistence. Includes playtest simulation and targeted fix loops.
Use this workflow to generate a complete board game design from a simple theme and set of constraints, fully integrated with the MCP for data persistence.
Autonomous Mode: This workflow runs straight through from theme to finished rulebook without stopping for user feedback. For interactive co-design with preference learning, use
/designerinstead. For phase-by-phase execution (one agent per turn, resumable across chats), use/game-gen-stepinstead.
Usage: /game-gen "<Theme>" [--profile] [--mechanics "mech_id1,mech_id2,..."]
The optional --profile flag enables Nova preference personalisation (see Step 0).
The optional --mechanics flag lets you pre-select up to 6 mechanisms from the taxonomy (see .claude/skills/BoardGameDesign/resources/mechanisms.json). Mechanism IDs use underscores (e.g. hand_management, deck_building, area_control). Hyphens are also accepted and will be normalised to underscores. The MechanicsArchitect will treat these as non-negotiable anchors and build the remaining slate around them.
create_design_session with the game name, theme, the full user prompt as initialPrompt, and optionally prePickedMechanics (see step 4 below). Note the sessionId and the sanitized gameSlug.save_draft to initialize a draft rulebook using the gameSlug.--profile was passed:
get_designer_profile--profile was NOT passed, skip this entirely — do NOT load or use the profile for biasing decisions--mechanics was passed:
area-control → area_control).claude/skills/BoardGameDesign/resources/mechanisms.json and extract all valid IDscreate_design_session as prePickedMechanics### Pre-Picked Mechanics
The following mechanism IDs have been pre-selected by the user and are non-negotiable anchors:
- {id1}
- {id2}
...
--profile and --mechanics are provided: pre-picks take priority as anchors; include the Profile Context block so the MechanicsArchitect can use profile affinities when filling any remaining slotsPreference Learning (always on): Regardless of
--profile, this pipeline records every design decision viarecord_decisionafter each step (Steps 1-4, 6). This accumulates designer preference data for future use without influencing the current run.
Spawn the mechanics-architect subagent with sessionId, gameSlug, theme, and optionally the Profile Context block and/or the Pre-Picked Mechanics block.
The agent will:
list_references(type: "mechanism") to check existing patterns.claude/skills/BoardGameDesign/resources/mechanisms.json taxonomyadd_design_step to log output (with trace block — see Forensic Traces below)save_reference for each mechanismupdate_rule(path: "mechanics") to write to draftAfter the agent completes: Call record_decision with decision: "accept", a rationale summarizing the key mechanism choices, and impactedMechanisms listing the selected mechanism IDs. This feeds the preference learning system without biasing the current run.
Optionally run a quick structural check:
npx ts-node .claude/skills/BoardGameDesign/scripts/consistency_checker.ts game-data/{gameSlug}/rulebooks/draft.json
If more than 3 warnings appear, ask the MechanicsArchitect to reconsider or proceed cautiously to the next step.
Spawn the theme-weaver subagent with sessionId and gameSlug.
The agent will:
add_design_step to log output (with trace block)update_rule(path: "overview") and update_rule(path: "metadata.thematicBrief")After the agent completes: Call record_decision with decision: "accept", a rationale summarizing the thematic direction, and impactedMechanisms listing the mechanism IDs that were themed.
Spawn the component-designer subagent with sessionId and gameSlug.
The agent will:
add_design_step to log output (with trace block)update_rule(path: "components") to write Component Manifest to draftsave_reference for each major deck/component setAfter the agent completes: Call record_decision with decision: "accept", a rationale summarizing the component strategy, and impactedMechanisms listing mechanisms that each component supports.
Run the consistency checker to verify component/rule alignment:
npx ts-node .claude/skills/BoardGameDesign/scripts/consistency_checker.ts game-data/{gameSlug}/rulebooks/draft.json
update_rule to apply targeted fixes, re-run until threshold is metSpawn the details-architect subagent with sessionId and gameSlug.
The agent will:
add_design_step to log output (with trace block)update_rule for every rulebook section (overview, setup, turn-structure, actions, scoring, special-rules, edge-cases, quick-reference)save_reference(name: "setup_manifest", type: "setup")After the agent completes: Call record_decision with decision: "accept", a rationale summarizing the rulebook structure and key design choices, and impactedMechanisms listing all mechanisms that now have written rules.
Spawn the setup-validator subagent with sessionId and gameSlug.
The agent will:
add_design_step to log outputIf NEEDS_FIXES: Use update_rule to apply setup corrections. Re-run SetupValidator if many fixes were needed.
Spawn the simulation-runner subagent with sessionId, gameSlug, and playerCount (default: 2).
The agent:
add_design_step (stepNumber: 5, persona: "SimulationRunner") and save_reference (name: "simulation_report")After: Call record_decision based on the simulation verdict:
decision: "accept", rationale summarizing the simulation findings, impactedMechanisms for any flagged mechanismsdecision: "defer", rationale noting which metrics were borderlinedecision: "reject", rationale listing metrics below threshold; surface findings to the user and ask whether to proceed to Step 6 or iterateRun the /game-critique skill against the gameSlug with sessionId and gameSlug parameters. The skill will:
mechanics — update if parameters, costs, resource flows, or token caps changedoverview — update if theme, player count, or win condition changedquick-reference — must always reflect the latest parameters
Use batch mode update_rule with updates array to update all affected sections in one call.After critique completes: For each fix that was applied, call record_decision with decision: "accept", a rationale describing the fix, and the impactedMechanisms. For any unresolved issues surfaced to the user, call record_decision with decision: "defer".
promote_draft to move draft to latest.jsoncompile_markdown_rulebook to generate human-readable Markdownrebuild_reference_index to update reference librarysave_reference with:
name: {gameSlug}-briefgame: {gameSlug}version: latesttype: game-briefcontent: A ~200-word summary drawn from all design steps covering theme, player count, mechanisms, components, and win conditionDone: The game is fully designed, critiqued, compiled, and persisted.
Every subagent step (1-4) includes a trace block in its add_design_step call. This is the Nova Loop evidence format:
{
"observation": "What was produced or decided",
"data": { "key_metrics": "or parameters" },
"mechanism": "The design principle or mechanism driving the decision",
"impact": "How this affects the overall game experience"
}
Example (MechanicsArchitect):
{
"observation": "Selected action-point system with 3 AP per turn as the core loop driver",
"data": { "mechanisms": ["action_points", "set_collection", "area_control"], "complexity": 3 },
"mechanism": "Action points create tension through constrained choice; set collection provides a secondary goal that rewards long-term planning",
"impact": "Players face meaningful decisions each turn without analysis paralysis; 3 AP keeps turns under 2 minutes"
}
These traces are persisted in the design session and can be reviewed via get_design_session(includeFull: true). The /designer skill's Nova Loop uses them for synthesize_nova_advice.
trace block linking decisions to evidence (GameGrammar 2.0 "Forensic Persistence")record_decision is called after every step, accumulating designer preferences for future runs — without biasing the current run (bias requires explicit --profile)simulation-runner subagent — 3 games × 3 strategies, 4 heuristic scores, empirical evidence for criticsupdate_rule)