@ericrisco/rsc 0.1.34 → 0.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +28 -2
  2. package/manifest.json +241 -2
  3. package/package.json +1 -1
  4. package/scripts/lib/domains.js +1 -0
  5. package/scripts/lib/recommend.js +4 -0
  6. package/skills/agent-eval/SKILL.md +1 -1
  7. package/skills/analyze/SKILL.md +1 -1
  8. package/skills/brand-voice/SKILL.md +1 -1
  9. package/skills/brand-voice/references/voice-guide-template.md +14 -0
  10. package/skills/building-agents/SKILL.md +2 -2
  11. package/skills/competitor-watch/SKILL.md +9 -4
  12. package/skills/competitor-watch/references/tracker-schema.md +19 -0
  13. package/skills/constitution/references/constitution-template.md +10 -0
  14. package/skills/content-engine/SKILL.md +1 -1
  15. package/skills/content-engine/references/brief-and-pipeline.md +15 -1
  16. package/skills/course-builder/references/grounding-and-scoping.md +23 -0
  17. package/skills/course-storytelling/references/learner-grounding.md +22 -2
  18. package/skills/decision-records/SKILL.md +14 -1
  19. package/skills/decision-records/references/templates.md +20 -0
  20. package/skills/design/references/brand-grounding.md +11 -1
  21. package/skills/game-design/SKILL.md +170 -0
  22. package/skills/game-design/evals/README.md +13 -0
  23. package/skills/game-design/evals/cases.yaml +47 -0
  24. package/skills/game-design/references/mechanics-and-loops.md +78 -0
  25. package/skills/game-design/references/playtesting-and-scope.md +58 -0
  26. package/skills/game-design/references/progression-and-economy.md +70 -0
  27. package/skills/game-storytelling/SKILL.md +159 -0
  28. package/skills/game-storytelling/evals/README.md +28 -0
  29. package/skills/game-storytelling/evals/cases.yaml +51 -0
  30. package/skills/game-storytelling/references/branching-and-state.md +134 -0
  31. package/skills/game-storytelling/references/dialogue-tools.md +117 -0
  32. package/skills/game-storytelling/references/environmental-storytelling.md +71 -0
  33. package/skills/gamedev-multiplayer/SKILL.md +250 -0
  34. package/skills/gamedev-multiplayer/evals/README.md +12 -0
  35. package/skills/gamedev-multiplayer/evals/cases.yaml +44 -0
  36. package/skills/gamedev-multiplayer/references/godot-high-level-multiplayer.md +133 -0
  37. package/skills/gamedev-multiplayer/references/prediction-and-latency.md +104 -0
  38. package/skills/gamedev-multiplayer/references/unity-and-unreal-netcode.md +166 -0
  39. package/skills/gamedev-pathing/SKILL.md +242 -0
  40. package/skills/gamedev-pathing/evals/README.md +14 -0
  41. package/skills/gamedev-pathing/evals/cases.yaml +49 -0
  42. package/skills/gamedev-pathing/references/navmesh-workflow.md +110 -0
  43. package/skills/gamedev-pathing/references/search-algorithms.md +135 -0
  44. package/skills/gamedev-pathing/references/steering-and-avoidance.md +120 -0
  45. package/skills/gamedev-physics/SKILL.md +225 -0
  46. package/skills/gamedev-physics/evals/README.md +12 -0
  47. package/skills/gamedev-physics/evals/cases.yaml +54 -0
  48. package/skills/gamedev-physics/references/character-controllers.md +120 -0
  49. package/skills/gamedev-physics/references/determinism-and-queries.md +124 -0
  50. package/skills/gamedev-physics/references/layers-and-masks.md +115 -0
  51. package/skills/gamedev-shaders/SKILL.md +252 -0
  52. package/skills/gamedev-shaders/evals/README.md +14 -0
  53. package/skills/gamedev-shaders/evals/cases.yaml +45 -0
  54. package/skills/gamedev-shaders/references/effect-recipes.md +205 -0
  55. package/skills/gamedev-shaders/references/godot-shading-language.md +133 -0
  56. package/skills/gamedev-shaders/references/unity-and-unreal-shaders.md +169 -0
  57. package/skills/gamedev-shipping/SKILL.md +236 -0
  58. package/skills/gamedev-shipping/evals/README.md +9 -0
  59. package/skills/gamedev-shipping/evals/cases.yaml +55 -0
  60. package/skills/gamedev-shipping/references/mobile-and-desktop.md +127 -0
  61. package/skills/gamedev-shipping/references/stores-and-ci.md +162 -0
  62. package/skills/gamedev-shipping/references/web-export-headers.md +140 -0
  63. package/skills/godot/SKILL.md +319 -0
  64. package/skills/godot/evals/README.md +13 -0
  65. package/skills/godot/evals/cases.yaml +50 -0
  66. package/skills/godot/references/export-and-testing.md +102 -0
  67. package/skills/godot/references/gdscript-style.md +84 -0
  68. package/skills/godot/references/godot3-to-4-traps.md +89 -0
  69. package/skills/godot/references/nodes-scenes-resources.md +109 -0
  70. package/skills/harness/SKILL.md +3 -3
  71. package/skills/harness/references/daily-curation-automation.md +8 -6
  72. package/skills/harness/references/obsidian-scaffolding.md +16 -9
  73. package/skills/harness/references/wiki-article-template.md +31 -14
  74. package/skills/harness/references/wiki-index-template.md +7 -3
  75. package/skills/harness/references/wiki-protocol.md +120 -54
  76. package/skills/harness/references/wiki-worklog-template.md +5 -1
  77. package/skills/instagram-api/SKILL.md +8 -1
  78. package/skills/instagram-api/references/insights-metrics.md +8 -1
  79. package/skills/knowledge-ops/SKILL.md +9 -9
  80. package/skills/knowledge-ops/evals/cases.yaml +1 -1
  81. package/skills/knowledge-ops/references/gardening-playbook.md +18 -8
  82. package/skills/level-design/SKILL.md +175 -0
  83. package/skills/level-design/evals/README.md +35 -0
  84. package/skills/level-design/evals/cases.yaml +58 -0
  85. package/skills/level-design/references/blockout-to-art.md +118 -0
  86. package/skills/level-design/references/guidance-and-readability.md +152 -0
  87. package/skills/level-design/references/pacing-and-encounters.md +142 -0
  88. package/skills/linkedin-api/SKILL.md +10 -1
  89. package/skills/linkedin-strategy/SKILL.md +12 -0
  90. package/skills/linkedin-strategy/references/wiki-records.md +27 -1
  91. package/skills/marketing/references/brand-grounding.md +22 -2
  92. package/skills/medium-strategy/SKILL.md +12 -0
  93. package/skills/medium-strategy/references/wiki-records.md +39 -1
  94. package/skills/medium-writing/SKILL.md +19 -0
  95. package/skills/plan/references/plan-template.md +12 -1
  96. package/skills/roast-me/tools/adapters/__pycache__/__init__.cpython-312.pyc +0 -0
  97. package/skills/roast-me/tools/adapters/__pycache__/base.cpython-312.pyc +0 -0
  98. package/skills/roast-me/tools/adapters/__pycache__/claude.cpython-312.pyc +0 -0
  99. package/skills/roast-me/tools/adapters/__pycache__/codex.cpython-312.pyc +0 -0
  100. package/skills/roast-me/tools/adapters/__pycache__/gemini.cpython-312.pyc +0 -0
  101. package/skills/roast-me/tools/adapters/__pycache__/registry.cpython-312.pyc +0 -0
  102. package/skills/shortform-packaging/SKILL.md +7 -2
  103. package/skills/shortform-packaging/references/package-templates.md +13 -2
  104. package/skills/shortform-strategy/SKILL.md +30 -6
  105. package/skills/shortform-strategy/references/learning-loop-template.md +9 -1
  106. package/skills/specify/references/spec-template.md +12 -1
  107. package/skills/tiktok-api/SKILL.md +6 -2
  108. package/skills/tiktok-api/references/wiki-schema.md +38 -4
  109. package/skills/unity/SKILL.md +282 -0
  110. package/skills/unity/evals/README.md +8 -0
  111. package/skills/unity/evals/cases.yaml +43 -0
  112. package/skills/unity/references/build-and-platforms.md +65 -0
  113. package/skills/unity/references/input-system.md +102 -0
  114. package/skills/unity/references/lifecycle-deep-dive.md +75 -0
  115. package/skills/unreal/SKILL.md +270 -0
  116. package/skills/unreal/evals/README.md +12 -0
  117. package/skills/unreal/evals/cases.yaml +45 -0
  118. package/skills/unreal/references/blueprint-cpp-parity.md +109 -0
  119. package/skills/unreal/references/gameplay-framework.md +95 -0
  120. package/skills/unreal/references/packaging.md +83 -0
  121. package/skills/verify/SKILL.md +11 -1
  122. package/skills/youtube-api/SKILL.md +7 -2
  123. package/skills/youtube-api/references/wiki-schema.md +25 -4
  124. package/skills/youtube-packaging/SKILL.md +10 -2
  125. package/skills/youtube-packaging/references/description-and-chapters.md +70 -2
  126. package/skills/youtube-strategy/SKILL.md +9 -2
  127. package/skills/youtube-strategy/references/wiki-records.md +39 -6
  128. package/skills/youtube-strategy/scripts/verify.sh +4 -0
  129. package/skills/youtube-thumbnails/SKILL.md +10 -5
  130. package/skills/youtube-thumbnails/references/experiment-log-format.md +28 -2
@@ -81,9 +81,19 @@ If the user can't answer a question, that dimension stays incomplete — note th
81
81
 
82
82
  ### Profile wiki article template
83
83
 
84
- Each `02-DOCS/wiki/teaching/*.md` article follows the harness wiki format:
84
+ Each `02-DOCS/wiki/teaching/*.md` article follows the harness wiki format. It is an OKF v0.1 article: open it with YAML frontmatter carrying a non-empty `type:` (`teaching-profile`), then the H1 and body:
85
85
 
86
86
  ```markdown
87
+ ---
88
+ type: teaching-profile
89
+ title: Teaching — Learner
90
+ description: Who is learning, their level and prior knowledge, their pains and desires, and what they can DO after.
91
+ tags: [teaching, learner, profile]
92
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
93
+ topic: teaching
94
+ status: stable
95
+ ---
96
+
87
97
  # Teaching — Learner
88
98
 
89
99
  > Sources: {user interview, YYYY-MM-DD}
@@ -116,9 +126,19 @@ After this, the learner can: …
116
126
 
117
127
  ### False-beliefs article specifics
118
128
 
119
- `false-beliefs.md` must type every belief so `brunson-frameworks.md` can match it to a breaking story:
129
+ `false-beliefs.md` must type every belief so `brunson-frameworks.md` can match it to a breaking story (same OKF frontmatter; `type: teaching-profile`):
120
130
 
121
131
  ```markdown
132
+ ---
133
+ type: teaching-profile
134
+ title: Teaching — False Beliefs
135
+ description: The learner's blocking beliefs, typed vehicle / internal / external, each with a breaking story.
136
+ tags: [teaching, false-beliefs, profile]
137
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
138
+ topic: teaching
139
+ status: stable
140
+ ---
141
+
122
142
  # Teaching — False Beliefs
123
143
 
124
144
  > Sources: {user interview, YYYY-MM-DD}
@@ -56,9 +56,22 @@ Map every ADR to the **MADR 4.0.0 template** (released 2024-09-17 — the curren
56
56
 
57
57
  Required spine, in order: **Title → Status → Date → Context and Problem Statement → Decision Drivers → Considered Options → Decision Outcome → Consequences**. The MADR-optional sections (Confirmation, Pros and Cons of the Options, More Information) you add only when they pull weight.
58
58
 
59
- Minimal skeleton — this is enough for most decisions:
59
+ Minimal skeleton — this is enough for most decisions. When the ADR lives in a harness
60
+ workspace (`02-DOCS/wiki/decisions/`), it is part of an OKF v0.1 bundle, so it opens with YAML
61
+ frontmatter carrying a non-empty `type: decision` (plus the OKF-recommended `title`/`tags`/
62
+ `timestamp`). The body keeps the human-readable `- Status:`/`- Date:` lines verbatim — they are
63
+ the decision's domain record and `scripts/verify.sh` reads them, so the frontmatter is purely
64
+ additive. Cross-references use standard markdown links, never wikilinks. (In a plain code repo
65
+ under `docs/adr/`, the frontmatter is optional — OKF conformance only governs the wiki bundle.)
60
66
 
61
67
  ```markdown
68
+ ---
69
+ type: decision
70
+ title: "Choose Postgres over DynamoDB for the primary store"
71
+ tags: [adr, database, billing]
72
+ timestamp: 2026-06-02T00:00:00Z
73
+ ---
74
+
62
75
  # 7. Choose Postgres over DynamoDB for the primary store
63
76
 
64
77
  - Status: accepted
@@ -8,6 +8,17 @@ Filenames: `NNNN-title-with-dashes.md` where `NNNN` is a zero-padded sequential
8
8
 
9
9
  Store under one log only — `docs/adr/` (code repo) or `02-DOCS/wiki/decisions/` (harness workspace). Maintain an index as `docs/adr/README.md` or `0000-index.md`:
10
10
 
11
+ When the log lives in `02-DOCS/wiki/decisions/`, each ADR is a document in an OKF v0.1 bundle, so it opens with YAML frontmatter carrying a non-empty `type: decision` (plus the OKF-recommended `title`/`tags`/`timestamp`). The MADR body — `- Status:`, `- Date:`, the sections — is kept exactly as below; the frontmatter is additive and `verify.sh` keeps reading the body lines. The index file (`0000-index.md` / `README.md`) is the OKF reserved directory listing and carries **no frontmatter**. All cross-references are standard markdown links, never wikilinks. In a plain `docs/adr/` code repo the frontmatter is optional — OKF conformance governs only the wiki bundle. The OKF frontmatter block to prepend (shown once; the templates below omit it for brevity):
12
+
13
+ ```yaml
14
+ ---
15
+ type: decision
16
+ title: "<short decision title>"
17
+ tags: [adr]
18
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
19
+ ---
20
+ ```
21
+
11
22
  ```markdown
12
23
  # Decision Log
13
24
 
@@ -116,7 +127,16 @@ a test, an architecture-fitness check.>
116
127
 
117
128
  ## Worked example — `0007-choose-postgres.md`
118
129
 
130
+ Shown with the OKF frontmatter it carries when stored in `02-DOCS/wiki/decisions/`:
131
+
119
132
  ```markdown
133
+ ---
134
+ type: decision
135
+ title: "Choose Postgres over DynamoDB for the primary store"
136
+ tags: [adr, database, billing]
137
+ timestamp: 2026-06-02T00:00:00Z
138
+ ---
139
+
120
140
  # 7. Choose Postgres over DynamoDB for the primary store
121
141
 
122
142
  - Status: accepted
@@ -102,9 +102,19 @@ If the user can't answer a question, that dimension stays incomplete — note th
102
102
 
103
103
  ### Visual-identity wiki article template
104
104
 
105
- Each `02-DOCS/wiki/brand/*.md` article follows the harness wiki format:
105
+ Each `02-DOCS/wiki/brand/*.md` article follows the harness wiki format. It is an OKF v0.1 article: open it with YAML frontmatter carrying a non-empty `type:` (`brand-study`), then the H1 and body:
106
106
 
107
107
  ```markdown
108
+ ---
109
+ type: brand-study
110
+ title: Brand — Visual Identity
111
+ description: The visual personality — OKLCH color system, type pairing & scale, and radius/shadow/motion personality.
112
+ tags: [brand, visual-identity, design]
113
+ timestamp: YYYY-MM-DDTHH:MM:SSZ
114
+ topic: brand
115
+ status: stable
116
+ ---
117
+
108
118
  # Brand — Visual Identity
109
119
 
110
120
  > Sources: {user interview, YYYY-MM-DD}
@@ -0,0 +1,170 @@
1
+ ---
2
+ name: game-design
3
+ description: "Use when designing or repairing the design of a game — inventing mechanics and systems, shaping the core loop, layering moment-to-moment / session / meta loops, planning progression, economy, currencies and sinks/faucets, tuning difficulty curves and balance, killing dominant strategies, adding 'juice'/game feel as design intent, prototyping and playtesting, or controlling scope, and especially when the ask is 'why isn't my game fun'. Triggers: 'design the core loop', 'my game isn't fun / doesn't hook', 'balance the economy', 'the difficulty curve feels off', 'players found a dominant strategy', 'how do I scope this', 'reward / progression loop', 'diseñar la mecánica', 'el juego no engancha', 'com equilibro l'economia'. NOT writing engine code, scripts or shaders (route to godot/unity/unreal), NOT narrative, dialogue or story beats (route to game-storytelling), NOT level layout or encounter placement (route to level-design)."
4
+ tags: [game-design, mechanics, core-loop, balancing, progression, playtesting, scope, fun]
5
+ recommends: [level-design, game-storytelling, godot, unity, unreal]
6
+ profiles: [full]
7
+ origin: risco
8
+ ---
9
+
10
+ # Design games that are fun on purpose
11
+
12
+ 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`.
13
+
14
+ ## The one rule
15
+
16
+ > 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. Every hour spent planning a mechanic you have not prototyped is an hour spent guessing. Prototype the riskiest assumption first, play it, then decide.
17
+
18
+ > The design of a game is the set of **verbs** it gives the player plus the **loops** those verbs live in. Everything else — art, story, levels — dresses that skeleton. If the skeleton is not fun in greybox, nothing dresses it into fun.
19
+
20
+ ## When to use / When NOT
21
+
22
+ **Use when:**
23
+ - Inventing or reworking mechanics and systems, or defining the player's verb set.
24
+ - Shaping the core loop, or layering moment-to-moment → session → meta.
25
+ - Planning progression, unlocks, pacing, or an in-game economy.
26
+ - Tuning a difficulty curve, hunting a dominant strategy, or setting up data-driven balance.
27
+ - Adding "juice" / game feel **as a design concept** (what feedback, why).
28
+ - Prototyping, planning a playtest, deciding what to measure, or cutting scope.
29
+ - The vague-but-critical ask: "why isn't my game fun / why doesn't it hook?"
30
+
31
+ **Do NOT use — route instead:**
32
+
33
+ | The ask | Route to | Why not here |
34
+ | --- | --- | --- |
35
+ | Write the movement/AI/shader/save code | `godot` / `unity` / `unreal` | This skill decides *what* to build; the engine skill builds it. |
36
+ | Author the story, dialogue, characters, lore | `game-storytelling` | Narrative design is its own craft; this skill owns systems and verbs. |
37
+ | Lay out a level, encounter, or world map | `level-design` | Spatial/encounter design applies the mechanics this skill defines. |
38
+ | Netcode, prediction, lag compensation | `gamedev-multiplayer` | A technical domain, not core design intent. |
39
+ | Ship / store page / build pipeline | `gamedev-shipping` | Release logistics, not design. |
40
+
41
+ (`godot`, `unity`, `unreal`, `game-storytelling`, `level-design` are linkable siblings; the rest are known ids you name but cannot link yet.)
42
+
43
+ ## Loops: moment-to-moment → session → meta
44
+
45
+ A game is loops nested inside loops. Each layer must reward on its own **and** feed motivation to the layer above it.
46
+
47
+ ```text
48
+ moment-to-moment (seconds) the primary verb: aim+fire, jump, place, click, parry
49
+ │ feeds
50
+ session loop (minutes) a run / match / mission: setup → tension → resolution
51
+ │ feeds
52
+ meta loop (sessions) mastery, unlocks, collection, rank — why you return tomorrow
53
+ ```
54
+
55
+ - **Moment-to-moment first.** The thing the player does constantly must feel good with *no* goal attached — jumping in Mario is fun in an empty room. If this layer is flat, no progression system rescues it. (Bungie's "30 seconds of fun" rule: perfect the small loop, then repeat it.)
56
+ - **Session loop** gives a run shape — a beginning, a rising middle, a payoff. It should end on a hook (almost-had-it, one-more-run).
57
+ - **Meta loop** is the reason-to-return: it spends the currency and mastery earned in sessions on lasting change (new verbs, new options, status).
58
+ - **Reward funding.** A reward at one layer should fund desire at the next. Misfunded loops fail predictably: fun moment-to-moment + empty meta = "great but I bounced"; rich meta + flat moment-to-moment = "I grind and I don't know why."
59
+
60
+ Depth vs breadth of loops, feedback-loop math, and worked loop teardowns: **[references/mechanics-and-loops.md](references/mechanics-and-loops.md)**.
61
+
62
+ ## MDA: the working lens
63
+
64
+ 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.
65
+
66
+ - **"Fun" is not a design target — name the aesthetic.** MDA's vocabulary: sensation, fantasy, narrative, challenge, fellowship, discovery, expression, submission (relaxation). "Make it more fun" is unactionable; "raise the *challenge* and *discovery*, drop the *submission*" is a to-do list.
67
+ - **Design the verbs, not the features.** The verb set *is* the game. A tight set of verbs with deep interaction (chess, Tetris) beats a wide set of shallow ones. Before adding a feature, ask: does it add a verb, deepen an existing verb, or just add a number?
68
+ - **Second-order design.** Ask what the rule makes players *do*, not what it literally says. Every incentive is also a de-incentive for everything else — rewarding kills steals attention from exploring.
69
+
70
+ The eight aesthetics with examples, emergence vs scripted content, and interaction-depth heuristics: **[references/mechanics-and-loops.md](references/mechanics-and-loops.md)**.
71
+
72
+ ## Progression & economy
73
+
74
+ Progression controls the rate at which the game reveals its depth; economy is the currency plumbing underneath it.
75
+
76
+ - **Pacing.** Interleave tension and release; teach → test → twist. Run difficulty and novelty as two curves so a lull in one is covered by the other.
77
+ - **Unlocks earn their keep.** Each unlock should add a verb or a *meaningful choice*, not just +10%. Gate content to pace the complexity the player must hold at once.
78
+ - **Currencies need distinct jobs.** Soft (earned, spent freely) vs hard/premium (scarce). Never add a currency without a distinct **sink** it exists to feed — currencies without sinks are clutter.
79
+ - **Sinks and faucets.** Faucets create currency; sinks destroy it. Balance the two or the economy drifts.
80
+
81
+ Model the drift with the core identity — no engine needed, a spreadsheet does it:
82
+
83
+ ```text
84
+ net_income_rate = faucet_rate − sink_rate
85
+ time_to_afford = cost / net_income_rate # tune this against desired pacing
86
+ cost(n) = base × growth^n # escalating sink; growth ≈ 1.07–1.15
87
+ ```
88
+
89
+ - **Avoiding runaway.** If `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.
90
+ - **Kill snowballs.** Positive feedback loops (rich-get-richer) let a leader accelerate out of reach and end matches early. Counter with negative feedback / catch-up (rubber-banding, comeback mechanics, escalating cost of dominance) — tuned so it aids without feeling like punishment for winning.
91
+
92
+ Currency taxonomies, inflation math, prestige/reset design, and a balancing-spreadsheet layout: **[references/progression-and-economy.md](references/progression-and-economy.md)**.
93
+
94
+ ## Difficulty & balancing
95
+
96
+ - **The curve is a sawtooth, not a ramp.** Rising baseline with peaks (bosses, gauntlets) and valleys (recovery, reward). Aim for the *flow channel*: challenge tracking skill, between boredom (too easy) and anxiety (too hard).
97
+ - **Few high-leverage knobs.** Most balance lives in a handful of variables (damage, health, spawn rate, cost, cooldown). Identify them, tune **one at a time**, and never chase a symptom by touching five knobs at once.
98
+ - **Data-driven balance.** Externalize tunables into data (tables/config), not hard-coded constants, so designers iterate without a rebuild and you can diff and A/B numbers. (The engine skill wires the loader; this skill decides *which* numbers are tunable.)
99
+ - **Dominant strategies kill choice.** When one option strictly beats the rest, all other choices die. Hunt them in playtest data and telemetry; fix by nerfing the outlier or buffing counters toward **intransitive** balance (rock-paper-scissors: every option beaten by another).
100
+ - **Perceived ≠ actual difficulty**, and difficulty options/accessibility widen the audience — decouple challenge from exclusion.
101
+
102
+ Flow-channel tuning, dominant-strategy detection, symmetry vs asymmetry, and difficulty-option patterns: **[references/progression-and-economy.md](references/progression-and-economy.md)**.
103
+
104
+ ## Feel / "juice" (as design intent)
105
+
106
+ 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.
107
+
108
+ - **Every input needs an immediate, legible reaction** — visual, audio, and/or haptic. Perceived latency is the enemy; responsiveness beats fidelity.
109
+ - **Juice vocabulary** (specify the intent, let the engine do it): hit-stop / hit-pause (freeze a few frames on impact to sell weight), screenshake (scaled to significance, never gratuitous), anticipation & follow-through and squash-and-stretch (animation principles that read intent), particles, easing/tweening curves, and layered sound.
110
+ - **Feel is often hidden generosity.** Coyote time, input buffering, and forgiveness windows make a game feel *fair* and responsive without the player ever knowing why.
111
+ - **Design-level, not code-level here.** Decide *what* should feel weighty and *why*; specify the effect and its trigger. The keyframes, curves, and shaders belong to `godot` / `unity` / `unreal`.
112
+
113
+ ## Prototyping & playtesting
114
+
115
+ - **Prototype the riskiest assumption first.** Whatever most determines whether the game works — prove or kill it before building anything else.
116
+ - **Paper → greybox → vertical slice.** Test rules and economies on paper/cards; test mechanics in an untextured blockout; only then build a polished slice. Find the fun before you buy the art.
117
+ - **Watch, don't coach.** In a playtest, shut up and observe. Note confusion, boredom, and quit points. The first-time experience is gold and you get it exactly once per tester.
118
+ - **Behavior over opinion.** Players are unreliable at saying *what* is wrong but reliable at signaling *that* something is. Weight what they do over what they say. Measure both: qualitative (struggle/quit points, think-aloud) and quantitative (completion rate, time-per-section, death heatmaps, D1/D7 retention).
119
+ - **Kill your darlings.** Cut any mechanic that does not serve the core loop, however clever. A pile of clever unrelated mechanics is not a game.
120
+ - **Scope is the #1 reason indie games die** — not talent, not tools. Cut *features*, not *quality*. A finished small game beats an unfinished ambitious one. Define the "one thing" the game is about and protect it ruthlessly; build a vertical slice, not a broad shallow map of half-features.
121
+
122
+ Playtest protocols, metrics/retention definitions, the prototyping ladder, and concrete scope-cutting tactics: **[references/playtesting-and-scope.md](references/playtesting-and-scope.md)**.
123
+
124
+ ## Documenting design
125
+
126
+ - **One page that lives beats a 100-page bible that dies.** Nobody reads the bible; it is stale the day after it is written. Write a living one-pager and let it grow only where a real decision needs recording.
127
+ - **The one-pager holds:** the hook / fantasy, the core loop, the verb set, the target aesthetic (named MDA emotion), the MVP scope, and — explicitly — what is *out*.
128
+ - **Design pillars** (2–4 words each, e.g. "tense stealth", "readable chaos") are decision filters: every feature must serve a pillar or it is cut. Pillars end arguments faster than any spec.
129
+ - **Keep it a communication tool, not an archive.** A wiki page beats a locked document; version it, link it, prune it.
130
+
131
+ ## Anti-patterns
132
+
133
+ | Anti-pattern | Why it bites | Do instead |
134
+ | --- | --- | --- |
135
+ | Designing on paper for months before building | Fun is only found by playing | Prototype the riskiest assumption first |
136
+ | "Make it more fun" as a task | Unactionable | Name the target MDA aesthetic and the mechanic behind it |
137
+ | Adding features instead of deepening verbs | Wide-and-shallow, no mastery | Deepen verb interaction before adding verbs |
138
+ | Currency with no sink | Meaningless clutter, inflation | Give every currency a distinct sink or cut it |
139
+ | Faucets outpacing sinks | Hyperinflation, trivial late game | Escalating/consumable sinks, caps, prestige |
140
+ | Unchecked positive feedback loop | Leader snowballs, match ends early | Add negative feedback / catch-up, tuned gently |
141
+ | One dominant strategy left standing | Choice dies, meta collapses | Nerf outlier / buff counters toward intransitive balance |
142
+ | Tuning five knobs at once | Can't attribute cause | Change one high-leverage variable at a time |
143
+ | Hard-coded balance constants | No iteration, no A/B, needs rebuild | Externalize tunables into data |
144
+ | Guiding testers during playtests | Contaminates the first-time signal | Watch silently; weight behavior over opinion |
145
+ | Scope creep / feature list as ambition | #1 indie killer | Cut features not quality; ship a vertical slice |
146
+ | 100-page design bible | Nobody reads it; goes stale | Living one-pager + pillars |
147
+
148
+ ## Project grounding
149
+
150
+ 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`](../harness/references/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.
151
+
152
+ ## Related skills
153
+
154
+ - `../level-design/SKILL.md` — applies these mechanics in space: layout, pacing beats, encounter design.
155
+ - `../game-storytelling/SKILL.md` — narrative, dialogue, and how story wraps the systems you define here.
156
+ - `../godot/SKILL.md`, `../unity/SKILL.md`, `../unreal/SKILL.md` — implement the settled design; all engine APIs, feel/juice code, and data-driven tuning loaders live there.
157
+ - Known siblings to name but not yet link: `gamedev-multiplayer`, `gamedev-physics`, `gamedev-pathing`, `gamedev-shaders`, `gamedev-shipping`.
158
+
159
+ ## Checklist
160
+
161
+ - [ ] The **core verb** is named and is fun in greybox with no goal attached.
162
+ - [ ] The three loops (moment-to-moment / session / meta) are identified and each is reward-funded by the layer below.
163
+ - [ ] The target **aesthetic** is named (MDA vocabulary), not "fun".
164
+ - [ ] Every currency has a distinct sink; faucets vs sinks are modeled and do not run away.
165
+ - [ ] Difficulty follows a sawtooth in the flow channel; high-leverage knobs are identified and data-driven.
166
+ - [ ] No dominant strategy survives; options are intransitively balanced.
167
+ - [ ] Feel/juice intent is specified (what + why), deferred to the engine skill for how.
168
+ - [ ] The riskiest assumption was prototyped and playtested; behavior (not just opinion) was observed.
169
+ - [ ] Scope is cut to a vertical slice; a one-page living doc + pillars exist, not a bible.
170
+ - [ ] Engine specifics were deferred to `godot`/`unity`/`unreal`; narrative to `game-storytelling`; layout to `level-design`.
@@ -0,0 +1,13 @@
1
+ # Evals for game-design
2
+
3
+ `cases.yaml` is the trigger and capability spec for this skill, read by the catalog's
4
+ skill-eval harness. `should_trigger` asserts the skill fires on design-intent asks — core
5
+ loops, economy/inflation, balance, difficulty curves, feel, scope, and the vague "why isn't my
6
+ game fun" — including a Spanish phrasing. `should_not_trigger` asserts near-misses route to the
7
+ right sibling: engine code to `unity`/`godot`/`unreal`, story to `game-storytelling`, layout to
8
+ `level-design`, netcode to `gamedev-multiplayer`, release to `gamedev-shipping`.
9
+
10
+ The `capability` case checks that an economy/loop-repair answer stays engine-agnostic: it
11
+ diagnoses loop funding, models faucets vs sinks with the pseudo-formula, stops runaway inflation
12
+ with escalating sinks/prestige, names the MDA aesthetic, and defers implementation to the engine
13
+ skills.
@@ -0,0 +1,47 @@
1
+ skill: game-design
2
+
3
+ should_trigger:
4
+ - prompt: "I've been building my game for months and it just isn't fun to play. What's wrong?"
5
+ why: "The signature 'why isn't my game fun' trigger; answer diagnoses which loop is starved and pushes prototype-the-core-verb-in-greybox."
6
+ - prompt: "Help me design the core gameplay loop for a roguelike deckbuilder."
7
+ why: "Core-loop design plus moment-to-moment → session → meta layering is the central job."
8
+ - prompt: "My in-game gold keeps inflating so late-game upgrades feel free. How do I fix the economy?"
9
+ why: "Economy/faucets-vs-sinks and runaway-inflation fixes (escalating sinks, caps, prestige); the pseudo-formula applies."
10
+ - prompt: "Everyone in my card game just plays the same one deck because it beats everything. How do I rebalance?"
11
+ why: "Dominant-strategy detection and pushing toward intransitive (rock-paper-scissors) balance."
12
+ - prompt: "The difficulty in my platformer spikes weirdly — some levels are trivial, then a wall. How should the curve work?"
13
+ why: "Difficulty curve as a sawtooth in the flow channel, high-leverage knobs, one-at-a-time tuning."
14
+ - prompt: "I keep adding features and never finishing. How do I decide what to cut?"
15
+ why: "Scope control (the #1 indie killer): cut features not quality, define the one thing, vertical slice, cut list, kill your darlings."
16
+ - prompt: "El juego no engancha después de la primera partida, ¿cómo lo arreglo?"
17
+ why: "Spanish — starved meta loop / return-reason; diagnoses reward funding across loop layers."
18
+ - prompt: "How do I make combat feel punchier and more satisfying without touching the story or the netcode?"
19
+ why: "Game feel / juice as design intent (hit-stop, screenshake, feedback); explicitly excludes story and netcode."
20
+
21
+ should_not_trigger:
22
+ - prompt: "Write the C# script that moves my player character and handles jumping in Unity."
23
+ route_to: unity
24
+ why: "Engine implementation code; this skill decides what to build, the engine skill writes it."
25
+ - prompt: "Write the dialogue tree and backstory for my game's main antagonist."
26
+ route_to: game-storytelling
27
+ why: "Narrative and character writing, not systems/mechanics design."
28
+ - prompt: "Lay out the rooms and enemy placement for level 3 of my metroidvania."
29
+ route_to: level-design
30
+ why: "Spatial and encounter layout applies mechanics; it is not core mechanic/economy design."
31
+ - prompt: "Implement client-side prediction and lag compensation for my multiplayer shooter."
32
+ route_to: gamedev-multiplayer
33
+ why: "Netcode is a technical domain, not moment-to-moment or economy design intent."
34
+ - prompt: "Set up my Steam store page and build the release pipeline for launch."
35
+ route_to: gamedev-shipping
36
+ why: "Release logistics, not design."
37
+
38
+ capability:
39
+ - scenario: "A solo dev's incremental/idle game feels grindy and the currency inflates until upgrades are free; they ask how to fix the design."
40
+ must_include:
41
+ - "Diagnoses which loop is starved (moment-to-moment / session / meta) and checks that each layer's reward funds the next"
42
+ - "Models the economy with net_income_rate = faucet_rate − sink_rate and time_to_afford = cost / net_income_rate"
43
+ - "Prescribes escalating/exponential sinks (cost(n) = base × growth^n), consumable sinks, caps, or prestige resets to stop runaway inflation"
44
+ - "Requires each currency to have a distinct sink, and tunables to be data-driven rather than hard-coded"
45
+ - "Names the target MDA aesthetic instead of 'more fun', and frames unlocks as new verbs/choices not just +N%"
46
+ - "Recommends prototyping the fix and playtesting for behavior (retention, time-per-tier), not just opinion"
47
+ - "Defers engine implementation to godot/unity/unreal and records the design in 02-DOCS/wiki/design/ only if a harness exists"
@@ -0,0 +1,78 @@
1
+ # Mechanics, verbs, loops, and feel — deep dive
2
+
3
+ Engine-agnostic. This expands the SKILL.md sections on loops, MDA, verbs, and feel. No engine APIs — when a pattern needs code, it belongs to `godot` / `unity` / `unreal`.
4
+
5
+ ## MDA in practice
6
+
7
+ Mechanics → Dynamics → Aesthetics is a lens, not a pipeline you fill in once.
8
+
9
+ - **Mechanics** — the rules, entities, and numbers you literally author: gravity value, damage table, spawn rules, win condition.
10
+ - **Dynamics** — the runtime behavior that emerges when players push on the mechanics: kiting, rushing, turtling, economy hoarding. You do not write dynamics; you *provoke* them with mechanics.
11
+ - **Aesthetics** — the emotional response the player actually has. This is the only layer they experience directly.
12
+
13
+ You author left-to-right but must **reason right-to-left**: start from the feeling you want, hypothesize a dynamic that would produce it, then author the mechanic that produces that dynamic. Playtest to see whether the real dynamic matches the intended one — it usually doesn't the first time.
14
+
15
+ ### The eight aesthetics (name the one you want)
16
+
17
+ | Aesthetic | The feeling | Example games |
18
+ | --- | --- | --- |
19
+ | Sensation | Sense-pleasure, "game as toy" | *Tetris*, rhythm games, *Katamari* |
20
+ | Fantasy | Make-believe, inhabiting a role | *Skyrim*, flight sims |
21
+ | Narrative | Drama unfolding | *Disco Elysium*, *The Last of Us* |
22
+ | Challenge | Obstacle course, mastery | *Celeste*, *Dark Souls*, *Trackmania* |
23
+ | Fellowship | Social framework, cooperation | *It Takes Two*, MMOs, *Among Us* |
24
+ | Discovery | Exploring the unknown | *Outer Wilds*, *Subnautica* |
25
+ | Expression | Self-discovery, creation | *Minecraft*, *The Sims*, *Animal Crossing* |
26
+ | Submission | Pastime, relaxation, "flow-off" | idle games, *Stardew Valley* farming |
27
+
28
+ Most games target **two or three**, weighted. Writing them down settles arguments: a feature that serves none of your chosen aesthetics is a cut candidate, however cool.
29
+
30
+ ## Verbs are the game
31
+
32
+ The player's verb set — the actions available — is the truest description of a design. "A game about jumping and stomping" (Mario) says more than any feature list.
33
+
34
+ - **Depth over breadth.** A few verbs that interact combinatorially (chess: six piece-moves) yield more game than dozens of isolated ones. Interaction between verbs is where mastery and emergence live.
35
+ - **Verb economy test.** Before adding anything, ask: does this add a *new verb*, *deepen an existing verb's interactions*, or merely *add a number*? Numbers rarely add game.
36
+ - **Emergence vs progression** (Juul's distinction):
37
+ - *Emergent* games — simple rules, vast possibility space (chess, poker, *Spelunky*, roguelikes). Cheap to build, huge replay, hard to control the experience.
38
+ - *Progression* games — designer places a sequence of challenges (linear campaigns). Total authorial control, expensive per minute of play, low replay.
39
+ - Most games blend: an emergent core loop inside a progression frame.
40
+
41
+ ## Loop layering, in detail
42
+
43
+ ```text
44
+ INPUT ─▶ [ moment-to-moment verb ] ─▶ immediate feedback ─▶ (repeat, seconds)
45
+ │ accrues into
46
+ [ session goal / run ] ─▶ session payoff ─▶ (minutes–1h)
47
+ │ funds
48
+ [ meta progression ] ─▶ lasting change ─▶ (across sessions)
49
+ ```
50
+
51
+ - **Moment-to-moment must be intrinsically fun.** Test: strip every goal, reward, and score — is the raw act of doing the verb still satisfying? If not, fix this before anything else. This is Bungie's "30 seconds of fun" — perfect the small loop, and the game is that loop repeated in varied contexts.
52
+ - **Session loop needs a shape.** Setup → rising tension → climax → resolution → hook. A run that just stops has no payoff; a run that ends on "so close" pulls the next one.
53
+ - **Meta loop is the return reason.** It converts session output (currency, XP, mastery, unlocks) into durable change. If the meta gives only numeric inflation and no new *choices or verbs*, players feel the grind without the growth.
54
+ - **Reward funding is the health check.** Each layer's reward should create desire for the next layer. Diagnose a "not fun" game by asking which loop is starved:
55
+ - Flat moment-to-moment → nothing above can save it.
56
+ - Empty meta → "great for an hour, then I bounced."
57
+ - Meta with no moment-to-moment joy → "I grind and don't know why."
58
+
59
+ ## Feedback loops (system dynamics)
60
+
61
+ Distinct from "player feedback." These are the amplifying/damping loops in your systems.
62
+
63
+ - **Positive feedback loop** — success makes further success easier (rich-get-richer). Accelerates games to a conclusion and rewards early leads. Good for *ending* a game; dangerous if unchecked mid-game (snowball, runaway leader, blowouts).
64
+ - **Negative feedback loop** — success makes further success harder, or trailing players get help (catch-up, rubber-banding, escalating cost of dominance, *Mario Kart* items). Keeps games close and tense; overdone it punishes skill and feels unfair.
65
+ - **Design move:** use negative feedback to keep the mid-game close and positive feedback to force a decisive end — so games stay tense but still *end*.
66
+
67
+ ## Game feel / juice as design intent
68
+
69
+ Feel is the moment-to-moment made tactile. Decide it here; the engine implements it.
70
+
71
+ - **Responsiveness first.** Immediate, legible reaction to every input beats visual fidelity. Perceived input latency destroys feel.
72
+ - **Juice vocabulary** — specify the *intent* and *trigger*, not the code:
73
+ - *Hit-stop / hit-pause* — freeze a few frames on impact to sell weight.
74
+ - *Screenshake* — amplitude scaled to significance; gratuitous shake reads as noise.
75
+ - *Anticipation & follow-through*, *squash-and-stretch* — animation principles that telegraph intent and add weight.
76
+ - *Particles, easing/tweening curves, layered SFX* — reinforce the action's magnitude.
77
+ - **Hidden generosity.** Coyote time (jump slightly after leaving a ledge), input buffering (queue an input landing a hair early), and forgiveness windows make a game feel *fair* and responsive without the player knowing why. These are design decisions with real numbers (frames/ms) — specify them; the engine skill wires them.
78
+ - **Boundary:** keyframes, curves, shader passes, and timing code are engine work. Here you produce a table of "action → intended feel → effect → trigger."
@@ -0,0 +1,58 @@
1
+ # Prototyping, playtesting, scope, and docs — deep dive
2
+
3
+ Engine-agnostic. Expands the SKILL.md sections on prototyping, playtesting, scope, and documenting design.
4
+
5
+ ## The prototyping ladder
6
+
7
+ Climb only as far as each rung earns. Each rung is cheaper to change than the next.
8
+
9
+ 1. **Riskiest-assumption first.** Name the single thing that, if it doesn't work, sinks the game (Is the core verb fun? Does the economy hold? Is the twist readable?). Prototype *that*, not the easy parts.
10
+ 2. **Paper / cards.** Best for rules, turn order, economies, and card/board interactions. Simulate the loop by hand; you can rebalance in seconds with a pencil.
11
+ 3. **Greybox / blockout.** Untextured, programmer-art mechanics running in the engine. Proves *feel* and moment-to-moment fun. If it isn't fun in greybox, art will not make it fun — this is the single most expensive lesson to learn late.
12
+ 4. **Vertical slice.** One polished, representative sliver — one level or one loop at final quality — proving the game is worth finishing and showing what "done" looks like. Prefer this over a broad, shallow map of half-built features.
13
+
14
+ **Find the fun before you buy the art.** Art and audio are the most expensive assets and the hardest to change; commit them only after the mechanic underneath is proven.
15
+
16
+ ## Playtesting
17
+
18
+ - **Watch, don't coach.** Say as little as possible. The instant you explain a control, you have destroyed the first-time-user signal you can never recapture from that tester.
19
+ - **Behavior over opinion.** Players are unreliable at diagnosing *what* is wrong and reliable at signaling *that* something is. When a tester says "the jump is fine" but dies to the same gap ten times, believe the deaths. Weight actions over words.
20
+ - **Protocols:**
21
+ - *Think-aloud* — tester narrates their thoughts live; surfaces confusion and mental model mismatches.
22
+ - *First-time-user (FTUE)* — a fresh tester with zero explanation; the harshest and most valuable test of onboarding.
23
+ - *Post-play interview* — ask open questions ("what would you tell a friend about this?"), never leading ones.
24
+ - **What to measure:**
25
+ - *Qualitative* — struggle points, boredom points, quit points, "aha" moments, emotional reactions.
26
+ - *Quantitative* — completion rate per section, time-per-section, death heatmaps, failure counts, and retention: **D1 / D7 / D30** (fraction returning 1/7/30 days later). Retention is the honest verdict on whether the loops hook.
27
+ - **Cadence:** test early, test ugly, test often. A rough test this week beats a polished one next month. Rotate testers — a tester can only be first-time once.
28
+
29
+ ## Killing your darlings
30
+
31
+ - Cut any mechanic that does not serve the core loop or a design pillar — regardless of how clever it is or how long it took. A pile of unrelated clever mechanics is not a game.
32
+ - Signs a darling must die: it needs its own tutorial, it only shines in one contrived spot, playtesters ignore it, or defending it starts with "but it was hard to build" (sunk cost is not a design argument).
33
+
34
+ ## Scope: the #1 indie killer
35
+
36
+ More indie games die of scope than of bad ideas, weak talent, or poor tools. The failure mode is always the same: a feature list that outruns the finish line.
37
+
38
+ - **Cut features, not quality.** A finished small game beats an unfinished ambitious one, every time. Shrinking scope preserves polish; cutting polish to keep scope produces a large mediocre thing nobody finishes.
39
+ - **Define "the one thing."** State in one sentence what the game is *about* and protect it. Everything that doesn't serve it is a candidate for the cut list.
40
+ - **Vertical slice over horizontal sprawl.** Build one loop end-to-end at quality before widening. A deep narrow slice ships; a wide shallow map of stubs does not.
41
+ - **A public cut list.** Keep an explicit "not doing" list next to the feature list. Naming what's *out* is as important as naming what's in — it ends the "wouldn't it be cool if…" spiral.
42
+ - **Budget by the finish, not the ambition.** Estimate remaining work against real available time; when they don't fit, the variable you move is scope, not the ship date and not sleep.
43
+
44
+ ## Documenting design: the living one-pager
45
+
46
+ A 100-page design bible is stale the day after it's written and read by no one. Replace it with a living one-pager that grows only where a real decision needs recording.
47
+
48
+ One-page design doc contents:
49
+
50
+ - **Hook / fantasy** — one sentence: what is the player's power fantasy or core experience?
51
+ - **Pillars** — 2–4 short phrases (e.g. "tense stealth", "readable chaos", "no dead ends"). These are decision filters: every feature must serve a pillar or it is cut.
52
+ - **Core loop** — the moment-to-moment → session → meta chain in a few lines.
53
+ - **Verbs** — the actions the player has.
54
+ - **Target aesthetic** — the named MDA emotion(s), weighted.
55
+ - **MVP / vertical-slice scope** — the smallest thing worth building and playing.
56
+ - **Out of scope** — the explicit cut list.
57
+
58
+ Keep it a communication tool, not an archive: a versioned wiki page beats a locked document. Prune it as decisions settle; link deeper notes only where they earn their space.
@@ -0,0 +1,70 @@
1
+ # Progression, economy, and balance — deep dive
2
+
3
+ Engine-agnostic. Expands the SKILL.md sections on progression, economy, difficulty, and balancing. All math here fits in a spreadsheet; no engine APIs.
4
+
5
+ ## Progression pacing
6
+
7
+ - **Two parallel curves: difficulty and novelty.** Boredom comes from either flatlining. When difficulty must plateau (a rest area), spike novelty (a new mechanic, a set-piece); when novelty must pause, nudge difficulty. Never let both go flat at once.
8
+ - **Teach → test → twist.** Introduce a mechanic safely, test it under mild pressure, then combine it with an earlier mechanic. This is how you build *layered* mastery instead of a pile of unrelated tutorials.
9
+ - **Gate to control cognitive load.** Unlocks pace how many systems the player juggles at once. Front-loading every verb overwhelms; drip-feeding lets each verb be learned before the next.
10
+ - **Unlock quality bar.** Each unlock should add a **verb** or a **meaningful choice**, not just +N%. A stat bump is progression felt as grind; a new option is progression felt as growth.
11
+
12
+ ## Economy: currencies, faucets, sinks
13
+
14
+ - **Currency taxonomy:**
15
+ - *Soft currency* — earned through play, spent freely (gold, scrap). Drives the core economy loop.
16
+ - *Hard / premium currency* — scarce or bought, gates high-value or aspirational items.
17
+ - *Time / energy* — a pacing gate (stamina systems); a sink on session length.
18
+ - *Prestige* — meta-currency earned by resetting progress; funds the long meta.
19
+ - **One currency, one job.** Every currency must have a distinct **sink** it exists to feed. If two currencies buy the same things, merge them. Currency without a sink is clutter and inflates.
20
+
21
+ ### Faucets and sinks
22
+
23
+ - **Faucet** = anything that *creates* currency (quest rewards, drops, passive income).
24
+ - **Sink** = anything that *destroys* it (shop costs, upgrades, repairs, consumables, taxes/fees).
25
+ - The economy is healthy when total faucet output and total sink demand track each other over the play arc.
26
+
27
+ Core identity to model in a sheet:
28
+
29
+ ```text
30
+ net_income_rate = faucet_rate − sink_rate
31
+ time_to_afford = cost / net_income_rate
32
+
33
+ # escalating sink — the standard way to keep pace with rising income:
34
+ cost(n) = base × growth^n
35
+ # growth ≈ 1.07–1.15 for idle/incremental; higher = steeper wall
36
+ # solve for growth by pinning two target prices, or for base by pinning the first cost
37
+ ```
38
+
39
+ Tune `time_to_afford` against desired pacing (e.g. "a new tier every ~2 sessions"). Sweep the parameters in a spreadsheet before touching the engine.
40
+
41
+ ### Runaway and inflation
42
+
43
+ - **Symptom:** `net_income_rate` grows faster than `cost(n)` → currency piles up, prices feel free, the late game trivializes. Or the reverse: sinks outpace faucets → progress stalls, players feel taxed.
44
+ - **Fixes for over-supply:** escalating/exponential sinks (`growth` above), consumable sinks (currency spent every session, not banked), soft/hard caps, and **prestige resets** that trade accumulated progress for a permanent multiplier and re-open the curve.
45
+ - **Multiplayer economies** add faucet leaks (duping, botting, gold farming) and player-to-player trade that can concentrate wealth — audit total money supply over time, not just per-player rates.
46
+
47
+ ## Difficulty and balancing
48
+
49
+ ### The curve
50
+
51
+ - **Sawtooth, not a straight ramp.** A rising baseline with peaks (bosses, gauntlets) and valleys (recovery, reward rooms). The valleys make the peaks legible and let the player breathe.
52
+ - **Flow channel** (Csikszentmihalyi via game design): keep perceived challenge tracking the player's rising skill, in the band between boredom (too easy for current skill) and anxiety (too hard). As skill grows, challenge must grow with it.
53
+ - **Perceived ≠ actual.** Telegraphing, readability, and generosity (see feel) change *perceived* difficulty without changing the numbers. A fair-feeling hard game keeps players; an unfair-feeling easy one loses them.
54
+
55
+ ### Tuning knobs
56
+
57
+ - **Find the few high-leverage variables** — usually damage, health, spawn rate/density, resource cost, cooldown/duration. Most balance lives in a handful of them.
58
+ - **Change one at a time.** Chasing a symptom by moving five knobs makes cause un-attributable. Move one, retest, record.
59
+ - **Data-driven.** Put tunables in data (tables/config/spreadsheets), never hard-coded constants, so designers iterate without a rebuild and numbers are diffable and A/B-able. This skill decides *which* values are tunable and their ranges; the engine skill (`godot`/`unity`/`unreal`) builds the loader.
60
+
61
+ ### Dominant strategies and intransitive balance
62
+
63
+ - **Dominant strategy** = an option that strictly beats the alternatives in most situations. It collapses the meta: every rational player converges on it and all other choices die.
64
+ - **Detect it:** watch playtests and telemetry for pick-rate/win-rate outliers, and for "solved" openings. High pick + high win = nerf target.
65
+ - **Fix toward intransitivity:** aim for rock-paper-scissors — every option is beaten by *some* other option, none beats all. Nerf the outlier or buff its counters; prefer many small changes over one sweeping one.
66
+ - **Symmetry vs asymmetry:** symmetric balance (mirror factions) is easy to make fair but flat; asymmetric balance (distinct factions/classes) is rich but must be balanced by *outcome parity* (equal win-rates), not by identical stats.
67
+
68
+ ### Difficulty options & accessibility
69
+
70
+ - Decouple **challenge** from **exclusion**. Difficulty modes, assist toggles (aim assist, slow-mo, invulnerability), and separate sliders for enemy damage vs enemy health widen the audience without diluting the intended experience for those who want it. Accessibility is design, not charity — it grows the reachable player base.