{
  "schema": "https://l0g.fr/openapi.json#/components/schemas/IntegritySurface",
  "version": "1.10.0",
  "generated": "2026-07-01T08:37:56.758Z",
  "algorithm": "sha-256",
  "canonicalization": {
    "format": "JSON stable : clés triées récursivement, sans espaces, champ generated ignoré.",
    "ndjson": "NDJSON : lignes JSON dans l’ordre publié, séparées par LF, avec LF final ; les lignes meta NDJSON n’incluent pas generated.",
    "omittedFields": [
      "generated"
    ],
    "reason": "Le champ generated varie à chaque build ; les empreintes visent le contenu utile du snapshot."
  },
  "counts": {
    "snapshots": 17,
    "articles": 44,
    "guides": 17
  },
  "snapshots": [
    {
      "path": "/agents.json",
      "url": "https://l0g.fr/agents.json",
      "role": "Manifeste de découverte agent",
      "mediaType": "application/json",
      "canonicalSha256": "8580f39ec6e05f8552c596a67ade1b2cd098391ca605895bd5deec1140fe21e6",
      "canonicalBytes": 5511
    },
    {
      "path": "/openapi.json",
      "url": "https://l0g.fr/openapi.json",
      "role": "Contrat OpenAPI public",
      "mediaType": "application/json",
      "canonicalSha256": "361aeaa377bb3a9b0c54a7c552c44ba9453603cd519bb1e9b3808a2b6322d7e8",
      "canonicalBytes": 52078
    },
    {
      "path": "/api/v1/catalog.json",
      "url": "https://l0g.fr/api/v1/catalog.json",
      "role": "Catalogue machine complet",
      "mediaType": "application/json",
      "canonicalSha256": "691db11c93258fef1b103901b1e3699aea8a421446f94b32e5805b214e317830",
      "canonicalBytes": 396012
    },
    {
      "path": "/api/v1/catalog.ndjson",
      "url": "https://l0g.fr/api/v1/catalog.ndjson",
      "role": "Catalogue machine en NDJSON",
      "mediaType": "application/x-ndjson",
      "canonicalSha256": "7056befeb08de44bdca000d24d0827035c24ea93a3512cdbb3c5e02eedd29fab",
      "canonicalBytes": 390388
    },
    {
      "path": "/api/v1/claims.json",
      "url": "https://l0g.fr/api/v1/claims.json",
      "role": "Graphe affirmation-source",
      "mediaType": "application/json",
      "canonicalSha256": "a1ce766a6de0ef9e6e7186f4ec9d809c640b682f6333f59d2b6941104b252984",
      "canonicalBytes": 311619
    },
    {
      "path": "/api/v1/claims.ndjson",
      "url": "https://l0g.fr/api/v1/claims.ndjson",
      "role": "Claims en NDJSON",
      "mediaType": "application/x-ndjson",
      "canonicalSha256": "f22606c971157e4584ee8f6e66f6f13ba4a7baaab736e1548d9f129d4d95d004",
      "canonicalBytes": 218024
    },
    {
      "path": "/api/v1/evidence-graph.json",
      "url": "https://l0g.fr/api/v1/evidence-graph.json",
      "role": "Evidence graph",
      "mediaType": "application/json",
      "canonicalSha256": "75df9af0e33998c1afaa3c1a383a342553f3125bb6e5c436ae30f5a6e82f0787",
      "canonicalBytes": 282974
    },
    {
      "path": "/api/v1/evidence-graph.ndjson",
      "url": "https://l0g.fr/api/v1/evidence-graph.ndjson",
      "role": "Evidence graph en NDJSON",
      "mediaType": "application/x-ndjson",
      "canonicalSha256": "551fe7df8a1db20a44e2e781feed59e64f58bed174b4580140ce47e8d6c0f678",
      "canonicalBytes": 297656
    },
    {
      "path": "/api/v1/sources.json",
      "url": "https://l0g.fr/api/v1/sources.json",
      "role": "Registre sources et hôtes cités",
      "mediaType": "application/json",
      "canonicalSha256": "65a1958a7fa9e41178e0741bd9116bf10eb090f162fc1cb4a1f0c60977f78355",
      "canonicalBytes": 23993
    },
    {
      "path": "/api/v1/freshness.json",
      "url": "https://l0g.fr/api/v1/freshness.json",
      "role": "Fraîcheur corpus",
      "mediaType": "application/json",
      "canonicalSha256": "9ac74b85e1be77be28b4b80785ca133de4f35253bfca63af75d5c76e0519dd8f",
      "canonicalBytes": 11203
    },
    {
      "path": "/api/v1/changes.json",
      "url": "https://l0g.fr/api/v1/changes.json",
      "role": "Changefeed machine",
      "mediaType": "application/json",
      "canonicalSha256": "2bd7c89affe9b2de9ce2434dd34d08eef30c229061ccdc8ca44786e52dd440de",
      "canonicalBytes": 57117
    },
    {
      "path": "/api/v1/changes.ndjson",
      "url": "https://l0g.fr/api/v1/changes.ndjson",
      "role": "Changefeed machine en NDJSON",
      "mediaType": "application/x-ndjson",
      "canonicalSha256": "fd95f5aa661a9b79a2b5e2942449ebf7c8a07f360eaa2e321dae23dc863da7a5",
      "canonicalBytes": 58056
    },
    {
      "path": "/api/v1/signals/current.json",
      "url": "https://l0g.fr/api/v1/signals/current.json",
      "role": "Dernières observations point-in-time par instrument",
      "mediaType": "application/json",
      "canonicalSha256": "a01874ae8bf01628a6f383121d0e828170d10d058622ea51b911bbda72f33bf7",
      "canonicalBytes": 5727
    },
    {
      "path": "/api/v1/signals/history.json",
      "url": "https://l0g.fr/api/v1/signals/history.json",
      "role": "Historique des signaux",
      "mediaType": "application/json",
      "canonicalSha256": "446c5fce5674ab23fa417384f52b92ba8fb5e0e31679ff63bd814ad57901fa02",
      "canonicalBytes": 12786
    },
    {
      "path": "/api/v1/signals/history.ndjson",
      "url": "https://l0g.fr/api/v1/signals/history.ndjson",
      "role": "Historique des signaux en NDJSON",
      "mediaType": "application/x-ndjson",
      "canonicalSha256": "2ebce153a3b76137e9f58818f306af91a30e23fcf54a07dee3590e9773629ea1",
      "canonicalBytes": 7240
    },
    {
      "path": "/api/v1/signals/history.csv",
      "url": "https://l0g.fr/api/v1/signals/history.csv",
      "role": "Historique des signaux en CSV",
      "mediaType": "text/csv",
      "canonicalSha256": "ad0aa865717fae7f45082a9d1f1a56c8d10693f3d31b3679102de7c16e04dbe3",
      "canonicalBytes": 1616
    },
    {
      "path": "/api/v1/signals/schema.json",
      "url": "https://l0g.fr/api/v1/signals/schema.json",
      "role": "Schéma historique des signaux",
      "mediaType": "application/json",
      "canonicalSha256": "5d9194340c8efc90520cf413fbac32dc57240fe87a3a36a4066689b185493365",
      "canonicalBytes": 1325
    }
  ],
  "verification": {
    "rule": "Récupérer le JSON, supprimer récursivement les champs generated, trier les clés, sérialiser sans espaces, puis calculer SHA-256.",
    "caveat": "Ces empreintes vérifient les surfaces Agent Surface ; les fichiers externes conservent leur propre politique de version."
  },
  "externalAuthenticity": {
    "status": "github-sigstore-attestation-configured",
    "mechanism": "GitHub Artifact Attestations / Sigstore, émises par le workflow de build avec OIDC GitHub Actions.",
    "subjects": [
      "/agents.json",
      "/openapi.json",
      "/api/v1/integrity.json"
    ],
    "currentGuarantee": "Les hashes publiés sur l0g.fr vérifient la cohérence canonique des artefacts servis ; le workflow GitHub signe extérieurement les manifests principaux par attestation Sigstore.",
    "missingGuarantee": "Une copie locale construite hors CI peut ne pas avoir d’attestation distante ; l’attestation doit être vérifiée côté GitHub pour le commit publié.",
    "verification": "Vérifier les attestations GitHub du commit publié sur le dépôt bluetouff/l0g pour les sujets /agents.json, /openapi.json et /api/v1/integrity.json, puis comparer les SHA-256 canoniques exposés.",
    "recommendedNextSteps": [
      "Publier un lien de vérification des attestations depuis la page données.",
      "Étendre l’attestation à tous les snapshots JSON et NDJSON si le volume reste acceptable.",
      "Publier périodiquement les empreintes dans un canal social vérifié."
    ]
  },
  "license": "CC BY 4.0",
  "attribution": "l0g.fr"
}
