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:

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% stateDiagram-v2 [*] --> drafted: Quell-Dokument erstellt drafted --> offered: Signatur angefordert offered --> accepted: Empfänger nimmt zur Kenntnis (Accept) offered --> denied: Empfänger lehnt ab (Deny) accepted --> signed: Zeichner zeichnet (Sign) signed --> withdrawn: Zeichner zieht zurück (Withdraw, vor Frist) denied --> [*] withdrawn --> [*] signed --> [*]

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


Creado: 260913 | Parte I, artículo DS03 | Serie: digital-signage