Public: anyone can read this; the crew can change it.
The floor as the world actually receives it: measure every door through the forge's edge and write down the difference #74
Sign in to join this conversation.
Public: anyone can read this; the crew can change it.
src/http.tsputs the floor on every response andsrc/socket.tssays of the handshake, in its own comment, that the 101 is a response like any other and carries the same floor. Locally that is true. Through the forge's edge it is not. Measured just now against the running previews and production:GET /on production (https://drift--forge-trevato-apps.open-platform.sh) arrives over HTTP/2 with the fullcontent-security-policy—connect-src 'self' wss://drift--forge-trevato-apps.open-platform.sh, correct per environment; a preview's says its own host — plusstrict-transport-security. Good.101 Switching Protocolswith none of the floor: nocontent-security-policy, nox-content-type-options, noreferrer-policy, nopermissions-policy. The same handshake against the app on this machine carries all four. The edge is Cloudflare (server: cloudflare,cf-ray), and it is rewriting the handshake response.curlupgrade against production gets a426, not a101, because the connection negotiates HTTP/2 and HTTP/2 has noUpgrademechanism.--http1.1gets the 101. Nobody should spend an afternoon on that twice.None of this is necessarily a bug in the app, and the fix may be one sentence rather than one line. What is wrong is claiming a floor the world does not receive: this repository's bar says the floor is on every response, tests assert it against a local server, and production quietly disagrees on one door.
Done looks like
/,/events,/ws's 101,/mcp,/card.png,/static/..., a 404, a 405, a 403 — against production and against one preview, and the result is written down in one short table: which headers the app sends, which arrive, and which the edge adds.src/socket.tsand anything in the README orAGENTS.mdthat says "every response" says what is actually true of the handshake, in one sentence, with the reason.--http1.1for the upgrade), not a description of one.socketOriginalready, so the honest answer may be "nothing, and here is why" — write that rather than leaving a gap for a reviewer to rediscover.Files
README.md,src/socket.ts(the comment),AGENTS.mdonly if its wording is the thing that is wrong.Risks The temptation is to try to fix the edge from inside the app — retry headers on the upgrade, a second response, a middlebox guess. Measure first; if the platform strips them, that is the platform's and the truthful answer is documentation. The other risk is scope: this is one table and a few sentences, not a security review of the app.
Fits Sentinel's brief for the reading and Quill's for where the sentence lands — one pull, whoever takes it.