Clean successor to V3 (forge: lilith/atlilith). Seeded from local Mac working tree at ~/Code/@projects/@cocottetech/. node_modules and build artifacts excluded via .gitignore. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
99 lines
6.3 KiB
Markdown
99 lines
6.3 KiB
Markdown
# second-member-invite.screen
|
|
|
|
Invite a second (or Nth) member to an org. Implements [brief AC](./AC-second-member-onboarding.brief.md). P5+ — speculative. Reached from org-overlay-settings.screen.md → "+ Invite member." Voice: working.
|
|
|
|
## Layout (full-screen sheet)
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────┐
|
|
│ Cancel Invite to Demimonde Send │ 56pt
|
|
├─────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ─── Their identity ─── │
|
|
│ Display name (their choice): │
|
|
│ ╭───────────────────────────────────────╮ │
|
|
│ │ Their working name │ │
|
|
│ ╰───────────────────────────────────────╯ │
|
|
│ Email or phone (for invite delivery): │
|
|
│ ╭───────────────────────────────────────╮ │
|
|
│ │ │ │
|
|
│ ╰───────────────────────────────────────╯ │
|
|
│ │
|
|
│ ─── Their role ─── │
|
|
│ ○ Owner (full org admin) │
|
|
│ ● Admin (manage members + brands) │
|
|
│ ○ Talent (operates under brand, no org admin) │
|
|
│ ○ Read-only (audit + analytics only) │
|
|
│ │
|
|
│ ─── What they can see ─── │
|
|
│ ☑ Their own engagement / audit │
|
|
│ ☑ Org-wide audit (per W §data-scope) │
|
|
│ ☐ Other members' private data │
|
|
│ │
|
|
│ ─── Specialists ─── │
|
|
│ Initial posture: ● Inherits org defaults │
|
|
│ ○ Custom │
|
|
│ ☑ All gates at "propose only" for first 14d │ safety default
|
|
│ │
|
|
│ ─── Brand ownership ─── │
|
|
│ Will they operate a brand? │
|
|
│ ○ Quinn's existing brand (Cocotte umbrella) │
|
|
│ ● Their own brand (new sub-brand under org) │
|
|
│ [ Configure their brand → ] │
|
|
│ │
|
|
│ ─── Notes for them ─── │
|
|
│ ╭───────────────────────────────────────╮ │
|
|
│ │ "Looking forward to working with you" │ │
|
|
│ ╰───────────────────────────────────────╯ │
|
|
│ │
|
|
└─────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Components
|
|
|
|
| Component | Notes |
|
|
|---|---|
|
|
| Identity | Display name (their pick, not real name) + delivery channel. |
|
|
| Role | 4 levels: Owner / Admin / Talent / Read-only. |
|
|
| What they can see | Data-scope overrides per W §data-scope. |
|
|
| Specialists | Initial posture inheritance + 14-day "propose only" safety default. |
|
|
| Brand ownership | They join an existing brand or get their own sub-brand. |
|
|
| Notes | Personal welcome message in invite email. |
|
|
|
|
## States
|
|
|
|
1. **Default (admin invite)** — radio on Admin; sensible defaults selected.
|
|
2. **Talent invite** — most read-only checkboxes off by default; brand row defaults to "existing brand."
|
|
3. **Owner invite** — confirmation banner: "Owner role gives full org admin including billing. Continue?"
|
|
4. **Invalid delivery channel** — inline error; Send disabled.
|
|
5. **Existing CocotteAI user on this email** — chip: "This person already has a CocotteAI account. They'll see the invite as 'join org' on their next sign-in."
|
|
6. **Pending invitation already exists** — banner: "An invite to this address was sent on {date} (pending). Resend or cancel?"
|
|
7. **Org member cap reached** (per plan tier from brief Z) — banner: "Demimonde's plan supports {N} members. Upgrade to invite more." Routes to billing.
|
|
8. **Compliance flag** (jurisdiction conflict: e.g. talent in a jurisdiction the org can't operate in) — soft warning, doesn't block.
|
|
|
|
## Interactions
|
|
|
|
- **Tap a role** → updates "what they can see" defaults.
|
|
- **Tap "Configure their brand"** → brand-config sheet (sub-brand details: name, domain, voice lean).
|
|
- **Tap "Send"** → sends invite + records audit; confirmation toast.
|
|
- **Long-press a sent invite (in member list)** → "Resend / Cancel / Modify role."
|
|
|
|
## Edge cases
|
|
|
|
- **Sending to a Coop-blocked address** (per N) — soft warning: "This address is flagged in your Berlin coop. Continue anyway?"
|
|
- **Member accepts and immediately wants different role** — they request via chat; owner gets approval card.
|
|
- **Invite expired** (14-day default TTL) — automatically marked expired; member list shows expired chip.
|
|
- **Pre-existing personal account being upgraded to org member** — data migration prompt: "Their personal data will stay personal. They'll see org data after accepting."
|
|
|
|
## Related
|
|
- [Brief AC](./AC-second-member-onboarding.brief.md) — parent.
|
|
- [Brief W](./W-org-overlay.brief.md) — data-scope source.
|
|
- [Brief Z](./Z-billing-payments.brief.md) — member cap source.
|
|
- [Brief D](./D-onboarding.brief.md) — invite recipient's onboarding flow.
|
|
- [Brief N](./N-provider-coop.brief.md) — Coop-blocked check.
|
|
- [org-overlay-settings.screen.md](./org-overlay-settings.screen.md) — entry.
|
|
|
|
## Out of scope
|
|
- Bulk invites (defer; per-member at P0).
|
|
- Inviting to a coop (separate flow; brief N coop-invite mechanism).
|
|
- Custom role definitions (4 fixed roles at P0).
|