DS03 — El proceso de firma (Accept/Deny/Sign)
Disparador S2
Después de que se ha definido el documento de firma (DS02), el verificador plantea la pregunta correcta: ¿Qué se decidió 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 según el esquema signature-event-1.0:
{
"$schema": "https://gitcover.org/schemas/signature-event-1.0.schema.json",
"docUid": "<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",
"docUid": "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 firma
forma una cadena SHA-256 (GCPN-principio prev_sha256, 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 verificador 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 firma) | Punto de inicio del plazo, equidad del procedimiento |
accepted |
El destinatario ha tomado conocimiento (acceso en forma de texto confirmado) | § 126b (1): acceso acreditado |
denied |
El destinatario rechaza (con justificación) | Documenta el rechazo — importante en versiones contradictorias |
sign |
El firmante firma (referencia a Facsimile/clave) | § 371a ZPO: adición del nombre + indicación de forma |
withdraw |
El firmante retira (antes de la caducidad) | Retirada a prueba de revisión en lugar de borrado silencioso |
Principio de no borrado silencioso: Un evento nunca se borra ni se sobrescribe. Una retirada es un evento
withdraw— el historial permanece completo (GoBD-principio: trazabilidad).
Plantilla (offered/presented): preparar documentos originales + texto de commit
Al presentar para firma, los documentos originales correspondientes se preparan (stage) en el repositorio Git (git add) —
así queda delimitado de forma inequívoca en el índice de Git qué debe firmarse, separado del resto
del estado de trabajo. Para ello se prepara un texto de commit en alemán que enumera los documentos originales
a firmar con SHA-256 (HITL y el texto del contrato están en alemán).
gc-docsign present <ur-doc.md> … --repo <dir> # stagt Ur-Docs, schreibt .git/PRESENTED-COMMIT-MSG.txt
gc-docsign gcsig --doc "<ur-doc.md>" --phase presented # Phase `presented` setzen
Ningún commit por la herramienta (NO-AUTO-COMMIT): el commit delimitado y firmado con GPG lo realiza el firmante (véase GCSIG).
Firma múltiple: 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 un ID de contenedor.
Determinismo
Cada evento es describible de forma determinista: uuidV7 a partir de la marca temporal +
SHA-256 del evento, máquina de estados sin transiciones indeterminadas, ningún
texto libre salvo la declaración statement. Esa es la cualidad de saga:
el proceso puede ser repetido y reconstruido sin conocimiento de contexto por cualquier verificador.
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 verificador.
Creado: 260913 | Parte I, artículo DS03 | Serie: digital-signage