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:

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:

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