ADR-0026 — Le tenant Fondateur est DESIGNE, pas devine par l'adhesion de l'admin
Corrige la mise en oeuvre de l'ADR 0024 §4. Ne revoque pas son principe : « la plateforme est un tenant de son propre Studio ».
Statut
Accepté · 2026-09-19
Piliers : design-system, security-identity, app-shell, billing
Corrige la mise en oeuvre de l'ADR 0024 §4. Ne revoque pas son principe : « la plateforme est un tenant de son propre Studio ».
Contexte
L'ADR 0024 §4 a ecrit la cible sans ambiguite :
Le profil Founder est un tenant. La plateforme se produit elle-meme depuis l'organisation qu'elle opere, sur un
Storequi porte sa marque.
Ce qui a ete construit resout ce tenant par l'adhesion de l'admin
(features/studio/internal-scope.ts), un choix lui-meme herite de
acces-delegue-et-frontiere-studio.md,
qui avait rejete PLATFORM_ORG_ID et Organization.kind pour de bonnes
raisons : une variable fail-soft a "" change le comportement en
preview sans rien dire, et « l'org ou quelqu'un tient agency.* » est
circulaire.
Le raisonnement etait juste et sa conclusion a derive, parce qu'une proposition manquait : l'admin est membre d'autre chose que la plateforme. Le compte du fondateur est aussi le premier utilisateur du produit ; il a son organisation et sa boutique a lui. « L'organisation que la plateforme opere » et « une organisation dont l'admin est membre » ne sont donc pas la meme phrase, et c'est la seconde qui a ete codee.
Trois consequences observees, toutes signalees :
- le siege s'ouvrait sur un selecteur listant sa boutique personnelle, dans le cockpit de la plateforme ;
design-system/2802a renduStudioScope.storeIdnullable pour que le cockpit s'ouvre sans marque — ce qui a supprime l'ecran de selection sans corriger sa source, donc on ne peut plus produire du tout cote/opssans designer une boutique cliente ;- le Studio interne est devenu un outil pour operer la boutique d'un UTILISATEUR, alors qu'il existe pour produire le marketing de la PLATEFORME et eviter de recruter un designer.
Le troisieme est le plus couteux : il a inverse la raison d'etre de la surface.
Entre-temps, INTERNAL_ORG_SLUGS est arrive
(src/lib/studio/internal-pricing.ts) pour facturer nos propres
organisations au cout fournisseur. C'est deja une designation de la
plateforme, cote serveur, derivee d'un slug et jamais d'un argument.
Elle existait, et le scope ne la lisait pas.
Décision
Le tenant Fondateur est l'organisation DESIGNEE par
INTERNAL_ORG_SLUGS, et sa marque est la boutique de cette
organisation. L'adhesion de l'admin ne designe plus rien.
Ce qui en decoule, et rien de plus :
- Le cockpit interne s'ouvre sur la marque de la plateforme, pas sur un selecteur. Produire y est possible immediatement, sans designer une boutique cliente, parce que la plateforme a la sienne.
- Une marque cliente reste atteignable, et devient un choix EXPLICITE et secondaire. Un operateur qui produit pour un client de l'agence le fait deliberement ; ce n'est jamais le defaut, et l'ecran dit pour qui il produit a tout moment.
- Aucune organisation designee, aucun defaut. Quand
INTERNAL_ORG_SLUGSest vide — c'est le cas d'origine — le cockpit ne se rabat PAS sur une organisation dont l'admin est membre. Il dit qu'aucune marque de plateforme n'est designee et comment en designer une. Un repli silencieux sur la boutique personnelle du fondateur est exactement le defaut que cet ADR ferme. - La variable reste la seule designation, et elle garde les gardes
qu'elle a deja : resolue cote serveur, derivee du slug, jamais prise
d'un client. L'objection de
acces-delegue-et-frontiere-studio.mdcontre unPLATFORM_ORG_IDfail-soft tient toujours, et le point 3 y repond : le vide ne vaut pas repli, il vaut refus explicite.
Alternatives écartées
Garder l'adhesion et demander au fondateur de sortir de sa propre organisation. Ecarte : son compte est legitimement le premier utilisateur du produit, et une architecture qui exige qu'une personne n'utilise pas son propre produit n'est pas une architecture.
Un champ Organization.kind = "platform". Ecarte pour la raison
deja ecrite : un drapeau en base se pose depuis un ecran, donc il
devient une permission qu'on peut se donner. Un slug dans
l'environnement du serveur se pose au deploiement.
Retirer les marques clientes du cockpit interne. Ecarte : le studio d'agence est un usage reel, et il faut pouvoir choisir d'operer ou non sur un store. Ce qui etait faux n'est pas leur presence, c'est qu'elles etaient le DEFAUT et la seule option.
Conséquences
internal-scope.tscesse d'etre la source du tenant Fondateur. Il garde son role pour les surfaces d'AGENCE (/ops/creative/pipeline,clients,concepts), qui parlent bien des organisations que l'operateur atteint.- Le compte personnel du fondateur n'apparait plus dans le siege, sauf s'il declare son organisation personnelle comme interne, ce qui serait son choix explicite.
- Une garde derivee doit refuser que le montage interne retombe sur une organisation non designee : c'est la regression exacte que cet ADR ferme, et elle est invisible a l'oeil puisque l'ecran rend la meme chose dans les deux cas.
- La variable devient structurante et non plus seulement tarifaire. Sa ligne dans l'audit d'environnement doit le dire.