{
  "schema": "https://l0g.fr/openapi.json#/components/schemas/IntegritySurface",
  "version": "1.10.0",
  "generated": "2026-07-15T00:53:08.295Z",
  "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": 71,
    "guides": 37
  },
  "snapshots": [
    {
      "path": "/agents.json",
      "url": "https://l0g.fr/agents.json",
      "role": "Manifeste de découverte agent",
      "mediaType": "application/json",
      "canonicalSha256": "9fb1f3406d6ee7015060665c8367a0869cc8bad0370d2d8b98194275019df808",
      "canonicalBytes": 6173
    },
    {
      "path": "/openapi.json",
      "url": "https://l0g.fr/openapi.json",
      "role": "Contrat OpenAPI public",
      "mediaType": "application/json",
      "canonicalSha256": "548126d7534cf685d7c40887caf13731bf028c377b624dba69fb4e9e15c6c728",
      "canonicalBytes": 70454
    },
    {
      "path": "/api/v1/catalog.json",
      "url": "https://l0g.fr/api/v1/catalog.json",
      "role": "Catalogue machine complet",
      "mediaType": "application/json",
      "canonicalSha256": "97dcb128d93997e438a276e5834157e03838cb549d3e38f41a48ec2950293fa1",
      "canonicalBytes": 962738
    },
    {
      "path": "/api/v1/catalog.ndjson",
      "url": "https://l0g.fr/api/v1/catalog.ndjson",
      "role": "Catalogue machine en NDJSON",
      "mediaType": "application/x-ndjson",
      "canonicalSha256": "bdf814c30d9d8a2f2d4940cfdecfad3cf1662f96a676560017b6f00fcd0761f9",
      "canonicalBytes": 957218
    },
    {
      "path": "/api/v1/claims.json",
      "url": "https://l0g.fr/api/v1/claims.json",
      "role": "Graphe affirmation-source",
      "mediaType": "application/json",
      "canonicalSha256": "56a358ecf5164ad314618f8edb6674c1445dcc91570af741131ba03c4cc6a910",
      "canonicalBytes": 739962
    },
    {
      "path": "/api/v1/claims.ndjson",
      "url": "https://l0g.fr/api/v1/claims.ndjson",
      "role": "Claims en NDJSON",
      "mediaType": "application/x-ndjson",
      "canonicalSha256": "f253196057f762d330774c52440cce6293461a9de2b98e1097ff3464cb788a4f",
      "canonicalBytes": 526979
    },
    {
      "path": "/api/v1/evidence-graph.json",
      "url": "https://l0g.fr/api/v1/evidence-graph.json",
      "role": "Evidence graph",
      "mediaType": "application/json",
      "canonicalSha256": "93dec4af0a0c39a790fb340012156644e9c116a64881eec5e6f82d9f13d20052",
      "canonicalBytes": 680324
    },
    {
      "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": "21198fca90b6e7c020e222bb821219698959d4ccb10ed0f8596d7bfc0051ab82",
      "canonicalBytes": 714206
    },
    {
      "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": "aa47118c8ade8e857acf0304562c598f1e3c432ee5b62bbdbe5060bd01ce9331",
      "canonicalBytes": 27063
    },
    {
      "path": "/api/v1/freshness.json",
      "url": "https://l0g.fr/api/v1/freshness.json",
      "role": "Fraîcheur corpus",
      "mediaType": "application/json",
      "canonicalSha256": "9cfc6b7b7e474477ce3d6ae5d51025b14959add2d172e45e0ab83bebb0c0b10a",
      "canonicalBytes": 11749
    },
    {
      "path": "/api/v1/changes.json",
      "url": "https://l0g.fr/api/v1/changes.json",
      "role": "Changefeed machine",
      "mediaType": "application/json",
      "canonicalSha256": "63da86468fcce61c7e00020ba859aa9a60e9cf74e0ba2fb51745d7fa997b65ab",
      "canonicalBytes": 104770
    },
    {
      "path": "/api/v1/changes.ndjson",
      "url": "https://l0g.fr/api/v1/changes.ndjson",
      "role": "Changefeed machine en NDJSON",
      "mediaType": "application/x-ndjson",
      "canonicalSha256": "1b516aa184ccfb4d11d9a209642a8afefedc18f30718153fdddf473fbd311ead",
      "canonicalBytes": 106963
    },
    {
      "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": "d3b5e9db11bffdfa8369ee79c7234505a2a4b6b38b620dd6740d27049fa92846",
      "canonicalBytes": 5724
    },
    {
      "path": "/api/v1/signals/history.json",
      "url": "https://l0g.fr/api/v1/signals/history.json",
      "role": "Historique des signaux",
      "mediaType": "application/json",
      "canonicalSha256": "b2eb8cfc073020e2eac2f25149ad9615ba26e078bc07442cb153b15ebe7a2df9",
      "canonicalBytes": 12780
    },
    {
      "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": "df5b5bf5d0c7a75001e70a05c0be6ccb53cf8ea2d5814696852e2a51e8c6bc2c",
      "canonicalBytes": 7237
    },
    {
      "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": "246b9865936c87315af55f4dd714b6588a8ad63934c763c474bdb1b4e9f4fbdc",
      "canonicalBytes": 1613
    },
    {
      "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"
}
