# ADR 007 : Instances en marque blanche

## Statut

**Accepté** (24/10/2026)

## Contexte

La vitrine doit pouvoir être déclinée : Paris-Saclay d'abord, puis une Graduate School, un établissement partenaire, ou un autre membre de la communauté CRISalid. Le code ne doit pas contenir « Paris-Saclay ».

## Décision

- Une instance = `instances/<id>/research.config.ts` + ses logos dans `public/brand/<id>/`. Le fichier est validé par Zod (`src/config/schema.ts`) au chargement : une configuration invalide fait échouer le build.
- L'instance active est choisie au build par `NEXT_PUBLIC_RESEARCH_INSTANCE` (registre `src/config/index.ts`). `scripts/instance.mjs` fixe la variable, un dossier de build par instance (`.next-<id>`) et un port (3000, 3010).
- Le thème Mantine est **calculé** depuis 4 couleurs de base (`brand.colors`) : `colorScale()` produit les 10 nuances. Les composants n'utilisent que les noms génériques `brand`, `accent`, `ink`.
- Un seul dépôt et une seule application tant que les instances partagent tout le code. Le découpage `packages/core`, `packages/ui`, `apps/<instance>` attendra un besoin réel de divergence (pages éditoriales propres, déploiements séparés).
- Deuxième instance de démonstration : **Université Paris 1 Panthéon-Sorbonne**, pionnière de CRISalid et de profil SHS, pour éprouver la configuration sur un établissement opposé à Saclay.

## Conséquences

- Ajouter une instance prend une configuration et un logo ; le rapport `pnpm data:probe --instance <id>` dit aussitôt ce que les sources savent du périmètre.
- Les variables `NEXT_PUBLIC_*` étant inlinées, une image Docker par instance.
- Les deux registres d'instances (`src/config/index.ts` et `PORTS` dans `scripts/instance.mjs`) doivent rester alignés.
- La charte de l'instance Paris 1 est une maquette : à remplacer par la charte officielle avant toute présentation publique.
