# THE single source of truth for the devvm Workstation lifecycle (onboard -> offboard). # Consumed by roster_engine.py (derive/validate) + t3-provision-users.sh (apply). # # os_user (the map KEY, pinned) -> authentik_user . k8s_user . tier . namespaces # The three identifiers differ per person (verified 2026-06-08) -- no email->username # derivation; record each explicitly. # # Tiers: admin | power-user | namespace-owner # admin - cluster-admin, unlocked tree, secrets (groups: sudo,docker,code-shared) # power-user - cluster-wide READ (no Secrets) via oidc-power-user-readonly; locked clone # namespace-owner - admin in their own namespace(s) only; locked clone # # wizard IS listed (as admin): the reconcile REGENERATES /etc/ttyd-user-map + # dispatch.json from this file, so omitting him would drop his t3 instance. The # provisioner skips account/group/clone mutations for already-existing users, so # listing him is safe (he keeps his unlocked tree + cluster-admin untouched). users: wizard: {authentik_user: vbarzin, k8s_user: wizard, tier: admin} # base config author + cluster-admin emo: {authentik_user: emil.barzin, k8s_user: emo, tier: power-user} # NET-NEW k8s_users entry (add as power-user before provisioning) ancamilea: {authentik_user: ancaelena98, k8s_user: anca, tier: namespace-owner, namespaces: [plotting-book]} # ALREADY provisioned in-cluster -- assert, don't re-create # gheorghe: {authentik_user: vabbit81, k8s_user: vabbit81, tier: namespace-owner, namespaces: [vabbit81]} # already a cluster ns-owner; uncomment to give him a devvm workstation