Prefijo de namespace y modelo de identidad V7GUID
Decisión de arquitectura del 2026-07-26. Documentado en
GitCover.Discovery/plans/ADR-001_namespace_prefix_gitcover.md.
Pregunta inicial
¿Se debe mantener el largo prefijo de namespace de C# GitCover.Discovery para una futura publicación OSS, o trabajar con un prefijo acortado sin prefijo (Discovery.*)?
Contexto: 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, ya que 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 exista unicidad entre repositorios, independientemente de las versiones de DLL o de las instancias de proceso.
El modelo de identidad V7GUID
El concepto V7GUID establece la identidad y la tipificación completamente a nivel de bits:
Identidad de tenant (bits 0–47)
La identidad de tenant se deriva de la marca de tiempo de 48 bits de la UUIDv7 de fundación. 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)
Dirige un repositorio dentro de un contexto de tenant. Por tenant existe exactamente un repositorio TOP (id=1) y hasta 4.095 adicionales. La unicidad está garantizada 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 reemplaza los enums específicos de cada solución (RepoKind, ArtifactKind en GitCover.Discovery; Prozesstyp en GCP.Portfolio; Type en GCPN). El archivo central kinds.json se mantiene 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) y el Object ID (qué objeto concreto, uuidv7 puro). 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 está garantizada por el registro de diccionario (
kinds.json), no por el namespace de C#. - La redefinición de tipos a nivel de tenant o de repositorio (sentinela
255= Custom/TenantDefined) se realiza en el diccionario, no en el namespace de C#. El prefijo de namespace no puede invalidar esta redefinición.
Razones para mantenerlo
| Argumento | Justificación |
|---|---|
| Consistencia de marca | Las 18 soluciones 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 el origen. |
| Libertad 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 origen y pertenencia de licencia. |
| Consistencia del ecosistema de soluciones | Los bundles transversales entre soluciones (GCEP-Federation, MCP-Hub) hacen referencia actualmente a GitCover.Core, GitCover.V7Guid; un namespace acortado rompería 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 registre una herramienta de
GitCover.Discovery.Apiy otra deGitCover.Accountant.Apino entra en conflicto: los nombres de herramientas son separados y los tipos V7GUID son únicos en el registro central. - Federación GCEP: Referencia mediante V7GUID (Class Identifier + Object ID), no mediante namespaces de C#.
- Interacción con agentes de IA: Los agentes de IA trabajan con nombres de herramientas y artefactos referenciados por V7GUID, no con namespaces de C#.
- Redefinición a nivel de tenant/repositorio: La sentinela
255(Custom/TenantDefined) hace referencia de forma determinista a una definición propia del tenant en el diccionario, independientemente de que el namespace de C# seaGitCover.Discovery.*oDiscovery.*.
Conclusión
El prefijo de namespace de C# GitCover. se mantiene como convención de nomenclatura, no como medio de identidad. La identidad y la unicidad de tipos están garantizadas por el modelo V7GUID (Tenant-ID en bits 0–47, repository_id en bits 52–63, registro kind en bits 114–121). El prefijo es neutral para la colaboración dinámica entre desarrolladores, agentes de IA y servicios MCP: no transporta 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(alcance 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 solución:
Development/Solutions/GitCover.Discovery/plans/ADR-001_namespace_prefix_gitcover.md