<?xml version="1.0" encoding="UTF-8"?>
<!--
  Schema XML del documento de atestación de hash del AIP COMPLETO ("sello #2") v2.
  Namespace: https://docs.docuten.com/earchiving/aip-hash-attestation/v2
  Decisión: D-26 (Phase 05.1) + GATE-02 (Phase 05.1.2) — el perfil Merkle viaja DENTRO
            de la evidencia sellada.

  RELACIÓN CON v1

  Sustituye a aip-hash-attestation-v1.xsd como formato de ESCRITURA desde Phase 05.1.2
  (GATE-02): AipHashAttestationXmlBuilder produce EXCLUSIVAMENTE documentos de este
  namespace. v1 se conserva SOLO para lectura retroactiva de los sidecars ya sellados
  bajo el perfil legacy (ventana D-25) — ver AipHashAttestationXmlReader, que despacha
  entre v1 y v2 por el namespace del elemento raíz. v1 no se modifica ni se elimina.

  QUÉ CERTIFICA ESTE DOCUMENTO

  El fixity del AIP tal como queda en custodia DESPUÉS del merge del paso 10 de la saga,
  SIN EXCLUSIONES: contenido + METS.xml + premis.xml + los ficheros de
  metadata/preservation/ generados por la propia atestación de origen.

  Y, a diferencia de v1, el PERFIL bajo el que se computó fullAipMerkleRoot: sin él, un
  tercero que solo tenga el ZIP del AIP y el sello no puede saber qué algoritmo recomputar
  (algoritmo, orden canónico de hojas, concatenación, tratamiento del nodo impar), porque
  todo eso vivía únicamente en el Javadoc de MerkleTree, que no viaja con el paquete.

  QUÉ *NO* ES

  NO sustituye a v1 como formato de LECTURA: los sidecars ya sellados bajo v1 siguen
  leyéndose (ventana D-25).
  NO es la atestación de origen (origin-attestation.xml, attestation-v1.xsd, sello #1):
  aquélla acredita la autenticidad de ORIGEN del SIP y, por construcción, no puede cubrir
  los ficheros de atestación que ella misma genera (circularidad detectada por B-1).
  attestation-v1.xsd NO declara merkleProfile en esta fase — decisión documentada en
  docs/governance/merkle-profile-v2.md § "Fuera de alcance".
  NO es el informe de verificación on-demand (integrity-report-v1.xsd, Plan 05.1-10), que
  sí declara merkleProfile pero de forma aditiva y opcional.
  Los tres son artefactos sellados INDEPENDIENTES con propósitos distintos: este esquema
  no importa, no extiende y no comparte ObjectFactory con ninguno de ellos, y por tanto no
  arrastra campos ajenos (submitter, sipHash, sipId, submittedAt, documents,
  regulatoryBasis) a un documento que solo habla de integridad del objeto conservado.

  DÓNDE SE PUEBLA EL CONTENIDO

  fullAipMerkleRoot, merkleProfile y la lista completa de fileEntry se pueblan en el objeto
  JAXB ANTES de marshalToBytes()/canonicalize() (AipHashAttestationXmlBuilder). Poblarlos
  después dejaría la evidencia FUERA de lo firmado por el QTSP y sellado por la TSA —
  exactamente el defecto que D-21 corrigió para aipMerkleRoot en el sello #1.

  Bindings JAXB: aip-hash-attestation-v2.xjb
                 → paquete com.docuten.earchiving.attestation.internal.generated.aiphashv2
-->
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:ah="https://docs.docuten.com/earchiving/aip-hash-attestation/v2"
    targetNamespace="https://docs.docuten.com/earchiving/aip-hash-attestation/v2"
    elementFormDefault="qualified"
    version="2.0">

  <!-- Elemento raíz: ah:aipHashAttestation -->
  <xs:element name="aipHashAttestation" type="ah:AipHashAttestationType"/>

  <xs:complexType name="AipHashAttestationType">
    <xs:sequence>
      <!-- Identificador del AIP cuyo fixity completo se certifica -->
      <xs:element name="aipId" type="xs:string"/>
      <!-- Identificador del tenant (multi-tenant) -->
      <xs:element name="tenantId" type="xs:string"/>
      <!-- Identificador/ruta del blob WORM definitivo del AIP sobre el que se calculó el root -->
      <xs:element name="aipBlobId" type="xs:string"/>
      <!--
        Merkle root SHA-256 hex del AIP COMPLETO, calculado sobre el blob WORM definitivo
        sin ninguna exclusión (D-26). Es la referencia contra la que INTEG-06 contrasta la
        recomputación del AIP entero.
      -->
      <xs:element name="fullAipMerkleRoot" type="xs:string"/>
      <!--
        URI VERSIONADA ESTABLE del perfil Merkle bajo el que se computó fullAipMerkleRoot
        (GATE-02, D-26). OBLIGATORIO: v2 nace declarando el perfil — no es un campo aditivo
        opcional como aipMerkleRoot lo fue en attestation-v1.xsd, porque un documento v2 sin
        perfil declarado reintroduciría exactamente la ambigüedad que este esquema cierra.

        El valor es la URI que identifica al documento normativo
        docs/governance/merkle-profile-v2.md, donde el algoritmo está descrito paso a paso:
        hoja = SHA-256(0x00 || entryHashBytes), nodo interior = SHA-256(0x01 || left || right),
        construcción bottom-up por niveles con PROMOCIÓN del nodo impar sin re-hashear, orden
        canónico de hojas por MerkleTree.LEAF_NAME_ORDER, ámbito sin exclusiones.

        La URI es un identificador, no una URL que deba resolverse: no se dereferencia en
        tiempo de verificación ni de sellado.
      -->
      <xs:element name="merkleProfile" type="xs:string"/>
      <!-- Instante UTC en que se calculó el root y se solicitó el sello -->
      <xs:element name="sealedAt" type="xs:dateTime"/>
      <!--
        Fixity por fichero del AIP completo: una entrada por CADA fichero del paquete.
        Una vez sellada, esta lista es la ÚNICA referencia que permite diagnosticar QUÉ
        fichero cambió ante un FAIL de sello #2, sin depender de aip_files (que solo refleja
        el estado pre-merge del paso 7).
      -->
      <xs:element name="fileEntry" type="ah:FileEntryType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <!--
    ah:FileEntryType: fixity de un fichero individual del AIP. IDÉNTICO a v1.
    - filename:   RUTA COMPLETA del fichero dentro del ZIP del AIP (nunca nombre base:
                  dos representaciones pueden contener ficheros homónimos con contenido
                  distinto — Assumption A4, Plan 05.1-01)
    - sha256Hash: hash SHA-256 hex REAL de ese fichero (nunca un valor colectivo compartido)
  -->
  <xs:complexType name="FileEntryType">
    <xs:sequence>
      <xs:element name="filename" type="xs:string"/>
      <xs:element name="sha256Hash" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
