Préfixe de namespace et modèle d'identité V7GUID
Décision d'architecture du 2026-07-26. Documenté dans
GitCover.Discovery/plans/ADR-001_namespace_prefix_gitcover.md.
Question de départ
Faut-il conserver le long préfixe de namespace C# GitCover.Discovery pour une future publication OSS, ou travailler avec un namespace raccourci sans préfixe (Discovery.*)?
Contexte : dans le cadre d'une collaboration dynamique entre développeurs, agents IA et services MCP, qui interagissent tous dynamiquement entre eux, des namespaces « absolus » pourraient brouiller les limites — car le concept V7GUID utilise les 48 premiers bits pour l'ID de tenant et les types sont enregistrés au minimum au niveau de l'outil, mais peuvent être redéfinis au niveau du tenant ou du dépôt (niveau organisation), afin que l'unicité soit garantie entre les dépôts dans GCEP, indépendamment des versions de DLL ou des instances de processus.
Le modèle d'identité V7GUID
Le concept V7GUID définit l'identité et la typisation entièrement au niveau des bits :
Identité du tenant (bits 0–47)
L'identité du tenant est dérivée de l'horodatage de 48 bits de l'UUIDv7 de création. Elle est encodée de manière déterministe dans la GUID — le namespace C# ne transmet aucune information d'identité supplémentaire.
repository_id (bits 52–63, 12 bits, 0–4095)
Adresse un dépôt dans le contexte d'un tenant. Par tenant, il existe exactement un dépôt TOP (id=1) et jusqu'à 4 095 autres. L'unicité est garantie par la repository_id, non par le namespace C#.
kind (bits 114–121, 8 bits) — registre normatif central
Normalise la nature de l'activité de manière transverse aux dépôts et remplace les énumérations spécifiques à la solution (RepoKind, ArtifactKind dans GitCover.Discovery ; Prozesstyp dans GCP.Portfolio ; Type dans GCPN). Le fichier central kinds.json est maintenu dans la racine normative OSS (git.gitcover.org/OSS/TOP/.gitcover/dictionaries/).
Identifiant dual (classification, uuid)
Sépare l'identifiant de classe (quoi/type, encodé de manière déterministe dans les bits) et l'ID d'objet (quel objet concret, uuidv7 pur). Ensemble, ils forment la clé composite — le namespace n'y est pas inclus.
Pourquoi le préfixe de namespace est neutre
Le préfixe de namespace C# GitCover. suggère une « identité absolue » qui n'est pas prévue dans le modèle V7GUID. Il est neutre pour le modèle d'identité et de typisation :
- MCP enregistre des noms d'outils, non des namespaces C#.
- GCEP référence via V7GUID, non via des identifiants C#.
- L'unicité des types est garantie par le registre de dictionnaire (
kinds.json), non par le namespace C#. - Une redéfinition de types au niveau du tenant ou du dépôt (sentinelle
255= Custom/TenantDefined) s'effectue dans le dictionnaire, non dans le namespace C#. Le préfixe de namespace ne peut pas contourner cette redéfinition.
Raisons du maintien
| Argument | Justification |
|---|---|
| Cohérence de marque | Les 18 solutions dans Development/Solutions/ utilisent le préfixe (à l'exception d'exceptions historiques comme GCP/GCEP). Pour la publication OSS sous git.gitcover.org/GCC-OSS/<repo>, GitCover.* signale l'origine. |
| Absence de collision NuGet | Un simple Discovery.* entre facilement en collision avec des paquets tiers ; GitCover.Discovery est globalement unique. |
| Visibilité de la licence | Le modèle de licence IPL (Open-Core, taxonomie Field-of-Use) utilise le namespace comme marqueur d'origine et d'appartenance à la licence. |
| Cohérence de l'écosystème de solutions | Les bundles transverses aux solutions (Fédération GCEP, MCP-Hub) référencent aujourd'hui GitCover.Core, GitCover.V7Guid — un namespace raccourci casserait cette chaîne. |
Conséquence pour la collaboration dynamique
Le namespace C# n'est pas un médium d'identité pour :
- Enregistrement d'outils MCP : Un serveur MCP qui enregistre un outil issu de
GitCover.Discovery.Apiet un autre issu deGitCover.Accountant.Apin'entre pas en conflit — les noms d'outils sont séparés, et les types V7GUID sont uniques dans le registre central. - Fédération GCEP : Référence via V7GUID (identifiant de classe + ID d'objet), non via des namespaces C#.
- Interaction avec les agents IA : Les agents IA travaillent avec des noms d'outils et des artefacts référencés par V7GUID, non avec des namespaces C#.
- Redéfinition au niveau du tenant/dépôt : La sentinelle
255(Custom/TenantDefined) renvoie de manière déterministe à une définition propre au tenant dans le dictionnaire — indépendamment du fait que le namespace C# soitGitCover.Discovery.*ouDiscovery.*.
Conclusion
Le préfixe de namespace C# GitCover. est maintenu en tant que convention de nommage — non comme médium d'identité. L'identité et l'unicité des types sont garanties par le modèle V7GUID (ID de tenant dans les bits 0–47, repository_id dans les bits 52–63, registre kind dans les bits 114–121). Le préfixe est neutre pour la collaboration dynamique entre développeurs, agents IA et services MCP — il ne transmet aucune information d'identité qui ne soit déjà encodée de manière déterministe dans la V7GUID.
Sources
- Spécification V7GUID :
specs/v7guid/00_gesamtkarte.md(carte d'ensemble 128 bits) - Spécification V7GUID :
specs/v7guid/33_kind.md(champkind, registre central) - Spécification V7GUID :
specs/v7guid/12_repository_id.md(portée du dépôt) - Spécification V7GUID :
specs/v7guid/90_dual_identifier.md(identifiant dual) - ADR-002 :
specs/v7guid/ADR-002_layout_v2_kind.md(consolidationkind) - Racine normative OSS :
git.gitcover.org/OSS/TOP/.gitcover/dictionaries/kinds.json - Modèle de licence IPL :
REPOS/AFJD/IPLicensing/03_OSS_MODEL.md - ADR dans le dépôt de solution :
Development/Solutions/GitCover.Discovery/plans/ADR-001_namespace_prefix_gitcover.md