ADRADR-0026 · Le tenant Fondateur est designe, pas devine

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 Store qui 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 :

  1. le siege s'ouvrait sur un selecteur listant sa boutique personnelle, dans le cockpit de la plateforme ;
  2. design-system/2802 a rendu StudioScope.storeId nullable 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 /ops sans designer une boutique cliente ;
  3. 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 :

  1. 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.
  2. 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.
  3. Aucune organisation designee, aucun defaut. Quand INTERNAL_ORG_SLUGS est 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.
  4. 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.md contre un PLATFORM_ORG_ID fail-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.ts cesse 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.