Intent: the operator can see why a stranger's first ask was refused, on its own page, without touching /forges. First half of #11555 (parked twice: both pulls stayed red). Start fresh from main; touch only the files below.
Done:
[ ] new src/web/pages/forges-refused.ts builds GET /forges/refused from one listRefusals call (src/core/first_ask_refusals.ts): the last 20 rows, each with time, who, the ask as escaped text and the reason; an empty list is one quiet line
[ ] mounted with one router.add("GET", "/forges/refused", …) line in src/http/server.ts, placed before /forges/:name routes, behind the same gate as /forges (others get exactly the answer /forges gives them)
[ ] new test/forges-refused.test.ts, in-process with createApp and a temp dir: an admin sees the rows; a non-admin gets /forges' refusal; <script> in an ask renders as text; no email or claim code appears
[ ] the new route passes whatever scripts/openapi-routes.ts and scripts/hollow.ts ask of a new GET page (list it where they say), and the test joins scripts/gate.ts if the gate does not find it by itself
[ ] bun x tsc --noEmit, bun scripts/design-lint.ts and bun test test/forges-refused.test.ts pass in the sandbox before the push
Files: src/web/pages/forges-refused.ts (new), src/http/server.ts (one line), test/forges-refused.test.ts (new), possibly scripts/gate.ts or the route lists named above.
Risks: do not edit src/web/pages/forges.ts or docs here (the next issue does). Branch scout/11555-… at 4687f1b01911 may be read for ideas.
Suggested brief: scout.
Intent: the operator can see why a stranger's first ask was refused, on its own page, without touching /forges. First half of #11555 (parked twice: both pulls stayed red). Start fresh from main; touch only the files below.
Done:
src/web/pages/forges-refused.tsbuildsGET /forges/refusedfrom onelistRefusalscall (src/core/first_ask_refusals.ts): the last 20 rows, each with time, who, the ask as escaped text and the reason; an empty list is one quiet linerouter.add("GET", "/forges/refused", …)line insrc/http/server.ts, placed before/forges/:nameroutes, behind the same gate as/forges(others get exactly the answer /forges gives them)test/forges-refused.test.ts, in-process withcreateAppand a temp dir: an admin sees the rows; a non-admin gets /forges' refusal;<script>in an ask renders as text; no email or claim code appearsscripts/openapi-routes.tsandscripts/hollow.tsask of a new GET page (list it where they say), and the test joinsscripts/gate.tsif the gate does not find it by itselfbun x tsc --noEmit,bun scripts/design-lint.tsandbun test test/forges-refused.test.tspass in the sandbox before the pushFiles: src/web/pages/forges-refused.ts (new), src/http/server.ts (one line), test/forges-refused.test.ts (new), possibly scripts/gate.ts or the route lists named above. Risks: do not edit src/web/pages/forges.ts or docs here (the next issue does). Branch
scout/11555-…at 4687f1b01911 may be read for ideas. Suggested brief: scout.