ADR 0043 – Bibliothèque CEL des expressions
Statut : Décidée. Date : 02/10/2026. Lot 0 bis, séquence L0-1 ; répond à la question Q2 de la note d’amendement.
Contexte
Section intitulée « Contexte »Les conditions composées des tables de décision sont écrites en CEL (AM-09). Le téléphone et le serveur doivent les évaluer avec la même bibliothèque (P8, AM-10). La note fixe deux critères : un comportement identique dans le navigateur et dans Node, et une taille de paquet acceptable sur le téléphone. Les calculs restent en entiers.
Décision
Section intitulée « Décision »@marcbachmann/cel-js 8.0.0 (MIT, aucune dépendance), version épinglée, dans packages/domain seulement. Elle est encapsulée par le module expressions : verifierExpression (publication : variables toutes déclarées, types, aucun nombre décimal) et evaluerExpression (entiers passés en int 64 bits, variable absente → variable_manquante, PC-07).
Mesures du 02/10/2026, sur un jeu de 30 expressions du sous-ensemble BioTrace (comparaisons, in, has(), macros exists et all, tables, entiers 64 bits, dépassement, division par zéro, court-circuit, syntaxe invalide) :
| Critère | @marcbachmann/cel-js |
@bufbuild/cel 0.6.1 |
|---|---|---|
| Paquet minifié (esbuild) | 82 Ko | 278 Ko |
| Paquet compressé (gzip -9) | 24 Ko | 68 Ko |
| Dépendances | aucune | @bufbuild/re2, @bufbuild/cel-spec, @bufbuild/protobuf |
| Jeu de 30 expressions | 30 résultats | mêmes 30 résultats |
| Node 22 contre navigateur (Chromium) | identiques | identiques |
| Vérification de types avant évaluation | oui (check) |
non exposée simplement |
Alternatives écartées
Section intitulée « Alternatives écartées »@bufbuild/cel: la plus fidèle à la spécification, mais trois fois plus lourde sur le téléphone, en version 0.x, et liée à Protobuf, que BioTrace n’utilise pas.cel-js: dépend deramda, bibliothèque de la famille de Lodash (interdite), et n’est plus mise à jour depuis 07/2025.
Conséquences
Section intitulée « Conséquences »- CEL autorise la comparaison entre
intetdouble: c’estverifierExpressionqui refuse tout littéral décimal, etevaluerExpressionqui refuse toute variable non entière (RangeError). - La détection d’une variable absente lit le message d’erreur de la bibliothèque (« Unknown variable », « No such key »). La version est épinglée et les vecteurs VT-EXPR le vérifient à chaque montée de version.
- Le jeu de mesure est devenu les vecteurs
testdata/domain/expressions(VT-EXPR-001 à 028). Le rejeu dans Chromium a été fait une fois, à la main : l’exécution automatique des vecteurs du domaine dans un navigateur reste à faire (réserve du journal).
Stratégie de sortie
Section intitulée « Stratégie de sortie »Seul packages/domain/src/expressions/index.ts importe la bibliothèque. La remplacer revient à réécrire ce fichier, sous les mêmes vecteurs. Les expressions stockées dans les packs sont du CEL standard, indépendant de l’implémentation.