People & Roles (ops guide)
La sezione PEOPLE & ROLES del control plane è la gestione centrale di
chi sta dentro al sistema Playroll. Vive su
https://control.extrinsiccognition.com/p2e/people/... e ha quattro pagine,
ciascuna per una popolazione diversa:
- Admins — chi controlla il control plane (staff EC)
- Operators — chi usa il control plane senza essere admin (cm, vc)
- Players — utenti Playroll che hanno fatto Steam OAuth
- Contributors — utenti del Contributor Portal (lato legale/pagamenti)
Tutte le pagine sono admin-only: serve crm_user_roles.role = 'admin'
per accedere. Se non sei admin (cm/vc o altro), vedrai un 403.
Le tre popolazioni — perché sono separate
Sono tre cose diverse anche se la parola "utente" è la stessa.
| Popolazione | Identità | Dove vive |
|---|---|---|
| Operators (admin / cm / vc) | Email aziendale | crm_user_roles (3 admin oggi) |
| Players | Steam OAuth | playroll_users + auth.users (124 oggi) |
| Contributors | Email + onboarding legale | supa_portal.contributors |
Gli operators non sono mai players (passano da Cloudflare Access, non
fanno Steam OAuth). I contributors possono essere players (link via
contributor_app_links nel portal), ma non per forza.
Aggiungere un operator non crea un account Playroll. Promuovere un player
ad admin (cosa che il sistema non permette) non avrebbe senso: i player
hanno email sintetica steam_<id>@playroll.gg, gli admin servono email
vera per accedere via Cloudflare Access.
Admins
URL: /p2e/people/admins
Cosa fa un admin
- Accede a tutto il control plane in lettura/scrittura
- Può aggiungere/togliere altri admin e operators
- Può modificare gruppi notifiche, mandare notifiche, vedere pagamenti, ecc.
Vincoli enforced
- Email deve finire in
@extrinsiccognition.com. Il backend rifiuta qualsiasi altro dominio per il ruoloadmin. Messaggio errore:admin_role_requires_extrinsiccognition_email. - Un admin non può revocare sé stesso. Messaggio errore:
self_revocation_blocked. È un freno per evitare di chiudersi fuori da soli. Se devi davvero revocarti, chiedi a un altro admin di farlo. - Un admin non può declassarsi a cm/vc. Stesso freno. Messaggio errore:
self_demotion_blocked.
Aggiungere un admin
- Click "Add admin" in alto a destra della tabella
- Inserisci email
nome@extrinsiccognition.com - (Opzionale) Note per ricordare chi è
- Conferma
L'admin appare immediatamente in tabella. Può loggarsi via Cloudflare Access e vede tutte le pagine entro 60s (TTL cache role).
Revocare un admin
Click icona cestino sulla riga. Confirma. La cache del ruolo viene invalidata subito — al prossimo refresh la persona viene espulsa dal control plane.
Operators
URL: /p2e/people/operators
I due ruoli operatore disponibili:
| Ruolo | Cosa può fare |
|---|---|
| cm (community manager) | Scrivere su notifications, gruppi, payment review |
| vc (view-only contributor) | Solo lettura dashboards |
Email libera (qualsiasi dominio). Pensato per partner, agenzie, contractor che non sono staff EC ma devono avere un livello di accesso ridotto.
Aggiungere un operator
- Click "Add operator"
- Inserisci email
- Scegli role (cm o vc)
- (Opzionale) Note
- Conferma
L'operator può accedere via Cloudflare Access entro 60s. Le pagine che vede dipendono dal role (cm scrive, vc legge soltanto).
Modificare / revocare
Click su riga → modal di edit (per cambiare role o note). Click icona cestino → revoca con conferma. L'email è chiave primaria: per cambiare l'email serve revocare e aggiungere nuovo.
La distinzione admin / cm / vc è per ruolo, non per gerarchia. Un admin
EC potrebbe perfettamente avere anche un operator amico con role cm per
una settimana di supporto durante un launch. Non c'è nulla di permanente.
Players
URL: /p2e/people/players
I 124 utenti Playroll registrati via Steam OAuth. Read-mostly: l'identità (steam_id, username, avatar) viene da Steam e non si può modificare a mano.
Cosa vedi nella tabella
| Colonna | Cosa significa |
|---|---|
| Steam | avatar + username + steam_id |
| Discord | username + id (se collegato) |
| Tier | contributor_tier (es. pilot, founder) |
| Country / Lang | da playroll_users.country / language |
| Groups | chip per ogni gruppo notifiche di cui è membro |
| Last seen | MAX(app_update_resolve_audit_v1.created_at) — l'ultima volta che il launcher ha pingato il server |
| Joined | playroll_users.created_at |
Ricerca
Casella di ricerca in alto a destra. Match server-side su:
steam_usernameodiscord_username(parziale, case-insensitive)user_idosteam_idesatti se digiti un UUID o un id
Min. 2 caratteri prima che la ricerca parta (debounce 300ms).
Editare un player
Click su una riga → modal con:
- Blocco read-only di tutti i campi identità (steam_id, discord, email, ecc.)
- Sezione Notification groups: pill cliccabili per ogni gruppo seedato
(
founders,ops,beta). Click per toggle. Save applica add/remove.
Mutation possibile: solo i gruppi. Niente altro. Steam OAuth è il source of truth per l'identità; user create/delete è fuori scope.
Audit
Ogni cambio gruppi logga [users] <admin-email> groups for user <id>: +[added] -[removed] lato server.
Contributors
URL: /p2e/people/contributors
Read-only. Proiezione cross-DB su supa_portal (Contributor Portal). Mostra
chi ha fatto onboarding legale, dove sta nel flusso, IBAN status.
Cosa vedi
| Colonna | Cosa significa |
|---|---|
| Name | legal_name come da documento |
| quella usata per l'onboarding portal | |
| City | residenza dichiarata |
| Tax | tax_status (es. forfettario, dipendente, …) |
| Onboarding | stato del flusso portal |
| IBAN | chip colorato: missing (rosso), pending (grigio), manual (giallo), *last4 (verde) |
| Cap € | cap_limit_eur per anno legale |
| Linked | "linked" verde se contributor_app_links ha un app_user_id per questa email, "portal-only" altrimenti |
| Created | data prima riga onboarding/application |
Niente CRUD qui
Il portal è il source of truth per dati legali/KYC/IBAN. Modifiche random da qui rischierebbero di rompere la compliance. Se serve modificare un contributor:
- Per cambi normali (email confermata, IBAN aggiornato): usare il portal
- Per fix tecnici (es. duplicate row, dato corrotto): script SQL una-tantum
Search
Stesso pattern dei players: 2+ caratteri, match su legal_name, email,
city.
Casi d'uso comuni
"Voglio mandare una notifica solo ai founders, ma il gruppo è vuoto"
- Vai a
/p2e/people/players - Cerca il primo founder per username
- Click sulla riga → modal → tick
founders→ Save - Ripeti per ogni founder
- Vai a
/p2e/notifications→ selezionafounderscome group → vedi il count aggiornato
"Aggiungere Andrea (agenzia esterna) come operatore cm temporaneo"
- Vai a
/p2e/people/operators - Click "Add operator"
- Email:
andrea@agency.com, role:cm, note: "supporto launch Q2 2026" - Conferma
Andrea può loggarsi via Cloudflare Access immediatamente. Quando il supporto finisce, click cestino sulla riga.
"Verificare se un player ha completato l'onboarding legale"
- Vai a
/p2e/people/players, cerca per username, copia l'email - Vai a
/p2e/people/contributors, cerca per email - Vedi colonna
Linked(verde = match),Onboarding,IBAN
Se vedi "portal-only" significa che ha fatto onboarding ma non ha fatto Steam OAuth nel launcher. Viceversa, se il player non appare in Contributors, non ha fatto onboarding legale.
Cosa fare se qualcosa non torna
- 403 forbidden_admin_only su qualsiasi pagina: il tuo email non è admin. Chiedi a un altro admin di promuoverti.
- "self_revocation_blocked" / "self_demotion_blocked": stai cercando di revocare o declassare te stesso. Per design impossibile. Chiedi a un altro admin.
- "admin_role_requires_extrinsiccognition_email": stai cercando di
promuovere un'email non-EC ad admin. Usa role
cmovcinvece. - Modifica gruppo su un player non si riflette nel composer notifiche: refresh la pagina notifiche. La cache groups è server-side ma il composer fetcha groups all'apertura.
- Errore 500 generico: probabile problema cross-DB (contributors usa supa_portal). Controlla console e scrivi a Marco col messaggio.
Riferimenti
- Spec sistema notifiche (playroll-cpp)
- Notifications composer ops — runbook collegato
- Backend code (Express) — sezione PEOPLE & ROLES in routes.ts
- Frontend code — file
p2e-admins.tsx,p2e-operators.tsx,p2e-players.tsx,p2e-contributors-list.tsx