Mastery & Flow
What it is. Flow is the state where challenge tracks skill so closely that attention locks: too easy and the player is bored, too hard and they’re anxious. The design job is to keep play inside that narrow flow channel as the player’s skill climbs — the difficulty rises to meet a rising player. Mastery is the channel’s ceiling: how far skill can keep buying results.
Player fantasy. “I’m getting better and the game noticed.” The near-miss that pulls you back in; the run where you finally read the pattern; the moment a wall becomes a warm-up. Time disappearing.
Why it works
- Boredom and anxiety are the two failure modes, and they sit on either side of the same line. Flow is the ridge between them; the ramp is how you walk it upward.
- The skill-delta is the flow proof. FUN.md law 2: run the intended strategy and a null strategy and assert the gap. That gap is the operational definition of “skill matters here” — no gap, no channel, no flow, just noise. This is the fun proxy the whole engine leans on.
- Learnable depth keeps the channel open. A high skill ceiling (
system-mastery-curve) means the player can keep climbing without you authoring infinite content — Tetris has no level 900 assets, just a faster you. - The channel is per-player, not per-game. Two players of different skill both deserve flow at once. You reach both by widening the channel (assist options, a high ceiling over a gentle floor), not by picking one difficulty and hoping.
Levers
| Lever | Moves the channel | Example |
|---|---|---|
| Ramp slope | How fast challenge rises | Level times/spawn curves that track completion |
| Skill ceiling | How high mastery can climb | Tech, movement tech, combos, optimisation (system-mastery-curve) |
| Failure cost | Anxiety dial | Instant retry (low) vs run-loss (high) — see system-grace |
| Onboarding | Where the channel starts | Teach-by-doing so the floor isn’t a wall (system-onboarding) |
| DDA | Auto-centres the channel | Nudge difficulty to the measured player (system-difficulty-and-dda) |
| Assist / options | Widens the channel per-player | Slow-mo, invincibility (Celeste); flow for more people |
Applied across genres
| Genre | Where flow lives | The mastery ceiling |
|---|---|---|
Precision platformer (genre-precision-platformer) | Each screen just past the last verb | Movement tech, optimal routing, deathless runs |
Endless arcade (anchor-tetris, anchor-nuclear-throne) | The self-raising speed curve | Pure execution; the wall is the player |
Bullet hell (genre-bullet-hell) | Fire-lane uptime under rising density | Reading patterns, holding fire under pressure (FUN.md §7) |
Tactics (genre-tactics) | The optimal line hidden in a legible board | Perfect-clears; seeing three moves deep |
Rhythm (genre-rhythm) | Window accuracy vs chart density | Frame-tight timing, full-combo chains (FUN.md §18) |
Racing (genre-racing) | The line at the edge of grip | Braking discipline, the speed/line tradeoff (FUN.md §20) |
Roguelite (system-meta-progression) | Run knowledge + build reading | System mastery outpacing unlock power |
Overdone when…
- The wall with no ramp. Difficulty jumps a cliff — anxiety, not challenge.
Break the spike into a slope (
pattern-pacing-and-tension). - The plateau. Skill stops buying results (a hard cap, a dominant strategy) —
boredom. A collapsed
system-build-diversityflattens the ceiling. - Difficulty by unfairness. Faster balls, more HP, coin-flip deaths — that’s anxiety without skill expression, the opposite of flow (FUN.md §7: density ≠ difficulty; §19: speed ≠ harder).
- DDA that erases skill. Rubber-banding so hard that playing well is pointless
is a
pattern-feedback-loopsgone wrong — the channel should centre, not flatten. - A ceiling the player can’t see. Depth exists but nothing signposts it, so the
expert doesn’t know there’s more to climb (
pattern-readability) — the mastery is real but invisible, and invisible depth reads as a plateau.
Verify / feel-gate link
Flow is not directly measurable, but its precondition — skill changes outcomes — is the single most important assertion in FUN.md:
- Skill-delta (law 2).
expect(smartScore).toBeGreaterThan(nullScore * K)— greedy 158 vs random 82, judgement 19/20 vs recklessness 0/20, braking 26.2s vs flooring 27.7s. No gap = no flow channel exists to walk. - Ramp legibility. Per-level bot completion times expose the ramp (FUN.md §2) — a flat or inverted curve is a difficulty bug you can see in the numbers.
- Grace bounds anxiety (law 5). Coyote/buffer/i-frames/instant-retry keep the anxious side of the channel humane; spec them in frames and gate edge-in/edge-out.
- Mastery ceiling. Pairs with
system-mastery-curve— prove an expert line meaningfully beats a competent one, not just skill vs null.
Worked micro-example
“A platformer that stays in flow for a beginner and an expert.” One difficulty
number can’t serve both — a floor for the beginner is a plateau for the expert. Widen
the channel instead of moving it: (1) the ramp teaches each verb one screen before
it’s required (system-onboarding) so the floor isn’t a wall; (2) a high skill
ceiling — optional deathless/speed routes let the expert keep climbing
(system-mastery-curve); (3) assist options (slow-mo, invuln) widen the floor
for players who’d otherwise fall out of the channel entirely (system-accessibility).
Prove the ceiling with a two-tier skill-delta: an expert line meaningfully beats a
competent one, not just skill vs null (FUN.md law 2).
Composes with
system-mastery-curve— this pattern is the why; that system is the how of building a high, learnable ceiling. Read them together.system-difficulty-and-dda— the mechanism that keeps the channel centred as skill rises.pattern-pacing-and-tension— flow over a session is a curve of peaks and breathers, not a constant.pattern-feedback-loops— the negative loop that stops a snowball is also what keeps a match inside the flow channel for both players.
See also
design/FUN.mdlaw 2 — the skill-delta, the closest thing to a fun proof and the operational test for “is there a flow channel here?”.system-onboarding— where the channel starts; a wall on frame one loses the player before flow can begin.