verify.py lit un journal public (CSV ou JSON), recalcule chaque empreinte (RFC 8785 JCS + SHA-256), contrôle la continuité de la chaîne et retrouve les totaux par genre. Bibliothèque standard de Python seulement.
Python 3.8 ou plus. Le code de sortie vaut 0 si la chaîne est intègre, 1 sinon ; avec --attendu, 1 aussi si la tête diffère.
python3 verify.py journal.json --attendu <tete_hex>Un tableau d'expressions, chacune avec ses dix champs et son empreinte. En CSV, les mêmes colonnes, une ligne par expression.
channel, created_at, event_id, genre, participation_id, prev_hash, quantity, seq, tenant_id, transaction_ref_hash — triés par nom, sérialisés sans espace, entiers seulement.
Le dépôt publie trois expressions figées et leurs empreintes. Si ton vérificateur donne autre chose sur ces vecteurs, ce n'est pas le journal qui a un problème : c'est ton installation.
Le nombre de lignes, la tête recalculée, les totaux par genre, puis chaque écart avec son numéro de ligne, et enfin « intègre » ou « ROMPUE ».
Le même contrat est exécuté en Node (plateforme) et en Python (vérificateur) sur les vecteurs à chaque intégration. Un octet d'écart casse la construction.