ACP MCP evidence reproduction

AI-assisted; verified with the tests and tools listed above.
No tests were used as evidence: these recordings show the real server and CLI.

Environment on both sides: Linux x86_64, Node 26.12.1, vp dev:server,
Ghostty under Xvfb, 1920x1080, dark terminal, font size 16.
Fresh database at the checkout's own migration level; automatic seeding disabled.
One synthetic project named ACP evidence, one thread, one local ACP provider.

The raw JSON-RPC probe implements ACP v1 and advertises mcpCapabilities.acp=true.
It emulates the serverId request shape used by ACP schema 1.10+.
It does not run peri or an LLM and does not import production bridge code.
Each request waits 900 ms for readable live recording; responses are real.
Tool output in the recording selects only title, status and message to omit
operational metadata. The protocol transcript uses the same selected fields.

Use separate clean worktrees at:
Base d91915db9e36b03450aa7d6dbd35ff27cb027ffe
Head 0f1f95b9628402a30aa00f9a74ef71434e28738e

Put these scripts together in a scratch directory. In each checkout, vp i,
then bash /location/of/scripts/seed.sh /absolute/new-output-directory.
Run headless-desktop /location/of/scripts/record.sh before-or-after
/absolute/checkout /absolute/same-output-directory (all arguments on one line).
The driver launches the real t3 thread start --wait command and displays the
live probe transcript. Recording and two identical 500 ms-apart final screenshots
are retained. Private logs must not be uploaded.

Same interaction on both commits:
1. Start a thread asking to list/call a T3 tool and reinitialize.
2. Observe declared ACP server {type:acp,name:t3-code,serverId:t3-code}.
3. Send server/discover in mcp/message {serverId,requestId,method,params}.
4. Send MCP initialize 2025-06-18, notifications/initialized, tools/list,
   tools/call t3_thread_read for the current thread.
5. Repeat initialize, initialized notification, tools/list and t3_thread_read
   on the same ACP connection.

Observed base: every current-draft request returns outer ACP code 0, missing
connectionId; initialization, discovery, listing and calling all fail.
Observed head: discovery returns inner MCP -32600 (session id required), then
both initialize requests succeed, both lists return 68 tools and both calls
return the actual synthetic thread title and prompt with isError=false.

Not covered: peri 0.2.0 itself; overlapping initialization races; legacy draft
compatibility; explicit session deletion on shutdown; all other MCP tools.
