Aller au contenu principal

Vérifier sans nous faire confiance

Une garantie d'inaltérabilité qu'on ne peut contrôler qu'en exécutant le code de celui qui la revendique ne garantit rien. C'est pourquoi Kastell publie un vérificateur indépendant.

Le vérificateur

outils/verifier-journal.mjs

  • 149 lignes, aucune dépendance, ne parle à aucun serveur.
  • Publié sous CC0 1.0 — domaine public. Copiez-le, lisez-le, réécrivez-le.
node outils/verifier-journal.mjs journal-de-crise.json

Il vérifie : la séquence sans trou, la chaîne d'empreintes, et la concordance entre chaque événement et son empreinte. Il détecte un contenu modifié, une troncature de fin, un trou au milieu.

Le calcul, en dix lignes

Chaque événement porte l'empreinte SHA-256 de :

[empreinte précédente, ou l'octet 0x00 pour le premier]
++ utf8( crise_id | seq | type | occurred_at | acteur_id | cellule_id
| origine | charge_canonique )

charge_canonique est la forme exacte que PostgreSQL a hachée ; elle est transportée telle quelle dans l'export, précisément pour que le contrôle n'ait à réimplémenter aucune normalisation.

Pourquoi il est sous CC0 et non sous AGPL

Ce fichier existe pour qu'un tiers — auditeur, assureur, partie adverse — contrôle un journal sans nous demander la permission. Le placer sous AGPL ferait dépendre la vérification de nos conditions.

La suite de vérification du produit

pnpm verif

Plus de six cents garanties, chacune rattachée à une exigence du cahier des charges. Elle remet à zéro sa propre base (…_verif, créée au besoin) et ne touche jamais celle de développement, et refuse de s'exécuter si KASTELL_ENV=production.

Elle ne teste pas seulement que les choses marchent, mais que les mauvaises sont refusées : qu'un événement ne peut pas être modifié, qu'une clé d'API ne ressort ni de l'API ni du journal, qu'un envoi de masse sans confirmation du décompte est rejeté.

L'intégrité en service

La console root vérifie tous les journaux de l'instance à la demande, et rend le nombre de crises contrôlées, la durée, et les anomalies s'il y en a.