# GrokBoy acceptance ## P0 — streaming chat - [x] Cargo workspace `grokboy-core` + `grokboy` - [x] Env: `GROKBOY_API_KEY` / `XAI_API_KEY` / `OPENAI_API_KEY` - [x] Default base `https://api.x.ai/v1` - [x] `grokboy chat` streams assistant tokens - [x] `cargo test` passes without API key ## P1 — tools + ReAct - [x] `shell`, `list_dir`, `read_file`, `write_file` - [x] Multi-step tool loop - [x] Sessions under `~/.grokboy/sessions/` - [x] `grokboy run` / `grokboy smoke` - [x] Default model `grok-4.6` ## P2 — completion contract - [x] `report_done` / `report_blocked` stop the loop with a clear verdict - [x] Loop guard (identical tool rounds ×3 → blocked) - [x] Context truncation (`GROKBOY_CONTEXT_CHARS`, default ~100k) - [x] Offline smoke/tests cover P2 without API key ## P3 — browser - [x] Playwright DOM path (no screenshot-first) - [x] Tools: `browser_navigate`, `browser_snapshot`, `browser_click`, `browser_type`, `browser_eval` - [x] Thin Node helper under `tools/playwright/` (JSONL / one-shot JSON) - [x] Fail closed with install hint when Node/Playwright/Chromium missing - [x] `cargo test` / `grokboy smoke` pass without Playwright browsers installed