# Fps

> Design an arena level for Jev FPS (the ASCII map, the demons, the pace), then measure where Jev's decision rate stops being enough.

- Skill: `autonomous-ai/fps` (Agent Skill)
- Install (CLI): `npx skillmds@latest add autonomous-ai/fps`
- Raw SKILL.md: https://api.skillmd.com/api/skills/autonomous-ai/fps/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: autonomous-ai (https://skillmd.com/u/autonomous-ai)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/autonomous-ai/fps

---


# Craft: Jev FPS levels

Jev FPS is a first-person arena shooter that Jev plays by itself, one typed decision at a time. You
shape the arena in `level.json`. The craft is a map that reads well in 3D and a pace that shows the
real limit: about nine decisions a second.

## What Jev is asked, every tick

One call, four questions, all answered in parallel from the same state text:

```
turn    choice  LEFT_HARD  LEFT  LEFT_FINE  AHEAD  RIGHT_FINE  RIGHT  RIGHT_HARD
move    choice  FORWARD  BACK  STRAFE_LEFT  STRAFE_RIGHT  HOLD
fire    noul    "Fire now? Yes only when a demon is in your crosshair and you have ammo."
threat  score   calm < watchful < pressed < critical
```

The state text is what a player could know: health, ammo, wall distances, each demon in sight with
its bearing and distance, the nearest demon it can hear but not see, the automap route, and whether
the crosshair is on a demon. The pane shows this text live under "What Jev reads".

## Drawing a good map

- Tiles: `#` stone, `%` tech panel, `=` hell brick, `.` floor, `P` start, `D` demon spawn,
  `M` medkit, `A` ammo. The border must be wall. Every row is the same width.
- Give sight lines of 5 to 9 tiles. Very long halls make it a shooting gallery. Tight mazes hide
  demons until they are biting.
- Put spawns on at least two sides of the start so Jev must turn to deal with them.
- Pillars (single wall tiles in a room) make demons split and flank, which is fun to watch.
- A level of about 24 by 16 fills the minimap nicely. Bigger maps mean long quiet walks.

## Setting the pace

`demonSpeed` is the dial. Demons weave as they charge, so speed is also how fast they cross the
crosshair. Each wave adds one demon and 12% speed, so every run ends when the pace passes what nine
decisions a second can handle.

| feel | demonSpeed | demons |
|---|---|---|
| a stroll, long runs | 0.8 | 3 |
| the default | 1.2 | 4 |
| tense from wave 1 | 2.4 | 5 |
| brutal | 4.0 | 8 |

`tickMs` changes the decision rate itself. Raising it to 250 shows what a slower decision loop
costs: the same demons now win much earlier.

## Verifying

```bash
node "$JEV_DSH/toolchain/check.mjs"
```

Then watch the pane and read `.harness/verdict.json`: wave, kills, deaths, best wave, shots on
target. Report the pace you chose, how far Jev gets, and the speed where it stops clearing waves.
The pane's MOCK badge means the offline stand-in is playing, not the real model. Say so when you
report.

