
# DPAC T2 Generator

El **AerariumChain DPAC T2 Generator** es una aplicación de escritorio (macOS y Windows, con licencia) que AerariumChain pone a disposición de los proveedores de digitalización y de la Digital Library. Construye los **paquetes de actualización T2** de los objetos 3D y de los gigapíxeles, los verifica antes de comprimirlos, los escribe en un disco externo y emite un **certificado de verificación** con el registro de todos los controles y los documentos de paradatos adjuntos.

Un paquete T2 es un *delta* sobre el paquete T1 ya ingerido por DPAC: contiene el METS actualizado (`RECORDSTATUS="UPDATE_3D"`, ID de cabecera igual al UUID del recurso asignado por DPAC), la carpeta de **paradatos** (el informe de configuración de la adquisición y el informe de procesamiento) y la carpeta **RAW_3D** con los datos brutos de adquisición. Las imágenes ya presentes en el T1 (la miniatura y las vistas de renderizado) se vuelven a poner también en el T2, copiadas byte a byte desde el paquete T1 y verificadas con los checksums del METS; máster y derivado siguen siendo referencias (opción: solo imágenes, todos los archivos del T1, ninguno).

La herramienta tiene dos partes: un **constructor** (un procedimiento guiado) y un **verificador** (la interfaz de control con los paneles de paquetes generados y fallidos). Todo lo que hace la ventana puede dirigirse también desde una **API HTTP local**, de modo que un proveedor pueda integrar el packager en su propio sistema y conservar la interfaz para el trabajo manual en el PC.

## Instalación, acceso y licencia

La app solo funciona con una **cuenta del Hub AerariumChain** y una **licencia activa**. El titular de la licencia (para la Digital Library, AerariumChain) decide qué cuentas pueden usarla y en cuántos ordenadores.

**Descargar el instalador.** En el Hub, menú **DPAC → DPAC T2 Generator**, la página muestra la licencia de la cuenta y los botones para macOS (Apple Silicon o Intel) y Windows. La descarga queda registrada a nombre de la cuenta. Sin licencia activa los botones están desactivados.

**macOS.** Abrir el archivo `.dmg` y arrastrar la app a Aplicaciones. La app está firmada y notarizada por Apple: se abre sin avisos. Si macOS mostrara igualmente un mensaje de app no verificada (por ejemplo con un archivo copiado desde una memoria USB), abrir **Ajustes del Sistema → Privacidad y seguridad** y elegir **Abrir igualmente**, o hacer clic derecho en la app → **Abrir**.

**Windows.** Ejecutar `AerariumChain DPAC T2 Generator Setup <versión>.exe` y seguir la instalación (se puede elegir la carpeta). Mientras el instalador no esté firmado con el certificado de firma de código de Windows, puede aparecer uno de estos mensajes:

| Mensaje | Qué hacer |
|---|---|
| **«Windows protegió su PC»** (Microsoft Defender SmartScreen) | hacer clic en **Más información**, comprobar que la app es «AerariumChain DPAC T2 Generator» y luego **Ejecutar de todas formas** |
| El navegador marca el archivo como **«no se descarga habitualmente»** | en la lista de descargas elegir **Conservar** (Edge: … → Conservar → Mostrar más → Conservar de todos modos) |
| **«Control inteligente de aplicaciones bloqueó una aplicación»** | con el Control inteligente de aplicaciones activo, Windows no abre apps sin firmar: [contáctenos](https://aerariumchain.com/es/contact/) para la versión firmada. El estado está en **Seguridad de Windows → Control de aplicaciones y navegador → Control inteligente de aplicaciones** |
| El antivirus de la empresa pone el archivo en cuarentena | pedir al administrador de TI que permita el instalador y la carpeta de la app |

**Primer inicio.** La app muestra el **contrato de licencia** (EULA) para aceptar y luego pide el acceso con la cuenta del Hub: la misma sesión lee los datos del Hub, sin un segundo inicio de sesión. Arriba aparecen el código de la licencia, el titular y la fecha de vencimiento; el mismo código figura en el certificado y en el paquete de verificación de cada paquete creado.

**Licencia.** Cada ordenador en el que se inicia sesión ocupa una instalación de la licencia (volver a abrir la app en el mismo ordenador no consume otra). La licencia se renueva en línea cada 30 minutos; sin red la app funciona hasta 72 horas. Al vencer, o si se suspende, la app se bloquea e indica a quién dirigirse.

**Actualizaciones.** Las versiones nuevas se descargan solas y se instalan al reiniciar (ver más abajo).

## Qué produce

Por cada paquete el disco de destino recibe una carpeta con el nombre de la entrega, de modo que el listado se lee una línea por obra:

```
<destino>/CANTIERE_LOTTO_PK_T2/
  CANTIERE_LOTTO_PK_T2.zip               la entrega para la Digital Library
  CANTIERE_LOTTO_PK_T2_CERTIFICATO.pdf   certificado de verificación
  CANTIERE_LOTTO_PK_T2_VERIFICA.zip      el paquete de verificación para el control de calidad (ver abajo)
  CANTIERE_LOTTO_PK_T2/                  la entrega sin comprimir, con el mismo nombre del ZIP (sobre la que corren los controles)
    <prefijo>.xml                        METS T2 (UPDATE_3D, UUID DPAC, SIZE y MD5 reales)
    <prefijo>_PARADATA_3D/               configuración de adquisición / ficha de levantamiento e informe de procesamiento (PDF)
    <prefijo>_RAW_3D/                    datos brutos: export Artec (PLY + fotos), archivos, contenedor .acraw o proyecto original
    <prefijo>_Thumbnail_3D/              miniatura ya presente en el T1, repuesta en el T2
    <prefijo>_6ViewImages_3D/            vistas de renderizado ya presentes en el T1, repuestas en el T2
  CANTIERE_LOTTO_PK_T2_VERIFICA/         el paquete de verificación sin comprimir, con el mismo nombre de su ZIP
```

El ZIP de entrega contiene solo el contenido de la carpeta `CANTIERE_LOTTO_PK_T2/`. Todo lo demás queda fuera de la entrega.

Para un **gigapíxel** (material HQ de D.PaC) el T2 tiene la misma forma: el METS del T1 gigapíxel con el estado de actualización (`UPDATE_HQ`, o `UPDATE_2D` si la Digital Library lo pide: se elige en Ajustes), las carpetas `<prefijo>_PARADATA_HQ` y `<prefijo>_RAW_HQ`, y como datos brutos las **imágenes de entrada del fotomosaico en RAW DNG** con al menos una toma con el **ColorChecker**, como pide el Ministerio. El informe de procesamiento describe el ensamblaje, la alineación, la calibración del color y la imagen máster.

La estructura del paquete, la transformación del METS y las reglas de checksum son las mismas de la canalización del Hub AerariumChain: un paquete construido con la herramienta es idéntico a uno producido por el Hub.

![La vista de verificación: el paquete en examen, los paquetes generados y los fallidos con sus problemas](/downloads/dpac-t2-verifica.png)

## Crear un paquete a mano

La sección **Crear paquete T2** es un procedimiento en cinco pasos.

1. **METS T1**: el METS exacto ingerido con el T1, desde un archivo local, desde una URL, o leído directamente del **Hub AerariumChain** (acceso con las credenciales del Hub, elección del hive y de la obra: la herramienta descarga el METS T1, el UUID DPAC, la ficha de levantamiento del Site Manager y el estado del derivado). Con el T1 llega también su paquete (del hub se leen solo las entradas necesarias), del que la miniatura y las vistas de renderizado se reponen en el T2.
2. **Identificación**: código de obra, código de lote y PK (dan nombre al ZIP), el prefijo del paquete (da nombre al METS y a las carpetas), el **UUID del recurso asignado por DPAC** tras la ingesta del T1, título y número de inventario.
3. **Paradatos**: los dos informes pueden generarse desde los formularios (la herramienta reproduce los modelos MiC) o adjuntarse como PDF ya listos; se pueden añadir otros documentos.
4. **RAW 3D**: los datos brutos de adquisición en una de cuatro formas:
   - la **exportación desde el proyecto Artec Studio** con la CLI `aec_artecViewer`, la misma herramienta que ejecuta el nodo GPU de AerariumChain: un PLY bruto por escaneo (cada frame tal como se registró) más las **fotos de los escaneos** (las imágenes de la cámara de textura, PNG sin pérdida, `<prefijo>_RAW_NN_INP_NNNN.png`) listadas en el METS como imágenes de entrada. Los filtros son los de la CLI (`kind`, `scan-geometry`, `target-total`, `max-size`, `on-oversize`): un escaneo excluido o rechazado por tamaño no deja ni PLY ni fotos, un archivo fusionado o incompleto hace fallar la exportación (puerta de procedencia del servidor DPAC). El proyecto puede ser una carpeta o un ZIP local, o el registrado en el hub, descargado antes de la exportación;
   - **archivos brutos** (un PLY por escaneo, imágenes, E57 ...), copiados y con hash;
   - el **formato abierto `.acraw`** (AerariumChain Raw): en lugar de archivos sueltos, un único contenedor con manifiesto, SHA-256 de cada archivo y root hash, verificable por cualquiera sin software propietario; se aplica tanto a los archivos brutos seleccionados como a la exportación Artec (PLY por escaneo + fotos); especificación en [github.com/aerariumchain/acraw-spec](https://github.com/aerariumchain/acraw-spec);
   - el **formato original** del software de adquisición: la carpeta del proyecto comprimida sin recompresión, o un archivo copiado byte a byte.
5. **Destino**: el disco externo (se listan los volúmenes montados y el espacio libre), verificación automática, ZIP (ZIP64 cuando hace falta) y certificado.

![El paso RAW 3D: exportación desde el proyecto Artec con la CLI integrada (PLY por escaneo + fotos), filtros de la CLI](/downloads/dpac-t2-raw.png)

Desde el Hub, la herramienta también puede pedir al **propio Hub** que construya el T2: los PLY brutos se exportan del proyecto del escáner en un nodo GPU y el paquete se ensambla allí.

![El procedimiento guiado: METS T1 desde el Hub, identificación, paradatos, RAW 3D, destino](/downloads/dpac-t2-crea.png)

## Verificar un paquete

La sección **Verificar paquetes** acepta la carpeta del paquete (antes del ZIP) o un ZIP ya creado. Los controles cubren:

- el METS: XML bien formado, `PROFILE`, `OBJID`, cabecera (`RECORDSTATUS`, UUID, `CREATEDATE`, agentes), secciones descriptiva y administrativa, los campos obligatorios de los metadatos técnicos 3D, los identificadores duplicados;
- la sección de archivos: vocabulario `USE`, el grupo `FG_3D` del T1, los grupos `STORAGE` y `RAW_3D`, los nombres de los documentos de paradatos;
- cada archivo declarado en los grupos del T2: presencia, `SIZE`, `MD5`, `MIMETYPE`, `CREATED`, `ADMID`; la firma de los PDF; la cabecera de los PLY; los contenedores `.acraw` (reglas del contenedor, manifest, hashes, root hash, estructura);
- la semántica del delta: ningún archivo del T1 dentro del paquete, ningún archivo sin declarar;
- la comparación con el METS T1, cuando se proporciona;
- opcionalmente, el validador público METS ECO-MiC de ICDP.

Dos paneles guardan la historia: **paquetes generados** (verificación superada) y **paquetes fallidos**, cada uno con los problemas encontrados. Cada regla tiene un identificador estable (`HDR-ID`, `FSEC-STORAGE`, `FILE-MD5` ...) que aparece también en el certificado y en las respuestas de la API.

## El paquete de verificación para el control de calidad

Junto a cada entrega la herramienta escribe un **paquete de verificación**: la carpeta `CANTIERE_LOTTO_PK_T2_VERIFICA/` y su copia `CANTIERE_LOTTO_PK_T2_VERIFICA.zip` (las carpetas sin comprimir pueden desactivarse en los ajustes). Está pensado para el control de calidad de la Digital Library: quien recibe el ZIP de entrega puede comprobar que llegó intacto, leer el registro de los controles y saber cómo se construyó, sin abrir el paquete. Para el paquete `3D03CE01_LDIG013_PK0000002_T2` contiene:

| Archivo | Qué es y para qué sirve |
|---|---|
| `3D03CE01_LDIG013_PK0000002_T2_CERTIFICATO.pdf` | el certificado de verificación (ver abajo), copia del que está junto al ZIP |
| `3D03CE01_LDIG013_PK0000002_T2.zip.md5` | la huella MD5 del ZIP de entrega en formato `md5sum`: el hash, dos espacios, el nombre del archivo. Desde la carpeta donde está el ZIP: `md5sum -c 3D03CE01_LDIG013_PK0000002_T2.zip.md5` (Linux), `md5 -r 3D03CE01_LDIG013_PK0000002_T2.zip` (macOS), `certutil -hashfile 3D03CE01_LDIG013_PK0000002_T2.zip MD5` (Windows). Si el hash coincide, el ZIP recibido es byte a byte el producido |
| `3D03CE01_LDIG013_PK0000002_T2.zip.sha256` | la misma huella con SHA-256 (`sha256sum -c …` en Linux, `shasum -a 256 -c …` en macOS): más robusta que MD5, es la que figura también en el certificado |
| `rapporto.json` | el registro completo de los controles, legible por máquina: `ok`, `errors`, `warnings`, la lista `items[]` (cada control tiene un `id` estable como `HDR-ID`, `FSEC-STORAGE`, `FILE-MD5`, `T1-FILES`, un `level` `error|warn|info|ok`, el mensaje y el archivo afectado) y `summary` (tipo, OBJID, UUID DPAC, RECORDSTATUS, recuentos, inventario con MD5) |
| `build.json` | cómo se construyó el paquete: la especificación de build (identificadores, origen del T1, paradatos, modo RAW, opciones), de dónde viene el T1, los archivos producidos con tamaño y MD5, la herramienta de exportación y su versión |
| `t1.xml` | el METS T1 ingerido por DPAC del que deriva el T2: sirve para rehacer la comparación delta (cada archivo del T1 citado en el T2 debe conservar los mismos SIZE y CHECKSUM); la app lo reutiliza sola cuando alguien verifica el ZIP |
| `METS_<prefijo>.xml` | copia del METS T2 entregado |
| `METS_<prefijo>_RELAZIONE_SETUP-ACQUISIZIONE.pdf`, `METS_<prefijo>_RELAZIONE_ELABORAZIONE.pdf` | copias de los documentos de paradatos, para leerlos sin abrir el paquete |
| `artec-manifest.json` | (modo Artec) el manifiesto de la CLI: por cada PLY bruto el escaneo de origen, frames totales y usados, HD/SD, MD5, y la lista de fotos |
| `inventario.txt` | una línea por archivo del paquete: MD5, tamaño, grupo METS (STORAGE, RAW_3D, LOW, PREVIEW…), ruta |
| `LEGGIMI.txt` | qué es la carpeta, resultado e identificadores del paquete, los problemas detectados y la lista de arriba |

Un error bloquea el ZIP; un aviso no. El paquete de verificación se produce también cuando un paquete solo se verifica (una carpeta o un ZIP recibido de un proveedor), junto al archivo controlado.

## El certificado de verificación

Cuando un paquete supera la verificación, la herramienta escribe un PDF **fuera del paquete**: la identidad del paquete, SHA-256 y MD5 del METS y del ZIP, el registro completo de los controles con su resultado, el inventario de los archivos con sus hashes. Los PDF de paradatos no se adjuntan: están en el paquete entregado y en el paquete de verificación. Es el documento que debe conservarse con la entrega.

## La API local

La ventana y la API comparten el mismo código. La API escucha solo en el PC (`http://127.0.0.1:47821/api/v1`, puerto y token opcional en la configuración) y está descrita por un documento **OpenAPI 3.0** servido por la app en `/api/v1/openapi.json` y descargable aquí: [dpac-t2-openapi.json](/downloads/dpac-t2-openapi.json).

![Configuración: acceso al Hub, API local con el contrato OpenAPI, validador público, valores predeterminados](/downloads/dpac-t2-impostazioni.png)

![Ajustes: monitorización y asistencia, valores predeterminados y carpetas sin comprimir con el nombre de los ZIP](/downloads/dpac-t2-artec.png)

| Método | Ruta | Finalidad |
|---|---|---|
| GET | `/health` | estado de la app |
| GET | `/openapi.json` | el contrato de la API |
| GET | `/disks` | volúmenes montados y espacio libre |
| GET | `/artec/status` | ¿se puede usar la CLI `aec_artecViewer`? (ruta, Node, versión) |
| POST | `/artec/list` | lista escaneos, frames y fotos de un proyecto Artec |
| POST | `/build` | crea un paquete T2 (job) a partir de una `BuildSpec` |
| POST | `/check` | verifica una carpeta o un ZIP (job, o síncrona con `wait: true`) |
| POST | `/zip` | verifica y comprime la carpeta de un paquete (job) |
| POST | `/acraw` | envuelve archivos brutos en un contenedor `.acraw` (job) |
| POST | `/pdf/setup`, `/pdf/elaborazione` | genera los dos informes de paradatos |
| GET | `/jobs`, `/jobs/{id}` | estado, resultado y eventos de un job |
| GET | `/jobs/{id}/events` | los mismos eventos como Server-Sent Events |
| GET, DELETE | `/packages`, `/packages/{id}` | el registro de paquetes generados y fallidos |

Autenticación: ninguna por defecto; cuando en la configuración se define un token, debe enviarse como `X-Api-Token` o como bearer token. Cada ruta en las peticiones es una ruta en el PC donde se ejecuta la app.

### La petición de construcción

```json
{
  "identity": {
    "codiceCantiere": "3D03CE05", "codiceLotto": "LDIG003", "pk": "PK0000002",
    "objid": "M489_XXXX",
    "dpacUuid": "6f1c2a3e-4b5d-4e6f-8a9b-0c1d2e3f4a5b",
    "title": "Título de la obra", "inventory": "INV-1", "catalogId": "XXXX"
  },
  "t1": { "source": "file", "path": "/datos/t1/M489_XXXX.xml" },
  "paradata": {
    "setup":        { "mode": "generate", "data": { "id_oggetto": "...", "setup_acquisizione": "SETUP_#1" } },
    "elaborazione": { "mode": "generate", "data": { "operator": "...", "derivFile": "M489_XXXX_DRV.glb", "derivSoftware": "Blender" } }
  },
  "raw": { "mode": "folder", "folder": "/datos/raw/M489_XXXX", "extensions": ["ply"], "acraw": { "enabled": false } },
  "options": { "overwrite": true },
  "output": { "dir": "/Volumes/DISCO/T2", "zip": true, "keepStaging": true }
}
```

- `t1.source` es `file` o `url` (con `headers`).
- `paradata.*.mode` es `generate` (desde los datos), `file` (un PDF existente, `path`) o `none`.
- `raw.mode` es `artec` (con `raw.artec`: `projectPath` o `projectS3Key`, `kind`, `scanGeometry`, `targetTotal`, `maxSize`, `onOversize`, `maxTotalSize`, `photos`), `files`, `folder`, `original` (con `originalPath` y `originalVendor`) o `none`; `raw.acraw.enabled` activa el contenedor abierto. El manifiesto de la CLI Artec se conserva en `verifica/artec-manifest.json`.

### El flujo de un job

```
POST /build                      -> 202 { "jobId": "..." }
GET  /jobs/{jobId}               -> { "job": { "status": "running|done|failed", "result": ... }, "events": [...] }
GET  /jobs/{jobId}/events        -> text/event-stream: progress, done, error
```

Los eventos de progreso llevan `step`, `percent` y `message`; el resultado de una construcción lleva las rutas de la carpeta, del ZIP (con tamaño y MD5), del informe de verificación y del certificado. Una verificación síncrona:

```
POST /check  { "target": "/Volumes/DISCO/T2/3D03CE05_LDIG003_PK0000002_T2.zip", "wait": true }
-> 200 { "report": { "ok": true, "errors": 0, "warnings": 0, "items": [...], "certificatePath": "..." } }
```

Las mismas operaciones están disponibles desde la línea de comandos (`dpac-t2 build`, `check`, `zip`, `acraw`, `pdf-setup`, `pdf-elab`), con el mismo código.

## Guía y soporte AI

Esta página es la guía de la app: el menú **Guía** la abre en el navegador. La misma guía en Markdown, pensada como contexto para un asistente AI, se descarga aquí: [dpac-t2-guida.md](/downloads/dpac-t2-guida.md) (en italiano).

El menú **Conectar a AI** reúne todo lo que permite a un asistente (Claude Code, Claude Desktop, ChatGPT) o al equipo AerariumChain ayudar cuando algo falla:

- **Exportar diagnóstico para la AI**: un archivo Markdown (o una copia al portapapeles) con entorno, ajustes sin secretos, paquetes fallidos con sus problemas, el informe de verificación del paquete elegido, una nota del operador, las últimas líneas del log y la guía. Nunca los archivos de los paquetes. El mismo botón está en cada paquete fallido.
- **Conector MCP**: la app es un servidor MCP (Model Context Protocol) local. Con un clic se conecta a Claude Code o Claude Desktop, que pueden leer estado, paquetes, informes y log, lanzar una verificación o una construcción y resolver el problema en directo con el operador. ChatGPT requiere un servidor público: se usa la exportación de diagnóstico.
- **Guía** (enlace y descarga) y **Pedir asistencia** (solicitud al equipo con el contexto de la app).

![Conectar a AI: diagnóstico, guía, conector MCP, asistencia](/downloads/dpac-t2-ai.png)

## Actualizaciones, monitorización y asistencia

La app dialoga con el manager AerariumChain (manager.aerariumchain.com) a través del Hub, con un identificador de instalación y, si el operador está conectado, con su sesión:

- **Actualizaciones**: al arrancar y cada seis horas comprueba si se ha publicado una versión más reciente; si la hay, la descarga en segundo plano y la barra lateral muestra "Actualización X" con el progreso y el botón Reiniciar y actualizar (también se instala al cerrar). AerariumChain puede marcar una versión como obligatoria o forzar la actualización de una instalación desde el manager: la app la instala sola en cuanto no tiene trabajos en curso.
- **Monitorización**: por cada paquete creado envía un informe con identificadores (paquete, prefijo, UUID DPAC, obra, hive), resultado de la verificación con los problemas detectados, hash y tamaño del ZIP, recuentos (paradatos, PLY, fotos, imágenes del T1), herramienta de exportación y duraciones. Nunca los archivos del paquete. Los eventos se encolan sin conexión y salen en la primera conexión; se desactiva en Ajustes → Monitorización.
- **Asistencia**: "Pedir asistencia" en la barra lateral abre una solicitud al equipo AerariumChain con la versión de la app, el sistema, el estado de la CLI y las últimas líneas del log; la respuesta llega al email indicado.

## Requisitos y distribución

- macOS 11 o posterior (Apple Silicon o Intel) o Windows 10/11 de 64 bits; no hace falta otro software (los PDF de paradatos los genera la herramienta).
- Espacio en el disco de destino para los datos brutos y para el ZIP.
- Una cuenta del Hub AerariumChain con una licencia activa, y conexión a internet al menos una vez cada 72 horas.
- La CLI `aec_artecViewer` para la exportación desde proyectos Artec está integrada en la app (tomada de su propio repositorio al compilar) y se ejecuta con el runtime de la app: no hay nada que instalar.

El instalador se descarga del Hub con una cuenta que tiene la licencia. Para una licencia o asistencia [contáctenos](https://aerariumchain.com/es/contact/).
