remote-control 2.1.138 regression: pre-create-session POST returns 400 "Extra inputs are not permitted", phone work-dispatch silently broken
Summary
claude remote-control in version 2.1.138 breaks all phone work-dispatch on Windows. The daemon registers with the bridge successfully, but the pre-create-session POST returns:
[bridge] Session creation failed with status 400: source: Extra inputs are not permitted
The poll loop then runs forever returning 200 (no work), even when the mobile Claude app shows the device as Connected and the user creates sessions. The mobile UI hangs indefinitely on "Contemplating…" because no work is ever dispatched to the daemon. Downgrading to 2.1.114 fully restores the flow.
Versions tested (Windows 365 Cloud PC)
| Version | bridge:init Registered | Pre-create-session | Phone sessions work? |
|---|---|---|---|
| 2.1.138 | ✅ 200 | ❌ HTTP 400 "Extra inputs are not permitted" | ❌ (UI hangs forever) |
| 2.1.114 | ✅ 200 | ✅ implicit (no error in debug log) | ✅ (work polled, acked, spawned within seconds) |
Environment
- OS: Windows 11 Enterprise 26200 (Windows 365 Cloud PC)
- Node: v22.17.1
- npm: 9.8.1
- Install method:
npm install -g @anthropic-ai/claude-code@<version> - Invocation:
claude remote-control --name "<label>" --spawn=same-dir --debug-file <path> - Wrapped in a Scheduled Task that respawns the daemon on exit. Wrapper script discards TTY output and only logs lifecycle events.
Reproduction
npm install -g @anthropic-ai/claude-code@2.1.138- Run
claude remote-control --name "test" --spawn=same-dir --debug-file ./rc-debug.login any git repository. - Observe debug log —
bridge:init Registeredsucceeds, then[bridge] Session creation failed with status 400. - Open the Claude app on phone → Code tab → select the device → "New session" → type anything.
- UI hangs on "Contemplating…" indefinitely. No new claude.exe child of the daemon is spawned. No work entries appear in the daemon's debug log.
Debug log evidence
2.1.138 — broken (relevant excerpt, PII redacted)
[DEBUG] [bridge:init] bridgeId=<uuid> dir=<path> branch=main gitRepoUrl=<url> machine=<host>
[DEBUG] [bridge:init] apiBaseUrl=https://api.anthropic.com sessionIngressUrl=https://api.anthropic.com
[DEBUG] [bridge:init] sandbox=false debugFile=<path>
[DEBUG] [bridge:api] POST /v1/environments/bridge bridgeId=<uuid>
[DEBUG] [bridge:api] POST /v1/environments/bridge -> 200 environment_id=<id>
[DEBUG] [bridge:api] >>> {"machine_name":"<host>","directory":"<path>","branch":"main","git_repo_url":"<url>","max_sessions":32,"metadata":{"worker_type":"claude_code"}}
[DEBUG] [bridge:api] <<< {"environment_id":"<id>","organization_uuid":"<uuid>","environment_secret":[REDACTED]}
[DEBUG] [bridge:init] Registered, server environmentId=<id>
[DEBUG] [bridge] Session creation failed with status 400: source: Extra inputs are not permitted
[DEBUG] [bridge:work] Starting poll loop spawnMode=same-dir maxSessions=32 environmentId=<id>
[DEBUG] [bridge:api] GET .../work/poll -> 200 (no work, 1 consecutive empty polls)
[DEBUG] [bridge:api] GET .../work/poll -> 200 (no work, 100 consecutive empty polls)
After 9 minutes of polling: still no work dispatched, even though the phone-side created multiple sessions during that window.
2.1.114 — working (relevant excerpt, PII redacted)
[DEBUG] [bridge:init] Registered, server environmentId=<id>
[DEBUG] [bridge:work] Starting poll loop spawnMode=same-dir maxSessions=32 environmentId=<id>
[DEBUG] [bridge:api] GET .../work/poll -> 200 (no work, 1 consecutive empty polls)
[DEBUG] [bridge:api] GET .../work/poll -> 200 workId=<id> type=session sessionId=<id>
[DEBUG] [bridge:work] Acknowledging workId=<id>
[DEBUG] [bridge:api] POST .../work/<id>/ack -> 200
[DEBUG] [bridge:session] CCR v2: registered worker sessionId=<id> epoch=1 attempt=1
[DEBUG] [bridge:session] Spawning sessionId=<id> sdkUrl=https://api.anthropic.com/v1/code/sessions/<id>
[DEBUG] [bridge:session] sessionId=<id> pid=<pid>
The "Session creation failed with status 400" line is absent, and within a minute of starting the daemon, work was polled, acked, and a child claude.exe spawned successfully.
Workaround
Downgrade until a fix lands:
npm install -g @anthropic-ai/claude-code@2.1.114
Restart the daemon. Phone-pairing works again.
Suspected cause
The error string Extra inputs are not permitted is the standard Pydantic extra='forbid' validation error. The 2.1.138 client appears to send a field on POST /v1/environments/bridge/sessions (or whichever endpoint creates the pre-session) that the server-side schema rejects. Either:
- 2.1.138 added a new field that hasn't been deployed server-side yet, or
- A field was renamed/removed server-side but the client wasn't updated to match.
The mobile UI's behavior (showing "Connected" and accepting new sessions, but hanging on "Contemplating…") suggests the server-side accepts the session-create from the phone, queues the work, but cannot dispatch it because the daemon never completed its own pre-create handshake — leaving the env in a half-registered state that accepts inbound session intent but cannot route to a worker.
Happy to share more of the raw debug log privately if helpful. Thanks!
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗