Public: anyone can read this; the crew can change it.
Revoke on an invite link at /admin/limits goes through the confirm page, which says what revoking does #7970
Check · Review · Land · Live done — Landed and live in production.
The Revoke button on an open invite link at /admin/limits now opens the confirm page instead of revoking on one click. It works the same way as revoking a proposal token or an egress grant.
shipped production is serving it deploy 9b150b4
The Revoke button on an open invite link at /admin/limits now opens the confirm page instead of revoking on one click. It works the same way as revoking a proposal token or an egress grant.
src/web/pages/admin-limits.ts: The old one-click POST form is nowconfirmAction({ action: "/admin/invites/<id>/revoke", verb: "Revoke", size: "sm" }). The card's note no longer says "Nothing reads these yet.", since signup does redeem these links. It keeps the sentence that a link is shown once and is good for one signup.src/web/pages/search.ts:DESTRUCTIVEhas a new entry for^/admin/invites/([^/]+)/revoke$, added as the last entry after take-back, so it won't collide with the board-delete issue's entry. It sets verb "Revoke" and title "Revoke invite <id>?", with the detail text from the issue and no phrase to type. The POST handlerinviteRevokeis unchanged.test/invites.test.ts: The settings-form test used to check only that the page contained the revoke path. It now checks that:
- the page links Revoke to /-/confirm?to=… and has no direct POST form to the revoke route;
- the old note is gone;
- GET /-/confirm?to=/admin/invites/<id>/revoke answers 200 for an admin, with the new title and detail and a form that posts to the revoke route.
The link and confirm-page checks fail without the change. The existing revoke-by-POST step still passes.
One thing was dropped: the old button's accessible label was "Revoke invite <id>", but confirmAction takes no label, so it now reads just "Revoke". The confirm page's title still names the invite.
bun scripts/gate.ts, bun x tsc --noEmit and bun scripts/design-lint.ts are clean. scripts/fast.ts picked 981 test files, over its time budget, so I ran the ones that cover this change instead: invites, admin-limits-words, search, admin-limits-timing, invite-redeem, cross-origin-mutations and admin-gate. All 52 tests pass.
To try it on the preview, mint a link at /admin/limits and click Revoke. The confirm page explains what revoking does, and its Revoke button revokes the link.
🤖 Generated with Claude Code
Revoke on an invite link now goes through the confirm page, which says what revoking does. It follows the existing DESTRUCTIVE pattern and uses confirmAction, so the button is an <a> and the POST sits behind a second step that works without JavaScript. The POST handler still checks admin. The terminal screen already confirms before revoking, so both doors match. The test fails without the change. The preview answers 200 on the confirm route. The stale "Nothing reads these yet." note is removed. The accessible label is now plain "Revoke" instead of naming the invite; this is minor, and the confirm title names it.
The Revoke button on an open invite link at /admin/limits now opens the confirm page instead of revoking on one click. It works the same way as revoking a proposal token or an egress grant.
src/web/pages/admin-limits.ts: The old one-click POST form is nowconfirmAction({ action: "/admin/invites/<id>/revoke", verb: "Revoke", size: "sm" }). The card's note no longer says "Nothing reads these yet.", since signup does redeem these links. It keeps the sentence that a link is shown once and is good for one signup.src/web/pages/search.ts:DESTRUCTIVEhas a new entry for^/admin/invites/([^/]+)/revoke$, added as the last entry after take-back, so it won't collide with the board-delete issue's entry. It sets verb "Revoke" and title "Revoke invite <id>?", with the detail text from the issue and no phrase to type. The POST handlerinviteRevokeis unchanged.test/invites.test.ts: The settings-form test used to check only that the page contained the revoke path. It now checks that:- the page links Revoke to
/-/confirm?to=…and has no direct POST form to the revoke route; - the old note is gone; -GET /-/confirm?to=/admin/invites/<id>/revokeanswers 200 for an admin, with the new title and detail and a form that posts to the revoke route.The link and confirm-page checks fail without the change. The existing revoke-by-POST step still passes.
One thing was dropped: the old button's accessible label was "Revoke invite <id>", but
confirmActiontakes no label, so it now reads just "Revoke". The confirm page's title still names the invite.bun scripts/gate.ts,bun x tsc --noEmitandbun scripts/design-lint.tsare clean.scripts/fast.tspicked 981 test files, over its time budget, so I ran the ones that cover this change instead:invites,admin-limits-words,search,admin-limits-timing,invite-redeem,cross-origin-mutationsandadmin-gate. All 52 tests pass.To try it on the preview, mint a link at /admin/limits and click Revoke. The confirm page explains what revoking does, and its Revoke button revokes the link.
🤖 Generated with Claude Code
Closes #7962