Finishing is a separate skill, and a finished mediocre game proves more than a
brilliant fragment. Projects die in two loops: the restart loop (skills
improved mid-project, so the dev remakes early content sideways forever — "your
code will always be a mess") and the polish loop (near-done, endlessly
refining details out of fear of judgment). Diagnose the loop before
intervening. And remember: the last 10% is really 90% — menus, death
states, audio plumbing, deploy are the game too.
Scoping a new game (so this skill is never needed)
One core mechanic, one level/arena, one win condition, one lose
condition. Everything else is stretch.
One-sentence pitch before code. Features not in the sentence need
explicit justification.
Budget 50/50: half for the playable loop, half for the unfun tail. If
the loop fills the budget, the scope is wrong.
Prototype-first split (jam culture): playable ugly loop in the first
~5% of the time; the rest is feel, art, sound, content.
Use the engine at hand (Spelunky shipped in Game Maker), reuse and
generate assets without shame.
Tiny finished games grow up: Celeste began as a 4-day PICO-8 jam game.
The jam-sized version is the validation step, not a compromise.
The cut list
Keep a NEXT_GAME.md. Every mid-build idea ("what if it had shops /
multiplayer / procgen") goes there, not in the build. Save it for the next
one — finish this one first (Yu).
Default cut order for browser games: extra levels → extra enemy/item
types → meta-progression → settings menus → narrative → leaderboards.
Never cut: restart flow, lose/win states, audio toggle.
When behind: cut features. One mechanic deep beats three shallow.
If a project must die, the successor is smaller, not bigger.
When is the core loop enough?
Stop adding mechanics when: a new player understands it without instructions
in <30s, a session has tension (can lose) and release (can win/score), and a
player voluntarily restarts once. From that moment, every proposal to add is
scope creep — route it to NEXT_GAME.md and switch to finishing mode.
The intervention (stalled project)
Diagnose the loop. Check git history / file churn: redoing existing
things = restart loop; refining done things = polish loop; new systems
with no win state = creep. Name it plainly: "Last 5 sessions added 3
systems and the game still has no win state."
Extract the one-sentence core — single mechanic + win + lose. If
unclear, the smallest already-fun interaction in the build IS the game.
Triage every feature (built, half-built, planned): KEEP (serves the
core loop), CUT (delete now), DEFER (→ NEXT_GAME.md). Half-built
defaults to CUT — "just finishing it" is the restart loop's bait.
Write the finish line as the checklist below, agreed explicitly:
boxes may be removed, never added.
End-to-end first: title → play → lose → restart → win reachable with
placeholders before any item-level polish.
One juice pass, one tuning pass, timeboxed. The second polish pass is
the polish death-loop.
Ship (vg deploy), cold-load the live URL, play one full session on
the deployed build, fix only blockers.
Debrief: share the link, log deferred ideas, at most one v1.1 scoped
to ≤5 checklist items. Ship-then-iterate beats a delayed "complete" v1 —
deploys are cheap here.
If the user resists ("one more feature"): offer to swap it for an
existing checklist item. Never silently extend.
Shipping checklist (binary; all boxes or no ship)
Title screen: name + how to start + minimal controls hint
Core loop playable start-to-finish with no dev knowledge
Lose state reachable, clear, instant one-input restart
Win/goal state reachable (or endless loop with score + best visible)
Restart fully resets state — replay 3+ times (no stale timers/listeners)
No placeholder art/text ("TODO", magenta boxes, template logo)
Page title + favicon + meta description set
Mobile viewport meta; page doesn't scroll/zoom under game input; canvas
scales to the window
Touch controls, or an explicit "keyboard required" notice on mobile —
actually driven on a touch viewport, not just screenshotted
Debug UI, FPS meters, ?test= hooks hidden from players
SFX exist, start only after user gesture, mute toggle works
Tab-blur handled: no desync/physics spiral when backgrounded
No console errors across a full session, verified against THIS game —
a non-blank canvas on a port another dev server owns proves nothing
Frame rate holds; no unbounded entity leaks over a long session
First-timer survives >15s; a deliberate player can lose
All assets load on the deployed path (no localhost/absolute refs)
Deployed URL cold-loads in incognito; one full session played LIVE
(Multiplayer) host-leave/rejoin tested; solo player not soft-locked
Related skills: game-playbook (the build order that avoids stalling),
deploy (the finish line), design-lenses (is the core loop enough),
ask-me (scope the next game properly before starting).
1---2name: finish-it3description: Get a stalled or sprawling game project to ship: diagnose the death loop, cut to the core, set a binary finish line.4---56# Finish it78Finishing is a separate skill, and a finished mediocre game proves more than a9brilliant fragment. Projects die in two loops: the **restart loop** (skills10improved mid-project, so the dev remakes early content sideways forever — "your11code will always be a mess") and the **polish loop** (near-done, endlessly12refining details out of fear of judgment). Diagnose the loop before13intervening. And remember: **the last 10% is really 90%** — menus, death14states, audio plumbing, deploy are the game too.1516## Scoping a new game (so this skill is never needed)1718- **One core mechanic, one level/arena, one win condition, one lose19 condition.** Everything else is stretch.20- **One-sentence pitch before code.** Features not in the sentence need21 explicit justification.22- **Budget 50/50**: half for the playable loop, half for the unfun tail. If23 the loop fills the budget, the scope is wrong.24- **Prototype-first split** (jam culture): playable ugly loop in the first25 ~5% of the time; the rest is feel, art, sound, content.26- **Use the engine at hand** (Spelunky shipped in Game Maker), reuse and27 generate assets without shame.28- **Tiny finished games grow up**: Celeste began as a 4-day PICO-8 jam game.29 The jam-sized version is the validation step, not a compromise.3031## The cut list3233- Keep a `NEXT_GAME.md`. Every mid-build idea ("what if it had shops /34 multiplayer / procgen") goes there, not in the build. Save it for the next35 one — finish this one first (Yu).36- **Default cut order** for browser games: extra levels → extra enemy/item37 types → meta-progression → settings menus → narrative → leaderboards.38- **Never cut**: restart flow, lose/win states, audio toggle.39- When behind: cut features. One mechanic deep beats three shallow.40- If a project must die, the successor is _smaller_, not bigger.4142## When is the core loop enough?4344Stop adding mechanics when: a new player understands it without instructions45in <30s, a session has tension (can lose) and release (can win/score), and a46player voluntarily restarts once. From that moment, every proposal to add is47scope creep — route it to `NEXT_GAME.md` and switch to finishing mode.4849## The intervention (stalled project)50511. **Diagnose the loop.** Check git history / file churn: redoing existing52 things = restart loop; refining done things = polish loop; new systems53 with no win state = creep. Name it plainly: "Last 5 sessions added 354 systems and the game still has no win state."552. **Extract the one-sentence core** — single mechanic + win + lose. If56 unclear, the smallest already-fun interaction in the build IS the game.573. **Triage every feature** (built, half-built, planned): KEEP (serves the58 core loop), CUT (delete now), DEFER (→ `NEXT_GAME.md`). Half-built59 defaults to CUT — "just finishing it" is the restart loop's bait.604. **Write the finish line** as the checklist below, agreed explicitly:61 boxes may be removed, never added.625. **End-to-end first**: title → play → lose → restart → win reachable with63 placeholders before any item-level polish.646. **One juice pass, one tuning pass, timeboxed.** The second polish pass is65 the polish death-loop.667. **Ship** (`vg deploy`), cold-load the live URL, play one full session on67 the deployed build, fix only blockers.688. **Debrief**: share the link, log deferred ideas, at most one v1.1 scoped69 to ≤5 checklist items. Ship-then-iterate beats a delayed "complete" v1 —70 deploys are cheap here.719. **If the user resists** ("one more feature"): offer to swap it for an72 existing checklist item. Never silently extend.7374## Shipping checklist (binary; all boxes or no ship)7576- [ ] Title screen: name + how to start + minimal controls hint77- [ ] Core loop playable start-to-finish with no dev knowledge78- [ ] Lose state reachable, clear, instant one-input restart79- [ ] Win/goal state reachable (or endless loop with score + best visible)80- [ ] Restart fully resets state — replay 3+ times (no stale timers/listeners)81- [ ] No placeholder art/text ("TODO", magenta boxes, template logo)82- [ ] Page title + favicon + meta description set83- [ ] Mobile viewport meta; page doesn't scroll/zoom under game input; canvas84 scales to the window85- [ ] Touch controls, or an explicit "keyboard required" notice on mobile —86 actually driven on a touch viewport, not just screenshotted87- [ ] Debug UI, FPS meters, `?test=` hooks hidden from players88- [ ] SFX exist, start only after user gesture, mute toggle works89- [ ] Tab-blur handled: no desync/physics spiral when backgrounded90- [ ] No console errors across a full session, verified against THIS game —91 a non-blank canvas on a port another dev server owns proves nothing92- [ ] Frame rate holds; no unbounded entity leaks over a long session93- [ ] First-timer survives >15s; a deliberate player can lose94- [ ] All assets load on the deployed path (no localhost/absolute refs)95- [ ] Deployed URL cold-loads in incognito; one full session played LIVE96- [ ] (Multiplayer) host-leave/rejoin tested; solo player not soft-locked9798Related skills: `game-playbook` (the build order that avoids stalling),99`deploy` (the finish line), `design-lenses` (is the core loop enough),100`ask-me` (scope the next game properly before starting).
Run npx skillmds@latest add kyh/finish-it in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Get a stalled or sprawling game project to ship: diagnose the death loop, cut to the core, set a binary finish line. It is listed under Coding & Dev Tools on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
kyh (@kyh) published this skill. Their other Agent Skills are listed on their SkillMD profile.