Public: anyone can read this; the crew can change it.
A setting turns open-platform.sh sign-in off, and the forge works without it #2602
Check · Review · Land · Live done — Landed and live in production.
A new capacity setting, `signin.edge` (on or off, default on), turns the platform edge's sign-in off on every door. It is pushed. `tsc` printed no errors and the new and related suites pass (80 tests across 7 files), but I did not run the whole `bun test`. The forge runs the full check on this push.
shipped production is serving it deploy 97ab7b8
A new capacity setting, signin.edge (on or off, default on), turns the platform edge's sign-in off on every door. It is pushed. tsc printed no errors and the new and related suites pass (80 tests across 7 files), but I did not run the whole bun test. The forge runs the full check on this push.
What changed
- Setting:
signin.edgeis insrc/core/capacity.tsnext to the others, with its label and a reason in the help text. It shows on the settings page and in the capacity API with no page changes. Changes are recorded incapacityChangesand can be undone by clearing the value.FORGE_SIGNIN_EDGEis its boot default. - Off means off:
activeEdgeToken(app)insrc/http/edge.tsreturns the edge secret only while the setting is on.resolveAuthand the four web places that send people to the edge (layout, sign-in page, studio home, chrome) all use it. With the setting off, the edge headers are ignored and the pages show the forge's own/signin. The setting is read on every request, so it takes effect without a restart. - MCP: the
signin.edgekey is added to the capacity enum and the tool description insrc/http/mcp.ts. - Tests:
test/signin-edge.test.tscovers four cases:
- on by default;
- off: an edge identity is ignored, including for an account the edge made and for the admin, and the pages stop offering the edge;
- off: password sign-in (a token via /api/v1/tokens) and the passkey sign-in options endpoint still work;
- back on: the edge identity is read again.
Left out
- The passkey assertion itself is not exercised with the setting off. That path never reads the edge, and
test/passkeys.test.tscovers it. My test only checks that its options endpoint answers. - Accounts the edge made still have no password. With the setting off they cannot sign in until they set a passkey or a password by some other means. The setting's help text says so.
- No change to what happens to an unknown edge login. That is #2593.
Try it
- Run the app with
FORGE_EDGE_TOKENset, sign in as an admin, and open Settings → Capacity. Set "Sign in through the platform edge" to off. - Requests with
X-Plat-UserandX-Plat-Edge-Tokenare then treated as signed out. Clear the value to return to on. - Run
bun test test/signin-edge.test.ts.
🤖 Generated with Claude Code
The mechanism is sound. activeEdgeToken sends every door through one check: resolveAuth and the four sign-in links. Edge auth never mints a session cookie, so turning the setting off takes effect on the next request with no stale sessions left behind. The setting is read live from the database, the admin-only guard in changeCapacity still applies, and the test covers on, off and back on. One thing has to change before this lands.
High: the switch can lock the owner out with no way back. On this forge the owner signs in through open-platform.sh, so their account has no password and may have no passkey. If they set signin.edge=off, the very next request treats them as signed out. Nothing then lets them sign in again. FORGE_SIGNIN_EDGE cannot rescue them either, because capacityValue puts the stored value above the boot default. The only way back is editing forge_setting in the database by hand. That falls short of pillar 0 (trust and calm), and the help text naming the danger is not a guard.
Fix first: make changeCapacity (src/actions/capacity.ts) refuse signin.edge → off when the acting admin has neither a password nor a passkey. Return a named error such as would_lock_out, and show it on the settings page, in the API and in MCP. Add a test where an edge-made admin with no password tries to turn it off and is refused, the setting stays on, and an admin with a password still can. A boot-time escape hatch would also help: for example, have an explicit FORGE_SIGNIN_EDGE=on win over a stored off. That is secondary to the guard.
Medium: docs. The README section on FORGE_EDGE_TOKEN (around README.md:331) and docs/THREATS.md:135 (the edge → pod row) do not mention the new setting or FORGE_SIGNIN_EDGE. Add one sentence to each: with the setting off, X-Plat-User is ignored even when the secret matches.
Notes, not blocking:
- The terminal has no capacity command today, and this change keeps that as it was.
edgeLogoutUrlin layout.ts is only reached whenauth.via === "edge", which can no longer happen while the setting is off.- I could not reach the preview or the screenshots from this sandbox, so this review is based on the code and the test.
scout only (reviewers: not for you): Steward (trevato) — answer the reviewer's latest request on this head and push, or say in one line why not.
Taken over by nobody; stopped @scout.
This pull adds signin.edge, a capacity setting (on or off, default on) that turns the platform edge's sign-in off on every door. This push answers the reviewer's request: an admin can no longer turn the edge off on themselves and get locked out. tsc is clean, and test/signin-edge.test.ts plus the capacity suites pass (33 tests). I did not run the whole bun test; the forge runs the full check on this push.
What the setting does
- Edge ignored:
signin.edgesits insrc/core/capacity.tswithFORGE_SIGNIN_EDGEas its boot default.activeEdgeToken(app)insrc/http/edge.tsreturns the edge secret only while the setting is on.resolveAuthand the four web places that send people to the edge all use it. With the setting off, the edge headers are ignored and the pages show/signin. - No restart: the setting is read on every request.
- Where it shows: it appears on the settings page and in the capacity API, and
src/http/mcp.tslists the key. Changes are recorded incapacityChanges, and clearing the value returns it to on.
What changed since the first push
- Lockout guard:
changeCapacityinsrc/actions/capacity.tsrefusesoffwith the new errorno_credentialwhen the acting admin has neither a password nor a passkey. The settings page says to set one first. The API and MCP return the same refusal as a 422. - Guard test: a new case in
test/signin-edge.test.tshas an edge-made admin try to turn the edge off. It checks that the request is refused and the value stayson. - Threat docs:
docs/THREATS.md's edge → pod row now mentions the setting and the guard.
Left out
- Recovery override: there is no env override for recovery. The reviewer said to apply one in
src/http/edge.tsonly if I added it, and the guard covers the self-lockout it was meant for. If the only admin with a password is later removed, an operator has to clear the stored value in the database. - Other edge-made accounts: they still have no password, so with the setting off they can't sign in until they set a passkey or password some other way. The help text says so.
- Passkey assertion: the assertion itself isn't exercised with the setting off. The test only checks that the options endpoint answers, and
test/passkeys.test.tscovers the rest. - Unknown edge logins: no change to what happens to an unknown edge login. That is #2593.
Try it
- Run the app with
FORGE_EDGE_TOKENset and sign in as an admin who has a password. Open Settings → Capacity and set "Sign in through the platform edge" to off. Requests withX-Plat-UserandX-Plat-Edge-Tokenare then treated as signed out. Clear the value to return to on. - Run
bun test test/signin-edge.test.ts.
🤖 Generated with Claude Code
Closes #2595
The guard from the last round is in place and it is right. changeCapacity refuses signin.edge → off with no_credential when the acting admin has neither a password nor a passkey. It checks password_hash = '', which is exactly what ensureEdgeUser leaves behind, and it reads passkeys through passkeyIds. The settings page explains the refusal, and the API and MCP share the action. test/signin-edge.test.ts covers four things: an edge-made admin is refused and the value stays on; an admin with a password can turn it off; with the setting off, the edge headers are ignored on /api/v1/user, on / and on the /new gate; and turning it back on restores edge sign-in. activeEdgeToken is the one switch for resolveAuth and for every sign-in link (layout, chrome, site, studio). No code path still reads config.edgeToken directly to decide identity. I found no injection, no trusted client header and no unescaped output. On the head (79c7d63b), bun test test/signin-edge.test.ts test/capacity* passes: 33 tests, 0 failures.
One miss, fix first: the README does not mention the setting. Last round asked for this, and only docs/THREATS.md was updated. Add a sentence to the FORGE_EDGE_TOKEN paragraph (README.md:331) covering:
- Settings → Capacity → "Sign in through the platform edge" (
signin.edge, boot defaultFORGE_SIGNIN_EDGE, also/api/v1/admin/capacityand the MCPcapacitytool), set tooff, makes the forge ignoreX-Plat-Usereven when the secret matches. People then sign in with a password or a passkey. - An admin with neither is refused, so they cannot lock themselves out.
- Accounts the edge made cannot sign in while it is off until they add a passkey. A password-less account cannot set a password today, because
/settings/passwordasks for the current one.
The checklist requires that the README says how to use what the change adds, and right now it does not.
Not blocking:
- The
no_credentialmessage tells the admin to "Set a password or a passkey". An edge-made admin cannot set a password, becausechangePasswordverifies a current password they don't have, so only the passkey path is real. Consider rewording it to "Add a passkey (or a password)…" so the advice can be followed. - The terminal has no capacity command. That was true before this change, which keeps the terminal as it was.
- I could not reach the preview or its screenshots from this sandbox, so this verdict is based on the code and the tests run on the head.
The README now describes signin.edge, and I reworded the refusal message, as you asked. tsc is clean; I did not re-run the tests, since this push only touches the README and one message string.
- README: the
FORGE_EDGE_TOKENparagraph now covers three things.
- The setting: Settings → Capacity → "Sign in through the platform edge", boot default FORGE_SIGNIN_EDGE, also reachable at /api/v1/admin/capacity and the MCP capacity tool. Set to off, the forge ignores X-Plat-User even when the secret matches, and people sign in with a password or a passkey.
- The guard: an admin with neither a password nor a passkey is refused, so no one can lock themselves out.
- Edge-made accounts: they cannot sign in while the setting is off until they add a passkey. The README notes that a password-less account cannot set a password, because /settings/password asks for the current one.
- Refusal message: the
no_credentialtext on the settings page now reads "Add a passkey (or a password) to your own account first: with the edge off, you would be signed out for good." No test depended on the old wording.
Still left out: the setting has no recovery override, and the terminal has no capacity command, as before.
🤖 Generated with Claude Code
Approved. activeEdgeToken is now the only thing that decides edge sign-in. resolveAuth and all four sign-in links use it, and at this head no code outside src/http/edge.ts reads config.edgeToken. The setting is checked on every request, so turning it off takes effect without a restart. Only an admin can change it, through the existing changeCapacity path, which is the same on the page, the API and MCP. The guard stops an admin who has no password or passkey from locking themselves out. Its query is parameterised, and the new error message is a fixed string. test/signin-edge.test.ts would fail without this change: with the setting off, the edge request gets 401 where it would get 200, and the guard case expects no_credential. On the head I ran signin-edge, edge-auth and the capacity suites: 44 pass, 0 fail.
The terminal: SSH signs people in with keys and never reads the edge, so turning the edge off changes nothing there. No capacity setting has a terminal command today, so this pull is not the place to add the first one.
What I could not check: my sandbox blocked the preview host and the screenshot files, so I have not looked at the preview myself. The review is based on the code and the tests.
Not blocking, for later: the guard only checks off. If FORGE_SIGNIN_EDGE=off is set, clearing the value to "" also turns the edge off and skips the guard. That needs operator access, so it is acceptable.
A new capacity setting,
signin.edge(on or off, default on), turns the platform edge's sign-in off on every door. It is pushed.tscprinted no errors and the new and related suites pass (80 tests across 7 files), but I did not run the wholebun test. The forge runs the full check on this push.What changed
signin.edgeis insrc/core/capacity.tsnext to the others, with its label and a reason in the help text. It shows on the settings page and in the capacity API with no page changes. Changes are recorded incapacityChangesand can be undone by clearing the value.FORGE_SIGNIN_EDGEis its boot default.activeEdgeToken(app)insrc/http/edge.tsreturns the edge secret only while the setting is on.resolveAuthand the four web places that send people to the edge (layout, sign-in page, studio home, chrome) all use it. With the setting off, the edge headers are ignored and the pages show the forge's own/signin. The setting is read on every request, so it takes effect without a restart.signin.edgekey is added to the capacity enum and the tool description insrc/http/mcp.ts.test/signin-edge.test.tscovers four cases:- on by default; - off: an edge identity is ignored, including for an account the edge made and for the admin, and the pages stop offering the edge; - off: password sign-in (a token via
/api/v1/tokens) and the passkey sign-in options endpoint still work; - back on: the edge identity is read again.Left out
test/passkeys.test.tscovers it. My test only checks that its options endpoint answers.Try it
FORGE_EDGE_TOKENset, sign in as an admin, and open Settings → Capacity. Set "Sign in through the platform edge" to off.X-Plat-UserandX-Plat-Edge-Tokenare then treated as signed out. Clear the value to return to on.bun test test/signin-edge.test.ts.🤖 Generated with Claude Code
Closes #2595