Skip to main content
Welcome. This site supports keyboard navigation and screen readers. Press ? at any time for keyboard shortcuts. Press [ to focus the sidebar, ] to focus the content. High-contrast themes are available via the toolbar.
serard@dev00:~/cv

Pourquoi cette partie existe

Les conventions de nommage ne sont pas des détails. Dans un projet qui prétend que la pluralité des cadres est constitutive, la manière de désigner chaque cadre est ce qui rend cette pluralité opérationnelle. Sans une convention stricte, deux cadres concurrents finissent par s'appeler de la même façon dans deux contextes différents, et tout l'édifice s'effondre dans l'ambiguïté. La première rédaction du plan a accumulé exactement ce genre d'incohérences — Loi.Dsl était traité tantôt comme racine, tantôt comme instance, tantôt comme projet plat — et il a fallu une refonte complète pour en sortir. Cette partie documente la convention finale qui en est issue.

Le pattern fondamental

Tous les packages d'instance — c'est-à-dire les cadres juridiques concrets qu'on peut référencer en NuGet — portent le pattern :

${DslName}.${Space}${Time}.${Author}.Dsl

Décodons chaque composant :

${DslName} désigne la famille à laquelle appartient le cadre. Quatre familles existent dans le projet : Common (couche technique partagée), Law (couche juridique), Commons (couche politique sur les biens), Citizen (couche des cas citoyens). On peut en imaginer d'autres pour des extensions futures (Climate, Treaty, Custom, etc.). Le DslName est toujours en anglais, et toujours singulier sauf pour Commons qui est un substantif politique avec son propre S constitutif.

${Space} est la zone géopolitique couverte. Exemples : France, EU, Germany, Quebec, NewCaledonia, RomeAntique, World. Pas de tirets, pas d'espaces, en PascalCase. Pour les zones historiques où l'anglais n'a pas de nom évident, on peut garder un nom français reconnaissable comme RomeAntique (terminus technicus historique). La règle générale reste : l'anglais quand il existe naturellement, le terme historique reconnu sinon.

${Time} est la période temporelle. Une année unique (2026, 1995, 1804, 1958), une période (concaténée comme 1988_1995 à l'intérieur, mais habituellement on désigne un point dans le temps comme année de référence du cadre), un règne ou une mandature (MoyenAge, JulienPaul, MitterrandII). Le Time se concatène directement après le Space sans séparateur dans le nom du package : France2026, France1995, RomeAntique.JulienPaul. Le point sépare le namespace, pas les composants logiques.

${Author} est l'autorité ou le contributeur qui publie ce cadre. Exemples : Etalab, LaQuadrature, CGT, Erard (pour une reconstruction historique personnelle), INRIA, Cabinet${Nom}. C'est ce composant qui rend la pluralité opérationnelle : pour un même (${Space}, ${Time}), plusieurs ${Author} peuvent coexister, et chacun publie son cadre. Le compilateur n'arbitre pas entre eux ; il les reconnaît tous.

Les sept types de projets et leurs patterns

Type de projet Pattern Exemples
Racine M3 FrenchExDev.Net.Dsl (existant, le métamodèle racine)
Racine M2 d'interfaces FrenchExDev.Net.${DslName}.Dsl FrenchExDev.Net.Common.Dsl, FrenchExDev.Net.Law.Dsl, FrenchExDev.Net.Commons.Dsl, FrenchExDev.Net.Citizen.Dsl
Méta-générateur ${DslName}.DslGenerator CommonDslGenerator, LawDslGenerator
Description M2-meta Law.Dsl.MetaModel (un seul, pour décrire des cadres juridiques)
Instance d'un cadre ${DslName}.${Space}${Time}.${Author}.Dsl Common.France2026.Etalab.Dsl, Law.France2026.Etalab.Dsl, Law.France1995.Erard.Dsl, Commons.France2026.LaQuadrature.Dsl, Citizen.France2026.Etalab.Dsl
Bridge cross-DSL ${DslA}.${DslB}.Bridge.${SubProject} Law.Commons.Bridge.Core, Law.Commons.Bridge.Roslyn, Law.Commons.Bridge.SourceGenerator, Law.Commons.Bridge.Analyzers, Law.Commons.Bridge.Cli, Law.Citizen.Bridge.*
Quality gate ${DslName}.QualityGate.* Law.QualityGate.*
Cas concret M0 MyCases.${UserId} MyCases.MathildeMartin, MyCases.AlexSample

Les racines M2 d'interfaces portent le préfixe FrenchExDev.Net. parce qu'elles vivent dans le monorepo et qu'elles ne sont pas des instances. Les instances ne portent pas ce préfixe parce qu'elles sont publiées indépendamment, par des auteurs externes au monorepo, et qu'elles doivent pouvoir circuler en NuGet sans dépendre d'un namespace propriétaire. Les bridges sont organisés en cinq sous-projets selon le pattern Hexagonal qui sera détaillé en Partie 9 : Core (logique pure, sans Roslyn ni I/O), Roslyn (extraction depuis la Compilation), SourceGenerator (adapter build-time), Analyzers (adapter live IDE), Cli (interface ligne de commande optionnelle).

Distinction critique : Common (technique) vs Commons (politique)

C'est la distinction qui mérite le plus d'attention, parce qu'elle est subtile et qu'elle structure toute la partie politique du projet.

Common (sans S, anglais standard) est l'adjectif technique. Il désigne les choses partagées, sans aucun jugement de valeur. Une racine Common.Dsl contient les types-symboles techniques que tous les autres cadres viennent référencer : IAsset (un actif typé), ISpace (un espace géopolitique), IPeriod (une période temporelle), IProcedure (une procédure typée). Ces interfaces ne disent rien sur le monde — elles disent juste ce qui peut être typé. Une instance comme Common.France2026.Etalab.Dsl contient les actifs concrets (DrinkingWater, PublicCampaignFunding, SocialHousing...), les espaces concrets (FR, EU, World), les périodes concrètes (Y2026, Y1995...), les procédures concrètes (ParliamentaryDebate, NationalReferendum...). Tout cela est neutre : on dit qu'une chose existe et qu'elle a un nom canonique, on ne dit pas si elle est bonne ou mauvaise, juste ou injuste, à protéger ou à libéraliser.

Commons (avec S, substantif politique au sens d'Ostrom) est explicitement politique. Il désigne les biens communs au sens de Elinor Ostrom (Nobel 2009), de Pierre Dardot et Christian Laval (Commun, 2014), de Yochai Benkler (The Wealth of Networks, 2006). Une racine Commons.Dsl contient les types-jugements politiques : IAssetStatus (un actif a un statut typé), IBoundary (une frontière typée entre statuts requiert une procédure démocratique pour être franchie), StatusKind { Commons, Public, Private, Contested, InTransition } (les cinq statuts possibles d'un actif dans un cadre donné). Une instance comme Commons.France2026.LaQuadrature.Dsl politise le vocabulaire technique de Common.France2026.Etalab.Dsl : elle dit « l'eau potable est un bien commun en France 2026 selon La Quadrature, et toute privatisation requiert un référendum national ». Une autre instance, Commons.France2026.InstitutMontaigne.Dsl, peut dire « l'eau potable est un bien privé librement délégable ». Les deux instances référencent le même typeof(Common.France2026.Etalab.Assets.DrinkingWater) — c'est la couche technique partagée. Mais elles superposent dessus deux jugements politiques différents et explicitement typés, et le ConsensusScorer exhibe la divergence.

Le S final fait toute la différence. Common est l'adjectif partagé ; Commons est le substantif politique. Dans le code, ils ne sont jamais interchangeables. Le compilateur ne s'en plaindra pas (les deux sont des identifiants C# valides), donc c'est à l'humain d'imposer la discipline sémantique. Si vous lisez Commons.Dsl dans cette série, c'est toujours la couche politique. Si vous lisez Common.Dsl, c'est toujours la couche technique.

Note historique : la première rédaction du plan utilisait Commun en français pour la couche philosophique (avec l'idée que le mot français portait mieux la nuance des biens communs). Mais cela violait la convention plus profonde qui veut que le code C# soit en anglais. La refonte v3 a remplacé Commun par Commons (avec S), ce qui préserve la distinction sémantique sans sacrifier la convention linguistique. C'est une bonne illustration du fait que les conventions de code et les conventions sémantiques peuvent toutes deux être respectées si on accepte de chercher un peu.

Politique linguistique : C# en anglais, commentaires en français pour cette série

Par convention dans le projet, le code C# est toujours écrit en anglais. Identifiers (types, namespaces, properties, methods, parameters, enum members) sont en anglais. C'est la convention .NET standard, et c'est ce qui permet aux juristes anglophones et internationaux de lire le code sans friction.

Dérogation pour cette série blog : les commentaires // et /// sont en français, parce que l'audience est francophone et que le raisonnement pédagogique gagne à rester dans la langue du lecteur. Voici un exemple canonique :

// Marker interface : tout type pivot "actif juridique" implémente ceci
public interface IAsset { }

// Système de typage géographique avec hiérarchie
public interface ISpace { }
public interface ISubdivisionOf<TParent> : ISpace where TParent : ISpace { }

[Asset("Financement public des campagnes électorales", Category = "Vie démocratique")]
public sealed partial class PublicCampaignFunding { }
// ⬆ Le libellé (string passé au constructeur) reste en français parce que c'est
//    de la donnée humaine (titre affiché), pas un identifier. Les identifiers C#
//    sont en anglais, les strings de contenu juridique restent dans leur langue d'origine.

Distinction importante : identifiants ≠ chaînes de données. Les noms de types (PublicCampaignFunding, IAsset, Y2026) sont anglais par convention. Mais les chaînes de caractères qui transportent du contenu juridique humain — les libellés affichés, les descriptions, les textes d'alinéa, les noms canoniques d'articles — restent dans la langue du corpus juridique qu'elles représentent. Un PublicCampaignFunding dans le Code de l'environnement français aura un Label = "Financement public des campagnes électorales" — c'est normal et voulu. Les FQN typés (AssetFqn, SpaceFqn, etc.) stockent les noms de types C# (anglais), pas les libellés humains.

Cette politique s'aligne avec une règle plus générale qu'on retrouve dans tous les projets sérieux qui mêlent code et contenu humain : la structure technique est universelle, la donnée transportée est locale. Le code source de Wikipédia est en anglais, mais les articles sont en deux cents langues. Le code source de LaTeX est en anglais, mais les articles scientifiques qu'il met en page sont dans la langue de leurs auteurs. Le projet métacratique outillé fait pareil : le code C# est en anglais, le droit français qu'il type est en français.

Mapping des renommages depuis la première rédaction

Pour mémoire, voici le mapping qui a été appliqué entre la première rédaction (qui mêlait identifiants français et anglais) et la convention finale stricte. Si vous lisez d'autres documents qui utilisent l'ancien vocabulaire, ce tableau permet la conversion :

Ancien (français) Nouveau (anglais canonique)
Loi.Dsl (et toute variante) Law.Dsl
Commun.Dsl Commons.Dsl (avec S)
Citoyen.Dsl Citizen.Dsl
Mesure / MesureKind Measure / MeasureKind
Bien / IBien Asset / IAsset
Statut / IStatut / StatutKind Status / IStatus / StatusKind
Frontiere / IFrontiere Boundary / IBoundary
Procedure / IProcedure Procedure / IProcedure (déjà anglais)
ProcedureDemocratique DemocraticProcedure
Espace / IEspace Space / ISpace
Periode / IPeriode Period / IPeriod
Article Article (identique en anglais)
Alinea Alinea (conservé comme terminus technicus — voir ci-dessous)
MesCas.MathildeMartin MyCases.MathildeMartin
FinancementPublicCampagnes PublicCampaignFunding
DebatParlementaire2Lectures ParliamentaryDebateTwoReadings

L'exception Alineaterminus technicus juridique

Certains mots français n'ont pas de traduction anglaise équivalente dans le droit codifié. Alinea est l'exemple canonique : c'est la subdivision numérotée d'un article du droit français codifié, et Paragraph (la traduction littérale anglaise) est moins précis dans ce contexte parce qu'il désigne soit un paragraphe au sens typographique, soit une section légale au sens common law. Le mot Alinea est plus précis que sa traduction.

La convention retient donc Alinea comme un mot d'emprunt, traité comme un latinisme juridique (de la même façon que Amicus Curiae, Stare Decisis, Mens Rea, Habeas Corpus restent dans leur langue d'origine dans les codes anglais). Décision finale : [Alinea] reste [Alinea], sans traduction. C'est l'exception unique à la règle anglaise.

D'autres exceptions du même type pourront émerger pour des cadres historiques ou non-occidentaux. Un cadre Law.RomeAntique.JulienPaul.IUVS.Dsl aura raisonnablement besoin de garder Edictum, Praetor, Ius dans leur forme latine. Un cadre Law.NewCaledonia2026.Customary.Dsl aura raisonnablement besoin de garder Yarrap ou d'autres termes coutumiers kanaks. La règle générale est : l'anglais standard quand il est plus précis ; le terme local quand il est plus précis. La convention n'est pas un dogme ; c'est un outil au service de la spécificité des cadres.

Pourquoi des noms longs

Common.France2026.Etalab.Dsl est plus long que Common.Dsl. C'est intentionnel. Chaque composant du nom porte une information non-redondante :

  • Common dit la famille (technique)
  • France dit la juridiction
  • 2026 dit l'année de référence du cadre
  • Etalab dit l'auteur
  • Dsl dit le type de package

Si vous supprimez n'importe lequel de ces composants, vous obtenez un autre cadre. Common.France.Etalab.Dsl n'a pas de date — il prétendrait à l'éternité, ce qui est faux et politiquement dangereux. Common.France2026.Dsl n'a pas d'auteur — il prétendrait à la neutralité, ce qui est faux et politiquement dangereux. Common.2026.Etalab.Dsl n'a pas de juridiction — il prétendrait à l'universalité géographique, ce qui est faux et politiquement dangereux.

La longueur des noms est le prix payé pour l'honnêteté épistémologique. Chaque cadre dit explicitement qui il est, où il s'applique, à quelle époque il vaut, qui en est l'auteur. Aucun cadre ne peut prétendre être le droit français — au mieux, il peut prétendre être le droit français vu par tel auteur en telle année. Les noms longs sont la trace lexicale de cette modestie obligatoire.

⬇ Download