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:
- Notas de texto libre en Markdown, Word o papel: no legibles por máquina, no validadas contra esquema, no trazables
- Filas de Excel con fecha, actividad, horas: no versionadas, no ancladas criptográficamente, no a prueba de revisión
- Exportaciones de software de nómina como PDF: no evaluables automáticamente (§ 147 Abs. 6 AO), no rastreables de forma retrospectiva/progresiva
- Ninguna identidad inequívoca: cada entrada tiene un nombre de archivo, pero el nombre de archivo puede cambiar; la identidad de la entrada no es estable
- Ningún anclaje temporal: la fecha está como string en el documento, pero ¿quién registró realmente y cuándo? El momento de registro no está vinculado criptográficamente con la identidad
Afirmación central
Una entrada de diario de GitCover es un artefacto JSON con:
- JSON-Schema-First: el esquema existe antes de la entrada; la entrada se valida contra el esquema (hook pre-commit)
- 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) - 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 - 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 eluuidV7(timestamp de 48 bits), sin campodatetime/dateseparado - Obligatoriedad de sidecar: cada comprobante recibe un sidecar
.gc.mdcon su propiouuidV7(acto de clasificación) y eluuidV7del documento - Trazabilidad retrospectiva/progresiva: desde el asiento contable → comprobante → entrada de diario →
uuidV7y 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/dateredundante: El momento de registro está anclado en el propiouuidV7(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:
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)
(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 eluuidV7(timestamp de 48 bits, RFC 9562 §5.7). Una representación separada como string es redundante y no se incluye en los hechos. EluuidV7por sí solo es el DocID inequívoco; la clave compuestaV7GUID:uuidV7sirve para la organización de almacenamiento y la consulta a BD.
V7GUID: estructura y timestamp de 48 bits
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
uuidV7y no puede modificarse posteriormente sin invalidar el GUID. No existe un campodatetimeseparado; el tiempo está en eluuidV7. 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
(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():
- Parsear la clave externa —
260815_0900→2026-08-15T09:00:00Z - Calcular el timestamp de 48 bits — milisegundos Unix desde epoch
- Generar
uuidV7—Guid.CreateVersion7()con timestamp explícito, resto con aleatoriedad - Clave compuesta —
V7GUID(Class del registro) :uuidV7(Object con marca temporal) - 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:
(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 GUIDv7g_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 campodatetimeseparado; el tiempo está en los valoresuuidV7.
Trazabilidad retrospectiva y progresiva
(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
rolede la entrada. Elroledescribe 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:
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:
- por cada actividad/proyecto, líneas propias;
- en actividades fuera de la financiación de I+D (especialmente desarrollo de herramientas y agentes), además: qué actor o agente actuó con qué identidad de ejecución efectiva, sin revelar secretos (tokens, claves).
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
(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
- RFC 9562 §5.7 (UUIDv7): timestamp Unix ms de 48 bits
- Especificación V7GUID:
work/OSS/TOP/.gitcover/specs/v7guid/(normativa) - DPMA Az. 10 2025 003 091.6: patente V7GUID (reivindicación principal 2, reivindicaciones 5–8)
- Herramienta OSS GitCover
gc-v7guid:work/OSS/gc-v7guid(helpergen/decode) - GoBD (escrito del BMF, Rz. 146 - trazabilidad, Rz. 147 - verificabilidad)
- AO (§ 147 Abs. 2 - "maschinell auswertbar", § 147 Abs. 6 - Datenzugriff)
E1/agents/(anonimizado): concepto SSoT con artefactos JSON, sidecars
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.