Prefijo de namespace y modelo de identidad V7GUID
Decisión de arquitectura del 2026-07-26. Documentada en
GitCover.Discovery/plans/ADR-001_namespace_prefix_gitcover.md.
Pregunta inicial
¿Debe mantenerse el largo prefijo de namespace de C# GitCover.Discovery para una posterior publicación OSS o debe trabajarse acortado sin prefijo (Discovery.*)?
Antecedentes: En la colaboración dinámica entre desarrolladores, agentes de IA y servicios MCP, que todos trabajan dinámicamente entre sí, los namespaces «absolutos» podrían difuminar los límites - pues el concepto V7GUID utiliza los primeros 48 bits para la Tenant-ID, y los tipos se registran al menos a nivel de herramienta, pero pueden redefinirse a nivel de tenant o de repositorio (nivel de organización), de modo que en GCEP haya unicidad entre repos, independientemente de las versiones de DLL o de las instancias de proceso.
El modelo de identidad V7GUID
El concepto V7GUID fija la identidad y la tipificación completamente a nivel de bits:
Identidad del tenant (Bits 0–47)
La identidad del tenant se deriva de la marca de tiempo de 48 bits de la UUIDv7 fundacional. Está codificada de forma determinista en la GUID - el namespace de C# no transporta información de identidad adicional.
repository_id (Bits 52–63, 12 bits, 0–4095)
Direcciona un repositorio dentro de un contexto de tenant. Por tenant existe exactamente un repositorio TOP (id=1) y hasta 4.095 adicionales. La unicidad se rige por la repository_id, no por el namespace de C#.
kind (Bits 114–121, 8 bits) - registro normativo central
Normaliza el tipo de actividad de forma transversal entre repositorios y sustituye los enums específicos de cada solución (RepoKind, ArtifactKind en GitCover.Discovery; Prozesstyp en GCP.Portfolio; Type en GCPN). El kinds.json central se gestiona en la raíz normativa OSS (git.gitcover.org/OSS/TOP/.gitcover/dictionaries/).
Identificador dual (classification, uuid)
Separa el Class Identifier (qué/tipo, codificado de forma determinista en bits) del Object ID (qué objeto concreto, uuidv7 puro). Ambos juntos forman la clave compuesta - el namespace no está incluido en ella.
Por qué el prefijo de namespace es neutral
El prefijo de namespace de C# GitCover. sugiere una «identidad absoluta» que en el modelo V7GUID no está prevista. Es neutral para el modelo de identidad y tipificación:
- MCP registra nombres de herramientas, no namespaces de C#.
- GCEP referencia mediante V7GUID, no mediante identificadores de C#.
- La unicidad de tipos se rige por el registro de diccionarios (
kinds.json), no por el namespace de C#. - Una redefinición de tipos a nivel de tenant o de repositorio (Sentinel
255= Custom/TenantDefined) tiene lugar en el diccionario, no en el namespace de C#. El prefijo de namespace no puede socavar esta redefinición.
Razones para mantenerlo
| Argumento | Justificación |
|---|---|
| Coherencia de marca | Las 18 Solutions en Development/Solutions/ utilizan el prefijo (salvo excepciones históricas como GCP/GCEP). Para la publicación OSS bajo git.gitcover.org/GCC-OSS/<repo>, GitCover.* señala la procedencia. |
| Ausencia de colisiones en NuGet | Un simple Discovery.* colisiona fácilmente con paquetes de terceros; GitCover.Discovery es globalmente único. |
| Visibilidad de la licencia | El modelo IPLicensing (Open-Core, taxonomía Field-of-Use) utiliza el namespace como marcador de procedencia y de pertenencia a la licencia. |
| Coherencia del ecosistema de Solutions | Los bundles transversales a las Solutions (GCEP-Federation, MCP-Hub) referencian actualmente GitCover.Core, GitCover.V7Guid - un namespace acortado rompe esta cadena. |
Consecuencia para la colaboración dinámica
El namespace de C# no es un medio de identidad para:
- Registro de herramientas MCP: Un servidor MCP que registra una herramienta de
GitCover.Discovery.Apiy otra deGitCover.Accountant.Apino entra en conflicto - los nombres de las herramientas son independientes y los tipos V7GUID son únicos en el registro central. - GCEP-Federation: Referencia mediante V7GUID (Class Identifier + Object ID), no mediante namespaces de C#.
- Interacción de agentes de IA: Los agentes de IA trabajan con nombres de herramientas y con artefactos referenciados mediante V7GUID, no con namespaces de C#.
- Redefinición a nivel de tenant/repositorio: El Sentinel
255(Custom/TenantDefined) apunta de forma determinista a una definición propia del tenant en el diccionario - independientemente de si el namespace de C# esGitCover.Discovery.*oDiscovery.*.
Conclusión
El prefijo de namespace de C# GitCover. se mantiene como convención de denominación - no como medio de identidad. La identidad y la unicidad de tipos se rigen por el modelo V7GUID (Tenant-ID en los bits 0–47, repository_id en los bits 52–63, registro de kind en los bits 114–121). El prefijo es neutral para la colaboración dinámica entre desarrolladores, agentes de IA y servicios MCP - no transporta ninguna información de identidad que no esté ya codificada de forma determinista en la V7GUID.
Fuentes
- Especificación V7GUID:
specs/v7guid/00_gesamtkarte.md(mapa de 128 bits) - Especificación V7GUID:
specs/v7guid/33_kind.md(campokind, registro central) - Especificación V7GUID:
specs/v7guid/12_repository_id.md(ámbito de repositorio) - Especificación V7GUID:
specs/v7guid/90_dual_identifier.md(identificador dual) - ADR-002:
specs/v7guid/ADR-002_layout_v2_kind.md(consolidación dekind) - Raíz normativa OSS:
git.gitcover.org/OSS/TOP/.gitcover/dictionaries/kinds.json - Modelo IPLicensing:
REPOS/AFJD/IPLicensing/03_OSS_MODEL.md - ADR en el repositorio de la Solution:
Development/Solutions/GitCover.Discovery/plans/ADR-001_namespace_prefix_gitcover.md