# Status — molehill-2d

## Working

- The full loop: pop → click or miss → score or life → win or lose → play again.
- Nine `Clickable` moles wired to one handler; the built-in `ScoreKeeper` holds
  the score, the lives and both end conditions.
- Procedural audio on both outcomes; a hit flashes the mole before it drops, so
  a hit reads as a hit rather than as the mole vanishing.
- `bun run verify` — ten assertions, all driving the mouse.
- `coverage.json` — the gate's two questions answered without a body.

## Deliberately not here

- **A difficulty curve beyond `quicken`.** One knob, so the ramp is legible.
- **Multiple moles at once.** One mole is the clearest possible statement of the
  loop; two is a design decision the person cloning this should make.
- **Sprites.** The moles are rectangles on purpose — see Context.

## Where to take it next

- Swap `ColorRect2D` for `Sprite2D` and give the moles a sheet: nothing in
  `behaviors.ts` knows what a mole looks like.
- Golden mole worth three, bomb mole that costs a life when clicked — both are a
  `tags` entry on the node and a branch in `onMoleClicked`.
- Turn the field into a GRID of clickable cells and you have a match-3, a
  minesweeper or a tower-defense build menu; the input path is identical.

## Pausing

ESC pauses and shows the pause menu; OPTIONS opens the settings over it and
BACK returns to the menu that asked. All of it is `GameFlow` (`pausePanelPath`,
`screen(path)`, `back()`) wired with `connections` — there is no TypeScript for
any screen in this game.
