Quand compliance pose une question sur une décision d'il y a 18 mois
Un client a été rejeté il y a 18 mois. Compliance, l'audit interne ou un régulateur pose la question que chaque organisation finit par affronter :
Pourquoi ce client a-t-il été rejeté ?
Le decision log répond avec ce qui s'est passé à la couche opérationnelle :
decision = REJECTED
rule = R-182
timestamp = 2025-02-14T09:12:00Z
L'étape naturelle suivante est de regarder la règle R-182. Mais R-182 a pu être modifiée plusieurs fois depuis 2025-02-14. Et des overrides peuvent avoir été en vigueur à ce moment qui ne sont plus visibles aujourd'hui, ou des overrides peuvent être actifs maintenant qui n'étaient pas en vigueur à ce moment.
Ce que la vue actuelle de R-182 montre n'est pas nécessairement ce sur quoi la décision a été basée.
Et R-182 n'était peut-être même pas la règle gagnante. Plusieurs règles s'appliquaient probablement simultanément :
R-182 → ALLOW
R-431 → REVIEW
R-817 → BLOCK
règle de précédence → R-817 gagne
La vraie question n'est pas que dit R-182 aujourd'hui ? C'est :
Pouvez-vous reconstruire la décision policy telle qu'elle a réellement été prise, pas l'expliquer en utilisant la policy d'aujourd'hui ?
Le problème de reconstruction
Dans beaucoup d'architectures, reconstruire une décision historique exige de recoller plusieurs sources :
decision logs ce qui a été écrit dans le storage
+
versions de règles quelles règles existaient à cet instant
+
overrides quelles exceptions étaient actives
+
contexte quels faits étaient disponibles
+
approbations quelles décisions humaines avaient été enregistrées
+
config de précédence comment les ties étaient cassés
=
décision telle qu'elle s'est produite
Chacune de ces sources vit dans un système différent, souvent avec sa propre policy de rétention. La reconstruction est faisable, mais coûteuse et fragile.
Knowledge traite la reconstruction comme une propriété native de chaque décision, pas comme un effort d'engineering downstream.
Ce que Knowledge préserve pour chaque décision
Chaque appel /check et /resolve qui produit un verdict écrit une ligne Consultation qui fige :
- Le contexte envoyé par le caller - tous les faits, leurs sources, leur verification status
- Les versions de règles applicables à cet instant (snapshots immuables)
- La règle dominante et le trace de précédence qui y a mené
- Les overrides en vigueur et comment ils ont neutralisé ou shapé le résultat
- Le scope schema en effet pour ce tenant
- Un normative hash - agrégat SHA-256 des versions de règles citées + overrides actifs + configuration de précédence + flags universal-rule
Étant donné un consultation_id, la décision peut être reconstruite exactement. Pas par inférence de logs. À partir d'un état gelé.
Replay d'une décision
Étant donné un ID de consultation, Knowledge retourne la décision telle qu'elle s'est produite :
Decision : BLOCKED
Consultation : cns-9a8b7c
Decided at : 2025-02-14T09:12:00Z
Applicable rule versions :
R-182 v4 (severity: informative)
R-291 v7 (severity: hard_block)
R-817 v2 (severity: absolute_ban)
Overrides in force :
aucun
Dominating rule : R-817 v2
Precedence tie-broken by : severity (absolute_ban > hard_block > informative)
Context at decision :
jurisdiction = FR
client_type = individual
pep_match = true (source: screening_vendor)
risk_score = 0.83 (source: risk_engine)
Approval trail : aucun requis
Normative hash : sha256:9f2a...
Tout ce dont la reconstruction a besoin est dans une seule requête, peuplé depuis un état qui a été gelé au moment de décision. La règle R-817 est maintenant en v4 en production ; la Consultation retourne toujours v2 parce que c'est ce qui s'appliquait.
Expliquer et la policy et la décision
Deux questions différentes portent des réponses très différentes. Knowledge les sépare pour que chacune ait une surface first-class.
| Question | Où ça vit | Ce que ça explique |
|---|---|---|
| Pourquoi l'organisation a-t-elle adopté cette policy ? | Le governance_log de la Policy - une liste ordonnée d'actes d'adoption, amendement, renouvellement et retrait, chacun avec actor, date et rationale. | L'histoire propre de la policy : qui l'a changée, quand, pourquoi. Driver réglementaire, décision interne, process d'exception. Jamais lu par le moteur. Rendu dans l'UI registry comme un header ambre au-dessus de la liste de règles. |
| Pourquoi ce cas spécifique a-t-il eu ce résultat ? | La Consultation - versions de règles citées, trace de précédence, overrides, contexte, approbations. Lu par le moteur au moment de replay. | L'histoire technique de la décision : quelles règles s'appliquaient, ce qui a gagné, pourquoi, sur quel contexte. |
Le governance log répond à « pourquoi cette règle existe ? » La Consultation répond à « pourquoi cette règle a-t-elle fired sur ce cas ? » Les équipes compliance ont besoin des deux, depuis la même surface d'audit.
Comment le replay reste déterministe à travers les années
| Propriété | Ce que ça veut dire pour le replay |
|---|---|
| Versioning immuable par design | Chaque changement à une Rule crée une nouvelle RuleVersion. Les versions précédentes ne sont jamais réécrites. Une Consultation qui a cité une version antérieure continue de pointer sur cette version exacte, pour toujours. Même forme pour OverrideVersion. |
| Trace de précédence stockée, pas dérivée | La liste candidate complète, les règles neutralisées, le set effectif, la règle gagnante et le champ de tie-break sont stockés sur la Consultation elle-même. Rendus comme JSON structuré à côté du verdict, ou comme prose via /reason pour une narration humaine. Pas recalculée au moment de replay. |
| Approbations et overrides comme objets first-class | Les deux sont queryables, versionnés, et liés à la Consultation qu'ils ont résolue. Une Approval enregistre les règles déclenchantes, le requester, le decider, le résultat, le commentaire de décision. Un Override a sa propre chaîne de versions et s'applique dans un scope déclaré pour une fenêtre de temps déclarée. |
| Rétention comme choix de déploiement | Consultations, versions de règles et events sont retenus selon la policy configurée du tenant. Tant que la Consultation est retenue, la reconstruction lit l'état gelé. |
Vérification cryptographique (quand signed-verdict est activé)
Quand le déploiement a le verdict signing configuré, chaque champ audit-relevant de la décision (action, actor, resource, parameters, outcome, versions de règles citées, normative hash) est inclus dans une enveloppe JWS ES256 signée par la clé privée du tenant. Voir Enforcement.
Ça ajoute à l'histoire d'audit :
- Tamper-evident. Toute modification des champs de décision enregistrés invalide la signature.
- Vérifiable indépendamment. Un auditeur peut vérifier une décision depuis cold storage, des années plus tard, contre le JWKS du tenant, sans aucune dépendance à ce que Knowledge soit en ligne.
Related
| À lire ensuite | Pourquoi |
|---|---|
| Enforcement | Verdicts signés et la chaîne de confiance à quatre acteurs |
| Progressive context | Comment le côté contexte de l'audit trail est peuplé |
| Overrides, approbations, pauses | La surface d'authorship, versioning et approbation en profondeur |
| Product | La boucle de décision pour agents IA rule-governed |
