Closes the biggest coverage gap on this branch: every automated test talks
to a fake SSE server, so nothing proved the loop works against a real
model. scripts/handtest.py starts the actual binary, speaks real ACP to
it, and asserts on the five behaviours that are easy to break and hard to
notice:
basic persona + AGENTS.md hints reach the model; catalog populated
tools a real MCP tool is dispatched and its output comes back
stop-veto _Stop blocks end-of-turn, and the cap still releases it
cancel cancel mid-tool leaves no tool call spinning
steer a mid-turn steer is absorbed without restarting the turn
All 18 checks pass against Anthropic claude-sonnet-4-6. Each mode gets a
fresh process so one mode's conversation cannot pollute the next.
HANDTEST.md updated: describes the script, and its 'never run against a
real provider' known gap is replaced with what is now actually covered.
Also corrects the opening paragraph, which still said goose owns the loop.
Co-authored-by: Michael Neale <michael.neale@gmail.com>
Signed-off-by: Michael Neale <michael.neale@gmail.com>