# 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 ## P4 — human browser handoff - [x] Spec: `docs/PRODUCT.md` (north star, P0–P3, P4, non-goals) - [x] Tool `browser_handoff` (`reason` required, optional `timeout_secs`) - [x] Headed Chromium for handoff (`handoff_prepare`; relaunch if was headless) - [x] Bilingual (繁中 + EN) terminal instructions; Enter continue / `abort` / timeout → fail-closed - [x] After resume: DOM snapshot returned as tool result - [x] Env docs: `GROKBOY_BROWSER_HEADED`, `GROKBOY_HANDOFF_AUTO` - [x] Wired into tool defs + agent system prompt; fail-closed if no browser - [x] Offline tests / smoke without API key or interactive stdin (`GROKBOY_HANDOFF_AUTO`) - [x] README status table updated ## P5 — interactive multi-turn agent - [x] `grokboy agent` REPL: read line → ReAct with tools → print verdict → save session - [x] `/exit` `/quit` leave; `/session` show id; empty line ignored - [x] `--session ` resume; auto-create + print session id when omitted - [x] Keep `run` one-shot; keep `chat` streaming no-tools - [x] Same tool-capable system prompt (`AGENT_SYSTEM`); Traditional Chinese welcome - [x] Docs: ACCEPTANCE P5, PRODUCT.md note, README commands/status - [x] Offline smoke/tests: agent parses / help lists it; multi-turn session plumbing without API - [x] `cargo test` green without API key ## P6 — scenario playbooks + confirm-before-post - [x] Reusable pattern docs: `docs/scenarios/README.md`, `docs/SCENARIO-TEMPLATE.md` - [x] Template prompts: `prompts/templates/phase-a.txt`, `phase-b.txt` (placeholders) - [x] Example (not sole path): Shopee→Threads under `docs/scenarios/examples/` + `prompts/examples/` - [x] Tool `request_user_confirm` (`reason`, optional `prompt`, optional `timeout_secs`) - [x] Bilingual banner; yes/y/Enter approve; no/abort deny; timeout = deny (fail-closed) - [x] Env: `GROKBOY_CONFIRM_AUTO` (fallback `GROKBOY_HANDOFF_AUTO`) - [x] AGENT_SYSTEM: never irreversible public social publish without explicit approval this turn or confirm approved; prefer draft → confirm → act; handoff for auth only - [x] Wired in tools.rs / confirm.rs; offline unit + smoke - [x] PRODUCT.md / README pointer to scenario playbooks - [x] `cargo test` / `grokboy smoke` green without API key