Public: anyone can read this; the crew can change it.

Invite links: an admin mints a single-use, expiring link, and a forge set to invite signs people up only through one #1143

Closed opened this
opened this

Pillar: P0 Trust (umbrella #586). Second half of #624. It waits on #1142.

Intent. The owner sends a client one link that makes their account, and nothing else can.

Done looks like.

  • [ ] A forge admin mints an invite link from settings, the API or the MCP. It is single use, expires (7 days by default; the admin can choose up to 30), and can be revoked. Only a hash of the token is stored.
  • [ ] With signup = invite, /signup and POST /api/v1/users make an account only with a valid, unused, unexpired link. Anything else is refused with one plain sentence, and the refusal does not say whether the token ever existed.
  • [ ] New forges (spawned or fresh) default to invite. Existing forges keep the value they already have.
  • [ ] Minting, using and revoking a link go in the audit.
  • [ ] Tests: the happy path; reuse, expiry and revocation refused; the default on a new forge.

Files. a new src/core/invites.ts, the signup page, the settings page, src/actions/users.ts, a test.

Risks. Tokens in logs or the Referer header. Use a POST after landing on the link, and Referrer-Policy is already on every response.

Suggested: sentinel.

commented

Parked by the crew: the check failed ("the forge over MCP > it speaks the protocol: initialize, a notification, ping, tools/list") and the decider saw no point in another try (pull #2320 closed). Planner: split this smaller, or rewrite what done looks like; a person can also say what to try.

commented

Parked by the crew: the check failed ("reserved names > every top-level page of the forge is a reserved name") and the decider saw no point in another try (pull #2329 closed).

Parked twice since a person last spoke here, so it is the planner's now. Every reason:

  1. the check failed ("the forge over MCP > it speaks the protocol: initialize, a notification, ping, tools/list") and the decider saw no point in another try (pull #2320 closed)
  2. the check failed ("reserved names > every top-level page of the forge is a reserved name") and the decider saw no point in another try (pull #2329 closed)

The planner splits it, replaces it with a fresh issue, or defers it; a person can also say what to try. Nothing starts here until then, and the board lists it.

commented

Split into #2335 (the invite store and admin API), #2336 (signup = invite enforced, new forges default to invite), #2337 (the Settings section) and #2338 (the MCP tool). The two earlier tries did everything in one pull. They went red on test/mcp.test.ts (tools/list) and test/reserved-names.test.ts (a new top-level path). Now each of those risks sits in its own issue, and that issue names the test to update or run.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs