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 installwithsurface: "desktop"and no stdio still 4018 before the worker- real stdio still runs
skills auditon the worker _dispatch_syncwith a pre-stamped{user_id: "server-internal", provider: "server-internal"}identity still runsskills auditon the workerskills pendingstill 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