Symptom
The in-shell Team surface (sys_organization record page, ADR-0081) defaults to tab-0 Members. Its related-list toolbar carries exactly one action, Add Member (add_member — attach an EXISTING user by userId). The email-invite entry (invite_user) lives only on tab-1 Invitations (sys_invitation related list). Both buttons render as variant: primary with the same user-plus icon.
Measured effect: the maintainer, looking to "invite a teammate by email", landed on Members and concluded the product has no invite entry. If the author cannot find it, users will not.
Mechanism / file surface
packages/platform-objects/src/pages/sys-organization.page.ts — tab order: Members (sys_member) / Invitations (sys_invitation) / Teams.packages/platform-objects/src/identity/sys-member.object.ts — list_toolbar: add_member only (primary, user-plus).packages/platform-objects/src/identity/sys-invitation.object.ts — list_toolbar: invite_user (primary, user-plus) → POST /api/v1/auth/organization/invite-member. The delivery half works once found: sendInvitationEmail is wired (template auth.invitation, accept URL /_console/accept-invitation/<id>).
Premise verified against origin/main @ 4c9780c (2026-08-24): invite_user appears only on sys_invitation and sys_user; sys_member's toolbar has only add_member.
Requested outcome
Make the email-invite flow discoverable from the default Members tab. Suggested route (PM suggestion, not a ruling — implementer verifies):
- Mirror
invite_user onto sys_member's list_toolbar (same target / params / requiresFeature: 'organization' gate as the sys_invitation copy), and - differentiate
add_member (icon and/or label) so the two toolbar actions do not render as identical primary user-plus buttons.
Mechanism to verify before writing metadata: the objectui related-list toolbar bridge must render BOTH declared toolbar actions on the record page's related list.
Notes
Symptom
The in-shell Team surface (
sys_organizationrecord page, ADR-0081) defaults to tab-0 Members. Its related-list toolbar carries exactly one action, Add Member (add_member— attach an EXISTING user by userId). The email-invite entry (invite_user) lives only on tab-1 Invitations (sys_invitationrelated list). Both buttons render asvariant: primarywith the sameuser-plusicon.Measured effect: the maintainer, looking to "invite a teammate by email", landed on Members and concluded the product has no invite entry. If the author cannot find it, users will not.
Mechanism / file surface
packages/platform-objects/src/pages/sys-organization.page.ts— tab order: Members (sys_member) / Invitations (sys_invitation) / Teams.packages/platform-objects/src/identity/sys-member.object.ts—list_toolbar:add_memberonly (primary,user-plus).packages/platform-objects/src/identity/sys-invitation.object.ts—list_toolbar:invite_user(primary,user-plus) →POST /api/v1/auth/organization/invite-member. The delivery half works once found:sendInvitationEmailis wired (templateauth.invitation, accept URL/_console/accept-invitation/<id>).Premise verified against
origin/main@ 4c9780c (2026-08-24):invite_userappears only onsys_invitationandsys_user;sys_member's toolbar has onlyadd_member.Requested outcome
Make the email-invite flow discoverable from the default Members tab. Suggested route (PM suggestion, not a ruling — implementer verifies):
invite_userontosys_member'slist_toolbar(same target / params /requiresFeature: 'organization'gate as thesys_invitationcopy), andadd_member(icon and/or label) so the two toolbar actions do not render as identical primaryuser-plusbuttons.Mechanism to verify before writing metadata: the objectui related-list toolbar bridge must render BOTH declared toolbar actions on the record page's related list.
Notes
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 (add_memberendpoint mounting — resolved).