DS10 — El paquete del contenedor de FES (gcpn.zip)

Desencadenante S4, cierre de la Parte II

El verificador (o socio comercial) quiere ver la cadena — no solo de forma resumida. No recibe un repo, ni acceso Git, ni historial. Recibe un paquete: *.gcpn.zip — el conjunto físico de verificación del proceso de firma.

Manifiesto y archivo ZIP — dos tareas separadas

Tarea Soporte Contenido
Manifiesto el propio .gcpn.md Enumera todos los artefactos con SHA-256 (tabla de verificación + artefactos JSON incrustados) — identifica lo que pertenece al proceso
Archivo ZIP *.gcpn.zip Los archivos físicos para la entrega: los artefactos basados en texto (extraídos de la .gcpn.md como .json/.txt/.md/.v7g.md) más los artefactos binarios como archivos separados

Los artefactos basados en texto (.json, .txt, .md, .v7g.md) viven dentro de la .gcpn.md (MD-Fences) — en el ZIP se muestran como archivos individuales (extraíbles). Los artefactos binarios (PDF, PNG, SVG, …) no pueden vivir en el archivo MD — se incorporan al ZIP como archivos separados; por regla general ya están referenciados o identificados como hash SHA-256 en las estructuras de datos de los artefactos JSON (p. ej., evidence.facsimile_ref.sha256) — el hash es la identificación, el ZIP entrega el cuerpo.

La estructura del paquete

GCPN-SIG-260913-001.gcpn.zip
│
├── container.gcpn.md                      ← Manifest + textbasierte Artefakte (JSON-Fences) + .v7g.md
│                                            (identisch mit der Form im Git-Repo)
├── MANIFEST.json                          ← maschinen-lesbares Verzeichnis (alle SHA-256, package_sha256)
│
├── source/                                ← textbasiert: Quell-Dokument, aus dem Container extrahierbar
│   ├── gvb.md                             ← Quell-Dokument (referenced_doc)
│   └── gvb.md.v7g.md                      ← Sidecar
├── signature/                             ← textbasiert: Signatur-Doc + Events (aus MD-Fences)
│   ├── signature-doc.json                 ← Signatur-Doc (DS02) + .v7g.md
│   ├── event-offered.json                 ← Events (DS03) + .v7g.md
│   ├── event-accepted.json
│   ├── event-signed.json
│   ├── facsimile.svg                      ← BINÄR: Grafik physisch (Standard) — im JSON nur als SHA-256 referenziert
│   ├── facsimile.png                      ← BINÄR: Fallback
│   └── facsimile.sha256                   ← Checksums
├── fes/                                   ← binäre FES-Artefakte
│   ├── fes-envelope-report.json           ← Envelope-Report (DS09) + .v7g.md (textbasiert)
│   ├── contract-signed.pdf                ← BINÄR: signiertes PDF (PAdES)
│   ├── certificate-of-completion.pdf      ← BINÄR: Dienst-Report
│   └── pdfsig-report.txt                  ← Krypto-Prüfung (externes Tool)
└── README.md                              ← Verifikations-Anleitung (DS04-Routine)

Lectura: El manifiesto (.gcpn.md) nombra cada artefacto con SHA-256 — el ZIP entrega los cuerpos correspondientes. Los artefactos basados en texto están contenidos en el propio manifiesto (y en el ZIP además extraídos como archivos individuales); los artefactos binarios están presentes físicamente solo en el ZIP, pero en el manifiesto quedan completamente identificados por su SHA-256. Así, un verificador puede verificar cada cuerpo contra el hash indicado en el manifiesto.

El manifiesto de verificación

MANIFEST.json agrupa todos los SHA-256 del paquete:

{
  "$schema": "https://gitcover.org/schemas/gcpn-manifest-1.0.schema.json",
  "uuidV7": "<deterministische uuidV7>",
  "package": "GCPN-SIG-260913-001",
  "created_at": "2026-09-13T16:45:00Z",
  "created_by": "E1",
  "artifacts": [
    {"path": "container.md", "sha256": "…"},
    {"path": "source/gvb.md", "sha256": "…"},
    {"path": "signature/signature-doc.json", "sha256": "…"},
    {"path": "signature/event-offered.json", "sha256": "…"},
    {"path": "signature/event-accepted.json", "sha256": "…"},
    {"path": "signature/event-signed.json", "sha256": "…"},
    {"path": "signature/facsimile.svg", "sha256": "8fcffe0b…1006"},
    {"path": "signature/facsimile.png", "sha256": "d330348e…81fef"},
    {"path": "fes/fes-envelope-report.json", "sha256": "…"},
    {"path": "fes/contract-signed.pdf", "sha256": "7a054fa5…272b"}
  ],
  "verification_routine": "siehe README.md (DS04-Routine)",
  "package_sha256": "<SHA-256 des ZIP selbst>"
}

La regla de Facsimile: físico en FES, referencia en los demás casos

Importante (regla central de la Saga):

Procedimiento Facsimile en el paquete Justificación
Forma textual (Parte I) Referencia (SHA-256 + sello guid) El gráfico se encuentra en el directorio PII del repo del tenant; la cadena remite, el paquete documenta la referencia
FES (Parte II) Físico (SVG + PNG) El paquete es la entrega completa; el verificador necesita el gráfico para la comprobación, sin acceso al repo

La diferencia es deliberada: en la forma textual el asset permanece donde se gestiona con relevancia para GoBD (directorio PII, sidecar, verificación SHA); en FES se copia — el paquete es la versión completa (los originales permanecen inalterados en el repo; el SHA-256 prueba la identidad).

La rutina de verificación en el paquete

README.md guía al verificador a través de la rutina (DS04, nativa del paquete):

# 1. Manifest-Integrität
sha256sum -c <(jq -r '.artifacts[] | "\(.sha256)  \(.path)"' MANIFEST.json)
# 2. Kette prüfen (Quell-Dokument → Signatur-Doc → Events)
jq -r '.target.sha256' signature/signature-doc.json   # = sha256(source/gvb.md)
# 3. Event-Kette
jq -r '.prev_event_sha256' signature/event-*.json     # Verkettung prüfen
# 4. Facsimile
sha256sum signature/facsimile.svg                     # = 8fcffe0b…1006 (Tabelle)
# 5. PDF-Signatur (externes Tool, optional)
pdfsig fes/contract-signed.pdf                        # VALID, PAdES-B-T

ZIP de exportación vs. repo Git: definición de manifiesto

Dos formas de representación del mismo contenedor:

Forma Nombre Rol
En el repo Git <Referenced-Doc-Basisname>.gcpn.md El contenedor mismo — sus artefactos JSON incrustados + tabla de verificación son el manifiesto (el repo muestra el contenido directamente; los archivos ZIP no son representables en Git)
Como exportación <Referenced-Doc-Basisname>.gcpn.zip Entrega física (ZIP) — adicionalmente con MANIFEST.json (todos los SHA-256 + package_sha256) como índice legible por máquina

¿Es válida entonces la definición de manifiesto? Sí — en ambas formas: en el repo Git, la .gcpn.md cumple la función de manifiesto (enumera cada artefacto con SHA-256, y la rutina de verificación comprueba contra los datos incrustados); en el ZIP de exportación, la misma función de manifiesto se adjunta además físicamente como MANIFEST.json, para que el destinatario pueda comprobar sin un parser de MD (sha256sum -c). Ambas formas son equivalentes — el SHA-256 de los artefactos contenidos es la identificación (siempre y en todas partes).

Sufijo Significado
.gcpn Contenedor GitCover-PrimaNota (operaciones de negocio agrupadas)
.md Basado en Markdown (artefactos JSON en MD-Fences, compatible con Typora) — función de manifiesto en el repo
.zip Forma de exportación (entrega física, MANIFEST.json adjunto)

La Saga cierra la Parte II

El círculo está cerrado:

  1. Parte I: cadena en forma textual (documento fuente, documento de firma, eventos, sidecars, contenedor GCPN) — § 126b BGB, libre valoración de la prueba.
  2. Parte II: acoplamiento FES (niveles eIDAS, capa Facsimile, placa de firma, Envelope-Report, paquete físico).
  3. Parte III (planificada): círculo PII/GPG — gestión de claves, esquemas JSON de Signing-Identity, mecánica SSH vs. OpenPGP, Trust-Registry.

La Saga muestra: GitCover no sustituye a los servicios de firma — los ancla. El repo sigue siendo la capa de evidencia; los procedimientos externos se acoplan sin romper la cadena.


Creado: 260913 | Parte II, artículo DS10 | Serie: digital-signage