Document illustratif · adapté

Architecture

Une intention ne devient pas un effet parce qu’un composant a dit oui. Elle traverse une règle, une contrainte, une médiation, un profil, puis un runtime qui sépare juger, muter et prouver.

Sources et contexte de lecture

TENIR / REG — Architecture illustrative ; parcours interactif REG+ v5.6.0 ; démo Execution Control Plane ; KB3, ligne instituée ; dépôts tenir_governance et reg-conformance

Rendu public simplifié, lecture du 19 octobre 2026. KB3 : ligne de rendu doctrinale instituée et active. Elle rend le sens ; elle n’est pas le code, ni une constitution. KB2 : ligne antérieure. Ce site ne certifie aucune implémentation. Lire le statut détaillé →

En une phrase

Cette page explique comment TENIR imagine le passage d’une demande à une action réelle : ce qui est proposé, ce qui est vérifié, ce qui est effectivement envoyé et ce qui peut encore rester inconnu. C’est une carte de conception, pas la preuve qu’un système client fonctionne déjà ainsi.

Comment lire cette page

  • Vous cherchez l’idée : commencez par les trois piliers.
  • Vous cherchez le fonctionnement : lisez les cinq niveaux et les quatre fonctions.
  • Vous cherchez une preuve de version : consultez plutôt la page Statut.
  • Vous cherchez un exemple : ouvrez les démonstrations, qui restent des simulations lorsque cela est indiqué.

Statut du dessin. Classe : illustrative only. Le document source se dit illustratif. Il n’est pas le schéma normatif, ni le YAML du catalogue, ni un rapport d’audit complet. Là où il nomme V « volatilité », la ligne antérieure dit « vitesse ». KB3 ne reformule pas V et interdit de renommer en silence un champ du contrat machine. Le dessin du runtime est conservé. Cette page ne choisit pas un nom souverain pour V.

KB3, les extensions, le code

KB3 est la ligne de rendu doctrinale instituée et active. C’est une couche documentaire, hors du code. Il rend le sens ; il ne crée pas de sens souverain et n’est pas une constitution. Les services ou applications spécialisés l’enveloppent ou l’étendent : ils s’appuient sur KB3 et ne doivent pas le redéfinir. Cette discipline est celle de la politique d’extensions gouvernées et des espaces de noms. TENIR-Gov, ligne IronOmega, est une implémentation du plan de contrôle d’exécution. Elle doit s’aligner sur KB3. Elle n’est pas KB3. Cette page ne cite aucun chemin de code comme module KB3.

Trois piliers de l’écosystème technique

Théorie

Les textes posent le diagnostic et la séparation. Ils disent pourquoi gouverner l’exécution n’est pas réduire le problème à un moteur de politiques.

Standard REG

REG Core pour les invariants. REG+ pour les profils, les hypothèses et les règles de compatibilité. Le profil σ est un contrat. Les invariants I* sont les primitives.

Runtime TENIR-Gov

Implémentation de référence. Elle évalue, engage, enregistre. Elle ne redéfinit pas le canon.

Cinq niveaux

Niveau 0

Règle métier. Formulée par l’équipe ou le régulateur. Exemple donné : ne pas double-exécuter un paiement. Complète dans son registre, pas encore exécutable.

Niveau 1

Contrainte réglementaire. Le document cite, comme exemples, l’article 12 de l’EU AI Act et l’article 9 de DORA : obligations de traçabilité, de supervision ou de contrôle. Ce site ne vérifie pas ces articles.

Niveau 2

Acte de médiation. Intention métier plus hypothèses d’infrastructure égale règle substantive. La règle devient dépendante du déploiement.

Niveau 3

REG Core et REG+. Resolve(i, h, R, V) → Profile(σ, I*). Le profil est le contrat. Les invariants sont exécutables.

Niveau 4

Runtime. Evaluate produit un verdict. Commit tente la mutation. Record produit une preuve reconstructible.

La ligne antérieure décrit la même séparation en trois couches d’implémentation : interprétative, constitutionnelle, gouvernance. Le principe qu’elle formule : le modèle propose, la couche constitutionnelle adjudique, la couche de gouvernance applique, l’humain responsable reste comptable. KB3 exige de garder cette asymétrie visible. Une explication assistée par modèle ne remplace pas l’adjudication de la posture, de la conformité, de la dégradation ou de la trace.

Quatre fonctions

Evaluate()

Fonction pure. Elle lit le profil, les invariants, l’état s et la transition proposée. Elle ne modifie rien. Verdicts : PASS, FLAG, HOLD, HARD_VETO.

Commit()

Fonction mutative. Si elle échoue, le résultat effectif n’est pas un PASS. Issues nommées : COMMITTED, FAILED_RACE, FAILED_CONSTRAINT, SKIPPED.

Record()

EvidenceRecord : contexte, entrées, résultats, trace de commit, hash, signature. Le contrat vise une preuve qu’un tiers peut rejouer. SHA-256, Ed25519 et JCS sont les moyens nommés, pas une certification obtenue.

Assure()

Service qui observe l’infrastructure et injecte des signaux attestés. Le moteur ne détecte pas lui-même la violation d’une hypothèse de déploiement. Signaux : HYPOTHESIS_VERIFIED, WEAKENED, VIOLATED.

Signaux

FamilleOrigineNature
S1Passage proposéDéclarative. Peut être fausse ou mal formée. Exemples : agent, type d’action, montant, clé d’idempotence.
S2État métierObservée. Doit être fraîche. Exemples : ressource disponible, quarantaine, score d’autorité.
S3Assure()Attestée. Fraîcheur à vérifier.
S4Registre durableHistorique. Base de l’idempotence et de la reconstruction.

Ces quatre familles ne sont pas le scénario de laboratoire « S1 — Evidence Lost After Commit ». Le même identifiant désigne, selon le document, une famille de signaux ou un cas de conformance. Les deux usages coexistent. Il faut les lire dans leur fichier.

Chaîne

0

Observation brute des quatre familles.

1

Normalisation en coordonnées. Une coordonnée absente devient unmeasured, jamais une valeur favorable.

2

Score continu. Le score n’est pas le verdict.

3

Invariants discrets, indépendants du score.

4

Composition : treillis, réactions de signaux du profil, fraîcheur.

5

Commit, seulement si la mutation est autorisée.

6

EvidenceRecord.

7

Après coup : classe de réversibilité τ⁻¹ et EVP. Rétrospectif. Sans droit d’écriture sur le verdict.

Double noyau

Le double noyau n’oppose pas « structurel » et « substantif ». Il sépare un score continu et une membrane d’invariants discrets. Aucun invariant ne lit le score.

Score

S = K / (P · V + ε)

Dans ce dessin, V est appelé volatilité. La ligne antérieure l’appelle vitesse. Les deux noms restent visibles. Les seuils τ_pass et τ_block du dessin sont des paramètres du runtime, pas les postures NORMAL / CAUTION / HOLDING-FIRST. PASS, FLAG, HOLD et HARD_VETO sont des dispositions, pas ces postures.

Membrane

Exemples cités : I1 permis à usage unique, I2 liaison d’engagement, I6 pas d’admission sous quarantaine, I8 budget agrégé, I9 cohérence temporelle de trajectoire. La liste complète dépend du profil.

Si l’un dit HARD_VETO → HARD_VETO
sinon si l’un dit HOLD → HOLD
sinon si l’un dit FLAG → FLAG
sinon → PASS

Ensuite, une réaction explicite du profil peut encore modifier la décision. Sans règle dans σ, un signal est ignoré. Exemple donné : HYPOTHESIS_VIOLATED frais peut imposer HARD_VETO.

États, à part des verdicts

Le verdict autorise, suspend ou refuse. L’état opérationnel décrit la vie de l’opération : CREATED, RESERVED, DISPATCHING, puis CONFIRMED ou FAILED, avec UNKNOWN, HOLD et ESCALATED pour l’incertitude. Un fournisseur silencieux n’est pas un succès.

Preuve et après-coup

L’EvidenceRecord sépare le contexte d’évaluation, les entrées, les résultats — dont le détail par invariant, pas un booléen global —, la trace de commit et l’intégrité. τ⁻¹ classe PRE_COMMIT, EXACT_INVERSE, COMPENSATION, IRREVERSIBLE, INDETERMINATE. INDETERMINATE n’est pas IRREVERSIBLE : l’ignorance n’est pas la preuve d’un non-retour. EVP distingue valeur visée, valeur réalisée, perte d’exécution et friction rapportée à part. Le dépôt tenir_governance dit qu’EVP lit les enregistrements sans chemin d’écriture vers le verdict.

Démonstration du plan de contrôle

Trois artefacts accompagnent ce dessin. Ils sont illustrative only. Leurs verdicts PASS, FLAG, HOLD et HARD_VETO sont des dispositions d’exécution. Ils ne remplacent pas les postures NORMAL, CAUTION et HOLDING-FIRST. Le HOLD d’une opération n’est pas la posture HOLDING-FIRST.

La démo dessine deux noyaux, puis un treillis. Le noyau 1 calcule S = K / (P·V + ε). Le paramètre d’appel montré s’appelle velocity. Le parcours interactif écrit, pour la même lettre, « Velocity / Volatility ». KB3 ne reformule pas V. Cette page ne choisit pas un nom. Le noyau 2, dans la démo, vérifie les invariants I3 à I9. Le parcours interactif liste I1, I2, I3, I4, I6, I7, I8 et I9, et ne nomme pas I5. Les deux listes restent visibles. Aucun invariant ne lit le score.

Le treillis de la démo et du parcours est le même que celui du dessin : HARD_VETO l’emporte, puis HOLD, puis FLAG, sinon PASS. Un score élevé ne garantit pas PASS. Si un noyau échoue, si une donnée manque, ou si l’issue est indéterminée, la démo dit que la composition produit HOLD, jamais PASS.

Les six scènes, attribuées à la démo et non rejouées ici :

  1. Opération admissible. Un paiement de 10 sur une capacité de 100. Le noyau de score renvoie FLAG, la membrane PASS, la composition FLAG, l’état RESERVED, puis CONFIRMED après dispatch. La clé d’idempotence est réclamée à CREATED, avant l’évaluation.
  2. Doublon bloqué. La même clé, soumise encore, reçoit HARD_VETO. La reprise passe par resume_existing(), pas par une nouvelle adjudication.
  3. Cycle de HOLD. Suspension par opération, avec τ_K, distincte de QUARANTINE_LOCK, qui bloque toute admission pour une entité. Sorties montrées : RESERVED si la preuve suffit, ESCALATED vers un officier du risque, FAILED si τ_K expire. ESCALATED n’a pas de sortie automatique par le temps. L’expiration dans cet état produit UNKNOWN, pas une résolution. Ce HOLD est un état d’opération.
  4. Mémoire ou persistance. Sans store_path, un redémarrage perd la réclamation et la seconde adjudication peut revenir FLAG. Avec un magasin, elle revient HARD_VETO. require_persistence=True sans chemin lève ValueError. Depuis le correctif cité par la démo, l’absence de magasin émet un UserWarning.
  5. Délai, puis réconciliation. Un timeout de fournisseur mène à UNKNOWN, pas à FAILED. UNKNOWN n’est pas terminal. La réconciliation montrée peut confirmer que l’effet a eu lieu. Traiter le silence comme un échec pourrait doubler l’effet.
  6. Frontière de garantie. Au plus un dispatch par la porte de gouvernance, sur un seul hôte. La composition fail-closed et les invariants obligatoires sont locaux. La coordination inter-hôtes demande une infrastructure distribuée. L’effet externe exactly-once dépend du fournisseur. L’intégrité d’un artefact PyPI dépend de l’écosystème d’empaquetage. Une décision de gouvernance ne prouve pas, à elle seule, qu’un effet externe a eu lieu exactement une fois.

Le parcours interactif ajoute, comme limites qu’il appelle lui-même ouvertes : reconcile_commit() peut violer I8 en ajoutant au committed sans retirer du reserved ; time.time() dans des méthodes @replicated ; pas de validation des montants négatifs ou NaN ; magasins durables non atomiques ; vérificateur de linéarisabilité trop court ; pickle de pysyncobj sans authentification ; formule de quorum f+1 non générale ; Raft essayé sur localhost seulement, preuves auto-attestées, pas de tolérance byzantine. Ce site ne rejoue pas ces défauts. Il ne les déclare pas clos. La page Statut garde l’audit F-01, F-02 et F-03 du dessin illustratif.

Pièges que le dessin demande d’éviter

  • Le catalogue des configurations n’est pas le service Assure.
  • Une interface ConsensusBackend, et l’implémentation Raft 5.6.0, ne sont pas une preuve de consensus en environnement hostile.
  • Un score élevé ne garantit pas PASS. Un invariant peut imposer HARD_VETO seul.
  • admissible_structural n’implique pas effective_guarantee_demonstrated.

L’audit porté par ce document sur la 5.6.0 est résumé dans la page Statut.