Préfixe de namespace et modèle d'identité V7GUID
Décision d'architecture du 2026-07-26. Documentée dans
GitCover.Discovery/plans/ADR-001_namespace_prefix_gitcover.md.
Question initiale
Faut-il conserver le long préfixe de namespace C# GitCover.Discovery pour une future publication OSS, ou travailler avec une forme raccourcie sans préfixe (Discovery.*) ?
Contexte : dans le cadre d'une collaboration dynamique entre développeurs, AI Agents et MCP Services, qui travaillent tous dynamiquement ensemble, des namespaces « absolus » pourraient estomper les limites — car le concept V7GUID utilise les premiers 48 bits pour la Tenant-ID et les types sont enregistrés au minimum au niveau de l'outil, mais peuvent être redéfinis au niveau du Tenant ou du Repo (niveau organisation), afin qu'avec GCEP l'unicité règne entre les Repos, indépendamment des versions de DLL ou des instances de processus.
Le modèle d'identité V7GUID
Le concept V7GUID fixe l'identité et le typage entièrement au niveau des bits :
Identité du Tenant (bits 0–47)
L'identité du Tenant dérive de l'horodatage 48 bits de l'UUIDv7 de fondation. Elle est codée de manière déterministe dans le GUID — le namespace C# ne transporte aucune information d'identité supplémentaire.
repository_id (bits 52–63, 12 bits, 0–4095)
Adresse un Repository au sein d'un contexte de Tenant. Par Tenant, il existe exactement un Repository TOP (id=1) et jusqu'à 4 095 autres. L'unicité est assurée par le repository_id, et non par le namespace C#.
kind (bits 114–121, 8 bits) — registre normatif central
Normalise la nature de l'activité de manière transversale aux Repos et remplace les enums spécifiques aux solutions (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/).
Dual-Identifier (classification, uuid)
Sépare le Class Identifier (quoi/type, codé de manière déterministe en bits) et l'Object ID (quel objet concret, uuidv7 pur). Les deux forment ensemble le Composite Key — le namespace n'y figure pas.
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 typage :
- MCP enregistre des noms d'outils, et non des namespaces C#.
- GCEP référence via des V7GUID, et non via des identifiants C#.
- L'unicité des types est assurée par le registre des dictionnaires (
kinds.json), et non par le namespace C#. - Une redéfinition de types au niveau du Tenant ou du Repo (Sentinel
255= Custom/TenantDefined) s'effectue dans le dictionnaire, et non dans le namespace C#. Le préfixe de namespace ne peut pas compromettre cette redéfinition.
Arguments en faveur du maintien
| Argument | Justification |
|---|---|
| Cohérence de marque | Les 18 Solutions dans Development/Solutions/ utilisent le préfixe (hormis des exceptions historiques comme GCP/GCEP). Pour la publication OSS sous git.gitcover.org/GCC-OSS/<repo>, GitCover.* signale l'origine. |
| Absence de collisions NuGet | Un simple Discovery.* entre facilement en collision avec des paquets tiers ; GitCover.Discovery est globalement unique. |
| Visibilité de la licence | Le modèle IPLicensing (Open-Core, taxonomie Field-of-Use) utilise le namespace comme marqueur d'origine et d'appartenance à une licence. |
| Cohérence de l'écosystème de Solutions | Les Bundles transversaux aux Solutions (GCEP-Federation, MCP-Hub) référencent aujourd'hui GitCover.Core, GitCover.V7Guid — un namespace raccourci brise cette chaîne. |
Conséquence pour la collaboration dynamique
Le namespace C# n'est pas un support d'identité pour :
- Enregistrement des outils MCP : un serveur MCP qui enregistre un outil provenant de
GitCover.Discovery.Apiet un autre provenant 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. - GCEP-Federation : référence via des V7GUID (Class Identifier + Object ID), et non via des namespaces C#.
- Interaction avec les AI Agents : les AI Agents travaillent avec des noms d'outils et des artefacts référencés par V7GUID, et non avec des namespaces C#.
- Redéfinition au niveau Tenant/Repo : le Sentinel
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 comme convention d'identifiant — et non comme support d'identité. L'identité et l'unicité des types sont assurées par le modèle V7GUID (Tenant-ID 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, AI Agents et MCP Services — il ne transporte aucune information d'identité qui ne soit pas de toute façon déjà codée de manière déterministe dans le V7GUID.
Sources
- Spécification V7GUID :
specs/v7guid/00_gesamtkarte.md(carte 128 bits) - Spécification V7GUID :
specs/v7guid/33_kind.md(champkind, registre central) - Spécification V7GUID :
specs/v7guid/12_repository_id.md(portée Repo) - Spécification V7GUID :
specs/v7guid/90_dual_identifier.md(Dual-Identifier) - ADR-002 :
specs/v7guid/ADR-002_layout_v2_kind.md(consolidation dekind) - Racine normative OSS :
git.gitcover.org/OSS/TOP/.gitcover/dictionaries/kinds.json - Modèle IPLicensing :
REPOS/AFJD/IPLicensing/03_OSS_MODEL.md - ADR dans le Repo de la Solution :
Development/Solutions/GitCover.Discovery/plans/ADR-001_namespace_prefix_gitcover.md