MACGUARD · DOCUMENTACIÓN
English

Publicación y releases

Cómo se construye una release completa y qué ficheros contiene.

Secuencia

Diagrama: Secuencia de publicación

Dibujando el diagrama…

Descripción del diagrama

Tras las comprobaciones finales, publish.yml construye el archivo y los metadatos, vuelve a verificar los artefactos, crea una release en borrador, adjunta todos los ficheros y solo entonces la hace pública. Después site.yml construye el catálogo desde la release publicada, la verifica otra vez, despliega GitHub Pages y verifica la URL pública con los bytes reales. El espejo de Cloudflare se despliega cuando su credencial funciona.

Código Mermaid
sequenceDiagram
  autonumber
  participant P as publish.yml
  participant GH as GitHub Releases
  participant S as site.yml
  participant GP as GitHub Pages
  participant CF as Cloudflare Pages
  participant V as verify_live.py
  P->>P: re-verify final set, seal, sign, tar.gz, metadata
  P->>P: verify_release.py on the exact files to publish
  P->>GH: create DRAFT release with every asset
  P->>GH: check the asset count, then publish
  P->>S: request site deployment
  S->>GH: download the release and history
  S->>S: verify_release.py, build catalog and stats, record verification
  S->>GP: deploy
  S->>CF: deploy mirror (preflight first)
  S->>V: verify the public URL
  V->>GP: package, every rule file, catalog, links
  V-->>S: PASS or FAIL logged in the transparency log
  1. publish.yml comprueba antes (precheck) que el candidato difiere de la última release; si es idéntico no pide aprobación ni publica.
  2. Vuelve a verificar el conjunto final (clasificación y evidencia dinámica) antes de firmar.
  3. Firma el checkpoint, sella y firma el manifiesto, escribe la prueba de inclusión, empaqueta y genera los metadatos.
  4. Comprueba los artefactos exactos antes de que nada sea público, crea la release como borrador, adjunta todos los ficheros y solo entonces la hace pública.

Ficheros de una release

FicheroContenidoObligatorio
rules-release.tar.gzLas reglas (rules/) y manifest.json.sí
manifest.jsonLista de ficheros con SHA-256, fuentes, rules_root, cabeza del registro y estadísticas.sí
manifest.sigstore.jsonFirma Sigstore del manifiesto.sí
inclusion-proof.jsonPrueba Merkle de inclusión de la entrada de la release.sí
checkpoint.txtCheckpoint del registro.sí
checkpoint.sigstore.jsonFirma Sigstore del checkpoint.sí
release.jsonMetadatos: cifras, fuentes, cambios, paquete.no
changes.json, CHANGELOG.mdFicheros añadidos, modificados y quitados respecto a la anterior.no
consistency.jsonPrueba de consistencia con el registro de la release anterior.no (si hay anterior)

Ejemplo real: manifest.json de la última release (resumido):

{
  "schema": 1,
  "created_at": "2026-10-18T17:36:07.186971+00:00",
  "sources": [
    {
      "commit": "3ce6640c26046da8e6d8094af3eaaee3ee84e648",
      "id": "nextron",
      "kind": "rules",
      "license_check": {
        "detail": "DRL-1.1: allowed-with-attribution",
        "ok": true,
        "redistribution": "allowed-with-attribution",
        "sha256": "8a959b2413d0c83ca1b3ce9153076c649abf2e4bbfebbb493fb24c2074a1eb8a",
        "spdx_reported": "NOASSERTION"
      },
      "repository": "Neo23x0/signature-base"
    },
    {
      "commit": "0f93570194a80d2f2032869055808b0ddcdfb360",
      "id": "community",
      "kind": "rules",
      "license_check": {
        "detail": "GPL-2.0: allowed-with-license-notice",
        "ok": true,
        "redistribution": "allowed-with-license-notice",
        "sha256": "c03cea027b4b40e4402fabd08557736727ec3d5bc54ad64ab6472de432198cad",
        "spdx_reported": "GPL-2.0"
      },
      "repository": "Yara-Rules/rules"
    },
    {
      "commit": "649cd3bb08e1c4ecc1524cc016c7aa27a75d2193",
      "id": "yara-x",
      "kind": "engine",
      "repository": "VirusTotal/yara-x"
    }
  ],
  "files": [
    {
      "bytes": 27570,
      "path": "rules/community/antidebug_antivm/antidebug_antivm.yar",
      "sha256": "f3ee419817136b14253a1b9b1b1d0f36de7cb61b35539b2f9c643c102f0c701d",
      "source": "community"
    },
    "... 1173 more entries ..."
  ],
  "rules_root": "16d082395ef1ec53d0ad25d5840d83e7f5f3a75a283ce66f8fa75da106790ec5",
  "log": {
    "origin": "macguard-rules-log v1",
    "root": "1bab9bb9364b3a42f76835ae138bffad33eaa3694d0021afd208f5fd54e63d96",
    "size": 75
  },
  "stats": {
    "expanded_bytes": 7861571,
    "files": 1174,
    "yara_rules": 9958
  },
  "validation": {
    "checked": 1174,
    "engine": "yara"
  },
  "status": "PUBLISHED"
}

Claves del manifiesto: created_at, files, log, rejected, rules_root, schema, sources, stats, status, validation.

Reglas de publicación