ADR-059 ActifActive governance

Fermeture de la hiérarchie 3 niveaux : tokens sémantiques intermédiaires

DateDate
2026-06-15
DécideursDecision makers
Design System Lead

English summary: A systematic audit of the component-token object (COMP) in site/build.js found roughly 20 component tokens referencing primitive tokens directly, skipping the semantic layer required by ADR-001, plus 4 unrelated hardcoded CSS violations. This ADR closes the three-level hierarchy by adding 18 new intermediate semantic tokens (brand/feedback text colors, code-surface colors, toggle-track colors, a component spacing scale) and fixing the 4 CSS violations — leaving zero direct primitive references in the COMP object, with no visual change since resolved values stay identical.

>

*The original French version follows below — preserved unaltered as the historical record.*


Contexte

L'ADR-001 pose la règle fondamentale :

Tokens primitifs → Tokens sémantiques → Tokens de composant

Un audit systématique du COMP object dans site/build.js a révélé que ~20 tokens de composant référençaient directement des primitifs, sautant le niveau sémantique :

Token de composantPrimitif référencé (violation)
badge-brand-textprimitive.color.teal.12
badge-success-backgroundprimitive.color.green.3
badge-warning-backgroundprimitive.color.orange.3
badge-warning-textprimitive.color.orange.12
badge-info-backgroundprimitive.color.blue.3
badge-info-textprimitive.color.blue.12
banner-info-backgroundprimitive.color.blue.3
banner-success-backgroundprimitive.color.green.3
banner-warning-backgroundprimitive.color.orange.3
banner-warning-accentprimitive.color.orange.11
code-block-default-backgroundprimitive.color.gray.12
code-block-default-textprimitive.color.gray.4
code-block-default-meta-textprimitive.color.gray.8
code-block-default-copy-backgroundprimitive.color.gray.11
code-block-default-copy-background-hoverprimitive.color.gray.10
code-block-default-copy-textprimitive.color.gray.1
toggle-default-track-offprimitive.color.gray.9
toggle-default-track-off-hoverprimitive.color.gray.10
card-padding-smprimitive.space.3
card-padding-lgprimitive.space.6
badge-md-padding-x, table-padding-xprimitive.space.3
badge-md-padding-yprimitive.space.1
badge-sm-padding-xprimitive.space.2
badge-sm-padding-y"2px" (en dur)
code-block-default-padding-x, banner-padding-xprimitive.space.5
code-block-default-padding-y, banner-padding-yprimitive.space.4

Conséquence : changer la couleur de « fond code sombre » nécessitait de chercher toutes les occurrences de gray.12 dans le COMP, au lieu de modifier un seul token sémantique background.code qui se propagait partout. L'intention (fond de code) était invisible.

L'audit a également identifié 3 violations CSS immédiates non liées aux tokens :

  • Hex fallbacks dans des var(,fallback) (ex. var(--agtc-...,#646464)) dans [data-theme="light"]
  • font-size:0.85rem hors token sur .audit-contrast-table
  • filter:drop-shadow(rgba...) hors token sur .platform-logo-item img

Note post-incident 2026-06-15 : l'audit avait initialement classé les color:#hex;color:var(...) dans les règles :visited comme "fallbacks IE11 obsolètes" — c'était une erreur. Ces valeurs littérales sont une nécessité de compatibilité Safari : WebKit bloque la résolution de var() dans :visited pour prévenir le history sniffing. Elles ont été supprimées puis restaurées le même jour. Voir no-visited-nav.md §Exception Safari et ADR-047.


Décision

Partie 1 — 18 nouveaux tokens sémantiques

Créer les tokens intermédiaires manquants dans tokens/semantic.json, regroupés par famille :

Couleur marque

Token sémantiquePrimitifIntention
color.brand.primary-textteal.12Texte marque sur fond subtil clair (badge brand) — 12:1 sur fond blanc

Couleur feedback (texte sur fond subtil)

Token sémantiquePrimitifIntention
color.feedback.info-textblue.12Texte information sur fond subtil (badge/banner info)
color.feedback.warning-textorange.12Texte avertissement sur fond subtil (badge/banner warning)

feedback.success-subtle, feedback.warning-subtle, feedback.warning, feedback.info-subtle existaient déjà (ADR-045) — le COMP ne les utilisait pas.

Surface code

Token sémantiquePrimitifIntention
color.background.codegray.12Fond de bloc de code — surface sombre dédiée au code source
color.background.code-raisedgray.11Fond surélevé sur surface code (bouton copier au repos)
color.background.code-raised-hovergray.10Fond surélevé sur surface code au survol

Texte sur surface code

Token sémantiquePrimitifIntention
color.text.on-codegray.4Corps du code source sur surface sombre
color.text.on-code-mutedgray.8Métadonnées sur surface code (langue, numéro de ligne)
color.text.on-code-stronggray.1Bouton copier — contraste maximal sur surface code

Contrôle toggle

Token sémantiquePrimitifIntention
color.control.track-offgray.9Piste de toggle à l'état inactif (off)
color.control.track-off-hovergray.10Piste de toggle inactive au survol

Espacement composant (scale 2px → 24px)

Token sémantiquePrimitifValeurConsommateurs
space.component.padding-2xsspace.02pxbadge.sm padding vertical
space.component.padding-xsspace.14pxbadge.md padding vertical
space.component.padding-smspace.28pxbadge.sm padding horizontal, cellules tableau compact
space.component.padding-mdspace.312pxbadge.md padding horizontal, cellules tableau, card compact
space.component.padding-lgspace.416pxpadding vertical blocs code/bannières
space.component.padding-xlspace.520pxpadding horizontal blocs code/bannières
space.component.padding-2xlspace.624pxcard-padding-lg

Partie 2 — 4 corrections CSS

LigneViolationCorrection
[data-theme="light"] (3 règles)var(--agtc-...,#646464) — fallback dans var()Fallback hex retiré
.audit-contrast-tablefont-size:0.85rem hors tokenvar(--agtc-semantic-typography-label-size)
.platform-logo-item imgfilter:drop-shadow(rgba...) hors tokenNouveau --agtc-drop-shadow-sm dans :root

Alternatives rejetées

AlternativeRaison du rejet
Garder les primitives dans COMPViole ADR-001 (hiérarchie non négociable) — les agents ne voient pas l'intention
Créer des alias directs dans COMP sans sémantique (code-bg: primitive.gray.12)L'intention reste cachée ; un second composant consommant le même fond n'a pas de token partagé
Réutiliser background.inverse pour le fond codebackground.inverse = neutral.950 (surfaces sombres génériques : stats, footer). background.code = gray.12 (surface dédiée au code) — valeurs proches mais intention différente
Nommer les espaces par valeur (padding-12, padding-16)Nomme la valeur, pas la fonction. space.component.padding-md exprime la densité relative, pas la valeur absolue
Corriger seulement les violations les plus visiblesL'audit était systématique ; corriger sélectivement aurait laissé une dette invisible dans le COMP

Conséquences

Pour les agents : tout token de composant est désormais traçable jusqu'à une intention sémantique. Pour modifier la couleur de tous les fonds de code, il suffit de changer background.code dans semantic.json. Pour ajuster l'espacement compact des composants, space.component.padding-md.

Pour le système : le COMP object dans site/build.js ne contient plus aucune référence directe à --agtc-primitive-*. Validé par grep : 0 occurrence après correction.

Métriques build :

AvantAprès
756 tokens définis774 tokens définis (+18)
~20 violations hiérarchie0 violations hiérarchie
4 violations CSS0 violations CSS
0 fantôme0 fantôme

Gouvernance : ajout de tokens sémantiques → approbation Design System Lead, conforme à tokens-system.md. Aucun token primitif ni de composant modifié (les tokens de composant pointent vers les nouveaux sémantiques, mais leurs valeurs résolues sont identiques — 0 changement visuel).


Incidents ou déclencheurs

Audit systématique déclenché par la règle tokens-system.md :

*« Niveau 1 — Primitifs : Jamais utilisés directement dans les composants. Toujours via un token sémantique. »*

La violation était connue depuis la construction du COMP object (commentaire dans tokensCSS() : *« Espacements primitifs — référencés par certains tokens composant »*) mais aucun token sémantique intermédiaire n'avait encore été créé pour ces concepts.