ED03 - Formato del diario: artefactos JSON, firma temporal, V7GUID, sidecars

Problema

Un empresario quiere llevar su diario en Git, pero ¿cómo se ve exactamente una entrada a nivel técnico? La práctica actual no conoce una respuesta vinculante:

Afirmación central

Una entrada de diario de GitCover es un artefacto JSON con:

  1. JSON-Schema-First: el esquema existe antes de la entrada; la entrada se valida contra el esquema (hook pre-commit)
  2. V7GUID (Class Identifier): clasifica el documento/la acción según el registro .gitcover (qué/qué tipo); sirve para la organización de almacenamiento y la consulta a BD (p. ej. EF Core en Vertical App)
  3. uuidV7 (Object ID): ya es por sí solo la identidad inequívoca (DocID) de la entrada, RFC 9562 §5.7, generado a partir de una marca temporal predefinida (o now()) mediante GitCover Helper (gc-v7guid), resto rellenado con aleatoriedad
  4. Clave compuesta V7GUID:uuidV7: la clave compuesta del sidecar GCPN, sirve para la organización de almacenamiento y consulta; el momento de registro está en el uuidV7 (timestamp de 48 bits), sin campo datetime/date separado
  5. Obligatoriedad de sidecar: cada comprobante recibe un sidecar .gc.md con su propio uuidV7 (acto de clasificación) y el uuidV7 del documento
  6. Trazabilidad retrospectiva/progresiva: desde el asiento contable → comprobante → entrada de diario → uuidV7 y de vuelta resoluble

Compliance by Design: El formato no es posterior, es estructural. Esquema, V7GUID (Class), uuidV7 (Object) y sidecar son campos obligatorios; sin ellos una entrada no se admite en el repo.

Sin datetime/date redundante: El momento de registro está anclado en el propio uuidV7 (timestamp de 48 bits, RFC 9562 §5.7). Una representación separada como string en esquemas JSON o datos JSON es redundante y no se incluye en los hechos. La representación como string para transferencia DTO/HTMX es responsabilidad del harness, no del nivel de hechos.

La entrada de diario como nodo de compliance

La entrada técnica no es un fin en sí mismo. Es el nodo temporal en el que convergen varias cadenas de evidencia:

flowchart LR D["Diary: Agenda + Leistungszeit"] --> F["FZul/BSFZ"] D --> E["EStG/EÜR: Veranlassung"] D --> U["USt: Leistungszeitraum"] D --> G["GoBD/AO: Belegkette"] D --> C["Vertrag/Abrechnung"] D --> R["Risiko- und Fristenkontrolle"] D --> P["Git-Repos: portabler Proof"]

La SSoT del diario dice según qué agenda se trabajó. Los documentos originales, sidecars, GCPN y artefactos de Grundbuch/liquidación aportan los comprobantes correspondientes. Esta separación evita dos errores: una entrada de diario no se malinterpreta como sustituto de un comprobante externo, y un comprobante reunido posteriormente no se presenta falsamente como prueba de trabajo oportuna.

El esquema JSON (Schema-First)

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart LR S["JSON-Schema
(vor Eintrag)"] S --> V["Schema-Validierung
(Pre-Commit-Hook)"] E["Tagebucheintrag
(JSON)"] E --> V V -->|gültig| C["Commit akzeptiert
+ uuidV7 generiert"] V -->|ungültig| R["Commit abgelehnt
Schema-Verstoß"] style S fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style V fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style E fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style C fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style R fill:#FDBA74,stroke:#C2410C,color:#0F1B33

El esquema existe antes de la entrada; se guarda en .gitcover/schemas/diary-entry-1.0.schema.json y está versionado. Una entrada sin referencia de esquema ($schema) es rechazada por el hook pre-commit.

Esquema diary-entry-1.0.schema.json (simplificado)

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://gitcover.org/schemas/diary-entry-1.0.schema.json",
  "title": "GitCover Diary Entry v1.0",
  "type": "object",
  "required": [
    "$schema", "V7GUID", "docUid",
    "author", "role", "tenant", "sphere", "source"
  ],
  "properties": {
    "$schema": {
      "type": "string",
      "format": "uri",
      "const": "https://gitcover.org/schemas/diary-entry-1.0.schema.json"
    },
    "V7GUID": {
      "type": "string",
      "description": "Class Identifier - klassifiziert das Dokument/die Action aus .gitcover Registry (was/welcher Typ)"
    },
    "docUid": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
      "description": "Object ID - RFC 9562 §5.7 UUIDv7, generiert aus vorgegebener Zeitmarke (nicht now()), 48-Bit-Zeitstempel in der GUID verankert"
    },
    "author": { "type": "string", "description": "Akteur-Platzhalter, z. B. E1" },
    "role": {
      "type": "string",
      "enum": ["GF", "Buchhalter", "Lohnverantwortlicher", "F&E-Leiter", "Administrator"]
    },
    "tenant": { "type": "string", "description": "Tenant-Platzhalter, z. B. ORG-1" },
    "sphere": {
      "type": "string",
      "enum": ["ideell", "vermögensverwaltend", "zweckbetrieblich", "wirtschaftlich", "n/a"]
    },
    "source": {
      "type": "string",
      "enum": ["E1", "StB", "Notar", "Bank", "DRV", "FA", "BA", "VBG", "KK", "auto"]
    },
    "source_sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$",
      "description": "SHA-256 des referenzierten Belegs (eindeutige Beleg-ID)"
    },
    "tags": { "type": "array", "items": { "type": "string" } }
  }
}

Importante: sin campo datetime/date: El momento de registro está en el uuidV7 (timestamp de 48 bits, RFC 9562 §5.7). Una representación separada como string es redundante y no se incluye en los hechos. El uuidV7 por sí solo es el DocID inequívoco; la clave compuesta V7GUID:uuidV7 sirve para la organización de almacenamiento y la consulta a BD.

V7GUID: estructura y timestamp de 48 bits

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart LR subgraph V7["V7GUID (128 Bit, RFC 9562 §5.7)"] direction LR T["timestamp_ms
Bits 0–47
48 Bit Unix-ms"] V["version
Bits 48–51
0111 (UUIDv7)"] R["rand_a
Bits 52–63
12 Bit"] VA["variant
Bits 64–65
10"] RB["rand_b
Bits 66–127
62 Bit"] end T --> DT["48-Bit-Zeitstempel
in uuidV7 verankert
(kein separates datetime-Feld)"] V7 --> ID["uuidV7-Feld
Object ID
(vorgegebene Zeitmarke)"] style T fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style V fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style R fill:#E5E7EB,stroke:#6B7280,color:#0F1B33 style VA fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style RB fill:#E5E7EB,stroke:#6B7280,color:#0F1B33 style DT fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style ID fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7
Rango de bits Ancho Contenido Fijado por RFC
0–47 48 bits Milisegundos Unix desde epoch (1970-01-01T00:00:00Z) Sí (RFC 9562 §5.7)
48–51 4 bits Versión = 0111 (UUIDv7) Sí
52–63 12 bits rand_a (aleatorio) No
64–65 2 bits Variante = 10 Sí
66–127 62 bits rand_b (aleatorio) No

Principio central: El componente de timestamp de 48 bits (bits 0–47) es autoritativo para el momento de registro. Está anclado en el propio uuidV7 y no puede modificarse posteriormente sin invalidar el GUID. No existe un campo datetime separado; el tiempo está en el uuidV7. La representación como string para DTO/HTMX es responsabilidad del harness.

Extensión GitCover: jerarquía e IDs de proceso en los bits 66–127

La especificación GitCover-V7GUID (work/OSS/TOP/.gitcover/specs/v7guid/) amplía el componente aleatorio de 62 bits (bits 66–127) con una jerarquía de 6 niveles e IDs de proceso; esa es la extensión protegida por patente (DPMA Az. 10 2025 003 091.6):

Rango de bits Ancho Contenido
66–89 6×4 bits Jerarquía de 6 niveles (L1–L6, 4 bits cada uno)
90–97 8 bits ProcessTypeId (tipo de proceso)
98–105 8 bits GatewayId (punto de control)
106–113 8 bits Status (máscara de bits del ciclo de vida)
114–121 8 bits Kind (tipo de actividad)
122–127 6 bits VariantId (clase de variante)

Nota: Esta extensión no es estrictamente necesaria para la serie del diario; se vuelve relevante en ED02 (tenant/esfera/rol) y en artículos posteriores (harness). Aquí basta la base RFC 9562 con timestamp de 48 bits.

Rutinas helper: crear V7GUID a partir de claves externas

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart LR F["Fremd-Key
(Zeitmarke in Daten
oder Dateiname)"] F --> H["Helper-Routine
gc-v7guid"] H --> TS["48-Bit-Zeitstempel
extrahiert/konvertiert"] TS --> G["uuidV7 generiert
(Guid.CreateVersion7)"] G --> A["JSON-Artefakt
V7GUID + uuidV7"] A --> D["GoBD-Dokumentation
zeitnahe Erfassung
nachvollziehbar"] style F fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style H fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style TS fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style G fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style A fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style D fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33

La herramienta OSS de GitCover gc-v7guid (work/OSS/gc-v7guid) proporciona las operaciones:

gen — generar object IDs UUIDv7

# n Objekt-IDs mit vorgegebener Zeitmarke (nicht now()) und Zufalls-Tail (RFC 9562)
gc-v7guid gen 1 --ts 2026-08-15T09:00:00Z
# Ausgabe: 01a17e18-c662-7874-9e1c-85d47895304f

gen-doc — determinista a partir de metadatos del documento

# Dokumentgebundene ID aus Zeitmarke + SHA-256 des Ur-Dokuments
gc-v7guid gen-doc --ts 2026-08-15T09:00:00Z --doc-sha256 <64-hex>

decode — extraer timestamp y estructura de uuidV7

gc-v7guid decode 019f2c6f-0900-7000-8000-000000000000
# Ausgabe: unix_ms, utc (ISO-8601), version=7, variant=2, rfc9562

Clave externa → uuidV7

Las rutinas helper permiten crear una clave uuidV7 válida a partir de una clave externa (p. ej., una marca temporal en el nombre de archivo como 260815_0900_Lohnabrechnung.pdf), con marca temporal predefinida, no now():

  1. Parsear la clave externa — 260815_0900 → 2026-08-15T09:00:00Z
  2. Calcular el timestamp de 48 bits — milisegundos Unix desde epoch
  3. Generar uuidV7 — Guid.CreateVersion7() con timestamp explícito, resto con aleatoriedad
  4. Clave compuesta — V7GUID (Class del registro) : uuidV7 (Object con marca temporal)
  5. Documentación GoBD — registro oportuno anclado de forma trazable (sin campo datetime separado)

Relación con GoBD: El registro oportuno (GoBD Rz. 146) queda documentado criptográficamente mediante el timestamp de 48 bits en el uuidV7, no solo afirmado. El timestamp forma parte de la identidad y no puede modificarse posteriormente.

Estructura del sidecar (.gc.md)

Cada comprobante recibe un sidecar con dos referencias uuidV7:

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart TD D["Dokument
(PDF, XML, EML)"] D --> S["Sidecar .gc.md"] S --> U1["uuidV7 (eigen)
Identität des Sidecars
+ 48-Bit-Erfassungszeit"] S --> U2["uuidV7 (fremd)
Identität des Dokuments
in v7g_taxonomy"] S --> SH["sha256
Eindeutige Beleg-ID"] S --> T["v7g_taxonomy
Klassifizierung
(Tenant, Sphäre, Kategorie)"] S --> O["obsolescence
status: active/superseded/obsolete"] style D fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style S fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style U1 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style U2 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style SH fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style T fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style O fill:#E5E7EB,stroke:#6B7280,color:#0F1B33

Ejemplo de sidecar

{
  "$schema": "https://gitcover.org/schemas/v7g-sidecar-2.0.schema.json",
  "V7GUID": "<V7GUID-Class-aus-Registry>",
  "docUid": "019f2c6f-0900-7001-8000-000000000001",
  "sha256": "ab94670c0dd8499c27ef2feddd1d9c5925977d55a52150a6fca0f6567d2e5e79",
  "title": "260815_Lohnabrechnung.pdf",
  "original_filename": "260815_Lohnabrechnung.pdf",
  "locations": [
    {
      "unc_path": "./ORG-1/sources/lohn/260815_Lohnabrechnung.pdf",
      "from": "260815",
      "to": null,
      "note": "Primärspeicherort"
    }
  ],
  "v7g_taxonomy": [
    {
      "v7guid": "019f2c6f-0900-7000-8000-000000000000",
      "taxonomy": "ORG-1/Lohn",
      "valid_from": "260815",
      "valid_to": null,
      "note": "Tenant: ORG-1, Category: Lohn, Sphäre: ideell"
    }
  ],
  "gcpn": {
    "prima_nota_ref": null,
    "journal_entry_ref": null
  },
  "obsolescence": {
    "status": "active",
    "superseded_by": null,
    "superseded_at": null
  }
}

Clave compuesta V7GUID:uuidV7:

  • V7GUID (campo 1): Class Identifier del sidecar (clasificación del registro .gitcover: qué/qué tipo)
  • uuidV7 (campo 2): Object ID del propio sidecar, generado con marca temporal predefinida (¿cuándo se clasificó?), timestamp de 48 bits anclado en el GUID
  • v7g_taxonomy[].v7guid: Object ID del documento clasificado (¿qué documento se clasifica?)
  • sha256: identidad del documento original clasificado — la prueba de originalidad, siempre y en todas partes (aunque el documento se mueva: independiente de ruta/nombre, calculada a partir del contenido)

Así no solo queda identificado inequívocamente el documento (mediante su SHA-256), sino también el acto de clasificación mismo, incluido el momento (en uuidV7), quién clasificó y en qué rol. Sin campo datetime separado; el tiempo está en los valores uuidV7.

Trazabilidad retrospectiva y progresiva

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart LR subgraph RET["Retrograd (vom Buchungssatz rückwärts)"] direction LR B["Buchungssatz
(SKR04)"] B --> BE["Beleg
(SHA-256)"] BE --> DE["Tagebucheintrag
(uuidV7)"] DE --> V7["uuidV7
(48-Bit-Zeitstempel)"] end subgraph PRO["Progressiv (vom Beleg vorwärts)"] direction LR BE2["Beleg
(SHA-256)"] BE2 --> BS["Buchungssatz
(SKR04)"] BS --> GB["Grundbuch
(JSON)"] GB --> EB["Eröffnungsbilanz"] end style B fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style BE fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style DE fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style V7 fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style BE2 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style BS fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style GB fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style EB fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33
Dirección Inicio Resolución vía Objetivo
Retrospectiva Asiento contable (SKR04) source_sha256 → comprobante → uuidV7 Entrada de diario con timestamp de 48 bits
Progresiva Comprobante (SHA-256) uuidV7 → entrada de diario → source_sha256 Asiento contable → Grundbuch → balance de apertura

Relación con GoBD: La trazabilidad retrospectiva corresponde a GoBD Rz. 146 (trazabilidad). La trazabilidad progresiva corresponde a GoBD Rz. 147 (verificabilidad). Ambas están garantizadas by Design mediante uuidV7 + SHA-256, no mediante referencias cruzadas manuales.

Registro de tiempo en el diario

Cada entrada de diario contiene una tabla de registro de tiempo:

Inicio Fin Horas Actividad Tenant Esfera Propósito Fuente
0900 1200 3,00 Datos maestros de cuenta de nómina ORG-1 ideell — E1
1200 1400 2,00 I+D: especificación V7GUID ORG-1 ideell FZul1 E1

Regla de columna: La columna Propósito contiene exclusivamente el proyecto de I+D (FZul1, FZul2, …). El trabajo no de I+D figura como Administración (esfera/categoría) con propósito —. Cada hora FZul pertenece exactamente a un proyecto (§ 7 FZulG).

Relación con FZul: El registro de tiempo es la base para los justificantes de horas FZul (ED29). La separación I+D vs. Administración se realiza mediante la columna Propósito por cada línea de tiempo, no solo mediante el campo role de la entrada. El role describe la función de quien actúa (véase abajo), no la asignación de subvención.

El registro es completo; el límite se aplica solo en la liquidación

El diario registra el tiempo de trabajo realmente realizado de forma completa y sin límite superior, incluso cuando supera un límite semanal conforme a la normativa de subvenciones (p. ej., 40 horas por semana y persona). Tal límite es un factor de cálculo en la suma semanal y en la determinación de la subvención, no un límite de la línea de tiempo individual: ninguna línea se recorta, reduce ni reasigna solo porque se hubiera alcanzado un límite. El registro completo es requisito para la plausibilidad del diario y la solidez de la cadena de evidencia. Las reagrupaciones entre proyecto y administración son cuestiones de liquidación/proyección, no correcciones al comprobante.

El transcurso del día: primero el comprobante, después el asiento

Un día de diario tiene un flujo fijo. Registro (comprobante) y liquidación/asiento están estrictamente separados:

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart LR A["Tagesbeginn
Pflichtjobs (z. B. Verbrauchsdaten
des Vortags abholen)"] A --> B["Während des Tages
Einträge inkrementell
fortschreiben"] B --> C["Tagesabschluss
Dauer ermitteln,
Zeilen zuordnen"] C --> D["Wochenanfang
Vorwoche absummieren"] D --> E["Ledger/Projektion
erst nach vollständiger
Klärung"] style A fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style B fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style C fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style D fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style E fill:#FDBA74,stroke:#C2410C,color:#0F1B33
Paso Contenido Efecto
Durante el día Las actividades se registran incrementalmente como líneas de tiempo, en la medida en que se indiquen, asignen o puedan asignarse por contexto Comprobante/libro de registro, sin asiento
Cierre del día Determinar la duración del trabajo (primero la indicación del empresario; el ancla del sistema solo como indicio); asignar los valores diarios por entrada a las esferas o proyectos, como se indique o según lo plausible, marcado como estimación; después cerrar el SHA del sidecar y el índice El día queda cerrado (inmutable)
Inicio del día Tareas obligatorias, p. ej., recoger los datos de consumo del día anterior Base de valores para distribuciones posteriores (p. ej., cuota de uso de electricidad); ninguna cuota el mismo día
Inicio de semana Sumar la semana anterior (split proyecto/esfera; el límite semanal solo como factor de cálculo) Comprobación semanal, proyección
Ledger/proyección Actualización del ledger de proyectos y de la ponderación Solo después de la aclaración completa del diario, no a partir de una entrada individual

Delimitación: La indicación FZul/esfera en el diario es un campo del comprobante. Es independiente de cualquier reserva de certificación y no genera ningún asiento. El diario es la evidencia; se contabiliza en el ledger y se pondera en las proyecciones. El mismo principio se aplica a los comprobantes: un comprobante prueba; el asiento llega después y por separado.

Roles en el diario: persona, función, parte, ejecución

El campo role no es la persona. Para una comprensión robusta de los roles, GitCover distingue cinco niveles que permanecen separados incluso cuando la misma persona hace todo de una vez (típico en pymes):

Nivel Pregunta Ejemplo
Persona ¿Quién es la persona física? E1
Función / rol de representación ¿En qué calidad actúa? Director gerente, responsable de I+D
Parte representada ¿Para quién se emite la declaración («actuando por»)? ORG-1 o PARTNER-ORG
Identidad de ejecución ¿Bajo qué cuenta, principal o clave corre el proceso técnico? Cuenta de usuario, principal de servicio, clave de firma
Declaración / acto de firma ¿Qué contenido documental se acepta o firma en qué rol? Accept, Sign (DS03)

Una persona puede tener varias funciones y varios actos de firma en el mismo documento, por ejemplo como director gerente de dos sociedades. De ello no surgen varias personas ni necesariamente varias cuentas o claves. Sin embargo, los roles no deben coincidir solo porque la persona o las credenciales sean idénticas: cada acto de firma vincula versión del documento + persona + función + parte representada + consentimiento cubierto expresamente. Una consulta conjunta a la persona puede cubrir varias firmas de función, si las funciones cubiertas se nombran expresamente; no sustituye una aprobación referida al documento. Detalles: DS03 - Procedimiento de firma y DS13 - Estratificación de participantes.

Límite honesto: Esta separación se describe como requisito y modelo de datos. Una vinculación técnicamente forzada de forma integral entre persona, función, parte y consentimiento (especialmente los claims de rol desde el identity provider hasta los eventos de firma) es objeto de desarrollo en curso y aún no está implementada en todas partes.

Trabajo con agentes en el diario

Si el empresario utiliza agentes de IA, se aplica lo siguiente: el control, la instrucción, la supervisión y la validación de los agentes son uso de medios de trabajo por parte de la persona que actúa; el tiempo registrado es el tiempo de la persona. El diario no lleva una categoría propia de «tiempo de agentes» ni exige confirmaciones de «solapamiento» cuando las actividades se ejecutan en paralelo. En su lugar:

La elegibilidad para financiación no resulta del uso de agentes, sino de la cuestión de si la actividad afecta a una pregunta técnica de investigación abierta (delimitación en el proyecto respectivo).

Qué termina en el repo Git y qué no

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart TD IN["Ins Git-Repo"] IN --> J["JSON-Artefakte
(Tagebucheinträge, Grundbuch)"] IN --> S["Sidecars .gc.md"] IN --> B["Belege
(PDF, XML, EML)"] IN --> SC["Schemata"] IN --> D["Dictionaries"] OUT["Nicht im Git-Repo"] OUT --> P["Private Dokumente
(sofern nicht ausdrücklich eingeführt)"] OUT --> T["Temporäre Dateien"] OUT --> C["Credentials/Secrets"] style IN fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style J fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style S fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style B fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style SC fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style D fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style OUT fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style P fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style T fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style C fill:#FDBA74,stroke:#C2410C,color:#0F1B33

Importante: Solo se incorporan al repo Git artefactos estructurados (JSON, sidecars, comprobantes, esquemas, diccionarios). Los documentos privados nunca se incorporan al repo, salvo que se hayan introducido y clasificado expresamente como artefacto. Es un requisito de protección de datos y compliance (RGPD, GoBD).

Leverage de riesgo

Hoy (barato) Mañana (a prueba de revisión) Riesgo mitigado
Artefacto JSON con V7GUID (Class) + uuidV7 (Object) Momento de registro anclado criptográficamente en uuidV7 Negación del momento de registro
Validación de esquema (pre-commit) Solo entradas válidas en el repo Infracción de esquema, campos obligatorios incompletos
Sidecar con clave compuesta V7GUID:uuidV7 Acto de clasificación trazable Negación de la clasificación
source_sha256 por entrada Trazabilidad retrospectiva Negación de la asignación de comprobante
Helper gc-v7guid para claves externas Registro oportuno documentado (marca temporal en uuidV7) Infracción GoBD «no oportuno»

Requisito del harness (avance)

Derivable de ED03:

ID Requisito Prioridad
FA-1.1 Entradas de diario como artefactos JSON (Schema-First) MUST
FA-1.2 Clave compuesta V7GUID (Class) : uuidV7 (Object) — sin campo datetime/date separado; tiempo en uuidV7 (RFC 9562 §5.7) MUST
FA-1.3 uuidV7 generado a partir de marca temporal predefinida (no now()) mediante helper MUST
FA-2.1 SHA-256 como ID de comprobante MUST
FA-2.2 Obligatoriedad de sidecar .gc.md MUST
FA-2.3 Sidecar con clave compuesta V7GUID:uuidV7 (Class + Object) MUST
FA-2.12 Trazabilidad retrospectiva (asiento → comprobante → uuidV7) MUST
FA-2.13 Trazabilidad progresiva (comprobante → asiento → Grundbuch) MUST
TA-1.5 Rutinas helper para crear V7GUID a partir de claves externas (gc-v7guid) MUST
TA-1.6 Requisitos temporales GoBD documentados (timestamp de 48 bits en uuidV7) MUST
TA-2.1 Pre-commit: validación de esquema JSON MUST

La lista completa de requisitos está en Harness-Anforderungen.md.

Fuentes

Topología de fuentes y enlaces de referencia CDN

Rol Lugar Propósito
Primary / SSoT git.gitcover.org/GCC Almacenamiento canónico (firmado con GPG, versionado)
Public OSS Mirror / CDN codeberg.org/gitcover-commons Espejo de solo lectura; descubrimiento FLOSS
Community Hub github.com/gitcover-commons Issues y Discussions; referencia de código fuente en Codeberg

Nota: Esta asignación de fuentes, mirror y community hub refleja el estado actual y puede cambiar. Consulte la fuente canónica correspondiente en gitcover.org para conocer el estado actual.