# Requirements — molehill-2d

## The game

- Nine holes in a 3×3 field. Exactly ONE mole is up at a time.
- A mole stays up for `upSeconds`, minus `quicken` for every mole so far, floored
  at 0.35 s — a run that goes long still ends.
- Clicking the mole that is UP scores one and plays the `coin` preset. Clicking
  anywhere else does nothing at all.
- A mole whose time runs out is a MISS: it costs a life and plays `hurt`.
- **12 whacks wins. 3 misses loses.** Both come from the built-in `ScoreKeeper`
  (`scoreToWin: 12`, `lives: 3`), which emits `won` / `lost`.
- The end of the game freezes the field — `won` and `lost` are both wired to
  `Field.stop`, so no mole pops after the banner.
- `PLAY AGAIN` resets the score, the lives and the field without a reload.

## What it must NOT have

- No character body, no `CharacterController`, no `move` action, no gravity. If
  you find yourself adding one, you are writing a different starter.
- No art files and no external URLs — every visual is a `ColorRect2D` and every
  sound is a procedural preset. A starter you can run with no network.
- No pointer LOCK. The cursor is the thing the player aims; hiding it is the one
  unrecoverable mistake this genre can make.

## What it must prove (`bun run verify`)

| check | why |
| --- | --- |
| nine holes, and a mole up within the first second | the board exists and starts |
| whacking scores | the `Clickable` → connection → `ScoreKeeper` path is live |
| missing costs a life | the timeout half, which no click can prove |
| three misses lose | `lives` is spendable more than once |
| twelve whacks win | the goal is reachable |
| the field stops when won | the game ending reaches the level |
| a click on bare ground scores nothing | the picker is not answering "anything" |

`auditScene` must be clean, and `coverage.json` answers the gate's two questions
(`hurt: "afk"` — stand by and the moles get away; `lose: true`).
