DS03 — Le processus de signature (Accept/Deny/Sign)

Déclencheur S2

Une fois le document de signature (DS02) défini, le vérificateur pose la bonne question : Qu'a-t-on donc finalement décidé ? Un document de signature dit seulement : « E1 signe le doc X. » Le processus — acceptation (Accept), refus (Deny), signature (Sign), retrait (Withdraw) — est un événement propre avec sa propre chronologie.

Machine à états du processus de signature

Un processus traverse une machine à états déterministe :

%%{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 --> [*]

Chaque changement d'état est un artefact d'événement dans le dépôt — un document JSON selon le schéma 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"
  }
}

Le chaînage : prev_event_sha256

Chaque événement renvoie à son événement précédent — l'historique de signature forme une chaîne SHA-256 (principe GCPN prev_sha256, ici au niveau de l'événement) :

offered (event 1) ──► accepted (event 2) ──► signed (event 3)
     │                      │                     │
   sha256                 sha256                sha256
     └── prev=null ─────────┴── prev=sha(ev1) ───┴── prev=sha(ev2)

Un vérificateur peut vérifier tout l'historique avec trois commandes :

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?

Les types d'événements

Événement Signification Valeur probante
offered Signature demandée (document présenté pour signature) Point de départ du délai, équité de la procédure
accepted Le destinataire a pris connaissance (accès en forme textuelle confirmé) § 126b (1) : accès prouvé
denied Le destinataire refuse (avec motivation) Documente le refus — important en cas de versions contradictoires
sign Le signataire signe (référence Fac-similé/clé) § 371a ZPO : adjonction du nom + indication de forme
withdraw Le signataire retire (avant déchéance) Retrait auditable au lieu d'une suppression silencieuse

Principe de non-suppression silencieuse : un événement n'est jamais supprimé ni écrasé. Un retrait est un événement withdraw — l'historique reste complet (principe GoBD : traçabilité).

Modèle (offered/presented) : indexer les documents originaux + message de commit

Lors de la présentation pour signature, les documents originaux concernés sont indexés dans le dépôt Git (git add) — ainsi, dans l'index Git, il est clairement délimité ce qui doit être signé, séparément du reste de l'état de travail. Pour cela, un message de commit allemand est préparé, qui liste les documents originaux à signer avec leur SHA-256 (HITL et le texte contractuel sont en allemand).

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

Aucun commit effectué par l'outil (NO-AUTO-COMMIT) : le commit délimité et signé GPG est effectué par le signataire (voir GCSIG).

Multi-signature : deux signataires, un document source

Lors d'une GVB avec deux lignes de signature, chaque signataire crée sa propre chaîne d'événements sur le même document source :

Quell-Dokument (sha256 T)
   ├── E1: offered → accepted → signed (Kette A)
   └── PARTNER-1: offered → accepted → signed (Kette B)

La vérification (DS04) contrôle les deux chaînes indépendamment — et le conteneur GCPN (DS05) regroupe les deux sous un identifiant de conteneur.

Déterminisme

Chaque événement est décrivable de manière déterministe : uuidV7 à partir de l'horodatage + SHA-256 de l'événement, machine à états sans transitions indéterminées, aucun texte libre hormis la déclaration statement. C'est la qualité Saga : le processus peut être reproduit et suivi sans connaissance du contexte par tout vérificateur.

Résumé


Créé : 260913 | Partie I, article DS03 | Série : digital-signage