Preuve vérifiable

Le pack de preuve scellé

Un verdict sans preuve est une opinion. Chaque validation peut émettre un pack signé qui dit quel document a été jugé, contre quelles règles exactement, par quel moteur, et ce qu'il a répondu — vérifiable par un tiers sans nous appeler.

Ce qui entre dans le sceau

Chaque étage apporte une empreinte. Le sceau final les couvre toutes : changer un octet à n'importe quel étage change le sceau.

  1. 1

    Le document

    SHA-256 du fichier déposé, sa taille, son format et son profil. Le document lui-même n’entre pas dans le pack — seulement son empreinte.

  2. 2

    Le socle

    L’identifiant du jeu de règles, son empreinte, sa date d’effet, et l’empreinte de chaque artefact exécuté.

  3. 3

    Le moteur

    Le nom et la version du processeur, et si le verdict a bien été rendu contre les artefacts du manifeste.

  4. 4

    Le verdict

    Le statut, le nombre d’erreurs, d’avertissements et de règles passées.

  5. 5

    L’intégrité

    Le SHA-256 d’une forme canonique du pack : une suite de lignes ordonnée, indépendante de la mise en forme JSON.

  6. 6

    La signature

    Une Ed25519 sur cette empreinte, avec l’identifiant de la clé qui l’a produite.

Ce que contient un pack

Celui-ci a réellement été émis par le pipeline. Sa clé de signature est engendrée pour la génération et n’est publiée dans aucun JWKS : il montre la forme, il ne se vérifie pas.

document.sha256
6ad797b11ee5f072bbfd3f41f9e03e4d5d037d1a1988fc7dcb221d082956f60f
ruleset.id
eu-en16931-2026-08
ruleset.sha256
3433666fbc3699ef3e194c56f4151c484f2b689cb9c352cfd269be1009b4c6e6
engine.version
saxon-12.5
verdict.status
needs_input
verdict
1 err · 0 warn · 65 pass
integrity.hash
8ea5a64a9154bb56678d8844bc3c9218c89efe81084bbe59bb958070c92e1d0c
signature.alg
EdDSA

Ce pack a été rendu contre eu-en16931-2026-08. Un socle publié est immuable : le même fichier, épinglé sur ce même identifiant, rendra le même verdict tant que les artefacts sont conservés — dix ans, la durée d’archivage fiscal.

Le pack, champ par champ
{
  "version": "2",
  "sealed_at": "2026-08-21T02:14:52Z",
  "document": {
    "sha256": "6ad797b11ee5f072bbfd3f41f9e03e4d5d037d1a1988fc7dcb221d082956f60f",
    "bytes": 14619,
    "format": "pdf",
    "syntax": "cii",
    "profile": "urn:cen.eu:en16931:2017"
  },
  "ruleset": {
    "id": "eu-en16931-2026-08",
    "sha256": "3433666fbc3699ef3e194c56f4151c484f2b689cb9c352cfd269be1009b4c6e6",
    "sealed": true,
    "effective_from": "2026-08-01",
    "artifacts": [
      {
        "name": "saxon-he",
        "version": "12.5",
        "sha256": "98c3a91e6e5aaf9b3e2b37601e04b214a6e67098493cdd8232fcb705fddcb674"
      },
      {
        "name": "schematron-cen",
        "version": "1.3.16",
        "sha256": "f821ce9320acc219081197ec893d7d3e8276ccd011fdff56c50e4f08b5a72fd0"
      }
    ]
  },
  "engine": {
    "name": "factlint-saxon",
    "version": "saxon-12.5",
    "pinned": true
  },
  "verdict": {
    "status": "needs_input",
    "errors": 1,
    "warnings": 0,
    "passes": 65
  },
  "integrity": {
    "alg": "SHA-256",
    "hash": "8ea5a64a9154bb56678d8844bc3c9218c89efe81084bbe59bb958070c92e1d0c"
  },
  "signature": {
    "alg": "EdDSA",
    "key_id": "example-key-not-published",
    "value": "cuE7ZNrOutWJdM5Kan7QVorKx7hTP6ftIMjSBUaTOd-rUMZU4odsNMK1yiHduYHycnOoxp32qqrO6lvC61EyCg"
  }
}

Comment vérifier un sceau

  1. 1

    Recalculer l’empreinte

    Reconstruire la forme canonique du pack et en prendre le SHA-256. Elle doit être identique au champ integrity.hash.

  2. 2

    Récupérer la clé publique

    Le JWKS publie les clés actives et révoquées. Celle qui a signé est désignée par signature.key_id.

  3. 3

    Vérifier la signature

    Une vérification Ed25519 standard, avec la bibliothèque de votre choix. Rien de propriétaire, aucune dépendance à nous.

Ou en un appel
Ed25519
curl -X POST https://api.factlint.com/v1/evidence/verify \
  -H 'Content-Type: application/json' \
  -d @pack.json

La vérification est gratuite et sans clé : elle ne nous transmet aucun document et ne demande aucune confiance, donc elle ne se paye pas.

https://api.factlint.com/.well-known/evidence-jwks.json

Les questions qu’on nous pose

Peut-on vérifier hors ligne ?

Oui, et c’est le but. Le pack porte tout ce qu’il faut ; la clé publique est un fichier statique à mettre en cache une fois. Une vérification Ed25519 ne touche aucun réseau. L’endpoint existe pour la commodité, pas parce qu’il serait nécessaire.

Que se passe-t-il si Factlint disparaît ?

Les packs déjà émis restent vérifiables : ils ne dépendent d’aucun service. Ce qui disparaîtrait est la capacité à en émettre de nouveaux, et à rejouer une validation — le pack prouve alors ce qui a été jugé, mais plus personne ne peut le refaire. C’est pourquoi les empreintes d’artefacts y figurent : elles désignent des paquets publiés ailleurs, chez le CEN, le FNFE ou le KoSIT.

Le document est-il dans le pack ?

Non, seulement son empreinte. Un pack ne révèle donc ni un nom de client, ni un montant, ni un IBAN, et peut circuler sans précaution. En contrepartie, c’est à vous de conserver le fichier : sans lui, l’empreinte ne se recalcule pas.

Quelle valeur juridique ?

C’est une preuve technique, pas une certification. Le pack établit ce que notre moteur a fait, quand, et contre quelles règles — et qu’aucun de ces éléments n’a été modifié depuis. Il ne rend pas une facture conforme, ne vaut pas signature électronique qualifiée au sens eIDAS, et ne remplace aucune obligation de transmission. Ce qu’il apporte devant un contrôle ou un litige est la traçabilité : quelle version des règles s’appliquait ce jour-là, et ce qu’elle a répondu.

Une clé révoquée invalide-t-elle les anciens packs ?

Non. Une clé révoquée reste publiée dans le JWKS, précisément pour que les packs qu’elle a signés restent vérifiables. La révocation dit qu’on ne signe plus avec elle, pas que ce qu’elle a signé cesse d’être vrai.

La référence complète des endpoints →