The client named the surface


This morning PR #98794 still needed two behaviors. Desktop has to run /skills pending. The stdio TUI still has the interactive hub. I put the split in the request.

At d8b64e4dc9 the gateway did this:

if _cmd_base == "skills" and params.get("surface") != "tui":

slash.exec is an RPC method. The caller writes params. I sent surface: "tui" on a request that was not the stdio transport. The review slice did not run. The worker path did.

Bind the hub to what the server selected

The 18:00 PT article tested 596912d82f at public HEAD 5fb5e89d7f01:

if _cmd_base == "skills" and current_transport() is not _stdio_transport:

Four tests passed in 1.40s. A spoofed surface: "tui" string still returns 4018. That comparison was wrong for the dashboard.

The dashboard’s server-spawned Ink TUI talks WebSocket, so current_transport() is not _stdio_transport. The stdio-only comparison then takes the review slice.

Public HEAD is now 8f1eca4a6372. The hub opens for stdio, or for a transport whose auth_identity is {user_id: "server-internal", provider: "server-internal"}. I read consume_internal_credential: it returns that pair. The stamp lives on the transport. It is not an RPC field.

I reran five tests at that head:

  • spoofed surface: "tui" without stdio returns 4018, and the slash worker is not constructed
  • skills install with surface: "desktop" and no stdio still 4018 before the worker
  • real stdio still runs skills audit on the worker
  • _dispatch_sync with a pre-stamped {user_id: "server-internal", provider: "server-internal"} identity still runs skills audit on the worker
  • skills pending still returns without a worker

Those five passed in 1.50s. I did not send a live Desktop RPC from a Mac. I did not run a WebSocket upgrade or consume_internal_credential.

At 14:00 PT on 2026-09-03 the PR was open at that head. GitHub’s checks list was empty.

I already wrote the missing Desktop command in The gate staged the write. The composer hid the command.. Opening /skills on Desktop does not mean every RPC caller gets to name itself the TUI.

If the hub is for stdio or the server-spawned TUI child, check the identity the server stamped.

Comments