1Pick a goal. — Define a single feature or behavior to implement.
2Implement small. — Make the smallest change that moves the game forward.
3Ensure integration points. — Provide a single canvas and `window.render_game_to_text` so the test loop can read state.
4Add `window.advanceTime(ms)`. — Strongly prefer a deterministic step hook so the Playwright script can advance frames reliably; without it, automated tests can be flaky.
5Initialize progress.md. — If `progress.md` exists, read it first and confirm the original user prompt is recorded at the top (prefix with `Original prompt:`). Also note any TODOs and suggestions left by the previous agent. If missing, create it and write `Original prompt: <prompt>` at the top before appending updates.
6Verify Playwright availability. — Ensure `playwright` is available (local dependency or global install). If unsure, check `npx` first.
7Run the Playwright test script. — You must run `$WEB_GAME_CLIENT` after each meaningful change; do not invent a new client unless required.
8Use the payload reference. — Base actions on `$WEB_GAME_ACTIONS` to avoid guessing keys.
9Inspect state. — Capture screenshots and text state after each burst.
10Inspect screenshots. — Open the latest screenshot, verify expected visuals, fix any issues, and rerun the script. Repeat until correct.
11Verify controls and state (multi-step focus). — Exhaustively exercise all important interactions. For each, think through the full multi-step sequence it implies (cause → intermediate states → outcome) and verify the entire chain works end-to-end. Confirm `render_game_to_text` reflects the same state shown on screen. If anything is off, fix and rerun.
Examples of important interactions: move, jump, shoot/attack, interact/use, select/confirm/cancel in menus, pause/resume, restart, and any special abilities or puzzle actions defined by the request. Multi-step examples: shooting an enemy should reduce its health; when health reaches 0 it should disappear and update the score; collecting a key should unlock a door and allow level progression.
12Check errors. — Review console errors and fix the first new issue before continuing.
13Reset between scenarios. — Avoid cross-test state when validating distinct features.
14Iterate with small deltas. — Change one variable at a time (frames, inputs, timing, positions), then repeat steps 7–13 until stable.
Example command (actions required):
```
node "$WEB_GAME_CLIENT" --url http://localhost:5173 --actions-file "$WEB_GAME_ACTIONS" --click-selector "#start-btn" --iterations 3 --pause-ms 250
```
Example actions (inline JSON):
```json
{
"steps": [
{ "buttons": ["left_mouse_button"], "frames": 2, "mouse_x": 120, "mouse_y": 80 },
{ "buttons": [], "frames": 6 },
{ "buttons": ["right"], "frames": 8 },
{ "buttons": ["space"], "frames": 4 }
]
}
```