Use when designing or repairing what makes a game fun — verbs and mechanics, moment-to-moment/session/meta loops, progression, economy faucets and sinks, difficulty curves, dominant strategies, juice, prototyping and scope. NOT engine code (that is `godot`), NOT story (that is `game-storytelling`), NOT level layout (that is `level-design`).
npx skills add https://github.com/ericrisco/rsc-harness --skill game-design
Engine-agnostic game design: mechanics, loops, progression, economy, balance, feel, and the discipline of prototyping and scope. No engine APIs live here — when the design is settled, the implementation belongs to godot, unity, or unreal.
Two premises govern everything below. Fun is discovered, not designed — you cannot reason your way to a fun game on paper, you find it by building the smallest playable version and playing it, so every hour spent planning a mechanic you have not prototyped is an hour spent guessing. And a game is the set of verbs it gives the player plus the loops those verbs live in — art, story, and levels dress that skeleton; if the skeleton is not fun in greybox, nothing dresses it into fun.
Route elsewhere when the ask is not design:
| The ask | Route to | Why not here |
| --- | --- | --- |
| Write the movement/AI/shader/save code | godot / unity / unreal | This skill decides *what* to build; the engine skill builds it. |
| Author the story, dialogue, characters, lore | game-storytelling | Narrative design is its own craft; this skill owns systems and verbs. |
| Lay out a level, encounter, or world map | level-design | Spatial/encounter design applies the mechanics this skill defines. |
| Netcode, prediction, lag compensation | gamedev-multiplayer | A technical domain, not core design intent. |
| Ship / store page / build pipeline | gamedev-shipping | Release logistics, not design. |
A game is loops nested inside loops. Each layer must reward on its own and feed motivation to the layer above it.
moment-to-moment (seconds) the primary verb: aim+fire, jump, place, click, parry
│ feeds
session loop (minutes) a run / match / mission: setup → tension → resolution
│ feeds
meta loop (sessions) mastery, unlocks, collection, rank — why you return tomorrow
Depth vs breadth of loops, feedback-loop math, and worked loop teardowns: references/mechanics-and-loops.md.
Mechanics → Dynamics → Aesthetics. The designer authors Mechanics (rules, entities, numbers). At runtime those produce Dynamics (emergent behavior as players interact). Players only ever feel the Aesthetics (the emotional response). You design left-to-right; the player experiences right-to-left — so you must reason backward from the feeling you want to the rule that causes it.
The eight aesthetics with examples, emergence vs scripted content, and interaction-depth heuristics: references/mechanics-and-loops.md.
Progression controls the rate at which the game reveals its depth; economy is the currency plumbing underneath it.
Model the drift with the core identity — no engine needed, a spreadsheet does it:
net_income_rate = faucet_rate − sink_rate
time_to_afford = cost / net_income_rate # tune this against desired pacing
cost(n) = base × growth^n # escalating sink; growth ≈ 1.07–1.15
net_income_rate rises over time, costs must rise at least as fast or currency becomes meaningless (hyperinflation, trivialized late game). Fixes: escalating/exponential sinks, consumable sinks, caps, prestige resets.Currency taxonomies, inflation math, prestige/reset design, and a balancing-spreadsheet layout: references/progression-and-economy.md.
Flow-channel tuning, dominant-strategy detection, symmetry vs asymmetry, and difficulty-option patterns: references/progression-and-economy.md.
Game feel is the tactile sensation of control — the moment-to-moment made physical. It is a design concern here; the engine skills implement the effects.
godot / unity / unreal.Playtest protocols, metrics/retention definitions, the prototyping ladder, and concrete scope-cutting tactics: references/playtesting-and-scope.md.
| Anti-pattern | Why it bites | Do instead |
| --- | --- | --- |
| Designing on paper for months before building | Fun is only found by playing | Prototype the riskiest assumption first |
| "Make it more fun" as a task | Unactionable | Name the target MDA aesthetic and the mechanic behind it |
| Adding features instead of deepening verbs | Wide-and-shallow, no mastery | Deepen verb interaction before adding verbs |
| Currency with no sink | Meaningless clutter, inflation | Give every currency a distinct sink or cut it |
| Faucets outpacing sinks | Hyperinflation, trivial late game | Escalating/consumable sinks, caps, prestige |
| Unchecked positive feedback loop | Leader snowballs, match ends early | Add negative feedback / catch-up, tuned gently |
| One dominant strategy left standing | Choice dies, meta collapses | Nerf outlier / buff counters toward intransitive balance |
| Tuning five knobs at once | Can't attribute cause | Change one high-leverage variable at a time |
| Hard-coded balance constants | No iteration, no A/B, needs rebuild | Externalize tunables into data |
| Guiding testers during playtests | Contaminates the first-time signal | Watch silently; weight behavior over opinion |
| Scope creep / feature list as ambition | #1 indie killer | Cut features not quality; ship a vertical slice |
| 100-page design bible | Nobody reads it; goes stale | Living one-pager + pillars |
If the workspace has a 02-DOCS/ harness, record the design in 02-DOCS/wiki/design/ — a game-design.md one-pager (hook, core loop, verbs, pillars, MVP scope, what's out) plus an economy.md if there is a currency system. Write each as an OKF v0.1 wiki article per the harness wiki-article-template.md: YAML frontmatter with a non-empty type: (use type: design), a timestamp in ISO 8601, and standard markdown links — never wikilinks. Index it in 02-DOCS/wiki/index.md. This is recorded, not gated — skip silently if there is no harness.
godot/unity/unreal; narrative to game-storytelling; layout to level-design.Take ericrisco/game-design from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.