Aller au contenu

ADR-055 : Classification des opt-ins par destination

Statut

Proposé, Forge 1.0.0-rc (ticket ADR-OPTIN-CATEGORIES-001).
Décision de gouvernance et de présentation des opt-ins ; relève du mainteneur.


Date

2026-06-29


Contexte

Le nombre d'opt-ins officiels s'étend (une vingtaine de paquets forge-mvc-*).
La liste à plat devient difficile à parcourir, que ce soit sur PyPI, dans la
commande opt-in:list ou dans la documentation.

Le catalogue canonique existe déjà : cli/optins/catalog.py,
OFFICIAL_OPTINS: dict[str, OptIn], source de vérité unique de la famille
opt-in:* (ADR-016).
Chaque OptIn porte name, package_dist, package_import, kind et
summary.

Le champ kind (route / library / crosscutting) décrit comment la brique
se branche : c'est une classification technique.
Il ne dit rien de à quoi sert la brique : il manque un axe fonctionnel, la
« destination ».

Deux fausses pistes ont été écartées pour atteindre ce regroupement.

Renommer les paquets par domaine (par exemple forge-mvc-db-mariadb) heurte deux
règles.
Le nom d'un paquet PyPI est de l'API publique : renommer un paquet déjà publié
serait une rupture (charte, règle C).
Et l'API publique est en anglais (ADR-003), ce qui exclut un préfixe comme
bdd.

Réutiliser le champ kind mélangerait deux axes distincts (technique et
fonctionnel) et appauvrirait les deux.

Le catalogue est par ailleurs incomplet : il décrit moins d'entrées qu'il n'existe
de paquets, plusieurs opt-ins récents n'y figurent pas.


Décision

Un axe « destination » ajouté au catalogue, sans renommage

On ajoute un champ category à OptIn, distinct de kind.
category exprime la destination fonctionnelle ; kind reste la forme
d'intégration technique.
Aucun paquet n'est renommé : les noms de distribution PyPI restent le contrat
public, en anglais (ADR-003).

L'identifiant de catégorie est un slug anglais (cohérent avec ADR-003) ; son
libellé d'affichage est en français, côté CLI et documentation.

Liste canonique des catégories

Slug Libellé d'affichage Opt-ins
database Bases de données mariadb, sqlite, postgres, mssql
media Médias et fichiers files, images, video, audio
security Sécurité et accès mfa, rbac, audit
communication Communication mail, notifications, iot
data Données et modélisation pivot, stats, workflow, import-export
i18n Internationalisation i18n
content Contenu qrcode
configuration Configuration settings
operations Exploitation et outillage deploy, admin, testing, jobs

Cette liste est la taxonomie unique : la même alimente opt-in:list (sortie
groupée) et la navigation du site (sections par destination).
Une seule taxonomie, deux surfaces.

Règle pour tout nouvel opt-in

Tout nouvel opt-in officiel déclare sa catégorie dans le catalogue, parmi la
liste canonique ci-dessus.
L'ajout d'une catégorie hors liste passe par une mise à jour de cet ADR.

Cas des backends de base de données

Les backends BDD (mariadb, sqlite, postgres, mssql) suivent un modèle
exclusif (ADR-054) : on en installe un seul par projet, découvert par
l'entry point forge_mvc.db_backend.
Ils ne s'« enable » pas comme les autres opt-ins et ne figurent pas dans
OFFICIAL_OPTINS.
Ils sont présentés dans une section dédiée « Bases de données » (lecture
seule, sémantique « choisis-en un »), distincte des opt-ins composables, et
restent pilotés par la famille db:*.

Périmètre

Cet ADR fige la taxonomie et la règle de déclaration.
La mise en œuvre (champ category, complétion des entrées manquantes du
catalogue, opt-in:list groupé, réorganisation de la navigation du site) relève
de tickets distincts.


Conséquences

Le catalogue gagne un axe fonctionnel et sera complété pour couvrir tous les
paquets existants.
opt-in:list regroupe les briques par destination, plus lisible à mesure que la
liste grandit.
La navigation du site reprend la même taxonomie, sans dépendre des noms de
paquets.
Aucun nom de paquet n'est touché : pas de rupture de contrat public, pas de churn
d'imports.
Un garde-fou de test pourra vérifier que chaque opt-in du catalogue déclare une
catégorie de la liste canonique.


Alternatives écartées

Renommer les paquets par domaine (forge-mvc-db-*, forge-mvc-media-*...).
Rupture du contrat public pour les paquets déjà publiés (charte, règle C),
préfixe français exclu par l'ADR-003, et churn massif (noms PyPI, namespaces
importables, imports de tests, entry points, classifiers, documentation) pour un
gain surtout cosmétique.

Réutiliser le champ kind.
Mélange un axe technique (intégration) et un axe fonctionnel (destination), au
détriment de la clarté des deux.

Ne rien faire.
La liste à plat continue de se dégrader à mesure que le nombre d'opt-ins
augmente.


Charte appliquée

  • Principe 8 (noyau minimal, briques opt-in raisonnées) : la classification rend
    l'offre d'opt-ins lisible sans l'alourdir.
  • Principe 11 (une seule façon officielle) : une taxonomie unique alimente le
    CLI et la documentation.
  • Principe 3 (refus de la magie cachée) : la catégorie est déclarée
    explicitement dans le catalogue, pas inférée.
  • Règle C (pas de rupture d'API publique hors release majeure) : on classe sans
    renommer les paquets.
  • ADR-003 (API publique en anglais) : slugs de catégorie en anglais.

Référence

  • ADR-016 : unification du modèle opt-in (cycle, verbes).
  • ADR-052 : stratégie et critères d'admission des opt-ins.
  • ADR-054 : backends BDD exclusifs, découverts par entry points.
  • ADR-038 : doc des opt-ins embarquée par paquet, agrégée au site.
  • cli/optins/catalog.py : catalogue canonique OFFICIAL_OPTINS.