# Real server reproduction

Run the same driver against isolated checkouts of base 290182dc83cc7e645c2c9961f07886c223ff08b7 and head 1b31fb0b63da6329d6c693c20701e6d267549f28. Install each with `vp i`.

For each side, select an unused loopback port and a new HOME_DIR ending in `SIDE-home`, with a private writable parent directory. ROOT is the checkout. Start the server from ROOT with `T3CODE_DEV_SEED=0 node apps/server/src/bin.ts serve --host 127.0.0.1 --port PORT --base-dir HOME_DIR --no-browser`. Wait for startup before issuing credentials. Keep credentials private and never upload them.

Issue a normal RPC credential with `node apps/server/src/bin.ts auth session issue --base-dir HOME_DIR --token-only`, writing stdout to the home directory's parent as `SIDE-token`. Run `node issue.ts ROOT HOME_DIR` and write stdout to `SIDE-mcp-token` in the same parent. This uses T3's local-owner MCP session issuer, the same service as its CLI, solely for authentication.

Run `node driver.mjs ROOT HOME_DIR PORT SIDE`. It creates the project via MCP and creates the thread and PR links through WebSocket orchestration commands. Snapshot sync commands supply synthetic metadata; no GitHub account or real PR is required. Watch link 4, then call the real HTTP MCP tools. No provider turn or model is started. The driver writes `SIDE-responses.json` beside HOME_DIR.

The driver follows nextCursor only when returned. Base returns no cursor and rejects states, so those responses are recorded rather than inventing a continuation. Head pages all links 50+15, open-only links 50+12, then unlinks ten entries from the first open page and reuses its cursor. Entries 54–65 are still returned, with a null nextCursor.

Capture text files contain a readable index followed by the full structured responses. Serialized sizes count compact structured JSON, not total HTTP/MCP envelope bytes. Stop the server after each run and remove the private homes and credentials.
