playbenchSAFE
Every game-dev loop for AI coding agents (Claude Code, Codex, Cursor, Copilot, Gemini CLI): design, build, bot playtests on your real build, balance, iterate, human logs, gated itch/Steam/web shipping.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Bots playtest your game after every feature. You stay in charge of the fun.
A plugin for AI coding agents that covers every game-dev loop: design, build, playtest, balance, iterate, log, ship.Works with Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, and any agent that reads SKILL.md skills.
[](LICENSE)
A playbench bot playing the real build of the sample game. No human hands.
Why
Most indie games die the same way: a bug from hour 2 gets found at hour 40, nobody playtests until it "feels ready", and the release goes out with placeholder art still in it.
playbench catches each of those early:
- 🤖 After every feature, bots play your real build and catch crashes, freezes, softlocks and dead controls.
- 📊 Balance on the real game. It sweeps a value such as enemy speed and shows you where the difficulty falls off a cliff.
- 🚦 Ship with gates. Undisclosed AI or placeholder art is blocked, and nothing uploads until you tick the release gates.
How it works
Each loop is one skill (/playbench:design, build, playtest, balance, iterate, log, ship), and /playbench:studio tells you which loop you
73bad408d74bOBSERVED · 2026-10-14Host compatibility
What the documentation claims. We have not run a compatibility test.
| Host | Status | Notes |
|---|---|---|
| claude-code | mentioned | |
| codex | mentioned | |
| copilot | mentioned | |
| cursor | mentioned | |
| gemini-cli | mentioned | |
| windsurf | mentioned |
What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
---
name: art
description: Use when the user asks about art style, an art bible, a palette or fonts, sprites, animations, a sprite sheet or texture atlas, placeholder art, Aseprite exports, or asset naming.
allowed-tools: Bash(python:*), Bash(python3:*), Bash(py:*), Read, Write, Edit, Glob, Grep
---
!`python "${CLAUDE_PLUGIN_ROOT}/scripts/studio.py" status || py -3 "${CLAUDE_PLUGIN_ROOT}/scripts/studio.py" status || echo "playbench: no working Python 3 found"`
> **Any agent:** Claude Code runs the line above for you. If no `KEY=value` status block appears above, run `python "<SKILL_DIR>/../../scripts/studio.py" status` yourself (`py -3` on Windows, `python3` elsewhere) and treat its output as the status block. `<SKILL_DIR>` is the folder holding this SKILL.md; `<PLUGIN>` is the `PLUGIN` value from status. Names like `/playbench:build` mean "the playbench build skill" on any agent.
# Art: a one-page bible, labelled placeholders, atlases
The status lines above give `RUN`, `PLUGIN`, `CONTEXT`, `CODING`, `AI_POLICY`, `ENGINE` and `ALLOWED`. Use them; don't ask for what they already say. Every command is `<RUN> "<PLUGIN>/scripts/art.py" <cmd> ...`. Exit codes: 0 ok, 1 problems, 2 setup (the message says what to fix).
## Hard rules
- **Humans own final art.** Never present a generated image as final art. Everything art.py draws is a `_placeholder` file recorded in `art/PLACEHOLDERS.json` (`source: "generated"`), with a `playbench=placeholder` PNG text chunk.
- AI image generation, if the user brings one in, only as `art/<name>_placeholder.png` with an entry `{"path": ..., "source": "ai", "note": ...}` in `art/PLACEHOLDERS.json`. Never strip metadata from any image.
- `ship artgate` blocks undisclosed placeholders: each one is replaced with human-made art or disclosed before release.
- **Never tick a gate box.** Never write `[x]` into `gates.md`.
- `AI_POLICY=banned`: explain each step and give the exact command; the student writes the bible and runs the commands. Don't generate images.
## 0. Preconditions
- `RUN=NONE` or the echo fallback: tell the user to install Python 3.11+ and stop.
- Exit 2 with `Pillow not installed for <exe>`: show the printed `pip install pillow` command and **ask before running it**. lint and aseprite don't need Pillow.
- `INIT=no`: carry on in the current folder; suggest `/playbench:studio` once at the end.
Ask one question at a time, each with a default. Skip steps the user doesn't need (a jam may stop after step 3).
## 1. Art bible (`art/bible.md`)
If it exists, read it and edit in place. Otherwise read `design/design.md` (hook and pillars) and draft from `<SKILL_DIR>/bible-template.md`, keeping its exact shape (`ship.py` parses `## Palette` and `## Fonts`):
1. **Palette.** Offer 2-3 palettes drawn from the hook, each as a hex list with roles, e.g. `A) bg #1b1b2f, text #f5f5f5, link #ffcc00, button #e94560, hero #4fa3ff`. Default: A. `bg`, `text`, `link` and `button` are required; other colors get names (`hero`, `enemy`, `pickup`).
2. **Fonts.** Two Google Fonts: heading and body (default: Press Start 2P / Inter for pixel art, Fredoka / Inter otherwise).
3. **Pixel density.** Tile size and screen scale (default `tile: 16`, `scale: 3`; non-pixel art: `tile: 64`, `scale: 1`).
4. **Proportions.** One line per rule in tiles (default: hero 1 tile, enemies at most 2).
Write the page, then say: "This is your art direction; change anything. You approve it and own the final art."
## 2. Animation list
From the must features in `design/design.md`, propose rows for `## Animations` (`| sprite | anim | frames | fps |`): only what the must list needs (e.g. hero idle 2/4, hero run 4/10, enemy move 2/6, pickup spin 4/8). The user edits; write the table. Names are lowercase snake_case.
## 3. Placeholders
```
<RUN> "<PLUGIN>/scripts/art.py" placeholders .
```
One hatched, outlined sheet per row (frames side by side, frame number as pixels in the top-left), `tile` x `tile` per frame, colors from the palette. A row is skipped when final art `art/<sprite>_<anim>.png` exists. One-off: `placeholder . --name hero --anim run --frames 4 --size 16x16 --color hero`.
Tell the user plainly: these are labelled placeholders, recorded in `art/PLACEHOLDERS.json`; ship's artgate blocks them until each is **replaced** (then remove its entry) or **disclosed** in `disclosure.md`.
Who wires them into the game, by `CODING`: 1 Claude does it and says so; 2 Claude does it and asks for a review; 3 Claude explains and reviews the user's change.
## 4. Atlas for the engine
```
<RUN> "<PLUGIN>/scripts/art.py" pack art --out art/atlas [--padding 2] [--pot]
```
Writes `<out>.png` + `<out>.json` (TexturePacker JSON hash, frames named by file stem). Placeholder inputs rename the output to `*_placeholder` and record it.
- **Phaser:** `this.load.atlas('art', 'art/atlas.png', 'art/atlas.json')`; a single sheet strip also loads with `load.spritesheet(key, url, {frameWidth: <tile>})`.
- **Godot:** import the individual PNGs (or an AtlasTexture region per frame); use `--pot` only if a target needs power-of-two textures.
- Other web engines: any loader that reads TexturePacker JSON hash.
## 5. Aseprite (only if they own it)
```
<RUN> "<PLUGIN>/scripts/art.py" aseprite art/src/hero.aseprite --out art/hero
```
Runs Aseprite in batch mode to a packed sheet + json-hash data with tags. Exit 2 `Aseprite not found`: tell them to set `ASEPRITE=<path to the aseprite executable>`. Never download or install it.
## 6. Lint before ship
```
<RUN> "<PLUGIN>/scripts/art.py" lint .
```
Checks names under `art/`: lowercase `[a-z0-9_]` stems and extensions, no spaces, `_placeholder` only at the end, every placeholder listed and every listed file present, no names that differ only by case (itch's server is case-sensitive), every atlas JSON's image present. Explain each problem line and offer the rename; renames also need the code references updated.
## 7. Store page
`/playbench:ship` theme builds the itch page colors and fonts Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (7 observation(s))
- Network
- declared (2 observation(s))
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (9)
url = f"http://127.0.0.1:{srv.server_port}/index.html" + (f"?{query}" if query else "")return hashlib.sha1(json.dumps(s, sort_keys=True).encode()).hexdigest()[:12]
rec["shot"] = rec["png"] and hashlib.sha1(rec["png"]).hexdigest()[:12]
rec["shot"] = hashlib.sha1(rec["png"]).hexdigest()[:12]
t = t.replace('"<SKILL_DIR>/../../scripts/studio.py"', f'"{scripts}"') # copies no longer sit inside the repoassert "<SKILL_DIR>/../../scripts" not in s and (d / "playbench-design" / "design-template.md").exists()
page.goto(f"http://127.0.0.1:{srv.server_port}/index.html"); page.wait_for_function("window.__game")m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Gates applied: no_behavioural_pass.
73bad408d74bfull audit observations/trust-audit/skill/mihirsahu14__playbench.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-14 | 73bad408d74b | SAFE | B | 89 | first audit |
Questions
What does the playbench skill do?
Every game-dev loop for AI coding agents (Claude Code, Codex, Cursor, Copilot, Gemini CLI): design, build, bot playtests on your real build, balance, iterate, human logs, gated itch/Steam/web shipping.
Is playbench safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can playbench access on my machine?
The audit observed that it reaches the network and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: none found.
Which assistants does playbench work with?
Its documentation mentions claude-code, codex, copilot, cursor, gemini-cli and windsurf. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (73bad408d74b), read on 2026-10-14. The repository is watched, and a new audit runs when it changes — this is the first audit.