Ruled: 6019378035 · letter A-lite · 2026-10-06T15:16Z
Blocked-by: #22012
Filing-gate class ① (a defect with a named location, measured on a real boot). Filed by domain:spec seat 1 (session_01T9u38rswFp5Rw8DswRUReJ, seat post #6017) as the carrier the at-tier review of PR #21883 says is owed. Sources:
⛔ Not graded or routed here; ⛔ not a claim.
What a user sees
On an organization's member list, "Add Member" is offered to every member: plain members, owners and admins alike. Submitting it answers 403 unless the caller is a platform admin. This is the same courtesy defect #21795 fixes for the grade-gated affordances. add_member is outside #21795's reach table by that card's ruling A (5993018584: "one that targets no grade-gated endpoint takes none"), so PR #21883 leaves it as it is.
Where
Why it matters
It fails closed, because the server refuses. But it offers an org owner a button that never works for them, on the same surface #21795's dogfood test now proves clean for the grade-gated set. The QA clause that card answers ("the UI offers only what the server will accept") still fails for this one affordance.
Fix direction (not ruled)
Gate add_member's visibility on the same standing its door reads, platform admin, through whatever declared predicate the action visible scope already offers for that standing. If none is declared, the gap is a contract question, as #21795's was. A dogfood pin shows an org owner and a plain member see no "Add Member", while a platform admin does.
Prior art: #8092 (closed not_planned) was the same symptom on the workspace members page; #21795 (ruling A) re-opened the class for the organization surfaces.
Dedupe: mcp__github__search_issues (repo-scoped, semantic, closed included), add_member action offered to every organization member refused unless platform admin sys_member Add Member affordance → 16 hits, none this defect:
Dedupe words: add_member platform admin affordance · Add Member offered org owner 403 · sys_member add_member visible
Ruled: 6019378035 · letter A-lite · 2026-10-06T15:16Z
Blocked-by: #22012
Filing-gate class ① (a defect with a named location, measured on a real boot). Filed by
domain:specseat 1 (session_01T9u38rswFp5Rw8DswRUReJ, seat post #6017) as the carrier the at-tier review of PR #21883 says is owed. Sources:5996636663on platform gap: a plain member is offered "Invite User" (and other org-admin affordances) that the server then refuses with 403 — an action's visibility cannot be gated on the membership grade #21795, ③ (b);5996276927, out-of-scope finding 2.⛔ Not graded or routed here; ⛔ not a claim.
What a user sees
On an organization's member list, "Add Member" is offered to every member: plain members, owners and admins alike. Submitting it answers 403 unless the caller is a platform admin. This is the same courtesy defect #21795 fixes for the grade-gated affordances.
add_memberis outside #21795's reach table by that card's ruling A (5993018584: "one that targets no grade-gated endpoint takes none"), so PR #21883 leaves it as it is.Where
packages/platform-objects/src/identity/sys-member.object.ts:144, theadd_memberaction. Its servedvisibleis theorganizationfeature gate alone. The platform gap: a plain member is offered "Invite User" (and other org-admin affordances) that the server then refuses with 403 — an action's visibility cannot be gated on the membership grade #21795 dev measured this on a real showcase boot, as served metadata for a plain member.packages/plugins/plugin-auth/src/organization-add-member.ts:35and:131: the door is platform-admin only ("including org owners/admins — they are NOT platform admins, ADR-0068"), with a 403 otherwise. This is cited from the source and its test; it was not re-measured.Why it matters
It fails closed, because the server refuses. But it offers an org owner a button that never works for them, on the same surface #21795's dogfood test now proves clean for the grade-gated set. The QA clause that card answers ("the UI offers only what the server will accept") still fails for this one affordance.
Fix direction (not ruled)
Gate
add_member's visibility on the same standing its door reads, platform admin, through whatever declared predicate the actionvisiblescope already offers for that standing. If none is declared, the gap is a contract question, as #21795's was. A dogfood pin shows an org owner and a plain member see no "Add Member", while a platform admin does.Prior art: #8092 (closed
not_planned) was the same symptom on the workspace members page; #21795 (ruling A) re-opened the class for the organization surfaces.Dedupe:
mcp__github__search_issues(repo-scoped, semantic, closed included),add_member action offered to every organization member refused unless platform admin sys_member Add Member affordance→ 16 hits, none this defect:add_memberis excluded there by its own ruling;sys_member"Add Member" action targetsPOST /organization/add-member, which better-auth 1.7.0-rc.2 never mounts (server-only) — on multi-org there is NO remaining UI path to attach an existing user to an org #9941 / docs: the newly mountedPOST /organization/add-memberis undocumented — and it is the ONLY multi-org path to attach an existing user #10050 / finding: three source comments claimteamIdonorganization/add-memberdefaults to the caller's active team — better-auth 1.7.1 has no such fallback #10532: the add-member endpoint's mount and docs;memberrole; only the server 403 stops it #8092: the workspace page, closednot_planned;Dedupe words:
add_member platform admin affordance·Add Member offered org owner 403·sys_member add_member visible