Skip to content

Commit fdffe4a

Browse files
os-zhuangclaude
andcommitted
chore: changeset for #12751
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 722465c commit fdffe4a

1 file changed

Lines changed: 49 additions & 0 deletions

File tree

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
---
2+
"@objectstack/plugin-auth": minor
3+
"@objectstack/types": minor
4+
"@objectstack/plugin-security": patch
5+
---
6+
7+
feat(auth): walled deployment's declared owner is email-verified at operator-provisioned creation (#12751)
8+
9+
On a **walled** deployment (`OS_TENANCY_POSTURE` in the wall-enforcing
10+
family), the account whose email equals the declared platform owner
11+
(`OS_PLATFORM_OWNER_EMAIL`) is stamped `emailVerified` **at creation** when
12+
it comes into existence through an **operator provisioning path** — extending
13+
the #11343 dev-boot seeded-admin precedent to production walled boots
14+
(maintainer ruling 2026-08-28, cloud#1677: 「运营方创建即视为已验证」; the
15+
trust anchor is the operator's env-var declaration plus the
16+
operator-executed creation, not a mailbox round-trip; SMTP stays required
17+
only for inviting others).
18+
19+
**Which creation paths qualify** (the [#11739] audience taxonomy, not a
20+
second classification):
21+
22+
- the **bootstrap carve-out** — the very first account on a fresh install
23+
(zero human users), the one self-serve creation a walled boot admits;
24+
- **admin create-user / bulk import** (`method: 'admin'`) — an act only an
25+
authenticated admin session can perform;
26+
- **SCIM** (`method: 'scim'`) — provisioning executed by the
27+
operator-registered directory.
28+
29+
**Never**: non-bootstrap self-registration (including an
30+
invitation-admitted registration typing the owner address), provider-class
31+
JIT (the IdP asserts its own `emailVerified` at insert), any non-owner
32+
address, any unwalled posture, and a later email **update** to the owner
33+
address (the stamp is staged at the admission gate and consumed once by the
34+
`user.create` before-hook — a seam an update cannot traverse). Dev-boot
35+
behaviour (#11343) is unchanged.
36+
37+
The `WALLED_OWNER_NO_VERIFICATION_PATH` boot warning now probes the owner
38+
account's state: a fresh walled boot with no transport and no federated
39+
sign-in is **silent** (the operator's own first-account creation arrives
40+
verified — the case this closes), while an owner account that already
41+
exists **unverified**, a populated store whose bootstrap window is spent,
42+
and an unanswerable probe keep warning. A settled deployment whose owner is
43+
verified stops re-warning on every boot.
44+
45+
`@objectstack/types` gains `isEmailVerifiedUserRow` — the [#11343]
46+
fail-closed verified-representation allow-list, moved from
47+
`plugin-security`'s private copy so the elevation gate and the boot
48+
diagnostic read ONE resolution (`plugin-security` now consumes it; no
49+
behaviour change there).

0 commit comments

Comments
 (0)