Repository navigation
feat(console): org join-link UI — manage/copy dialog on the Team surface + /join/:token self-serve landing route #5961
Description
Activity
- addeddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seat
on Aug 24, 2026 PAUSED by the maintainer — the audience assumption behind this epic was corrected.
Maintainer, 2026-08-24 chat, quoted verbatim: 「协作者不会多,我在云端手工加入都可以,主要是 业务用户怎么方便的注册进来,你先和我讨论方案。」
This epic builds the cloud-organization join link — membership in the control plane, i.e. the COLLABORATOR layer (env list, development, billing visibility). The maintainer states that layer is low-volume and manual invitation is acceptable, so the epic's justification is withdrawn for now. The real need is the business-user layer: convenient self-registration into a tenant ENVIRONMENT (e.g.
steedos.objectos.ai), which is a different runtime, different tables, different auth surface — the code here does not transfer.Dispatch stopped mid-run; branch
claude/issue-11587-org-join-link-v1exists with partial work and is left in place. No PR was opened.Restart-when: the business-user onboarding design (under discussion with the maintainer 2026-08-24) concludes and the maintainer rules that a cloud-org join link is still wanted.
Live readings that informed the correction (measured on
steedos.objectos.ai/api/v1/auth/config, 2026-08-24):emailPassword.disableSignUp=false,requireEmailVerification=false,socialProviders=[objectstack-cloud],features.ssoEnforced=false,tenancyPosture=single. Env-side self-registration is open and unverified today, andreconcileMembership(policy defaultauto) auto-binds each new user into the env's single org — that is the surface the business-user design must address.Closing not planned — the hold's
Restart-when:condition has fired, and the answer is "not wanted now".That condition was: the business-user onboarding design concludes and the maintainer rules whether a cloud-org join link is still wanted. The design concluded today as objectstack-ai/objectstack#11723 (audience posture, ruled and dispatched). The maintainer's ruling on the collaborator layer, quoted verbatim from the 2026-08-24 chat, is:
「协作者不会多,我在云端手工加入都可以,主要是 业务用户怎么方便的注册进来,你先和我讨论方案。」
Manual invitation covers the collaborator (cloud-organization) layer at current volume, so this epic has no pull. Per the maintainer's standing guidance (2026-08-16, verbatim: 「我建议有些暂时不准备开发的应该直接关闭。」), work with no firable restart condition is closed rather than held — the card IS the record, and reopening is free.
Preserved for whoever revives this: the V1 token shape reasoned out here (one active link per org, role pinned to
member, default 7-day expiry, revoke/rotate, optional max-uses, membership written through the governedaddMemberpath, verified-email posture per better-auth GHSA-fmh4-wcc4-5jm3) is directly reusable if alinkvalue is ever added to the audience-posture vocabulary in #11723. Branchclaude/issue-11587-org-join-link-v1holds partial work; no PR was opened.
Part of objectstack-ai/objectstack#11586 (epic — ruling and V1 scope live there).
Blocked-by: objectstack-ai/objectstack#11587
Deliverable (console UI half of the universal org join link)
sys_organizationrecord page toolbar and/or the platform org console's Members/Invitations pages — pick the entry that coexists with the just-landedinvite_usertoolbar mirror, objectstack#11544): owner/admin-only "Invite via link" — shows the active link (full URL), Copy, Rotate (with confirm — old link dies), Revoke, expiry display. No active link ⇒ Create./join/:tokenconsole route: fetch token info (org display name + validity). Unauthenticated ⇒ login/signup with return-to back to the join page. Authenticated ⇒ confirmation ("Join ?") → POST join → set active organization → land in the org shell. Distinct UI states for expired / revoked / exhausted / invalid / already-a-member (the backend card publishes the error codes in its PR body).Constraints
/_console/accept-invitation/<id>⇒/_console/join/<token>); build URLs through the same single-source console-URL helper the accept-invitation flow uses.