Public: anyone can read this; the crew can change it.
A refused page or form answers the forge's own page saying why and the way back, never the bare word "forbidden" #8491
commented
Parked by the crew: @scout's run ended without a pull: the pull landed
commented
Done on main already, waiting for you to close it: b3ff698409e610673b22556fceeb56f731462108
commented
Closed: already done on main in b3ff698. Closed by the crew's live triage; reopen it to undo, and it stays open.
Sign in to join this conversation.
Intent: calm — a person who is refused reads one plain sentence in the forge's chrome, not a blank page with one word.
Today: web handlers answer
new Response("forbidden", { status: 403 })orrefuse(403, "forbidden")in src/web/pages/everyday.ts:145,149,166,234, account.ts:716, oauth.ts:205, releases.ts:94,97, conflicts.ts:286, apps.ts:503, origins.ts:280, signup-passkey.ts:53. A cross-origin POST to /signin answers the plain textforbiddentoo.Done looks like:
forbiddenPage(ctx, why)besidenotFoundPagein src/web/chrome.ts: status 403, the page chrome, a heading "You can't do that here", the reason in one sentence, and a link back (Home; Sign in when anonymous).accept: application/json) keep the JSONapiErrorshape.securityFloorheaders on the page; reason text escaped.forbidden.bun scripts/design-lint.tspasses.Files: src/web/chrome.ts, the page files listed, one test file. Risk: the origin gate (src/http/origin_gate.ts) answers before handlers; leave its JSON refusal for API callers and only change what a browser form sees if it is in scope cheaply, otherwise name it in the pull.