# Charte maison EtikPharma — v1.6
### Identité de marque · apps, visuels, vidéo

> **v1.6 (2026-08-25)** — cette version ajoute ce qui manquait le plus : **le statut de chaque
> standard**. Une charte qui ne dit pas lesquelles de ses règles sont mesurables et lesquelles
> sont des choix se fait rouvrir indéfiniment sur les secondes. Voir *Statut des standards*
> juste en dessous. Elle acte aussi le changement de police de titraille et écrit, pour la
> première fois, la règle des icônes d'application.

Charte maison EtikPharma : **deux couleurs primaires** (corail + teal), chacune en trois niveaux.
Bloc `tokens` ci-dessous = **parseable par un agent** (source unique des valeurs).

Source de fait des **couleurs et polices** : `~/Documents/charte-etikpharma/styleguide-v4.html`
(3 juin 2026), versée ici le 2026-07-19 après arbitrage Mehdi. À partir de cette date,
**refetik fait autorité** — le styleguide devient une archive, plus une référence.

La couche **mouvement** (v1.1, plus bas) ne vient pas du styleguide : elle n'existait nulle part
avant le 2026-07-20. Elle naît ici.

## Statut des standards — lire ceci avant de rouvrir une décision

Chaque règle de cette charte est de l'une de **deux natures**, et elles ne se discutent pas
de la même façon :

- **DÉRIVÉ** — la règle a une réponse juste, qui se mesure (un ratio de contraste, une
  hauteur utile, une lisibilité à une taille donnée). On ne l'ouvre pas à l'avis : on
  remesure. Si la mesure change, la règle change, et c'est normal.
- **ARBITRAIRE VERROUILLÉ** — plusieurs réponses marcheraient ; il fallait seulement en
  fixer une. La rouvrir n'a **aucune condition d'arrêt** : c'est ce qui produit les
  redesigns à répétition. Elle porte donc une **date de verrouillage** et un **coût de
  sortie** chiffré, et ne se rouvre que si quelqu'un accepte de payer ce coût.

| Standard | Statut | Ce qui le rendrait faux | Coût d'adoption / de sortie |
|---|---|---|---|
| Corail + teal comme primaires | **dérivé**, mesuré 2026-07-20 et 07-21 (tables de contraste plus bas) | un ratio mesuré sous le seuil WCAG applicable | ~20 fichiers portent encore la palette antérieure |
| Le teal porte le fond, le corail l'accent | **dérivé** — l'inversion a été mesurée : corail en fond ne contraste avec rien (2,90 sur crème, 1,62 sur teal) | une mesure montrant un fond corail conforme | nul, déjà appliqué |
| Un seul élément corail par plan | **arbitraire verrouillé le 2026-07-20** | rien : c'est une règle de rareté, donc un choix | nul |
| Fond d'icône `teal-deep` | **dérivé**, mesuré : l'accent corail y donne 3,19:1 contre 2,14:1 sur `teal` | remesurer le contraste de l'accent | 6 icônes installées à refaire |
| Pictogramme plat par défaut | **dérivé**, mesuré à taille réelle : le relief est invisible sous 32 px et **moins net** que le plat à 56 px | un usage réel au-dessus de ~120 px | nul |
| Police de titraille | **arbitraire**, clos par un dérivé (tracé du `f`) — **verrouillé le 2026-08-15** | trouver une serif sans `f` descendant qui fasse mieux par ailleurs | **14 bases** à migrer |
| Format 1:1 des capsules | **dérivé**, mesuré : hauteur utile 1 530 / 960 / **690 px** | un contenu dont la forme n'est pas carrée | pièces déjà produites à reformater |
| Easings et durées | **dérivé**, validés sur rendu réel le 2026-07-20 | un rendu jugé faux à l'œil | nul |
| Le grade nomme un rôle, pas une clarté | **dérivé** — le seuil de contraste suit l'usage du grade, pas son nom | un usage où le rôle n'impose rien de mesurable | renommage de 2 jetons, 1 base chacun |
| Deux familles de neutres, chaude et froide | **arbitraire verrouillé le 2026-08-18** | rien : les deux rampes tiennent. La famille suit le public visé, pas le goût | la rampe froide tourne déjà ; la chaude est incomplète sous 80 % de clarté |
| `info` distinct du teal de marque | **dérivé** — tant qu'ils sont confondus, aucune interface ne distingue un état d'une identité ; six bleus circulent en conséquence | une interface qui signale l'information par la forme seule | 1 famille à dériver |
| La marque | **arbitraire pur — verrou du 2026-08-18 RÉVOQUÉ le 2026-08-25** | rien. C'est un goût, et il est assumé comme tel | `bimi.svg` non basculé + la flotte à ré-ancrer |

**Comment lire la colonne « ce qui le rendrait faux »** : si la case est vide ou dit
« rien », la règle est un goût. Un goût est parfaitement légitime — mais il se **verrouille**,
il ne se **défend pas** par des arguments techniques inventés après coup.

### Pourquoi cette charte porte désormais un contrôle, et pas seulement des règles

Mesuré le 2026-08-18 sur l'ensemble des applications : **deux polices de titraille en
service, deux fonds d'icône, et une palette antérieure encore vivante 105 jours après son
remplacement** — la dette ayant *augmenté* sur la période. Et, sur le seul périmètre décidé,
**1 050 couleurs distinctes pour les 13 que nommait la v1.4** — dont deux jetons employés par *une* base
chacun, pendant que leurs voisins à un point d'écart en servent trois ou quatre. Aucune de ces divergences ne
vient d'un changement d'avis : chacune vient d'une décision prise une fois, correctement,
et **jamais propagée**.

La v1.0 → v1.4 a été écrite en **4 jours**, puis n'a pas bougé pendant **26 jours** pendant
que la flotte changeait de police. Ce n'est pas un défaut de rédaction, c'est un défaut de
mécanisme : **une règle qu'aucun contrôle ne vérifie n'est pas une règle, c'est un vœu.**

⇒ Les règles de cette charte qui portent sur du code (police de titraille, jetons de couleur,
fond d'icône) sont **contrôlées mécaniquement** par le contrôle de conformité de flotte, qui
vit dans le dépôt applicatif. Cette charte reste la **source des valeurs** ; le contrôle en
est le consommateur, et il échoue quand une application diverge.

## Typographie
- **Titraille / affichage** : **Lora** (serif de lecture, contraste modéré). **Depuis le
  2026-08-15** — voir *Pourquoi Fraunces est sortie* juste en dessous.
- **Texte / UI** : **Inter** (grotesque neutre), fallback `system-ui`.
- **Technique / chiffres** : **Space Grotesk** — jeton `tech`, **pas** `mono`.

### Pourquoi Fraunces est sortie — arbitrage Mehdi, 2026-08-15

Le motif est un **tracé**, pas un goût : le `f` de Fraunces **descend sous la ligne de base**
et son `j` porte une queue crochue. Ce n'est pas réglable — l'axe `WONK`, qui module
précisément ces deux lettres, est **absent du fichier servi par Google**, et même avec le
fichier complet le tracé ne bouge pas (mesuré : `WONK 0` et `WONK 1` rendent la même largeur,
là où `wght 900` réagit). **DM Serif Display** est écartée pour la même raison : son `f`
descend pareil.

**Statut de la règle** : le choix d'*une* serif est **arbitraire** — beaucoup auraient
convenu. Ce qui est **dérivé**, c'est le critère d'exclusion ci-dessus. La règle opposable
est donc celle-ci, et non « Lora parce que Lora » :

> **Critère de titraille** : la serif retenue ne doit pas faire descendre son `f` sous la
> ligne de base. Toute candidate qui le passe est recevable ; le choix entre elles est
> arbitraire et se verrouille par date.

**Verrouillé le 2026-08-15. Coût de sortie : 14 bases à migrer** — mesuré le 2026-08-18 sur
le périmètre *décidé* (les bases actives du contrôle de flotte), et non sur l'ensemble des
dossiers du dépôt. L'atelier de charte est exclu du compte des deux côtés : il embarque des
dizaines de polices par construction, il n'est pas un consommateur.

### Ce que Lora coûte, vérifié le 2026-08-18

**Lora n'expose que 400 → 700.** Vérifié en interrogeant Google Fonts graisse par graisse :
`wght@400/500/600/700` rendent **HTTP 200**, `wght@800` et `wght@900` rendent **HTTP 400**.

⇒ **Conséquence directe** : toute titraille écrite en 900 sous Fraunces descend à **700**.
Ce n'est pas un détail de rendu, c'est une perte de contraste typographique qu'il faut
compenser par la taille ou l'espacement, pas en demandant une graisse qui n'existe pas —
la demander casse le chargement de la feuille entière.

Lora est par ailleurs découpée **par sous-ensemble** (`latin`, `latin-ext`…), là où Fraunces
tenait en un fichier. Les `unicode-range` font que le navigateur ne télécharge `latin-ext`
que s'il croise un caractère concerné. Piège vérifié et démenti : la ligature `œ` (« cœur »,
« sœur », « nœud ») est dans **`latin`**, pas dans `latin-ext`.

> ⚠️ **POINT OUVERT — le lien avec apothicAIre est rompu.** La v1.4 justifiait Fraunces en
> partie parce que `charte/apothicaire.md` l'emploie aussi : *« c'est le lien visuel entre
> les deux identités »*. Ce lien n'existe plus. Deux issues, à trancher explicitement et pas
> par omission : soit apothicAIre bascule aussi sur Lora et le lien tient, soit il garde
> Fraunces et l'écosystème assume **deux serifs**. Le critère du `f` s'applique à
> apothicAIre comme au reste — mais il a été formulé pour de l'interface, pas pour du
> magazine, et rien ne dit qu'il y pèse autant. **Non tranché au 2026-08-18.**

### Pourquoi `tech` et non `mono` (tranché le 2026-07-19)
Space Grotesk est une **sans-serif proportionnelle**, pas une monospace : c'est la variante
proportionnelle de Space Mono, sa documentation le dit explicitement. Le jeton `mono` du styleguide
décrivait donc faux, et le fallback `monospace` ne rattrapait rien.

Elle embarque en revanche les **chiffres tabulaires** (`tnum`). L'alignement se règle donc en CSS,
sans ajouter une quatrième police.

> **Correctif v1.1** — la v1.0 justifiait ce choix par « un risque de rendu à froid sur la première
> frame ». C'est **faux en Remotion** : `@remotion/google-fonts` bloque le rendu jusqu'à ce que la
> police soit prête. La conclusion tient, mais pour une raison de sobriété — trois familles suffisent
> — et non pour ce risque technique, qui n'existe pas ici.

```css
font-family: 'Space Grotesk', sans-serif;
font-variant-numeric: tabular-nums;   /* obligatoire dès qu'un chiffre change dans le temps */
```

**Règle** : tout nombre qui varie frame par frame — compteur, pourcentage animé, timecode, colonne
chiffrée — porte `tabular-nums`. Sans lui, les chiffres n'ont pas la même largeur et le bloc
« respire » à chaque incrément. Très visible en vidéo, invisible sur une maquette figée.

## Palette
**Deux primaires à égalité** — corail et teal (arbitrage Mehdi, 2026-07-19). Chacune en trois
niveaux, selon la convention de nommage : base, `-deep` (variante foncée), `-soft` (variante très
claire).

> **Tranché en v1.1** (2026-07-20) : le teal porte le fond, le corail porte l'accent.
> Voir *Grammaire couleur en mouvement* plus bas. Reste non écrit : dans quel cas `-deep` plutôt
> que la base sur un support statique — **ne pas l'inférer**.
>
> ⚠️ **Ces deux phrases se sont contredites pendant un mois.** « À égalité » et « le teal porte
> le fond » ont été lues comme opposées le 2026-07-21, par Mehdi et par Claude, chacun d'un côté.
> Résolution en v1.3 : la parité se joue **entre** les plans, la rareté du corail **dans** un plan.
> Voir *Branche claire → La parité se joue entre les plans*.

```json
{
  "tokens": {
    "brand": {
      "corail": "#F68451", "corail-deep": "#EB7039", "corail-soft": "#FFE9E0",
      "teal": "#1C757F", "teal-deep": "#1E585F", "teal-soft": "#E4EEEF"
    },
    "ink": { "ink": "#1F2A37", "muted": "#4A5566", "line": "#E8E3D6", "creme": "#FBFAF5" },
    "state": { "ok": "#2BB673", "err": "#E5484D", "warn": "#E0A23C", "info": "#1C757F" },
    "fonts": { "display": "Lora", "text": "Inter", "tech": "Space Grotesk" },
    "numeric": { "tabular": "tabular-nums" },
    "motion": {
      "ease-enter": [0.16, 1, 0.3, 1],
      "ease-exit": [0.333, 0, 0.667, 0],
      "ease-emphasis": [0.34, 1.56, 0.64, 1],
      "dur-micro-frames": 13,
      "dur-base-frames": 30,
      "dur-ample-frames": 50,
      "stagger-frames": 14,
      "amplitude-px": 64,
      "fps-ref": 30
    },
    "type-scale": { "display": 84, "body": 44, "label": 32, "ref-width": 1080 }
  }
}
```

Les quatre nombres d'un `ease-*` sont les points de contrôle d'une Bézier cubique : identiques
entre `Easing.bezier(...)` côté Remotion et `cubic-bezier(...)` côté CSS. Stockés bruts pour
n'être liés à aucun des deux.

### Renommage `deep` → `teal-deep` (2026-07-19)
Le styleguide nomme `#1F5764` simplement `--deep`, sans préfixe de famille. **Cette asymétrie est
la cause directe de la fausse divergence** consignée jusqu'ici dans `registry.json` : elle comparait
`#1F5764` (« le pétrole ») à `#F26A45` (« le corail »), alors que ce sont **deux niveaux de deux
familles différentes** — respectivement le teal profond et le corail profond. Les deux valeurs sont
conformes, il n'y avait pas de conflit.

Un consommateur qui lit encore `--deep` doit être repointé sur `teal-deep`. Même valeur, nom explicite.

### Le violet n'est pas une couleur de marque
`#6C4BF0` / `#5A3BD6` / `#EFEAFC` figurent dans le styleguide : c'était une **alternative ajoutée
pour un projet ponctuel** qui réclamait une couleur de plus. **Ce n'est pas une couleur signature.**

Volontairement **hors du bloc `tokens`** : un outil qui lit la charte ne doit pas pouvoir s'en servir
par défaut. Consigné ici pour qu'il ne soit ni réinventé, ni repris par erreur comme couleur maison.
## Grades — v1.5 (2026-08-18)

### Pourquoi les suffixes actuels ne servaient pas

`-deep` et `-soft` décrivent une **apparence** (plus foncé, plus clair). Rien n'y dit *quand*
les employer — cette charte l'admettait elle-même : *« Reste non écrit : dans quel cas `-deep`
plutôt que la base sur un support statique — ne pas l'inférer. »*

Résultat mesuré au 2026-08-18 sur le périmètre décidé : **`corail-soft` et `teal-soft` sont
employés par UNE base chacun**, pendant que leurs voisins à un point d'écart en servent trois
et quatre. Un jeton dont on ignore l'usage n'est pas ouvert ; il est retapé de mémoire.

### Un grade nomme un RÔLE

| Grade | Rôle unique | Obligation de contraste |
|---|---|---|
| `sol` | fond de page | — |
| `surface` | fond de carte, de pastille | **aucune** — un remplissage décoratif n'est pas un objet porteur de sens |
| `filet` | bordure, séparateur | **3:1 seulement s'il est ce qui délimite un composant.** Décoratif si la surface le délimite déjà |
| `plein` | l'aplat qui **porte du sens** (pastille d'état, série d'un schéma) | **3:1** contre son sol — WCAG 1.4.11 |
| `encre` | le texte de cette famille | **4,5:1** contre son sol |

> ⚠️ **Correctif immédiat d'une première rédaction de cette table.** Elle imposait 3:1 à
> `surface` et à `filet` sans condition. C'est faux : WCAG 1.4.11 vise les composants
> d'interface et les objets graphiques nécessaires à la compréhension, pas un fond de carte.
> Appliqué tel quel, ce seuil aurait fait rejeter des valeurs correctes — un fond de carte à
> 1,12:1 sur sa page est un bon fond de carte. **Le seuil suit l'usage, pas le grade.**

Ce que la structure change, et c'est tout son intérêt : la branche claire a dû écrire une
**interdiction** — *« sur fond clair, le corail ne porte pas de texte, à aucune taille »*.
Avec les grades, elle devient une **affectation** : le corail porte du texte, et c'est
`corail-encre` qui le fait, par construction. Une règle qu'on applique bat une règle qu'on
doit se rappeler.

### Deux familles de neutres — arbitrage Mehdi, 2026-08-18

**Il y a deux familles de neutres : une chaude et une froide.** Ce n'est pas un doublon, et
l'arbitre existait déjà : les **deux familles visuelles** actées le 2026-07-31 (voir
`pointeurs/design-system-ui.md`), dont l'une porte explicitement un « filet chaud ».

| Famille visuelle | Public visé | Neutres |
|---|---|---|
| **Comptoir** — outils métier denses, desktop, pour l'équipe | interne | **neutres froids** |
| **Public** — applications grand public, mobile-first, pour les patients | externe | **neutres chauds** |

**La famille de neutres ne se choisit pas : elle découle de la famille visuelle.** Une
application qui hésite sur sa température de gris hésite en réalité sur son public, et c'est
cette question-là qu'il faut trancher.

#### La rampe froide — mesurée, et déjà entièrement en circulation

Aucune de ces valeurs n'est inventée : toutes tournent déjà sur le périmètre décidé.
Contrastes calculés contre `#F3F4F6`, son propre sol.

| Grade | Hex | Contre son sol | Bases où il tourne déjà |
|---|---|---|---|
| `sol` | `#F3F4F6` | — | 2 |
| `surface` | `#E2E8F0` | 1,12 | **10** |
| `filet` | `#94A3B8` | 2,33 | **9** |
| `plein` | `#7A8690` | **3,38 ✅** | **9** |
| `encre` | `#4A5566` (= `muted`) | **6,86 ✅** | **16** |
| encre forte | `#1F2A37` (= `ink`) | **13,21 ✅** | **16** |

`plein` et `encre` passent leurs seuils. `filet` à 2,33 est **décoratif seulement** : s'il doit
délimiter seul un champ de saisie, il faut descendre d'un cran vers `plein`.

#### La rampe chaude — incomplète, et il faut le savoir avant de s'engager

| Grade | Hex | Contre son sol | Bases |
|---|---|---|---|
| `sol` | `#FBFAF5` (= `creme`) | — | **16** |
| `surface` | `#F7F5F0` | 1,04 | 2 |
| `filet` | `#E8E3D6` (= `line`) | 1,23 | **12** |
| `plein` | `#D8D1BF` | 1,46 ❌ | 2 |
| `encre` | **n'existe pas** | — | **0** |

**Mesuré : il n'existe aucun neutre chaud sous 80 % de clarté sur tout le périmètre.** La
famille chaude n'a ni mi-ton porteur de sens, ni encre. Deux issues, et il faut en choisir
une explicitement :

1. **elle emprunte son bas d'échelle à la famille froide** (`plein` et `encre` partagés) — la
   température ne se joue alors que dans les valeurs claires, là où une grande surface la
   rend perceptible ; ⚠️ *ce raisonnement est une hypothèse à confirmer à l'œil, pas une
   mesure* ;
2. **on crée deux valeurs chaudes sombres**, à dériver puis à mesurer contre `creme`.

Tant que ce point n'est pas tranché, **la famille chaude ne couvre que `sol`, `surface` et
`filet`**, et toute encre reste `ink`.

#### Ce que la double famille NE coûte pas

Les contrastes de marque sont **quasi identiques sur les deux sols** :

| | sur sol froid `#F3F4F6` | sur sol chaud `#FBFAF5` |
|---|---|---|
| `corail` | 2,29 | 2,41 |
| `corail-deep` | 2,76 | 2,90 |
| `teal` | 4,89 | 5,15 |
| `teal-deep` | **7,32** | **7,71** |

⇒ **Toutes les mesures de la branche claire restent valables sur les deux sols.** La règle
« sur fond clair, le corail ne porte pas de texte » vaut à l'identique côté froid (2,19 est
même *pire* que 2,41). La double famille n'impose donc **aucune remesure de marque**.

### Les valeurs — arbitrées et mesurées le 2026-08-18

Toutes vérifiées **contre deux fonds** : le sol de leur famille, et la surface de leur propre
famille. Une encre d'état sert surtout à écrire sur sa propre pastille — la mesurer contre le
seul sol laisse passer des valeurs illisibles là où elles servent réellement.

| Famille | `sol` | `surface` | `filet` | `plein` | `plein-deep` | `encre` | `encre-forte` |
|---|---|---|---|---|---|---|---|
| **froid** *(Comptoir)* | `#F3F4F6` | `#E2E8F0` | `#94A3B8` | `#7A8690` | — | `#4A5566` | `#1F2A37` |
| **chaud** *(Public)* | `#FBFAF5` | `#F6F3EA` | `#E8E3D6` | `#D8D1BF` ⚠️ | — | `#7B6E4B` ✎ | — |
| **corail** | — | `#FFEDE6` | — | `#F68451` ⚠️ | `#EB7039` ⚠️ | `#D12D00` ✎ | — |
| **teal** | — | `#E4EEEF` | — | `#1C757F` | — | `#1E585F` | — |
| **info** | — | `#DBEAFE` | — | `#0284C7` ⚠️ | — | `#026BA2` ✎ | — |
| **ok** | — | `#DCFCE7` | — | `#2BB673` ⚠️ | `#1A8C56` | `#0F6B3D` | — |
| **warn** | — | `#FEF3C7` | — | `#FFB020` ⚠️ | `#B07D20` | `#7A5600` | — |
| **err** | — | `#FDECEC` | — | `#E5484D` | — | `#C0353A` | — |

**✎ = calculée**, pas mesurée. Trois valeurs n'existaient nulle part et ont été dérivées puis
vérifiées : elles ne circulent dans aucune base, et doivent être jugées à l'œil avant d'être
tenues pour acquises. Tout le reste est mesuré dans le code du périmètre décidé.

#### Ce que la mesure a reclassé, et pourquoi ça compte

**Le palier du milieu de `ok` et `warn` n'est pas une encre.** `#1A8C56` donne 4,08 sur le sol
et 3,88 sur sa pastille ; `#B07D20` donne 3,46 et 3,25. **Ils échouent le seuil du texte des
deux côtés** — ils ne peuvent pas écrire. Ils franchissent en revanche 3:1, donc ils peuvent
remplir : ce sont des `plein-deep`. Les nommer « ink » ailleurs était une erreur que seule la
mesure révèle, et qui produisait du texte illisible en toute bonne foi.

**Le corail n'a besoin que d'une encre, pas de deux.** `#D12D00` tient 4,92 sur le sol *et*
4,53 sur sa propre carte : une seule valeur couvre les deux rôles. Deux paliers séparés
auraient été distants de ΔE 2,7 — deux jetons pour une couleur, exactement le défaut que les
grades servent à fermer.

**La surface chaude a changé de valeur pour cesser d'être un doublon.** `#F7F5F0` était à
**ΔE 1,7** de `creme` : indiscernable. `#F6F3EA` porte l'écart à 3,2 et il est *mesuré* dans
3 bases. ⚠️ 3,2 reste « perceptible côte à côte », pas « nettement distinct » — si une carte
doit se détacher franchement de sa page, il faudra descendre plus bas et le mesurer.

#### Les ⚠️ ne sont pas des défauts à corriger

Cinq aplats ne franchissent pas 3:1 sur crème : `corail` 2,41 · `corail-deep` 2,91 · `ok`
2,50 · `warn` 1,75 · `chaud-plein` 1,46. **Aucun ne se répare en changeant sa couleur** — ce
sont les teintes de marque et d'état, en changer ferait perdre le sens. La sortie est celle
déjà écrite en v1.3 : **border l'aplat d'un filet opaque**, le bord porte le contraste, le
remplissage porte l'information. `chaud-plein` fait exception : c'est un aplat **structurel**,
il ne doit simplement jamais porter de sens.

#### Le filet d'un aplat est l'encre de sa propre famille — mesuré le 2026-08-18

La règle de bordure existait depuis la v1.3 mais son filet était **universel** : *« border la
surface d'un filet `teal-deep` plein »*. Mesuré sur les huit familles, **il ne généralise
pas** — `teal-deep` tombe à 1,64 sur un aplat teal (même famille), 1,97 sur l'information,
2,06 sur l'erreur, 2,66 sur le corail profond. Il fonctionnait sur le cas unique qui l'avait
inspiré, et il a été écrit comme s'il valait partout.

**La règle qui tient : le filet est l'`encre` de la famille de l'aplat.** Elle n'ajoute
aucune valeur — chaque famille en a déjà une.

| Aplat sous 3:1 | Filet | Filet / sol | Filet / remplissage |
|---|---|---|---|
| `corail` 2,41 | `corail-encre` | **4,92** | 2,04 |
| `corail-deep` 2,90 | `corail-encre` | **4,92** | 1,69 |
| `ok` 2,50 | `ok-encre` | **6,30** | 2,52 |
| `warn` 1,75 | `warn-encre` | **6,36** | 3,64 |
| `chaud-plein` 1,46 | `chaud-encre` | **4,81** | 3,30 |

**Ce que mesure la colonne qui compte** : le filet contre le **sol**. C'est l'exigence de WCAG
1.4.11 — un objet graphique porteur d'information doit se distinguer de ce qui l'entoure, pas
de lui-même. Les cinq passent largement. La dernière colonne n'est qu'un contrôle de bon sens :
un filet qui serait à 1,0 de son propre remplissage ne se lirait pas comme un filet.

**Trois familles n'ont besoin d'aucun filet** : `err` (3,75), `info` (3,92) et `teal` (5,15)
franchissent le seuil sans aide. Leur en imposer un serait un ornement, pas une correction —
et c'est justement là que le filet universel se lisait le plus mal (1,41 sur err et info,
1,64 sur teal).

⚠️ **Le filet doit être opaque.** Un contour à faible opacité laisse transparaître le sol et
ne porte plus le contraste mesuré. La v1.3 le disait déjà ; il n'y a que le choix de la
couleur qui change.

#### La collision qui reste, et qui est assumée

**`info-plein` `#0284C7` est à 14,3° du teal de marque `#1C757F` (186,1°).** *(v1.5 : 9,5° contre `#2D7A8B`. Le ré-ancrage du 2026-08-25 desserre la collision sans la lever.)* Cette famille a été
créée précisément parce que confondre l'information et l'identité est un défaut — et la valeur
retenue le reproduit en partie. **Arbitrage explicite de Mehdi le 2026-08-18**, pris en
connaissance de la mesure et de l'alternative (`#2563EB`, 221°, 4 bases, aucune collision).
L'encre a été dérivée à la même teinte (201°) pour que la famille soit au moins cohérente en
interne — sans quoi son aplat et son texte auraient divergé de 21°.

**Ce qui rendrait cet arbitrage faux** : une interface où un utilisateur prend un état
informatif pour un élément de marque, ou l'inverse. C'est observable, pas mesurable — donc à
regarder sur un écran réel avant de le graver.

### Ce qui reste à dériver — et qui ne doit pas être inventé

✅ **Les quatre points ouverts du 2026-08-18 sont clos** par la table ci-dessus : les `-soft`
sont devenus des `surface` avec une valeur remesurée, la famille `info` existe, les grades
manquants de `ok` et `warn` ont été repris du travail mesuré le 14/08 au lieu d'être refaits,
et `warn` a quitté son jeton mort pour le trio à 4 bases.

**Restent ouverts, et écrits comme tels :**

- **Les trois valeurs calculées** (`chaud-encre`, `corail-encre`, `info-encre`) — dérivées et
  vérifiées, mais elles ne circulent nulle part. À juger à l'œil.
- **L'écart de la surface chaude** — 3,2 de ΔE, perceptible mais pas franc. À trancher si une
  carte doit se détacher nettement de sa page.
- **La collision `info` / teal** — assumée, mais à regarder sur un écran réel.
✅ **Clos le 2026-08-18** : la question du filet est tranchée et mesurée — le filet est
l'`encre` de la famille de l'aplat, et trois familles n'en ont pas besoin.

## Divergences constatées dans les dérivés
**Revérifiées à la source le 2026-08-18** — la v1.4 les portait « non revérifiées » depuis
un mois, et deux des trois affirmations étaient devenues fausses.

| Valeur | Où elle est **réellement** au 2026-08-18 | Statut |
|---|---|---|
| `#E8604C` | prescrite comme « corail charte » dans un skill de génération d'icônes, **et présente dans le code de deux applications** | hors charte — corail non conforme |
| `#1B3A4B` | **plus aucune occurrence applicative** ; ne survit que dans les fichiers de référence d'un backend d'image fermé depuis le 2026-08-14 | hors charte — teal non conforme, mais éteint de fait |
| `#00CCBC` | palette antérieure, **~20 fichiers** dans une seule application | dette de migration, pas une divergence de doctrine |

⚠️ `firefly-studio` (`#1F5764` + `#F26A45`) **était conforme jusqu'à la v1.5** : c'étaient `teal-deep`
et `corail-deep`. Le ré-ancrage du 2026-08-25 les a déplacés vers `#1E585F` et `#EB7039` — le skill
passe donc **en dette**, au même titre que les lignes ci-dessus. Rien n'a été modifié de son côté.

> ⚠️ **Le cas `#E8604C` mérite mieux qu'une ligne de tableau, parce qu'il s'est propagé.**
> Le skill fautif ne se contente pas de l'employer : il l'utilise **dans une mesure de
> contraste** présentée comme faisant autorité (« sur teal `#1F5764` le corail charte
> `#E8604C` tombe à 2,38:1 »). Une valeur hors charte devenue argument technique se
> recopie beaucoup plus loin qu'une simple faute de couleur. À corriger à la source.
## Icônes d'application — v1.5 (2026-08-18)

La charte n'avait jamais écrit cette règle, et **deux conventions coexistaient depuis des
mois** sans que la question soit posée : sur les icônes installées mesurées le 2026-08-18,
**7 portaient un fond `teal-deep`, 6 un fond `teal`**.

### Le fond : `teal-deep`, et c'est dérivé

**Fond `teal-deep`, pictogramme `creme` + accent `corail`.**

Ce n'est pas un choix esthétique : sur `teal-deep` l'accent corail donne **3,19:1**, sur
`teal` il tombe à **2,05:1** — sous le seuil des composants graphiques porteurs
d'information (3:1, WCAG 1.4.11). `teal` ne permettrait pas d'employer le corail sur une
icône. C'est aussi la couleur de la tuile du lanceur d'applications, donc raccord invisible
sous la vignette.

### Le traitement : plat par défaut, relief borné

**Pictogramme plat.** Le semi-3D — dégradé, ombre portée, reflet — est autorisé
**uniquement** là où l'icône s'affiche réellement au-dessus de ~120 px.

Mesuré à taille réelle en comparant les deux rendus côte à côte (2026-08-18) :

| Taille | Verdict |
|---|---|
| sous 32 px | le relief **n'existe plus** |
| 56 px (tuile de lanceur) | le relief est **moins net** que le plat |
| ~120 px et au-delà | le relief paie |

⇒ La règle n'interdit pas le relief, elle le **borne à son domaine de validité mesuré**.
Une application dont l'icône vit sur un écran d'accueil est dans le domaine ; une tuile de
lanceur n'y est pas. Une icône déjà en relief pour cette raison est **conforme**, pas
divergente — ne pas l'« harmoniser » sans redemander.

### Ce qu'une icône peut montrer

Deux règles issues de neuf tours de correction sur trois icônes réelles (2026-08-18) :

- **Une icône montre un ÉTAT, jamais une transition.** Tout ce qui veut dire « la
  contrainte se lève » échoue : une barre qui glisse produit une loupe, et une diagonale
  sur un anneau **reproduit** le panneau d'interdiction qu'on cherchait à lever.
- **L'orientation décide de la lisibilité avant la taille.** Le même objet peut être
  illisible à la verticale et évident à l'horizontale, à taille identique.

### Calibrage — ce qui se mesure au lieu de se supposer

Le rognage circulaire d'Android borne un **rayon**, pas une largeur : un motif décentré ou
débordant d'un seul côté sort de la zone bien avant ce que laisse croire sa hauteur. Un
générateur d'icône **mesure la boîte réelle du motif, recentre en x et en y, met à
l'échelle, et imprime la marge restante à chaque taille**. Seuil d'alerte : **3 px** sur
l'icône de 180 px, la plus petite donc la plus exposée.

**Le contrôle se fait sur une planche multi-tailles** (16 → 180, à taille réelle, rognage
circulaire réellement appliqué), jamais sur un rendu unique. C'est ce contrôle qui a montré
qu'un motif plus élégant en grand **disparaissait sous 24 px**.

## Mouvement — v1.1 (2026-07-20)

> **Ce qui n'est PAS ici, volontairement.** Remotion fournit déjà : les courbes de Bézier et leurs
> recettes, la règle ease-out à l'entrée / ease-in à la sortie, `interpolate()` plutôt que `spring()`
> hors physique explicite, le `clamp` systématique, les propriétés `scale`/`translate`/`rotate`
> individuelles plutôt que des chaînes `transform`, les safe areas et les tailles de texte minimales.
> Sources : `.agents/skills/remotion-markup/timing.md` et
> `.agents/skills/remotion-create/video-layout.md`, **à lire, pas à recopier ici**.
>
> Cette section ne contient que ce que Remotion ne peut pas savoir : l'identité EtikPharma.

### Grammaire couleur en mouvement — arbitrage Mehdi, 2026-07-20
**Le teal porte le fond. Le corail porte l'accent.**

> ⚠️ **Vaut pour la branche SOMBRE.** Sur fond clair, la répartition change de véhicule sans
> changer de rôle — voir *Branche claire*. Un lecteur qui n'ouvrirait que cette section conclurait
> « le fond est toujours teal », ce qui est faux depuis la v1.3.

- `teal` / `teal-deep` : fonds, grands aplats, structure. C'est la couleur qu'on voit longtemps.
- `corail` : emphase seule — mot clé, chiffre qui compte, appel à l'action, filet d'accent.
- `teal-soft` / `corail-soft` : **aplats** secondaires — jamais un aplat porteur de sens (une carte
  qui contient l'information, un bloc qui structure la lecture). ⚠️ **Un SOL n'est pas un aplat
  porteur de sens** (précisé en v1.3) : un fond pleine page ne contient rien et ne structure aucune
  lecture, c'est la surface sur laquelle tout repose. `corail-soft` est donc légitime comme sol de
  branche claire, et reste interdit comme carte. En revanche, **autorisés comme
  couleur de texte secondaire sur fond foncé** : sur `teal-deep`, `teal-soft` est parfaitement
  lisible, et l'interdire ne laisserait que `creme` et `corail` pour trois niveaux de hiérarchie —
  or `corail` est déjà réservé à l'accent unique. *(Précisé le 2026-07-20 : la règle d'origine,
  écrite pour les aplats, se lisait comme interdisant aussi le texte.)*

**Règle dérivée** (formalisation, non arbitrée telle quelle) : **un seul élément corail à l'écran
à un instant donné.** Le corail tire sa force de sa rareté ; deux accents simultanés n'en font
aucun. Si deux éléments méritent l'accent, ils se succèdent dans le temps — c'est exactement le
« résoudre l'encombrement par le temps » de `video-layout.md`.

#### Contrastes mesurés (WCAG, 2026-07-20)
| Paire | Ratio | Emploi |
|---|---|---|
| `teal-deep` fond / `creme` texte | **7,71:1** | tout texte |
| `corail` sur `teal-deep` | **3,19:1** | toute l'échelle typo, **et rien en dessous** |
| `teal` fond / `creme` texte | 5,15:1 | tout texte, sans marge |
| `corail-deep` fond / `creme` texte | 2,90:1 | ❌ jamais |
| `teal` sur `corail-deep` fond | 1,62:1 | ❌ jamais |

**L'accent corail tient sur toute l'échelle, mais sans marge.** À 3,19:1 il franchit le seuil WCAG
des grands caractères (3:1, applicable dès 24 px) — or `display` 84, `body` 44 et `label` 32 sont
tous au-dessus. Il est donc conforme partout dans l'échelle. En revanche il échoue le seuil du texte
courant (4,5:1) : **tout corail sous 24 px est hors clous**, et la marge de 0,35 ne pardonne aucune
dérive du fond. Pour souligner un élément plus petit que l'échelle, jouer la graisse ou l'opacité,
pas la couleur.

**Corollaire** : « le teal porte le fond, le corail porte l'accent » n'est pas une préférence
esthétique — c'est la **seule répartition qui tient**. Le corail en fond ne donne un contraste
acceptable avec rien, ni le crème ni le teal. L'inversion a été mesurée, pas supposée.

### Easings maison
| Jeton | Points de contrôle | Emploi |
|---|---|---|
| `ease-enter` | `0.16, 1, 0.3, 1` | **Défaut EtikPharma.** Toute entrée d'élément. |
| `ease-exit` | `0.333, 0, 0.667, 0` | Toute sortie. Ease-in : l'élément part avec la gravité. |
| `ease-emphasis` | `0.34, 1.56, 0.64, 1` | Dépassement. **Au plus un par vidéo**, sur le moment qui compte. |

Le défaut est une décélération franche **sans dépassement** : registre maîtrisé, pas démonstratif.
Remotion recommande lui-même la parcimonie sur la courbe à dépassement — en faire le défaut irait
contre sa propre consigne.

### Durées et amplitude — en frames à 30 fps
| Jeton | Valeur | ≈ | Emploi | Statut |
|---|---|---|---|---|
| `dur-micro-frames` | 13 | 0,43 s | Élément secondaire, détail qui accompagne | ✅ **validé** |
| `dur-base-frames` | 30 | 1,00 s | Entrée d'un élément principal | ✅ **validé** |
| `dur-ample-frames` | 50 | 1,67 s | Changement de plan, respiration | dérivé |
| `stagger-frames` | 14 | 0,47 s | Décalage entre deux éléments qui s'enchaînent | ✅ **validé** |
| `amplitude-px` | 64 | — | Translation d'entrée, pour `ref-width` de large | ✅ **validé** |

Le suffixe `-frames` fait partie du nom, dans la prose comme dans le bloc `tokens` : l'unité est
dans le jeton pour qu'aucun lecteur n'ait à deviner s'il manipule des frames ou des secondes.

**`stagger-frames` n'est pas une durée** — c'est un décalage entre deux animations. La v1.1 initiale
réutilisait `dur-micro-frames` pour ça : deux notions sous un seul nom, le piège même que le
renommage `deep` → `teal-deep` était censé clore. Jeton distinct depuis le 2026-07-20.

#### Ce qu'un rendu réel a corrigé (2026-07-20)
Premier carton de titre rendu, jugé à l'œil. Verdict : *« un peu rapide, c'est peu perceptible ·
presque simultané · trop sage »*. Trois valeurs sur trois étaient fausses.

- **`dur-base-frames` 18 → 30.** 0,6 s ne laissait pas le temps de percevoir le mouvement.
- **décalage 8 → 14 frames.** À 8, l'œil lit deux éléments simultanés, pas un enchaînement.
- **amplitude 28 → 64 px.** Cause sous-estimée : le déplacement était trop court pour se voir,
  indépendamment de sa durée.
- **`ease-enter` inchangée.** Testée contre deux courbes à dépassement (`1.25` et `1.56`) et
  préférée aux deux. Le « trop sage » venait de la vitesse et de l'amplitude, **pas de la courbe** :
  elle passe de « choisie » à **validée**.

**`dur-micro-frames` validé le 2026-07-20** sur un second rendu, où il anime le sur-titre et une
mention technique. Un élément secondaire démarre en même temps que l'élément principal mais s'installe
deux fois plus vite (13 frames contre 30) : à l'œil, ça se lit comme une hiérarchie, pas comme une
inversion.

> Reste **`dur-ample-frames`**, seul jeton encore **dérivé** (×1,67 du rapport initial) : il est défini
> pour les changements de plan, et aucun carton isolé n'en a. Il ne se jugera que sur une vraie
> séquence à plusieurs plans.
> Si la composition ne tourne pas à 30 fps, convertir en secondes plutôt que copier les frames.

### Échelle typographique
Base reprise de `video-layout.md` pour une composition **large de 1080 px**, avec l'affectation
EtikPharma — dérivée des rôles de police déjà définis plus haut, non arbitrée séparément :

| Rôle | Taille | Police |
|---|---|---|
| Titre | 84 px | **Lora** (`display`) — plafonnée à **700**, voir *Ce que Lora coûte* |
| Texte de soutien | 44 px | **Inter** (`text`) |
| Label, mention | 32 px | **Inter**, ou **Space Grotesk** (`tech`) si c'est un chiffre ou une mention technique |

**Mise à l'échelle** : `taille = valeur × (largeur_composition / 1080)`. Une composition 1920 de
large exige des tailles proportionnellement plus grandes — ce sont des **minimums**, pas des cibles.
En cas de doute, `video-layout.md` tranche : plus grand, jamais plus petit.

### Chargement des polices
Passer par `@remotion/google-fonts` — il bloque le rendu jusqu'à ce que la police soit prête,
ce qui supprime le risque de première frame en police de repli.

```bash
npx remotion add @remotion/google-fonts
```

Les trois familles sont servies par `fonts.googleapis.com` (constaté le 2026-07-20 en les chargeant
dans une page réelle). **Non vérifié en revanche** : que `@remotion/google-fonts` expose bien un
sous-module pour chacune des trois. À confirmer à l'installation, pas à supposer.
Ne charger que les graisses réellement employées.

**Graisses réellement exposées** (vérifiées le 2026-07-20 via `getInfo()`, pas supposées) :

| Famille | Module | Graisses |
|---|---|---|
| Lora | `@remotion/google-fonts/Lora` | **400 → 700 seulement** (vérifié 2026-08-18) |
| Inter | `@remotion/google-fonts/Inter` | 100 → 900 |
| Space Grotesk | `@remotion/google-fonts/SpaceGrotesk` | **300 → 700 seulement** |

> ⚠️ **Deux des trois familles s'arrêtent à 700.** Lora comme Space Grotesk : demander 800 ou
> 900 **casse le chargement de la feuille entière**, pas seulement la graisse demandée. Seul
> Inter monte à 900. La titraille EtikPharma est donc plafonnée à 700 depuis le 2026-08-15.
>
> *Note historique* : Fraunces exposait bien 100→900. C'est la seule chose qu'on perd en la
> quittant, et elle était déjà connue au moment de l'arbitrage.

> ⚠️ **Non vérifié** : que `@remotion/google-fonts` expose bien un sous-module `Lora`. La
> vérification du 2026-08-18 porte sur l'API Google Fonts (`fonts.googleapis.com/css2`), pas
> sur le paquet Remotion. À confirmer à l'installation, pas à supposer.

## Branche claire — v1.3 (2026-07-21)

La charte ne décrivait qu'un fond sombre. Cette section ajoute la déclinaison claire,
**mesurée**, jamais inférée.

### Ce qui a été mesuré (WCAG, 2026-07-21)

| Fond | Texte | Ratio | Emploi |
|---|---|---|---|
| `creme` | `teal-deep` | **7,71:1** | tout texte — colonne vertébrale |
| `creme` | `teal` | 5,15:1 | tout texte |
| `creme` | `muted` | 7,22:1 | texte secondaire |
| `creme` | `corail` | **2,41:1** | ❌ jamais, à aucune taille |
| `creme` | `corail-deep` | **2,90:1** | ❌ jamais, à aucune taille |
| aplat `corail` | `ink` | **5,77:1** | texte courant |
| aplat `corail` | `teal-deep` | 3,19:1 | grands caractères (≥ 24 px) |
| aplat `corail-soft` | `ink` | **12,45:1** | tout texte |

**`teal-deep` sur `creme` = 7,71:1 est exactement le ratio `creme` sur `teal-deep`** déjà mesuré
le 2026-07-20 : le contraste est symétrique, c'est la même paire lue à l'envers. La colonne
vertébrale de la branche claire était donc validée depuis un mois sans que personne le voie.

### La règle

**Sur fond clair, le corail ne porte pas de texte — à aucune taille.** 2,41:1 et 2,91:1 échouent
même le seuil des grands caractères (3:1) ; aucune taille ne rattrape ça.

Il garde son rôle — porter l'accent — en changeant de véhicule : **sol, aplat ou filet.** Et il y
gagne : 5,77:1 en aplat clair avec de l'encre dessus, contre 3,19:1 en texte sur fond sombre, où
il tenait sans marge.

| | Branche sombre | Branche claire |
|---|---|---|
| Fond | `teal-deep` | `creme` ou `corail-soft` |
| Texte | `creme` | `teal-deep` |
| Accent corail | **en texte** | **en aplat ou filet** |

### La parité se joue entre les plans, pas dans un plan

Deux phrases de cette charte se contredisaient : « deux primaires à égalité » (en-tête et
§Palette, 2026-07-19) contre « le teal porte le fond, le corail porte l'accent » (§Mouvement,
2026-07-20 — le lendemain, sans amender la première).

**Résolution** : les deux sont vraies, elles ne parlent pas du même objet.

- « Un seul élément corail à l'écran » vaut **dans un plan** — le corail tire sa force de sa rareté.
- « Deux primaires à égalité » vaut **sur la durée** — les sols alternent d'un plan à l'autre, et
  la parité se compte en secondes, pas en pixels simultanés.

C'est le « résoudre l'encombrement par le temps » de `video-layout.md`, appliqué à la couleur au
lieu de la mise en page.

### Une couleur sémantique interdit sa présence dans le décor

**Dès qu'une couleur porte de l'information dans un schéma, le décor ne peut plus l'employer.**

Vécu le 2026-07-21 : une barre où `teal` = « relu depuis le cache » et `corail` = « repayé plein
tarif », posée sur un acte au sol corail. Au moment exact où la barre bascule entièrement en
corail — l'unique instant d'emphase de la capsule — elle devient invisible. Le plan le plus
important de la vidéo s'annulait dans son propre fond.

**Le sens gagne sur la parité.** Un sol qui porterait la couleur du schéma se choisit dans l'autre
famille, ou dans un niveau `-soft` de la même.

Corollaire : cette charte mesure des paires **texte/fond**. Un schéma coloré impose de mesurer
aussi des paires **surface/fond** — cas qui n'existait pas avant la v1.3.

#### Une surface corail ne tient sur aucun sol clair — elle se borde

Seuil applicable : **3:1**, celui des composants graphiques porteurs d'information (WCAG 1.4.11).

| Surface | Sol | Ratio | |
|---|---|---|---|
| `corail` | `corail-soft` | 2,06 | ❌ |
| `corail` | `creme` | 2,41 | ❌ |
| `corail` | `teal-soft` | 2,04 | ❌ |
| `teal-deep` | `corail-soft` | 6,90 | ✅ |
| `teal-deep` | `creme` | 7,71 | ✅ |

**Aucun sol clair ne porte une surface corail au-dessus du seuil.** La sortie n'est pas de
changer de couleur — ce serait perdre le sens — mais de **border la surface d'un filet
opaque** : le bord porte le contraste, le remplissage porte l'information. Un contour à faible
opacité ne suffit pas.

> ⚠️ **Corrigé en v1.5.** Cette section prescrivait un filet **`teal-deep`**, déduit du seul
> cas corail qu'elle mesurait. Généralisé aux huit familles, ce filet échoue : 1,64 sur un
> aplat teal, 1,97 sur l'information, 2,06 sur l'erreur. La règle exacte est
> *« le filet est l'`encre` de la famille de l'aplat »* — voir *Grades → Le filet d'un aplat*.

*Trouvé le 2026-07-22 en relisant cette section même : elle prescrivait de mesurer les paires
surface/fond, et la capsule qui l'a inspirée ne l'avait pas fait.*

### Format — le carré, mesuré le 2026-07-22

**Une capsule pédagogique se compose en 1:1 (1080 × 1080), pas en 9:16.**

Ce que la v1.2 prédisait, et qui s'est révélé faux :

> « quatre lignes de texte ne remplissent pas un 9:16, quelle que soit leur répartition. La vraie
> réponse est la **densité** — titre sur plusieurs lignes, élément graphique, ou image — pas la
> disposition. »

La densité a été ajoutée : un **schéma porteur de sens** dans chaque capsule, pas un ornement. Et le
9:16 restait à moitié vide. Trois capsules livrées, trois fois le même retour : « beaucoup de vide ».

**La cause est une forme, pas une quantité.** Le contenu d'une capsule est un titre court, un schéma
large et un paragraphe : ça occupe un carré. Le placer dans un cadre deux fois plus haut que large
laisse la moitié inoccupée **par construction**. Aucune densité ne comble un désaccord de proportion.

Comparaison rendue — même composant, même contenu, seule la hauteur change :

| Format | Hauteur utile\* | Verdict |
|---|---|---|
| 9:16 · 1080 × 1920 | ~1530 px | moitié vide |
| 4:5 · 1080 × 1350 | ~960 px | ~350 px de vide sous le header |
| **1:1 · 1080 × 1080** | **~690 px** | **plein, sans débordement sur le plan le plus chargé** |

\* après retrait des marges de sécurité, du header et du rail de progression.

**La règle** : choisir le format d'après la **forme du contenu**, jamais d'après la destination. Un
carton de titre — une ligne, un mot d'accent — tient en 9:16 : c'est ce qu'a montré `CartonTitre` le
2026-07-20. Une capsule explicative ne tient pas, et le vertical n'était pas un choix mais un héritage.

**`ref-width` reste 1080 dans les trois cas.** La mise à l'échelle typographique dépend de la largeur
seule : changer de format ne change aucune taille de texte, et il n'y a donc rien à recalculer.

**Corollaire sur une série** : un format mixte est pire que n'importe lequel des deux. Reformater une
pièce déjà validée est légitime pour tenir l'homogénéité — le dire, ne pas le faire en silence.
## Marque — v1.6 (2026-08-25)

### État : la marque est le « e », depuis le 2026-08-25

Le verrou du 2026-08-18 a été **révoqué par Mehdi le 2026-08-25**. La marque à quatre blocs est
retirée ; elle ne subsiste que dans `bimi.svg`, pour la raison dite plus bas.

**Le signe est un « e » en boucle ouverte**, tracé en trois masses qui se recouvrent : un arc haut
chaud, un corps qui traverse du chaud au froid, un arc bas froid. Fourni par Mehdi, produit sous
Recraft, puis nettoyé et scellé — **le fichier servi n'est pas le fichier d'origine**, et le
§ *Ce qui a été réparé* dit exactement en quoi.

**Statut : ARBITRAIRE PUR**, comme le précédent. Aucune mesure ne l'a désigné ; celles ci-dessous
disent seulement qu'il ne se disqualifie pas.

### ⚠️ La palette est ancrée SUR la marque, et non l'inverse

C'est le renversement de la v1.6, et il est explicite : **la marque ne se recolore pas aux jetons
— les jetons prennent la teinte de la marque.**

| jeton | v1.5 | v1.6 | |
|---|---|---|---|
| `corail` | `#FF8463` | **`#F68451`** | valeur prise dans la marque |
| `corail-deep` | `#F26A45` | `#EB7039` | ré-ancré |
| `corail-soft` | `#FFE9E0` | `#FFE9E0` | **inchangé** — était déjà à la teinte de la marque |
| `teal` | `#2D7A8B` | **`#1C757F`** | valeur prise dans la marque |
| `teal-deep` | `#1F5764` | `#1E585F` | ré-ancré |
| `teal-soft` | `#E4EEF0` | `#E4EEEF` | ré-ancré |

Méthode : chaque jeton **conserve sa clarté et son chroma** — ceux qui ont été mesurés pour le
contraste en v1.5 — et ne change que de teinte. **Le ré-ancrage est neutre en contraste**, vérifié
garde-fou par garde-fou : aucun ne franchit un seuil, dans un sens ni dans l'autre.

| garde-fou | v1.5 | v1.6 |
|---|---|---|
| texte blanc sur `teal` | 4,92 | **5,38** |
| `corail` sur crème | 2,30 | **2,41** |
| texte `teal-deep` sur `corail` | 3,35 | 3,19 |
| `teal-deep` sur crème | 7,71 | 7,68 |
| texte blanc sur `teal-deep` | 8,06 | 8,03 |

**Effet de bord favorable, mesuré** : la collision assumée entre `info-plein` et le teal de marque
passe de **9,5° à 14,3°**. Elle reste une collision ; elle est moins serrée.

**Deux choses n'ont PAS été ré-ancrées, délibérément.** Les trois valeurs `✎` calculées et jamais
mesurées (`chaud-encre`, `corail-encre`, `info-encre`), qui attendent toujours l'œil de Mehdi —
les ré-ancrer aurait posé un calcul sur un calcul non validé. Et la contradiction connue sur
`corail-soft` (`#FFE9E0` au bloc `tokens`, `#FFEDE6` à la table des grades) : elle demande un
arbitrage, pas une conversion.

### Les sept valeurs de la marque ne sont PAS des jetons d'interface

Un dégradé ne peut pas être un jeton. Les sept bornes sont nommées ici pour être reconnues, pas
pour construire des interfaces : `#F68451` et `#EE8E5D` (départs chauds) · `#D7A67F` (arrivée
neutre chaude) · `#A1E2D6` (arrivée froide pâle) · `#1C757F` et `#187A80` (froids profonds) ·
`#50AB9E` (froid moyen).

**Deux d'entre elles sont aussi des jetons** — `#F68451` = `corail`, `#1C757F` = `teal`. C'est
voulu : c'est ce qui fait l'ancrage.

⚠️ **La verrue, dite d'avance** : `#187A80` est à **ΔE 3,6** de `#1C757F`. Deux valeurs quasi
identiques dans un canon qui existe pour empêcher ça. Elles sont distinctes (seuil ~2,3), de
justesse. On ne peut pas la lever sans modifier la marque : elle est donc nommée et gardée.

### Ce qui a été mesuré POUR, et ce qui a été mesuré CONTRE

**POUR — la petite taille tient, mieux que la marque à quatre blocs.** Perte de forme (écart au
rendu 256 px) : **−39 %** à 16 px, **−48 %** à 24, −39 % à 32, −18 % à 48. Là où la précédente
était « illisible à 16 px », celle-ci se lit.
⚠️ **Cette mesure est relative au rendu 256 px du candidat lui-même**, donc invariante par
remplacement du candidat : une forme plus simple gagne toujours. Elle dit « il garde sa propre
forme », pas « on le reconnaît ». **Elle ne vaut pas argument d'adoption.**

**POUR — il tient sur tous les sols mesurés.** Part de tracé rendue invisible (ΔE < 5) : **0,0 %**
sur crème, encre, blanc, corail-soft, et sur la tuile `teal-deep` ré-ancrée. Sa borne foncée est à
L\* 44,9, la tuile à L\* 34 : elles se séparent d'elles-mêmes. **La tuile n'a donc pas eu à
changer** — un remplacement d'icônes sur toute la flotte évité.

**CONTRE — il n'existe pas en monochrome, et il n'en existera pas.** Son identité EST le dégradé ;
aplati en un ton, il ne reste qu'un « e » générique. `marque-mono` est **retirée**. Ce qui est perdu
est nommé : gravure, tampon, impression une couleur. Décision de Mehdi, 2026-08-25.

**CONTRE — c'est une lettre.** La marque précédente revendiquait de n'être « ni une lettre, ni une
croix ». Celle-ci est un « e ». Le référent croix, exploré et documenté plus haut, est abandonné
avec elle.

**CONTRE — il porte un défaut de fabrication, réparé mais pas à zéro.** Voir ci-dessous.

### Ce qui a été réparé sur le fichier d'origine

Le fichier sorti de Recraft n'était pas servable :

| défaut | état |
|---|---|
| manifeste C2PA (`compositeSynthetic`, certificat de signature) | retiré — **5 032 o, 35,7 % du fichier** |
| rectangle blanc opaque plein cadre | retiré — il peignait un carré blanc sur tout sol non blanc |
| 4 tracés sous le pixel (0,13 à 0,67 px à 32 px) | retirés — bruit de vectorisation |
| **trou d'une rangée de pixels entre les deux masses chaudes** | scellé par recouvrement de **2,4 u** |

**Le trou, et son résidu.** Profil de pixels à 512 px : la rangée fautive était à **alpha 193**,
soit 24 % du fond qui traversait. Recouvrement à 0,6 u → 230. À **2,4 u → 255**, fermé à partir de
260 px de rendu. **À 110 px l'alpha plafonne à 220 et aucune largeur ne ferme** : le trou et le
recouvrement rétrécissent ensemble. Le résidu est faible, il n'est pas nul.
**Coût du scellement** : chaque bord se déplace de 1,2 u sur 1024, soit **0,117 % de la largeur**.

⚠️ **C'est un emplâtre, pas une réparation de source.** La réparation propre est que les deux
segments se chevauchent réellement dans le tracé. **Quiconque ré-exporte depuis Recraft doit refaire
les quatre lignes de ce tableau** — rien n'en survit.

⚠️ **Piège de mesure, consigné parce qu'il a coûté quatre tentatives.** Ce trou a été déclaré réglé
trois fois à tort, chaque fois pour une raison différente : fenêtre d'échantillonnage hors de la
masse · seuil posé sur la transparence alors que le défaut est une chute *partielle* · érosion 7×7
qui effaçait la ligne d'un pixel qu'elle cherchait · couloir mordant sur le bord extérieur du logo.
**Ce qui a tranché est le profil de pixels brut**, pas un détecteur. Un défaut d'un pixel ne se
mesure pas par agrégat — et c'est l'œil de Mehdi, pas la mesure, qui a rouvert le dossier.

### Les deux tailles : il n'y en a plus qu'une

`marque-reduite` est **retirée**. Elle n'était pas un ornement : elle existait parce que la marque à
quatre blocs *soudait ses blocs* à 16 px. Le « e » n'a rien à souder. Et c'est mesuré : **agrandir
l'emprise dégrade la forme aux quatre tailles** (62,5 % gagne partout, 79,2 % perd partout). Une
réduite par mise à l'échelle n'a donc aucun gain à offrir ; une réduite qui changerait de forme
reste interdite par la règle de la v1.5, qui est conservée.

### Déclinaisons

| tracé | sol | note |
|---|---|---|
| `marque` | tuile `teal-deep` `#1E585F`, `rx 21.6` | emprise **62,5 %** de la tuile, comme la précédente |
| `marque-sur-creme` | tuile crème `#FBFAF5` | contextes clairs |
| `marque-detouree` | aucun (transparent) | ⚠️ **ne pas poser sur un fond teal** : 11 % du tracé s'y efface et il se fend en deux îlots |
| `bimi.svg` | **inchangé — porte encore les quatre blocs** | voir ci-dessous |

Les identifiants de dégradé sont **nommés par fichier** (`etik-<tracé>-<n>`). Ce n'est pas
cosmétique : le générateur de plaquette *inline les trois tracés dans une même page*, et des `id`
partagés s'y écraseraient mutuellement.

⚠️ **Et un dégradé de marque ne se partage pas entre plusieurs éléments transformés.**
`gradientUnits="userSpaceOnUse"` se résout dans l'espace de l'élément **peint**, transformations
comprises. Posé sur un groupe dont chaque enfant porte son propre `translate`, chaque enfant
repeint donc le **même bout de rampe** : le dégradé sort **plat**, sans erreur ni avertissement.
Mesuré le 2026-08-26 en composant « Pharmacie » en tracés — la rampe ne bougeait pas d'un bout à
l'autre du mot, dans **deux** moteurs de rendu, ce qui écarte l'hypothèse du rasteriseur.
**Parade** : les formes deviennent un `clipPath`, et **un seul `<rect>` sans `transform`** porte
le dégradé. Après correctif, la rampe va bien de `#F68451` à `#1C757F` sur toute la largeur.

🛑 **Corollaire pour le BIMI** : `clipPath` n'existe pas dans le profil SVG Tiny P/S. Un tracé de
marque dégradé destiné à l'e-mail ne peut donc pas employer cette parade — une raison de plus
pour que la bascule de `bimi.svg` soit traitée à part, et non dans la foulée.

### La marque e-mail n'a PAS été basculée

`bimi.svg` porte toujours les quatre blocs. Deux raisons, dont une corrige ce canon :

1. **Sondé le 2026-08-25** : `https://etikpharma.com/bimi.svg` rend **464 octets, identiques au
   fichier du canon**. ⛔ L'affirmation « 464 octets contre 1 339 pour celui en service », écrite
   ici et dans `registry.json`, **était périmée** — la bascule avait déjà eu lieu. Ce fichier EST ce
   qui s'affiche dans les messageries : le remplacer change la production.
2. Le profil **SVG Tiny P/S** exigé par BIMI n'a pas été vérifié contre les **dégradés** — et le
   doute noté plus haut dans cette charte n'est plus sans objet, puisque la nouvelle marque en porte
   trois. Une panne BIMI est **silencieuse** : le logo cesse simplement d'apparaître.

⇒ Bascule à traiter séparément, avec vérification du profil **et** sonde après déploiement. Jusque-là
**deux marques coexistent** — exactement ce que ce chantier combat, et c'est pour ça que c'est écrit
ici, daté, plutôt que subi.

## Ce que cette charte ne couvre pas encore
✅ **La marque est arrêtée et verrouillée le 2026-08-18** — dernier manque de la v1.4 comblé.
- **`dur-ample-frames`** — seul jeton de mouvement encore dérivé par proportion. Défini pour les
  changements de plan : il ne se validera que sur une séquence à plusieurs plans, pas sur un carton.
  **Toujours dérivé au 2026-07-21** : une capsule à trois plans a bien été produite, mais elle ne
  l'a pas employé (elle enchaîne sur `dur-base-frames` et `dur-micro-frames`). L'occasion existait, elle a été
  manquée — ne pas croire le jeton validé du seul fait qu'une séquence multi-plans existe.
- **Densité en format vertical** — la règle `taille × largeur / ref-width` est **nécessaire mais
  insuffisante** en 9:16. Contre-intuitivement, **ce n'est pas un problème de taille** : sur un
  téléphone, une vidéo verticale plein écran mappe 1080 px sur toute la largeur physique, là où une
  horizontale y mappe 1920 px — c'est donc l'horizontal qui exige un texte relativement plus gros.
  Grossir en vertical traiterait le symptôme.
  **Piste acquise** (2026-07-20) : répartir les groupes sur la hauteur (`space-between`) plutôt que
  les grouper au centre. Ça ancre le cadre à trois niveaux et supprime l'effet de bloc flottant.
  **RÉSOLU le 2026-07-22, et pas dans le sens annoncé.** Cette entrée opposait deux réponses
  candidates — la densité (retenue) contre la disposition (écartée). **Les deux étaient fausses.**
  Un objet graphique porteur de sens a bien été ajouté, et le 9:16 est resté à moitié vide. La
  réponse était le **format** : le contenu d'une capsule a une forme carrée, et aucune densité ne
  comble un désaccord de proportion. Voir *Branche claire → Format*. Leçon transférable : quand deux
  réponses candidates échouent toutes les deux, c'est en général que la question portait sur la
  mauvaise variable.
- **Le bas d'échelle de la famille chaude** — aucun neutre chaud sous 80 % de clarté n'existe
  sur le périmètre. À emprunter au froid, ou à créer et mesurer. Voir *Grades*.
- **La valeur de la famille `info`**, et celle des `surface` de marque — décidées le
  2026-08-18, **pas encore dérivées**. Voir *Grades → Ce qui reste à dériver*.

> ✅ **Deux manques de la v1.4 sont clos par la section *Grades*** : la répartition `-deep` vs
> base sur support statique, et les rôles des neutres. Ils ne manquaient pas d'une valeur mais
> d'une **grammaire de rôles** — c'est ce que les grades apportent.
