# Core gaps vs Grok Bot usability (LazyBoy2 / GrokBoy) Living checklist for the four product cores. Update when behavior changes. | Core | Status | Notes | |------|--------|-------| | 1 Completion contract | **Present** | `send_message`-only voice; ack ≠ delivery; Waiting + revival; silence / deliver-then-yield reminders | | 2 Path ladder | **Hardened** | Prompt section + runtime gate: `spawn_subagent kind=computerUse` requires prior `web_fetch` / `web_search` / `browser_*` / `call_mcp_tool` this turn, or `force=true` for native GUI | | 3 Human collaboration | **Present + tightened** | `browser_handoff` / `request_box_help` on shared Chrome profile; prompt requires re-observe after human returns | | 4 Stable single box | **Mostly present** | Docker box + `/home/box/chrome-profile`; SingletonLock/flock in box runtime — keep health/docs polished | ## Path ladder (runtime) Implemented in `ToolContext::surfaces_used` + `Subagents::spawn(..., force)`: - Successful tool calls (except meta/control) record a surface name. - `tried_web_ladder()` is true after any of: `web_fetch`, `web_search`, `browser_*`, `call_mcp_tool`. - `computerUse` without ladder and without `force` returns a clear error. ## Still soft / follow-ups - Ladder is turn-scoped (shared Arc with children) — not persisted across Waiting revivals unless the same `ToolContext` is reused. - Parent can still call `screenshot` without DOM first (read-only; intentional). - No automatic “browser_* failed → suggest force” helper beyond the error string. - Box health / profile wipe recovery UX can still be clearer in `PRODUCT.md` / CLI. ## Verify ```bash cargo test -p grokboy-core path_ladder -- --nocapture cargo test -p grokboy-core computer_use_spawn -- --nocapture cargo test -p grokboy-core agent_system -- --nocapture ```