# Brand API — charte.tero.be/brand/

> La charte Tero lisible par les machines. Fichiers statiques, versionnés, servis par nginx depuis `https://charte.tero.be/brand/`. Aucune authentification, aucun backend, lecture seule (GET). Version **1.0.0** — 21 octobre 2026.

## À qui ça sert

| Consommateur | Ce qu'il lit | Ce qu'il en fait |
|---|---|---|
| **Koen** (collaborateur IA de Tero Digital) | `llms.txt` → `llms-full.txt` → `brands.json` de la marque concernée → `tokens.json` → `logos.json` | produit une page, un visuel, un texte, un JSON-LD conformes, sans deviner |
| **Sites du groupe** (tero.be, un domaine par marque) | `tokens.css` (`<link rel="stylesheet">`), `brands.json` (mention d'endossement, pilier, schema.org), `logos.json` (fichier exact) | applique le thème de la marque avec `data-brand="<id>"` ; génère pied de page et JSON-LD |
| **Outils IA externes** (ChatGPT, Claude, Perplexity, agents de navigation) | `llms.txt`, `llms-full.txt`, `openapi.json` | répondent avec les faits de marque mesurés, pas des approximations |
| **Conformité / Atelier** (pages de ce site) | `brands.json`, `tokens.json` | mesurent l'écart des domaines et fabriquent signatures, avatars, lockups textuels |

## Les fichiers

| Fichier | Contenu | Clé de versionnage |
|---|---|---|
| [`brands.json`](./brands.json) | le groupe, les 3 piliers, les 28 marques (nom exact, pilier, relation d'endossement, mention à afficher, domaines, schema.org, adresse / téléphone relevés, accent en 3 variables, logos), Koen comme `fonctionInterne` | `version`, `date`, `source` |
| [`tokens.json`](./tokens.json) | jetons DTCG : neutres, 7 couleurs, **paires de contraste WCAG 2.1 calculées avec verdict**, piliers, accents des 28 marques, typographie (familles, graisses livrées, rampe, interlignages, lettrages), espace, rayons, ombre, durées, focus (A3), zone de protection et tailles minimales des logos tero et Koen | `$extensions.org.tero.brand` |
| [`tokens.css`](./tokens.css) | les mêmes jetons en variables CSS ; clair / sombre ; `[data-pillar]` ; un bloc `[data-brand="<id>"]` par marque | en-tête du fichier |
| [`logos.json`](./logos.json) | registre des fichiers **réellement présents** dans `/assets/` : viewBox, ratio, octets, usage, fond, interdits ; marques sans fichier = `[?] à documenter` | `version`, `date`, `source` |
| [`rules.json`](./rules.json) | les règles opposables de `regles.html` 1.1.0 : `id`, `section`, `etiquette` (MESURÉ / RÈGLE / À VALIDER CLIENT), `enonce` | `version`, `date`, `source` |
| [`openapi.json`](./openapi.json) | description OpenAPI 3.1 des ressources ci-dessus et de `/llms.txt`, `/llms-full.txt`, `/brands/{id}/DESIGN.md` | `info.version` |
| [`/llms.txt`](../llms.txt) · [`/llms-full.txt`](../llms-full.txt) | carte du site pour les agents · la charte entière en Markdown | en-tête |

Documentation humaine et explorateur : [`/api.html`](../api.html).

## Conventions

- **Casse** : les noms sont écrits dans leur casse officielle exacte. Mot-symbole `tero` (minuscules), rédaction `Tero`, jamais `TERO`.
- **`[?]`** : information absente des sources. On la demande au client, on ne la devine pas.
- **Étiquettes** : `MESURÉ` (relevé en production), `RÈGLE` (décision opposable), `À VALIDER CLIENT` (le client tranche).
- **Trois variables d'accent** : `accent` (aplat), `accentOn` (texte sur l'aplat), `accentText` (accent en texte, `null` si l'accent échoue AA → liens en encre soulignés, aucune teinte dérivée par calcul).
- **Trois piliers** (regles.html 1.1.0 § 1.2) : Tero Hospitality · Tero Leisure · Tero Sport Events. La fusion Leisure + Sport Events portée par `harness/tokens.json` 1.0.0 reste `[À VALIDER CLIENT]`.
- **Koen** n'est pas une marque : il vit sous `fonctionInterne.koen`, jamais dans `marques[]`, jamais dans un JSON-LD.

## Sources (aucune valeur inventée)

`regles.html` 1.1.0 (21/10/2026) · `docs/koen/ENDOSSEMENT.md` · `marques/*.html` · `docs/REGISTRE-LOGOS.md` · `harness/tokens.json` 1.0.0 (16/10/2026) · `assets/css/charte.css` · audit AEO `aeo-2026-10-21/fondations/raw/*.json` (24 domaines, relevé UTC du 21/10/2026) · `PLAN-FONDATIONS.md` livrable 4. Les adresses et téléphones viennent exclusivement du relevé ; les capacités et dates d'édition sont citées avec leur source.

## Rapport avec `harness/tokens.json`

`brand/tokens.json` **reprend intégralement** `harness/tokens.json` 1.0.0 (mêmes clés DTCG, mêmes valeurs) et l'étend. Le fichier harness est conservé tel quel comme photographie du harness 1.0.0 (2 entités) ; il porte désormais `$extensions.org.tero.harness.supersededBy = "/brand/tokens.json"`. Une seule source évolue : celle-ci.

## Versionnage

Sémantique : **MAJOR** structure incompatible · **MINOR** champ ou entrée ajoutés · **PATCH** correction de valeur. Les URL ne changent jamais ; chaque fichier porte `version` et `date`. Un consommateur vérifie `version` et refuse une MAJOR inconnue. Cadence : revue à chaque arbitrage client (champ `À VALIDER CLIENT` levé), au minimum trimestrielle, et à chaque nouveau relevé AEO.

## Usage rapide

```js
const brands = await (await fetch("https://charte.tero.be/brand/brands.json")).json();
const m = brands.marques.find(b => b.id === "teroir");
console.log(m.nom, m.pilier.nom, m.endossement.mention, m.accent);
```

```python
import json, urllib.request
tokens = json.load(urllib.request.urlopen("https://charte.tero.be/brand/tokens.json"))
teal = tokens["color"]["primitive"]["teal"]["$value"]
ok = [p for p in tokens["color"]["contrast"]["texte"] if p["fg"] == "teal" and p["aaTexte"]]
```

Prompt d'agent : « Lis https://charte.tero.be/llms.txt puis https://charte.tero.be/llms-full.txt avant de produire. Pour la marque `<id>`, charge https://charte.tero.be/brand/brands.json et n'utilise que son accent, sa mention d'endossement et le fichier de logo listé dans logos.json. Toute donnée absente s'écrit [?]. »

## Limites

- Les adresses, téléphones et dates d'édition ne couvrent que ce que l'audit du 21/10/2026 a relevé : 7 marques ont une adresse de rue complète, 6 un téléphone, 5 une date de prochaine édition. Le reste est `[?]`.
- Les relations d'endossement marquées `À VALIDER CLIENT` (Malle Poste, Tero Padel Academy, Tero Trail, Bouwrun, Lime, Brussels Premier Padel) attendent un arbitrage.
- 11 marques sur 28 n'ont aucun fichier de logo au registre et Tero Lieux n'a qu'une plaque de présentation (`logos.json` → `statut`) : les lockups 1..8 et les logos de Tero Lodges, Garisart, Tero Padel Club, etc. restent à produire par le studio. Les 56 déclinaisons icône/avatar sont générées depuis le monogramme et l'accent : ce ne sont pas des logos de marque.
- `rules.json` structure les sections 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14 et 21 de regles.html ; les sections 11, 13, 15 à 20 (performance, contenu, langues, médias, QA, pièges, checklists) ne sont pas encore découpées en objets.
