DS03 — El proceso de firma (Accept/Deny/Sign)
Desencadenante S2
Una vez definido el documento de firma (DS02), el auditor plantea la pregunta correcta: ¿Qué se ha decidido entonces? Un documento de firma solo dice: "E1 firma el Doc X." El proceso — aceptación (Accept), rechazo (Deny), firma (Sign), retirada (Withdraw) — es un evento propio con su propia cronología.
Máquina de estados del proceso de firma
Un proceso recorre una máquina de estados determinista:
Cada cambio de estado es un artefacto de evento en el repo — un
documento JSON conforme al esquema signature-event-1.0:
{
"$schema": "https://gitcover.org/schemas/signature-event-1.0.schema.json",
"uuidV7": "<deterministische uuidV7>",
"type": "signature-event",
"event": "sign",
"actor": {
"name": "Erich Mustermann",
"role": "Geschäftsführer",
"capacity": "handelnd für PARTNER-ORG"
},
"on": {
"signature_doc_sha256": "<SHA-256 des Signatur-Docs (DS02)>",
"target_doc_sha256": "<SHA-256 des Quell-Dokuments>"
},
"prev_event_sha256": "<SHA-256 des vorherigen Events, null beim ersten>",
"statement": "Ich zeichne das Dokument in der angegebenen Funktion und bestätige den in der Textform übermittelten Wortlaut.",
"evidence": {
"facsimile_ref": {
"file": "E1.Signature.transparent.FES.svg",
"sha256": "8fcffe0b313f8a1e5b44c1c33cd8073e699b338b6450aa1ba9f33f5587501006",
"guid_stamp": "01a09b48-4580-76f9-b789-024691b989c5"
},
"timestamp_utc": "2026-09-13T15:20:00Z"
}
}
El encadenamiento: prev_event_sha256
Cada evento remite a su evento predecesor — el historial de firmas
forma una cadena SHA-256 (principio prev_sha256 del
GCPN, aquí a
nivel de evento):
offered (event 1) ──► accepted (event 2) ──► signed (event 3)
│ │ │
sha256 sha256 sha256
└── prev=null ─────────┴── prev=sha(ev1) ───┴── prev=sha(ev2)
Un auditor puede verificar todo el historial con tres comandos:
sha256sum ev1.json # stimmt mit prev in ev2?
jq -r '.event' ev*.json | sort # Zustandsfolge korrekt?
jq -r '.actor.name' ev*.json | sort -u # Zeichner konsistent?
Los tipos de evento
| Evento | Significado | Valor probatorio |
|---|---|---|
offered |
Firma solicitada (documento presentado para su firma) | Punto de inicio del plazo, equidad del procedimiento |
accepted |
El destinatario ha tomado conocimiento (acceso en forma textual confirmado) | § 126b (1): acceso demostrado |
denied |
El destinatario rechaza (con justificación) | Documenta el rechazo — importante en caso de versiones contradictorias |
sign |
El firmante firma (referencia a Facsimile/clave) | § 371a ZPO: adición del nombre + indicación de la forma |
withdraw |
El firmante se retracta (antes de la preclusión) | Retirada a prueba de auditoría en lugar de borrado silencioso |
Sin principio de borrado silencioso: un evento nunca se borra ni se sobrescribe. Una retirada es un evento
withdraw— el historial permanece completo (principio del GoBD: trazabilidad).
Multifirma: dos firmantes, un documento fuente
En una GVB con dos líneas de firma, cada firmante genera su propia cadena de eventos sobre el mismo documento fuente:
Quell-Dokument (sha256 T)
├── E1: offered → accepted → signed (Kette A)
└── PARTNER-1: offered → accepted → signed (Kette B)
La verificación (DS04) comprueba ambas cadenas de forma independiente — y el contenedor GCPN (DS05) agrupa ambas bajo una Container-ID.
Determinismo
Cada evento es describible de forma determinista: uuidV7 a partir de la
marca de tiempo + SHA-256 del evento, máquina de estados sin transiciones
indeterminadas, ningún texto libre salvo la declaración statement. Esa es
la calidad de saga: el proceso puede ser reconstruido por cualquier auditor
repetidamente y sin conocimiento del contexto.
Resumen
- El proceso de firma es una máquina de estados (drafted → offered → accepted/denied → signed → withdrawn).
- Cada cambio de estado es un evento JSON (esquema
signature-event-1.0) con cadena SHA-256 (prev_event_sha256). - Los eventos nunca se borran — la retirada es un evento, no un borrado.
- Siguiente artículo (DS04): la rutina de verificación del auditor.
Creado: 260913 | Parte I, artículo DS03 | Serie: digital-signage