officer.dev: account creation exists, and roles are a table

This file said there was no way to create a second account. There is, and has
been since 69a31051 — POST /api/users, owner-gated, with a form under Settings.
platform/CLAUDE.md and docs/roles-and-teams.md carried the same stale claim and
were corrected in the platform repo; this one was missed because I said it was
not in a git repository. It is, through the symlink.

Also records roles as a table with foreign keys onto roles.name, USER_ROLES
gone, and UserRole as a plain string guarded at the write path instead of by the
compiler.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Officer-Session: 656f5c85-e49a-4f1f-b9f3-042a04b4d043
This commit is contained in:
2026-08-23 23:50:00 +00:00
co-authored by Claude Opus 5
parent 7c41c56577
commit 3552a5a7df
+11 -4
View File
@@ -175,10 +175,17 @@ keyed on **role**, never on a user, and live in `role_capabilities`; absence den
capabilities (terminal, chat, files, tasks, items, desktop, browser) run as the owner's OS user in the capabilities (terminal, chat, files, tasks, items, desktop, browser) run as the owner's OS user in the
owner's home and are **never grantable at any level** — that is structural, not a policy default. owner's home and are **never grantable at any level** — that is structural, not a policy default.
What is NOT built: **there is no way to create a second account.** `createUser` has one call site, **Account creation now exists** — `POST /api/users`, owner-gated, with a form under Settings → User
`api/auth/bootstrap.ts`, gated on an empty `users` table. No signup route, no invites, no admin Management, plus role change, password reset, Linux provisioning and delete. It landed in `69a31051`; this
create-user handler — the six accounts in Postgres were inserted by hand. Details and the open defect file claimed the opposite for days afterwards, and so did `platform/CLAUDE.md` and
list are in `platform/TODO.md` → "Multi-user"; the design write-up is `COMMS/capability-permissions-2026-08-07.md`. `docs/roles-and-teams.md`, which sequenced a phase around building the thing that already existed.
Roles are a table as of 2026-08-23, with `users.role` and `role_permissions.role` as foreign keys onto
`roles.name` with `ON UPDATE CASCADE`. `USER_ROLES` is gone and `UserRole` is `string`, so the guard the
compiler used to provide is now a runtime check at every write path that takes a role from outside.
The design write-up is `COMMS/capability-permissions-2026-08-07.md`; the roles plan and what is still open
is `docs/roles-and-teams.md`.
The single-user claims that used to be all over this repo's docs were corrected on 2026-08-07. If you The single-user claims that used to be all over this repo's docs were corrected on 2026-08-07. If you
find another one, it is stale — `platform/src/servers/capabilities/registry.ts` is the authority. find another one, it is stale — `platform/src/servers/capabilities/registry.ts` is the authority.