Chacun est une tranche de la même spirale. Cliquez une étoile pour l'ouvrir plus haut.
Vendoring avec somme de contrôle, jamais d'import live
Aucun sous-module.
Détail et preuve
La plupart des mécanismes communs (garde-fous, vérificateur de jeton, moteur de recherche documentaire, conformité, planificateur, client de stockage, noyau de facturation, registre de provenance) voyagent comme copie octet-à-octet accompagnée d'une somme SHA-256. Les exceptions sont écrites : aiame-one recopie quatre fichiers d'aiame-sov, retouchés, sans somme, et le dit lui-même ; aiame-angel utilise le moteur de résolution aiame-optaplanner par un chemin local ; aiame-apod utilise un petit paquet partagé de l'espace de travail. La somme prouve que la copie n'a pas été bricolée sur place ; elle est aveugle à la dérive amont, et le dépôt canonique le dit lui-même et fournit le script qui la rend visible. Quand un même mécanisme apparaît dans trois dépôts ou plus, un foyer canonique est créé et les copies sont re-vendorisées depuis lui — la dérive trouvée en consolidant est écrite dans le fichier de somme.
vendoring.txt : 38 dépôts sur 39 portent un CANONICAL.sha256 vers aiame-doctrine ; aiame-doctrine/README.md:112-117 (« byte-identical copy, not a submodule … The honest limit of that checksum: it proves the copy was not tampered with locally. It is blind to upstream drift ») ; aiame-doctrine/garde-fous/verifier-copies.sh:54-140 (liste CONSOMMATEURS, éprouvé par mutation le 2026-08-06) ; aiame-auth/verifier/README.md:50-54 (six copies consolidées, une n'exigeait pas l'expiration) ; aiame-rag-core/README.md:20 (supersède aiame-sov-kernel) ; aiame-one/README.md:82-92 §Vendoring debt (models/rag.py, schemas/rag.py, services/rag_service.py, services/llm_provider.py copiés d'aiame-sov « with trims », sans somme) ; aiame-apod/services/apod/frontend/package.json ("@aiame/find-workspace-root": "workspace:*") ; fiche aiame-optaplanner (seul consommateur aiame-angel, dépendance de chemin relatif)
Le triangle : la doctrine définit, aiame-red vérifie les produits, aiame-guard vérifie aiame-red
La doctrine tient un registre de clauses à identifiants stables.
Détail et preuve
aiame-red recopie chaque clause dans sa table de traçabilité et audite six cibles, dont la vitrine publique d'AIAME et son propre document de vision. aiame-guard vérifie que la traçabilité d'aiame-red ne dérive pas, rejoue ses tests chaque semaine et contrôle que ses fiches ne reproduisent pas leur propre lexique. L'épreuve de ce dernier étage (une panne provoquée à la main le 18 septembre 2026, que le portfolio public date du 19, et un courriel d'alerte reçu) est rapportée par le README d'aiame-guard et par le portfolio public du 2026-09-24 : c'est un fait daté, mais il n'est pas rejouable depuis le code.
Un seul service d'authentification, vérifié localement partout
aiame-auth est le seul service d'identité de la flotte : cinq frontaux s'y connectent, et sept services vérifient ses jetons Ed25519 en local, contre la clé publique publiée, sans aller-retour réseau par requête.
Détail et preuve
Le vérificateur est vendorisé avec somme de contrôle ; sa consolidation (six copies indépendantes, 2026-09-11) a révélé qu'une copie acceptait un jeton sans date d'expiration — trouvé en généralisant, corrigé pour tous.
Tout passe par une route Traefik nommée, et le routage est une donnée
Aucune étiquette de conteneur : une seule liste dans aiame-infra déclare chaque route publique (hôte, préfixe, limitation de débit, en-têtes), et le source de chaque service est un checkout frère du même espace de travail.
Détail et preuve
Deux services (Angel, auth) ne sont pas construits sur le serveur public mais relayés vers un serveur AIAME sur le réseau privé, pour que leur base de données n'en sorte jamais — si ce serveur est indisponible, la route répond 502, et le fichier le dit. Deux dépôts (aiame-one, aiame-rag) ne sont pas encore câblés, et c'est écrit au même endroit.
aiame-infra/ansible/roles/vitrine/defaults/main.yml:166-188 (« TRAEFIK ROUTING — file provider, not Docker labels ») ; :20-157 (vitrine_*_src → dépôts frères) ; :159-163 (« NOT wired up yet: aiame-one, aiame-rag ») ; :478-499 (« PROXY TO THE TAILNET … database stays home ») ; aiame-cartographe/backend/aiame_cartographe/parsers/infra_aiame.py:1-19
Le FORK : E3 finance E2, et le grand livre publie gris
Depuis le 2026-07-28, deux branches tournent en quarantaine : E3, cinq services destinés aux entreprises (aiame-red, aiame-sov, aiame-auth, aiame-optaplanner, aiame-fin), et E2, la science du visage et de la main (aiame-core, aiame-miroir, aiame-motion), muette et invendue.
Détail et preuve
Une part fixe des revenus nets E3 est réservée à E2 — le principe est acté, le pourcentage et le mécanisme attendent qu'un revenu existe. Aujourd'hui aucun service n'est vendu : le grand livre suit les cinq services E3, ingère l'export de commandes d'aiame-fin, et la page transparence affiche chaque ligne en gris plutôt qu'un zéro fabriqué.
aiame-doctrine/DECISION-2026-07-28-FORK.md §Decision 1-3 ; aiame-ledger/E3-SERVICES.yml (statut_vente : offered_sandbox_only ×2, not_offered ×3, « sold_real : Aucun service n'est encore ici ») ; aiame-fr.github.io/LEDGER-STATUS.json (« etat »: « gris », « aucun export aiame-fin fourni pour ce run ») ; aiame-ledger/packs/e3/ingest_fin.py:44
Zéro modèle de langage là où une réponse déterministe existe
Le vérificateur du vérificateur, le registre de provenance, le grand livre, le routage vocal par similarité de vecteurs, le solveur avec preuve d'optimalité, la carte de la flotte et la projection d'obligations n'utilisent aucun modèle de langage : leur sortie est rejouable et testable par mutation.
Détail et preuve
Là où un modèle intervient (recherche documentaire, lecture manuscrite, synthèses), il est auto-hébergé sans hôte implicite — l'adresse vide est une abstention déclarée, jamais un repli vers un fournisseur externe, et la classification documentaire d'aiame-knowledge dit elle-même qu'elle est un comptage de mots-clés, pas un modèle.
repos.json rôles : aiame-dream (« Zero LLM, zero serveur »), aiame-voice (« zero LLM »), aiame-guard (« verificateur deterministe, zero LLM ») ; aiame-knowledge/README.md:14-15 (« la classification est un comptage de mots-clés, pas un modèle ») et :41-45 (aucun hôte implicite, aucun provider externe, GF-1) ; aiame-mcp/backend/aiame_mcp/config.py:32 (« never assumed present ») ; aiame-cartographe/README.md (« aucun appel réseau »)
Un seul registre de provenance, né dans aiame-pouls, réutilisé partout
Le triplet Pièce / Fait / Registre de provenance — « expliquer(fait_id) » remonte de tout chiffre à sa pièce — a été construit dans aiame-pouls parce qu'il est le produit, pas une brique technique.
Détail et preuve
Il est vendorisé dans le grand livre (avec une seule règle ajoutée, l'allocation), étendu aux faits texte et géographiques dans aiame-racines, et son module de montants est devenu le noyau de facturation d'aiame-fin, lui-même vendorisé dans aiame-sov. Un défaut trouvé chez un consommateur remonte à la source ultime et redescend, jamais patché sur place.
aiame-ledger/core/provenance.py:3-12 ; aiame-racines/core/provenance.py:3-7 (PRD « Le Pouls » §3.3 : « c'est la seule brique plateforme construite en v1, parce qu'elle EST le produit ») ; aiame-fin/backend/aiame_fin/invoicing_core/montant.py:4-7 ; aiame-sov/backend/aiame_sov/vendored/invoicing_core/CANONICAL.sha256:24-31 (correction remontée à aiame-pouls#13 puis aiame-fin#36)
AIAME se lit et s'audite elle-même avant d'auditer quiconque
Trois lecteurs parcourent la flotte entière sans écrire nulle part.
Détail et preuve
aiame-knowledge inventorie et extrait la documentation de toute l'organisation ; aiame-cartographe lit les checkouts locaux et la table de routes sans jeton ni appel réseau ; le script de vérification des copies d'aiame-doctrine contrôle, depuis le disque, les copies des 34 consommateurs qu'il déclare (33 dépôts et la racine de l'espace de travail ; rejeu du 2026-09-30 : toutes à jour ; 5 dépôts actifs qui portent une copie n'y figurent pas, dont deux restés sur la version du 6 septembre). Les seules cibles de production que l'outil d'audit aiame-red est autorisé à sonder, en lecture seule, sont des hôtes d'AIAME elle-même, nommés par décision datée (sa vitrine, puis sov.services.aiame.fr), et le premier « scan documentaire » publié porte sur son propre document de vision. Le dépôt-carte reconnaît son propre angle mort : il tolère la dérive de l'inventaire, il ne l'alerte pas encore.
aiame-knowledge/backend/aiame_knowledge/inventory.py:13 (get_organization) et env.py:11-13 (« aiame-fr ») ; aiame-cartographe/backend/aiame_cartographe/discovery.py:52-114 et README.md (« Recoupement croisé contre repos.json : ABSENT ») ; aiame-doctrine/garde-fous/verifier-copies.sh:1-28 ; aiame-red/backend/specs/aiame-vitrine.yml:28-33 ; aiame-red/backend/specs/aiame-prd.yml:6-9 ; aiame-doctrine/DECISION-2026-09-14-probe-prod-allowlist.md ; rejeu du 2026-09-30 : copies non déclarées dans aiame-cartographe, aiame-guard, aiame-hand, aiame-registre, aiame-voice, périmées dans aiame-guard, aiame-voice
Une frontière avec le partenaire : des mécanismes, jamais des données
Elzéard est une organisation distincte.
Détail et preuve
AIAME lui destine des mécanismes, jamais ses données : des copies de code pour le stockage (aiame-store) et pour une agrégation de compteurs entre ses clients (aiame-compass, conçu pour ne jamais tourner sur l'infrastructure d'AIAME, et qui ne tourne encore nulle part), la résolution de plannings (aiame-optaplanner), et un service du réseau privé prévu pour l'une de ses interfaces (aiame-voice), qu'aucun produit n'appelle encore. aiame-compass écrit lui-même ce qui manque avant tout déploiement : son seuil de cinq compte des contributions et non des entreprises distinctes, rien n'interdit deux clients déclarés avec la même clé, et son propre code ne porte pas encore d'empreinte. Côté AIAME, un garde-fou (GF-4) bloque tout envoi de code qui contiendrait un identifiant d'accès permanent aux données des clients du partenaire. Les noms réels de ses clients sont interdits dans les sources d'AIAME, et un outil balaie tous les dépôts de l'inventaire pour le vérifier. aiame-cartographe dessine les deux organisations sans aucun jeton d'accès commun.
repos.json (aiame-compass : « vendore uniquement, jamais un service heberge par l'infra propre d'AIAME » ; aiame-store : « mecanismes canoniques distribues a Elzeard par vendoring ou service tailnet prive » ; aiame-voice : service tailnet-privé, premier consommateur prévu côté partenaire, intégration pas commencée) ; tools/cartographie-flotte/classification.json (aiame-optaplanner : « consommé par angel et par le partenaire ») ; fiche aiame-compass (réfutée) : pas de CANONICAL.sha256 racine, seuil compté en contributions (aggregate.py l.76), clés non comparées (config.py), aucun hébergement ; fiche aiame-voice : « Consommé par un produit réel : ABSENT » ; GF-4, aiame-doctrine/garde-fous/garde_fous.sh (grep bloquant « no Elzeard tenant credential or MCP client registration ») ; aiame-workspace/tools/anti-fuite/check.py (dépôts lus dans repos.json, câblé au pre-push de la racine) ; aiame-cartographe/README.md (« aucun jeton GitHub cross-org »)
Chronologie
Un nom, un instantané, une carte
Trois faits le même jour. L'instrument qui enregistre, pour chaque dépendance externe, sa juridiction de contrainte est nommé « Registre de contrainte », et rien de ce qu'il produit ne sort de l'organisation : AIAME mesure d'abord sa propre exposition avant de proposer un instrument de souveraineté à quiconque. Le premier instantané de flotte est exécuté : 39 dépôts, un tag chacun, manifeste généré depuis repos.json, vérifications locales notées « non mesuré » — pas vertes par défaut. Et la cartographie de la flotte classe les 39 dépôts par mission (gouvernance, vérification, socle, E3, E2, public, infra), avec un contrôle qui échoue dès qu'elle diverge.
Mise à jour ciblée du portfolio public : l'organisation compte 40 dépôts, 37 audités, quatre nouveaux ajoutés (aiame-racines, aiame-rag-core, aiame-voice, aiame-guard) ; troisième trou d'inventaire en un mois, et une régression CI trouvée. La page l'écrit elle-même : elle est exactement l'exemple qu'elle dénonce — un instantané qui se périme, jamais un mécanisme continu.
SCRATCH/portfolio-public.txt (« Trous d'inventaire », mise à jour 2026-09-24) ; SCRATCH/dates.txt
aiame-guard : qui vérifie le vérificateur
Le troisième dépôt est nommé et lancé : aiame-doctrine définit → aiame-red vérifie les produits → aiame-guard vérifie aiame-red. Première tranche : un contrôleur déterministe, sans LLM, qui compare la matrice de traçabilité d'aiame-red à ses règles réelles — et trouve dès le premier passage deux règles implémentées qu'aucune ligne ne citait. Déployé en timer hebdomadaire sur un serveur AIAME.
Deux décisions autorisent aiame-red à sonder, en lecture seule, une liste nommée d'hôtes appartenant à AIAME (jamais à un client) : d'abord sa propre vitrine, puis sov.services.aiame.fr. Le self-audit tourne désormais sur un timer d'un serveur AIAME, pas sur GitHub Actions. Deux des trois manques qui avaient retiré « Veille continue » de la vente sont fermés ; le troisième (historique par client) ne l'est pas, et le palier reste invendable (décision du 20 septembre).
Question du propriétaire : un tenant pourrait-il retourner la chaîne doctrine → red pour en faire le biais qu'elle combat ? Vérifié sur le code réel : les rapports d'aiame-red rediffusaient le lexique exact qui déclenchait chaque règle — un aide-mémoire d'évasion, corrigé ; un troisième dépôt pour surveiller le surveillant est proposé. Le même jour naît aiame-rag-core, moteur documentaire canonique vendoré avec somme de contrôle dans ses trois consommateurs.
aiame.fr/transparence publie le grand livre coût/revenu par service, généré par aiame-ledger : deux services « offerts en bac à sable uniquement », trois « non offerts », zéro incohérence, et une colonne revenu affichée gris — aucune clé de paiement de production n'a jamais été configurée, pour aucun service. « Gris honnête, jamais vert fabriqué. »
aiame-angel (planification infirmière : roster et tournée, déterministe, hors-ligne) est scindé d'aiame-optaplanner, qui redevient une bibliothèque pure sans domaine métier ni API. Angel est servi sur angel.services.aiame.fr derrière le service d'authentification aiame-auth ; vérifié le 29 septembre 2026 : /api/v1/health HTTP 200.
Le portfolio public est refait intégralement : 30 dépôts relus un par un, 11 n'avaient jamais figuré sur la page, 7 changent de palier sur preuves nouvelles. Le même jour, un blocage de facturation rend visible que GitHub Actions ne vérifiait rien que le local ne vérifie déjà : la doctrine devient « local d'abord, zéro minute Actions » et un hook pre-push prend le relais dépôt par dépôt dès le 27.
git log aiame-fr.github.io (d7e8027) ; git log aiame-workspace (5eab0e1, 133ea79) ; git log aiame-infra (f4ae878) ; SCRATCH/portfolio-public.txt (« État de la CI »)
Transparence coût/revenu : l'engagement, pas encore le chiffre
AIAME s'engage à publier, pour chaque service qui serait vendu, son coût et son revenu cumulés sur toute sa vie — gagé sur la vérifiabilité du grand livre seule, jamais sur l'allure du chiffre (« l'optique n'est pas une porte »). aiame-ledger naît le jour même pour construire ce grand livre à traçabilité obligatoire ; aiame-mcp naît aussi, avec la règle « servir, oui ; s'abonner vers des données de tenant, non ».
Né le 18 août, aiame-miroir (géométrie du visage et de la main, calcul 100 % local dans le navigateur) est servi sur dev.aiame.fr/miroir dès le 19 — trois semaines, pas les six mois que le FORK nommait. La décision du même jour remplace l'horloge par l'invariant qui a réellement tenu : E2 peut être montré à tout moment s'il reste gratuit, sans compte, muet (signaux mesurés, zéro interprétation) et jamais vendu. Vérifié le 29 septembre 2026 : HTTP 200.
Première doctrine : rien n'est vendu avant e2e propre
Trouvé en construisant le registre de clauses : aiame-red affichait un palier « Veille continue » à 49 €/mois sans aucune infrastructure derrière. Décision du propriétaire, verbatim : « we do not sell anything untill [sic] fully clean and e2e sandboxed », érigée en première doctrine. Le palier est marqué « pas encore vendable » le jour même, pas effacé. Le même jour naît la synthèse de référence (REFERENCE.md, CLAUSES.yml) contre laquelle aiame-red audite.
aiame-sov (assistant souverain du dirigeant de TPE/PME : recherche documentaire avec sources citées, veille territoriale) et la console d'activation de services (aujourd'hui aiame-services) sont déployés derrière Traefik sous services.aiame.fr, avec une réplique de staging sous dev.aiame.fr. Vérifié le 29 septembre 2026 : sov répond HTTP 200 avec environment « production ». Rien n'est vendu : offert en bac à sable uniquement.
Première page d'audit publique des dépôts aiame-fr (16 à l'époque), classés dev / pré-prod / prod à partir de preuves — requête HTTP réelle, CI lue dans les journaux de job, jamais un README pris pour argent comptant. Le verdict « certification e2e : ABSENTE » y est écrit en toutes lettres, et l'est toujours.
Le dépôt public est passé privé ce jour-là (pages légales incomplètes), ce qui suspend l'antériorité « par visibilité GitHub » ; elle est remplacée par un jeton d'horodatage RFC 3161 sur l'archive des 12 textes doctrinaux — seul le condensat quitte la machine : on date sans montrer. Éprouvé par mutation : un seul octet ajouté fait échouer la vérification. Même procédure que la recherche IVX (31 juillet) ; le miroir public est de nouveau vivant le 13 août.
En construisant le POC aiame-pouls (carte « On vous doit », registre de provenance), deux règles bloquantes se révèlent n'avoir jamais été prouvées : un contrôle vert « il n'y a aucun X » a exactement la même couleur qu'un contrôle cassé. La pratique est écrite le jour même et un harnais de mutation fait désormais échouer volontairement les garde-fous GF-1/2/3 à chaque changement.
Décision du propriétaire, statut ACTED : la plateforme PME (E3) est l'organe de revenu ; la science du visage (E2) est le cœur protégé, muet tant que la preuve scientifique n'existe pas ; une part fixe du revenu net d'E3 est fléchée vers la recherche E2, traçable publiquement — le pourcentage sera fixé quand un revenu existera. Le même jour, la doctrine est matérialisée (11 chartes verbatim + le script garde-fous), sept dépôts naissent — aiame-core, aiame-creator, aiame-doctrine, aiame-fin, aiame-rag, aiame-red, aiame-sov (dont le premier commit date du 23 juillet) — et aiame.fr publie sa première page.
Le mémo « AIAME July 2026 Review » archive Face, TA et Emo comme laboratoires d'innovation et refonde AIAME en plateforme locale de connaissance IA pour les PME européennes. Dix jours plus tôt, aiame-prd (15 juillet) portait déjà les cinq lois UAX et la Loi de la Preuve : « un chiffre sans pièce est un mensonge en puissance ».
L'organisation GitHub aiame-fr naît avec aiame-fr.github.io (31 janvier, un README d'antériorité), aiame-motion (2 février, un concept perceptif gelé) et aiame-infra (5 février, premier commit Terraform/Ansible). Rien n'est encore servi en ligne : ce sont des marqueurs de date.
Entre le 11 janvier et le 7 février 2026, dix textes fixent le pivot « Aiame Face » : un instrument géométrique de mesure du visage, opt-in, muet par défaut, et la Charte B2H (Business to Human), qui pose que toute interaction est volontaire et muette par défaut. La Charte de communication (17 janvier) liste ce qu'Aiame ne dira jamais.
Premier texte fondateur, extrait verbatim d'une conversation du 22 juillet 2025 : « User First. Always. » — l'utilisateur possède 100 % de ses données, rien n'est transmis sans consentement explicite, local d'abord. Le contexte initial (un assistant conçu pour protéger l'utilisateur, pas le contrôler, dans le monde du trading) sera dépassé ; le mécanisme, lui, reste.
aiame-doctrine/CONSTITUTION.md (en-tête de provenance) ; aiame-doctrine/reference/REFERENCE.md §1
Pour aller plus loin
Les 44 fiches, en texte, avec chaque preuve
aiame-cartographe · carte des interactions · vivant
Cartographe
Scanner en lecture seule qui dessine qui appelle qui entre dépôts AIAME et Elzéard : chaque arête sourcée fichier:ligne, chaque inconnue affichée, jamais devinée.
Quand une organisation approche la quarantaine de dépôts, plus personne ne sait de tête qui dépend de qui. Le Cartographe lit le code déjà présent sur le disque — jamais le réseau, jamais un jeton d'accès — et en tire une carte : les services qui s'appellent, les portes ouvertes sur Internet, et surtout la liste de ce qu'il n'a pas su relier. Aucune adresse ni valeur technique ne sort dans la carte, ce qu'un test vérifie en essayant délibérément d'en faire fuir une. C'est un outil interne, jamais mis en ligne.
Capacités — prouvé, déclaré, absent
prouvéDécouverte des dépôts des deux organisations depuis le disquebackend/aiame_cartographe/discovery.py:86-97 (list_aiame_repos lit repos.json :90, ne garde que les entrées ayant un .git) et :99-109 (Elzéard par checkout direct) ; backend/tests/test_discovery.py (7 tests, grep def test_) ; graph.json du 2026-09-29 12:41 : 39 nœuds AIAME + 9 Elzéard = les 48 dépôts du README — snapshot daté : repos.json compte 40 entrées depuis 14:11 le même jour (aiame-registre)
prouvéAppels sortants Node/TS (`process.env.*_URL`) avec exclusion des SaaS externesbackend/aiame_cartographe/parsers/node_calls.py:24 (motif), :29-32 (_EXTERNAL_DENYLIST) et :64-66 (is_external) ; backend/tests/test_node_calls.py (4 tests) ; graph.json 2026-09-29 : 5 arêtes NEXT_PUBLIC_AUTH_URL → aiame-auth
prouvéRoutes publiques lues dans la table Traefik d'aiame-infrabackend/aiame_cartographe/parsers/infra_aiame.py:19 (chemin ansible/roles/vitrine/defaults/main.yml) et :31-53 (parse_traefik_routes, clé traefik_routes) ; pipeline.py:105-115 ; backend/tests/test_infra_aiame.py (3 tests) ; graph.json 2026-09-29 : 10 arêtes `route` depuis le nœud « internet » vers 6 dépôts
prouvéAucune adresse ni valeur brute dans la sortie, prouvé par mutationbackend/tests/test_pipeline_no_secret_leak.py:15-16 injecte un littéral RFC 5737 (TEST-NET-2), :55-56 vérifie que l'arête existe bien avant d'affirmer l'absence, :59-60 vérifie l'absence du JSON ; graph.json 2026-09-29 (vraie flotte) : 0 littéral IPv4, 0 nom d'hôte .ts.net (grep -cE relancé par cette revue)
prouvéRéférences non résolues affichées, jamais devinéesbackend/aiame_cartographe/graph.py:33 (UnmatchedRef) et :65 (add_unmatched) ; resolve.py:61-65 refuse de choisir entre deux candidats (statut ambiguous) ; backend/tests/test_pipeline.py:47 test_unresolved_node_ref_is_surfaced_not_dropped ; graph.json 2026-09-29 : 66 références non résolues listées avec fichier:ligne
prouvéTableau de bord à trois vues (AIAME / Elzéard / Combiné) avec nœuds isolés listés à partcode câblé : frontend/src/app/page.tsx:38-48 (filtre nœuds/arêtes/non-résolus par organisation) et :50-61 (isolés = nœuds sans arête, hors « internet »), rendu par frontend/src/components/IsolatedNodesList.tsx ; le pre-push exécute typecheck/lint/build (compile), MAIS 0 test frontend, aucune capture versionnée (README : « pas reproduit ici ») — le rendu des trois vues n'est vérifié par rien de rejouable
absentAlerte de dérive contre l'inventaire repos.jsonREADME.md, tableau « État honnête » : ABSENT — « le scanner tolère la dérive, ne l'alerte pas encore » ; illustré le jour même : aiame-registre entré dans repos.json à 14:11 (40 entrées), invisible du graph.json de 12:41 (39), sans aucun signal
Ce qui est absent, en toutes lettres
ABSENT : alerte de dérive contre repos.json (README, tableau « État honnête ») — et mesurée en direct : repos.json compte 40 entrées depuis le 2026-09-29 14:11 (aiame-registre), le graph.json de 12:41 en montre 39, sans aucun signal.
ABSENT, DÉCIDÉ : superposition du trafic réel (logs, traçage) — le modèle de graphe (evidence + type d'arête) est prévu pour, rien n'est construit.
ABSENT, DÉLIBÉRÉ : parseur de l'exposition Elzéard — parsers/infra_elzeard.py:28-30 retourne [] et explique pourquoi (aucune table structurée ; le seul document qui la décrit se dit lui-même périmé et porte des identifiants qu'un dépôt aiame-fr ne doit jamais tenir).
ABSENT : tout test frontend (0 fichier *.test.* / *.spec.*, find 2026-09-29) ; la preuve visuelle des trois vues n'est pas versionnée ; le pre-push ne prouve que la compilation (typecheck/lint/build).
ABSENT : exclusion de `tests/fixtures/` et de `.claude/worktrees/` dans le scan (python_calls.py:22 et node_calls.py:21 n'excluent ni l'un ni l'autre) — mesuré le 2026-09-29 : 1 arête (cartographe → aiame-auth) et 1 non-résolu (MISTRAL_URL) auto-générés par les propres fixtures du dépôt ; les arêtes d'aiame-sov comptées deux fois via son worktree (graph.json). Cette arête auto-générée ne doit PAS être lue comme un lien réel vers aiame-auth (args.json « edges » la porte telle quelle).
DÉFAUT : redact_literal classe une adresse de boucle locale (la machine elle-même, écrite sous forme numérique) en « adresse IP interne » parce que resolve.py:83 teste le motif IP avant la branche « hôte local » de :85 ; 5 des 6 arêtes Python du jour portent ce libellé erroné (vérifié : les 4 champs d'aiame-mcp config.py:28-31 et la fixture config.py:2 utilisent cette forme numérique ; seule l'arête écrite `localhost`, côté partenaire, est bien classée) ; aucun des 9 tests de test_resolve.py ne couvre la branche « hôte local ».
PÉRIMÉ : README « 35/38 dépôts AIAME isolés » ; mesure du 2026-09-29 sur graph.json : 28/39 AIAME (7/9 Elzéard reste vrai) — définition identique à page.tsx:50-61 (nœud sans arête).
PÉRIMÉ : README.md et backend/README.md « les ~15 autres dépôts aiame-*/backend peuvent encore se collisionner entre eux » — mesuré le 2026-09-29 : il ne reste que 3 backends dont le paquet s'appelle `app` (aiame-auth, aiame-dream, aiame-hand), les autres ont renommé le 2026-09-28 (git log). Le constat était vrai à l'écriture, faux le lendemain.
INCOHÉRENT : parsers/python_calls.py:9 cite une section README « Provenance des motifs » qui n'existe dans aucun des deux README (grep 2026-09-29).
ABSENT : trailer Co-Authored-By sur le commit de la PR #3 (122a1d4, corps vide, auteur `Aiame Tech <tech@aiame.fr>` = identité partagée) alors que #1 et #2 le portent — auteur réel de #3 non vérifiable depuis git.
ABSENT du portfolio public du 2026-09-24 : dépôt créé le 2026-09-28, écart de baseline normal, pas un oubli.
ABSENT : CI — décidé (règle 11) ; le hook pre-push n'est actif que si core.hooksPath est réglé (réglé sur ce clone, `git config core.hooksPath` = .githooks, vérifié le 2026-09-29).
Dépend de
aiame-doctrinevendoré-checksumgarde-fous/CANONICAL.sha256 (2 sommes : garde_fous.sh, test_garde_fous.sh) ; `sha256sum -c` OK le 2026-09-29 (rejoué par cette revue) et sommes identiques au canonique aiame-doctrine/garde-fous/{garde_fous.sh,test_garde_fous.sh} ; rejoué à chaque push par .githooks/pre-push
aiame-infradépendance-cheminparsers/infra_aiame.py:19 et :31-35 lisent ansible/roles/vitrine/defaults/main.yml (clé traefik_routes) du checkout local ; pipeline.py:106-109 cherche le nœud aiame-infra ; 10 arêtes `route` dans graph.json 2026-09-29
Consommé par
—
Surface publique
—Aucune route Traefik vers ce dépôt dans la table d'aiame-infra (graph.json 2026-09-29 : 10 routes, aucune nommée cartographe) ; aucune sonde dans probes-2026-09-29.txt ; route.ts:15-16 : « never deployed » ; absent d'aiame-fr.github.io (grep 2026-09-29 : les deux occurrences de « cartograph » sur vitrine/index.html sont « cartographie AI Act », pas ce dépôt) ; dépôt GitHub privé (dates.txt).
Modèle de langage
oui — aucune dépendance modèle : backend/pyproject.toml ne déclare que PyYAML (pytest en groupe dev), frontend/package.json que d3-force/next/react ; GF-1 (aucun fournisseur frontier dans le code d'exécution, garde-fous/garde_fous.sh:33-44) vendoré et rejoué par .githooks/pre-push ; les mots OPENAI/ANTHROPIC de node_calls.py:30 sont une liste d'exclusion de noms de variables, pas un import
Souveraineté
Tourne uniquement sur le poste : lit les dépôts déjà clonés, aucun appel réseau (aucun import httpx/requests/urllib/socket dans backend/aiame_cartographe/, grep 2026-09-29), aucun jeton GitHub inter-organisations (backend/aiame_cartographe/discovery.py). Le tableau de bord est servi en local et n'est jamais déployé (commentaire dans frontend/src/app/api/graph/route.ts:15-16). La carte générée n'est jamais committée (.gitignore, backend/output/) et ne contient aucune adresse ni nom d'hôte — vérifié sur la sortie du 2026-09-29 (0 littéral IPv4, 0 .ts.net).
Doctrine incarnée
CONST-7.2
CONST-7.1
UAX-LOI-PREUVE.a
UAX-LOI-PREUVE.b
GF-2
GF-4
Tests
8fichiers · 35fonctionsaucune — dépôt créé le 2026-09-28, absent du portfolio public du 2026-09-24 ; seule mesure existante : README interne « VÉRIFIÉ » daté 2026-09-28 (non reproduite ici, tests non exécutés dans cette revue ; comptes 8 fichiers / 35 fonctions relevés par grep -c 'def test_' le 2026-09-29 : discovery 7, resolve 9, graph 4, python_calls 4, node_calls 4, infra_aiame 3, pipeline 3, no_secret_leak 1)
Dates
2026-09-28 · 2026-09-28 : le jour même de sa création, son intégration au .venv partagé révèle que ~15 dépôts aiame-*/backend (16 selon le corps du commit #2) installent tous un paquet nommé `app` (un seul survit par ordre d'installation) ; ce dépôt se renomme `aiame_cartographe` (PR #3, 122a1d4) et documente la collision pour les autres, sans la corriger à leur place — la flotte a renommé ses paquets le même jour (git log : aiame-mcp, -knowledge, -rag, -sov, -one, -fin, -red, paquet ajouté le 2026-09-28)
Un moteur en ligne de commande qui répond à des questions sur la mémoire écrite et gouvernée du partenaire Elzéard — décisions datées, statut actuel de chaque choix — chaque réponse citée à la ligne près, sans IA générative.
aiame-dream est un prototype qui interroge la mémoire écrite gouvernée du partenaire Elzéard — décisions (ADR) et journal chronologique, déjà tenus à jour par d'autres règles internes — et répond toujours en citant sa source exacte (fichier et ligne), jamais sans preuve. Il ne contient aucune intelligence artificielle : c'est une recherche déterministe dans des documents déjà gouvernés, pas une synthèse. S'il ne trouve rien, il le dit clairement plutôt que d'inventer une réponse. C'est un banc d'essai technique, pas un service public : il tourne uniquement en ligne de commande, sans serveur ni interface web, et il lui faut un accès local à l'espace de travail du partenaire pour fonctionner.
Capacités — prouvé, déclaré, absent
prouvéZéro IA générativebackend/app/{cli,graph,ingest,query,__init__}.py (384 lignes au total) n'importent que la bibliothèque standard (os, re, pathlib, enum, dataclasses, sys) ; aucune ligne openai/anthropic/gemini — vérifié en lisant les 5 fichiers source directement, et couvert par le garde-fou vendoré GF-1 (scripts/garde_fous.sh).
prouvéChaque réponse porte sa sourceFact.source_path est un champ obligatoire (non optionnel) du dataclass (backend/app/__init__.py) ; cli.py imprime f.cite() sur chaque ligne de sortie ; test_no_fact_without_a_source (tests/test_dream.py:28) fait échouer la suite si un fait est émis sans source.
prouvéSuite e2e CLI rejouable partout (9 tests)9 fonctions test_ dans tests/test_cli_e2e.py (compté par grep -c 'def test_'), contre un corpus fixture committé (tests/fixtures/mini-workspace/) ; chiffre identique à celui publié dans le portfolio public : « Suite e2e réelle (9 tests) rejouée en local, verte ».
déclaréSuite miroir contre le vrai corpus (13 tests) — non rejouée dans cette revue13 fonctions test_ dans tests/test_dream.py (compté par grep) ; le README revendique « 13 passed » contre le workspace réel du partenaire Elzéard (localisé via une variable d'environnement dédiée), mais cette revue est en lecture seule (aucune suite exécutée) : seule l'existence du code de test est vérifiée ici, pas son résultat.
prouvéRefuse d'inventer une réponsequery.py: Memory.why()/decisions() renvoient une liste vide si rien ne correspond (pas de ranking, pas de fallback) ; test_why_unknown_term_refuses_to_invent (tests/test_cli_e2e.py:73) et test_why_refuses_to_invent (tests/test_dream.py:64) le vérifient ; cli.py l'affiche en clair pour la commande `why` (« Empty means the vault does not say — not that nothing happened »).
prouvéÉcarts nommés, jamais contournés en silencegraph.py:gaps() retourne deux faits fixes citant explicitement ce qui manque (aucune brique de recherche sémantique déclarée, aucun exécuteur e2e bloquant) ; câblé à la commande `dream gaps` dans cli.py.
prouvéPas de serveur, pas de portaiame-dream est absent des arêtes de graph.json (aucune route Traefik, aucun outbound_call) ; README §'What deliberately does NOT exist' le déclare ; aucun import réseau/HTTP dans backend/app/ (grep socket/http.server/fastapi/flask/uvicorn/requests/aiohttp : zéro résultat).
déclaréAuto-contrôle anti-fuite de noms — dépend d'un autre dépôttest_no_client_name_in_own_output (tests/test_dream.py:131) appelle en sous-processus un script node d'un dépôt du partenaire, localisé via l'espace de travail du partenaire (variable d'environnement dédiée) ; nécessite `node` sur PATH et ce dépôt présent sur disque — non exécuté dans cette revue lecture seule.
Ce qui est absent, en toutes lettres
Recherche sémantique — absente par construction (README : nécessite un substrat RAG que l'infrastructure ne déclare nulle part ; nommé, pas supposé).
Persistance/cache — absent par construction (le corpus tient en mémoire, reconstruit à chaque appel, aucune base ni fichier de sortie).
Interface serveur/web — absente par construction (CLI uniquement, aucun port, aucune route publique).
Preuve d'exécution de la suite miroir (13 tests contre le vrai corpus du partenaire Elzéard) — non rejouée dans cette revue lecture seule ; seule l'existence des 13 fonctions de test est vérifiée, pas leur résultat.
Application garantie du hook pre-push sur un clone/worktree neuf — NON garantie par défaut : `core.hooksPath` n'est pas versionné (le hook le dit lui-même dans son en-tête), donc un nouveau clone n'est vérifié par rien tant que la commande n'est pas lancée à la main.
Date de création cohérente entre les sources internes — trois dates différentes coexistent : dates.txt (premier push, 2026-08-16), git log (premier commit local, 2026-08-01), repos.json (« créé localement le 2026-08-09 ») ; jamais réconciliées.
Autonomie du corpus — l'outil ne peut répondre à rien sans un accès local à l'espace de travail du partenaire Elzéard (deux ledgers ADR + un journal chronologique) : ce n'est pas une mémoire auto-suffisante de l'organisation qui le publie.
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 vendore garde_fous.sh + test_garde_fous.sh depuis aiame-doctrine/garde-fous/, resynchronisé à plusieurs reprises (commits fba051f 2026-09-06, 3355784 2026-09-11, 959c174 2026-09-22) ; contrôle d'intégrité relancé à chaque pre-push (commit 020ec82).
Consommé par
—
Surface publique
—Dépôt privé (dates.txt) ; CLI-only par conception (README §'What deliberately does NOT exist' : « No server, no port »). Aucune arête pour aiame-dream dans graph.json (route/outbound_call) ni dans ansible/roles/vitrine — cohérent avec l'absence de surface publique. Non sondé (absent de probes-2026-09-29.txt, cohérent avec un dépôt privé sans URL).
Modèle de langage
oui — aucun import openai/anthropic/gemini dans backend/app/, confirmé par lecture directe des 5 fichiers source (384 lignes) et par le garde-fou vendoré GF-1.
Souveraineté
Exécution 100% locale : CLI seule, aucun serveur, aucun appel réseau observé dans le code. Lit en local l'espace de travail du partenaire Elzéard, monté sur le même poste (via une variable d'environnement dédiée) — pas un service tiers hébergé.
Doctrine incarnée
CONST-3.1
CONST-3.2
CONST-7.1
CONST-7.2
GF-1
UAX-LOI-PREUVE.b
Tests
2fichiers · 22fonctionsportfolio public 2026-09-24 : « Suite e2e réelle (9 tests) rejouée en local, verte — CI GitHub désactivée depuis le 27/08 (facturation, non réactivée), pas seulement 'jamais câblée pour ces tests' ».
Dates
2026-08-16 (dates.txt — premier push vers l'org, sous le nom poc-dream) · 2026-09-22 : suppression du workflow GitHub Actions dormant (#9, 13h27) a fait disparaître sans le vouloir le contrôle d'intégrité CANONICAL.sha256 du hook pre-push local — restauré 24 minutes plus tard (#10, 13h51) le même jour, avec preuve loggée dans le message de commit qu'il sait échouer (1 octet corrompu testé, revert avant commit).
La vitrine publique d'AIAME, qui est aussi son propre audit : ce qui tourne, ce qui est testé, ce qui ne l'est pas.
Ce dépôt fournit la page d'accueil publique d'AIAME (www.aiame.fr), mais son cœur est un audit daté de l'organisation, repris à la main en trois passages en un mois (26 août, 8 septembre, 24 septembre ; la dernière, ciblée, a ajouté quatre dépôts sans relire les cartes existantes). Chacun des 37 dépôts audités y est classé « prod », « pré-prod » ou « dev » à partir de preuves : requêtes réelles, code lu, et non les intentions d'un README. La page écrit en toutes lettres qu'aucun de ces dépôts n'a de certification de bout en bout, et elle garde la trace de ses propres oublis d'une version à l'autre au lieu de les effacer. Elle publie aussi l'état du grand livre coût/revenu par service : un instantané daté du 2026-09-06, produit par aiame-ledger, où les deux services proposés uniquement en bac à sable apparaissent en gris (revenu non mesuré, jamais affiché à zéro sans preuve) et tous les autres comme « non proposés ». Aucun service n'est vendu.
Capacités — prouvé, déclaré, absent
prouvéPage publique servie (www.aiame.fr)sonde GET du 2026-09-29 (probes-2026-09-29.txt) : `200 https://www.aiame.fr/` ; source déployée : aiame-infra/ansible/roles/vitrine/defaults/main.yml:20 (`vitrine_site_src: .../aiame-fr.github.io/index.html`)
prouvéClassement publié de 37 dépôts, chaque carte avec sa preuve datéeindex.html:202 « Prod — 11 dépôts », :297 « Pré-prod — 17 dépôts », :438 « Dev — 9 dépôts » (37 balises <h3>aiame-…) ; section « Méthode » :190. Ce qui est prouvé est la publication ; l'exactitude de chaque carte reste celle de sa date (la carte aiame-eu, datée du 09-08, est dépassée)
prouvéVerdict « certification de bout en bout absente » sur les 37 dépôts auditésindex.html:162 « Verdict : ABSENTE — sur les 37 dépôts » + badge `cert-absent` sur chacune des 37 cartes
prouvéÉtat du grand livre coût/revenu publié, jamais affiché à zéro sans preuveLEDGER-STATUS.json (`"produit": "aiame-ledger"`, `genere_le: 2026-09-06`, `incoherences: 0`) : aiame-red et aiame-sov `offered_sandbox_only` / `gris` (revenu null), aiame-auth, aiame-optaplanner, aiame-fin `not_offered` ; transparence.html le rend. Instantané unique : le rituel mensuel n'existe pas encore (aiame-ledger/docs/ADR-LEDGER-003-freshness-cadence.md)
prouvéCopie des garde-fous d'aiame-doctrine vérifiée par empreinte au pre-pushscripts/CANONICAL.sha256 (garde_fous.sh + test_garde_fous.sh) ; `sha256sum -c` OK le 2026-09-30, sommes identiques au canonique ; .githooks/pre-push:38 (somme), :41 (harnais de mutation), :44 (garde-fous sur tout le dépôt)
prouvéVersion anglaise des pages principalesen/index.html, en/transparence.html, en/merci.html, en/paiement-indisponible.html, en/vitrine/index.html, en/dev/ (PR #36, #37 du 2026-09-25). Les pages légales anglaises sont générées dans aiame-doctrine et exclues de ce dépôt (.gitignore) ; docs/artefacts/ n'est pas traduit
absentSynchronisation automatique entre ce dépôt et www.aiame.frindex.html:250 : « Ce que sert réellement www.aiame.fr après qu'un opérateur humain lance make play-vitrine depuis aiame-infra — pas de synchronisation automatique entre les deux »
absentVérification GitHub Actions sur ce dépôtindex.html:249 (« désactivée depuis le 27/08 … 9 commits sans check GitHub ») ; aucun fichier .github/workflows suivi (retiré le 2026-09-22, PR #32, règle « local d'abord » de l'org) ; les vérifications tournent au pre-push local
Ce qui est absent, en toutes lettres
Certification de bout en bout : ABSENTE sur les 37 dépôts audités, écrit en toutes lettres
La page est de nouveau incomplète : 4 dépôts créés après la passe du 2026-09-24 n'y figurent pas (aiame-compass 09-26, aiame-hand 09-27, aiame-cartographe 09-28, aiame-registre 09-29 — dates.txt) ; les 3 autres absents (aiame-workspace, aiame-tf, changedetection.io) sont exclus volontairement et nommés par la page
La carte aiame-eu (datée du 09-08) présente encore eu.aiame.fr, mort depuis le 2026-09-13 ; la page précise que la passe du 09-24 n'a pas relu les 33 cartes existantes
La section CI présente Actions comme « non réactivé », alors que l'org a choisi de ne plus l'utiliser (workflows supprimés ici le 2026-09-22, PR #32) ; le commentaire du pre-push dit encore de ne PAS supprimer garde-fous.yml
Une carte (aiame-services, index.html:271) prête à sa liaison WebSocket une latence qu'aucune mesure publiée ne soutient
Grand livre : un seul instantané (2026-09-06), pas de publication périodique
Synchronisation automatique entre ce dépôt et le site réellement servi : absente, déploiement manuel (make play-vitrine)
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 (garde_fous.sh + test_garde_fous.sh), `sha256sum -c` OK le 2026-09-30, identiques à aiame-doctrine/garde-fous/ ; vérifié au pre-push (.githooks/pre-push:38)
aiame-ledgerautreLEDGER-STATUS.json : `"produit": "aiame-ledger"`, `genere_le: 2026-09-06` — fichier écrit par aiame-ledger (render.py:137, commande `publier` cli.py:205), recopié ici et rendu par transparence.html
https://www.aiame.fr/sonde GET du 2026-09-29 (probes-2026-09-29.txt) : `200 https://www.aiame.fr/`, titre « AIAME — Portfolio d[es dépôts] »
Modèle de langage
sans objet — site statique sans logique applicative ; le garde-fou GF-1 vendoré, lancé au pre-push sur tout le dépôt (.githooks/pre-push:44) avec son harnais de mutation (:41), est conçu pour bloquer un appel à un fournisseur frontière.
Souveraineté
La page réellement servie au public (www.aiame.fr) est hébergée sur un serveur AIAME dans un centre de données de l'Union européenne, déployée à la main depuis aiame-infra. Le dépôt, lui, est public sur GitHub et publié en miroir par GitHub Pages ; ce dépôt se documente comme le miroir, pas comme l'infrastructure de service.
Doctrine incarnée
FIRST-DOCTRINE-no-sale-before-e2e
TRANSPARENCY-cost-revenue-commitment
CONST-7.1
GF-1
GF-3
Tests
0fichiers · 0fonctionssans objet — site statique sans suite de tests applicative ; seul le harnais de mutation vendoré scripts/test_garde_fous.sh tourne au pre-push. Les mesures citées sur la page (ex. aiame-fin « 108 passed » le 09-08) sont celles d'autres dépôts.
Dates
2026-01-31 (dépôt GitHub et premier commit, README seul) · 2026-09-24 : mise à jour ciblée, 4 dépôts ajoutés (33 → 37), pas de relecture des 33 cartes existantes · 2026-09-08 : revérification en profondeur, inventaire rouvert (30 → 36 dépôts dans l'org) · 2026-08-26 : audit refait intégralement, les 30 dépôts de repos.json relus un par un — la page appelle elle-même la dernière passe sa « troisième réouverture en un mois »
Pile
HTML/CSS statique (aucun framework), nginx sur un serveur AIAME, déployé par aiame-infra, GitHub Pages (miroir), scripts shell vendorés (garde-fous)
aiame-guard · vérificateur du vérificateur · vivant
AIAME Guard
Vérifie automatiquement chaque semaine que le vérificateur de conformité aiame-red ne dérive pas de ses propres règles — zéro LLM, zéro serveur.
aiame-guard est le troisième maillon d'une chaîne de contrôle : la doctrine de l'organisation définit les règles, aiame-red vérifie que les produits les respectent, et aiame-guard vérifie qu'aiame-red reste fidèle à ses propres règles. Chaque semaine, un programme automatique compare le fichier qui liste les règles au code qui les applique, rejoue les tests d'aiame-red et vérifie qu'aucun rapport généré ne révèle par erreur le texte même qu'il est censé repérer. En cas de problème, un e-mail d'alerte part automatiquement. Le dépôt déclare l'avoir éprouvé en conditions réelles le 18 septembre 2026 (incident provoqué volontairement, alerte reçue, récupération constatée au passage suivant), mais cette preuve n'est pas rejouable depuis le code.
Capacités — prouvé, déclaré, absent
prouvéDétection de dérive TRACEABILITY.yml ↔ rules.py (axe 1)backend/aiame_guard/traceability_drift.py (dangling/orphan) ; backend/tests/test_traceability_drift.py = 18 fonctions def test_ (grep, recompté et confirmé) ; TRACEABILITY.yml d'aiame-red (lu directement) porte aujourd'hui R7b/R7c sur CONST-2.1 et FACE-8.1, cohérent avec le README d'aiame-guard qui cite ce correctif comme aiame-red PR#33.
déclaréRé-exécution de la suite de tests d'aiame-red (axe 2)backend/tests/test_live_aiame_red.py (1 fonction, skipif si AIAME_RED_RACINE absent, non exécutée dans cette revue en lecture seule) ; README décrit une ré-exécution hebdomadaire réelle ; portfolio-public 2026-09-24 : « 29 tests locaux passent (2 sautés, nécessitant AIAME_RED_RACINE) » — recompté ici par grep : 31 fonctions def test_ au total sur 4 fichiers, dont exactement 2 marquées skipif sans cette variable (test_live_aiame_red.py + test_check_redaction.py), donc 29 exécutables sans elle. Le chiffre colle.
prouvéInvariant de rédaction sur les fiches réellement rendues par aiame-red (axe 3)backend/aiame_guard/check_redaction.py + redaction_invariant.py, lus intégralement : lance `python -m aiame_red.cli` en sous-processus séparé (jamais un import), cohérent avec le paquet aiame-red actuel (backend/aiame_red/, confirmé par `ls` direct du dépôt aiame-red) après son aller-retour de nommage (app le temps de aiame-red#34, revenu à aiame_red le 2026-09-28) ; backend/tests/test_redaction_invariant.py = 11 fonctions def test_, test_check_redaction.py = 1 (grep -c, recompté).
déclaréDéploiement réel hebdomadaire + alerte e-mail (timer systemd, serveur AIAME privé)README §Status : rôle Ansible aiame-infra guard-watch (aiame-infra#100/#101/#104) — confirmé existant sur disque (ansible/roles/guard-watch/{defaults,tasks,templates}/) avec le timer `Mon *-*-* 06:47:00 UTC` (defaults/main.yml, guard-watch.timer.j2) et le sujet d'alerte exact « aiame-guard: guard-watch (cron) en echec » (templates/run-guard-watch.sh.j2) — le code correspond mot pour mot à ce que le README décrit. L'alerte reçue et confirmée par capture d'écran de l'owner le 2026-09-18, elle, reste non revérifiable depuis le disque (hors périmètre, lecture seule).
prouvéGarde pre-push local : intégrité de la copie vendorée + auto-test + GF-1..4 + pytest, coût Actions zéro.githooks/pre-push lu intégralement : sha256sum -c scripts/CANONICAL.sha256, bash scripts/test_garde_fous.sh, bash scripts/garde_fous.sh ., puis uv sync --all-packages --all-groups && uv run pytest — texte et ordre des étapes vérifiés contre le fichier réel.
prouvéZéro dépendance d'exécution (zéro LLM, zéro réseau dans le vérificateur lui-même)backend/pyproject.toml lu : [project] dependencies = [] ; pyyaml confiné à [dependency-groups].dev avec commentaire explicite (seul test_check_redaction.py en a besoin, pour lancer le CLI d'aiame-red en sous-processus).
prouvéCopie vendorée checksum-vérifiée de garde_fous.sh (aiame-doctrine)scripts/CANONICAL.sha256 (en-tête daté, source citée aiame-doctrine:garde-fous/garde_fous.sh, resynchronisé le 2026-09-06) + scripts/garde_fous.sh et test_garde_fous.sh présents ; sha256sum recalculé en direct sur les deux fichiers du dépôt : les deux empreintes correspondent exactement à celles enregistrées dans CANONICAL.sha256 — la copie n'est pas seulement déclarée vérifiée, elle l'est réellement, ici, maintenant.
prouvéChiffrement au repos du secret d'alerte SMTP déployéLe README d'aiame-guard dit « named, not built » (texte figé depuis le 2026-09-19, README §Status ; 7 commits ultérieurs jusqu'au 2026-09-29, aucun ne touche cette section). C'est faux aujourd'hui : aiame-infra#110 (mergée le 2026-09-21) câble pour guard-watch un secret d'alerte chiffré au repos (systemd-creds). Le gabarit du service guard-watch charge ce secret chiffré, et le rôle Ansible correspondant confirme, dans un commentaire daté, qu'il sert déjà guard-watch. Le message de commit de #110 déclare un aller-retour chiffrement/déchiffrement testé en direct sur un serveur AIAME du réseau privé (déclaration du commit, non rejouée dans cette revue). Nuance qui reste vraie : un autre consommateur du même secret, hors d'aiame-guard, n'est pas encore passé à la forme chiffrée (limite technique documentée dans aiame-infra). Le risque visé par DECISION-2026-09-19 n'est donc pas fermé pour ce secret dans l'absolu, mais il l'est pour le chemin de consommation d'aiame-guard lui-même.
Ce qui est absent, en toutes lettres
Le README d'aiame-guard affirme encore (contenu figé au 2026-09-19, jamais retouché depuis malgré 7 commits ultérieurs) que le chiffrement au repos du secret d'alerte est « named, not built ». C'est faux depuis le 2026-09-21 : aiame-infra#110 l'a câblé pour guard-watch (systemd-creds, aller-retour déclaré testé en direct sur un serveur AIAME du réseau privé). Or DECISION-2026-09-19-at-rest-encryption-gap-registered.md avait tranché « register the gap, don't build it yet ». La PR se réclame elle-même de l'Option 1 de cette décision sans qu'aucun DECISION-*.md ultérieur ne documente ce changement de cap (question de gouvernance hors périmètre de cette fiche). Ce qui reste ouvert n'est plus côté aiame-guard : un autre consommateur du même secret n'est pas encore passé à la forme chiffrée. Le risque visé par la décision n'est donc pas entièrement fermé à l'échelle de la flotte, mais ce n'est plus un manque de ce dépôt.
Aucune CI GitHub : les trois axes ne tournent que via le hook pre-push local et le timer systemd hebdomadaire — cohérent avec la désactivation Actions org-wide, mais signifie qu'aucun badge GitHub public ne rend compte de l'état de ce dépôt.
Aucun docs/adr/ propre à ce dépôt (structure de fichiers vérifiée, aucune correspondance) : sa gouvernance vit entièrement dans aiame-doctrine (DECISION-2026-09-13, DECISION-2026-09-18), rien en local à ce jour.
L'entrée de ce dépôt dans repos.json (« Aucune execution planifiee/permanente pour l'instant ») est en retard sur son propre README, qui documente un déploiement hebdomadaire réel depuis le 2026-09-19 — écart constaté en comparant les deux fichiers (les deux lus intégralement, confirmé), non corrigé dans cette revue (lecture seule).
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 vendore garde_fous.sh + test_garde_fous.sh depuis aiame-doctrine:garde-fous/, vérifié en pre-push (sha256sum -c) — empreintes recalculées en direct et concordantes.
aiame-redautreaiame-guard lit un checkout d'aiame-red comme cible (chemin passé en argument ou via AIAME_RED_RACINE) et lance son CLI en sous-processus (check_redaction.py : `python -m aiame_red.cli`, confirmé par lecture du fichier) — jamais importé en-process, jamais un appel réseau. Le paquet cible (aiame_red/) existe bien sur le disque du dépôt aiame-red, confirmé.
—Pas d'URL publique : outil CLI/cron sans frontend (« No frontend/: this is a CLI checker, nothing to serve. », README) ; absent de probes-2026-09-29.txt (grep confirmé, zéro occurrence) ; le portfolio public le classe lui-même hors « prod » faute de surface HTTP vérifiable par construction (portfolio-public.txt, 2026-09-24, citation exacte confirmée).
Modèle de langage
oui — pyproject.toml déclare dependencies = [] en [project] ; les trois axes sont regex/subprocess, jamais un appel modèle ; le README répète la formule « Zero LLM, zero server ».
Souveraineté
Tourne entièrement en local (Python pur, aucune dépendance réseau dans le vérificateur lui-même), planifié par un timer systemd sur un serveur AIAME privé ; seule sortie réseau : un e-mail d'alerte via un fournisseur SMTP tiers en cas d'échec.
4fichiers · 31fonctionsportfolio-public.txt, 2026-09-24 : « 29 tests locaux passent (2 sautés, nécessitant AIAME_RED_RACINE) » — recompté ici indépendamment par grep -c 'def test_' sur les 4 fichiers de tests : 18+11+1+1 = 31, dont exactement 2 marquées @pytest.mark.skipif sans AIAME_RED_RACINE (test_live_aiame_red.py, test_check_redaction.py) → 29 exécutables sans elle. Le chiffre du portfolio est exact, non ré-exécuté dans cette revue en lecture seule.
Dates
2026-09-18 · 2026-09-18 — première preuve de vie en conditions réelles : une dérive TRACEABILITY.yml a été réintroduite à la main sur le déploiement, le service planifié a échoué pour de vrai (ExecMainStatus=1), un e-mail d'alerte réel est arrivé (confirmé par capture d'écran de l'owner), puis la récupération a été vérifiée au run suivant (README du dépôt).
Le Dossier — mémoire documentaire de l'organisation
Chaque nuit, l'organisation lit ses propres documents : classement par mots-clés (pas un modèle), synthèse optionnelle par un LLM local, jamais externe.
Cet outil interne parcourt chaque nuit tous les dépôts de code de l'organisation et rassemble leurs documents (README, notes, décisions) en un seul dossier. Il range chaque document dans une catégorie par un simple comptage de mots-clés — pas une intelligence artificielle qui « comprend » le texte — et peut, en option, faire relire ce dossier par un modèle de langage installé sur un serveur interne pour en tirer un résumé, sans jamais l'envoyer à un service extérieur. Un tableau de bord associé (usage interne, non déployé publiquement) rend chaque catégorie cliquable jusqu'à l'extrait exact et au score qui l'ont produite, et conserve, sans l'adoucir, un avis critique interne sur les limites réelles de la méthode.
Capacités — prouvé, déclaré, absent
prouvéInventaire des dépôts de l'organisation (API GitHub)backend/aiame_knowledge/inventory.py : Github(GITHUB_TOKEN).get_organization(...).get_repos(), écrit output/repository_inventory.md ; aucun test dédié (pas de test_inventory.py dans backend/tests/ — confirmé par `ls backend/tests/`).
prouvéExtraction des documents (.md/.rst/.txt/.mdx) de chaque dépôtbackend/aiame_knowledge/extract_docs.py, couvert par backend/tests/test_extract_docs.py (7 fonctions test_*, recompté par grep -c '^def test_').
prouvéClassification par comptage de mots-clés (6 catégories, pas un modèle)backend/aiame_knowledge/classify_docs.py : dict RULES de mots-clés (ligne 11, catégorie 'business' en premier) + fonction classify() ; égalité retombe sur 'business' ; couvert par backend/tests/test_classify_docs.py (4 fonctions, recompté).
prouvéSynthèse executive/investisseur par LLM local optionnel, avec repli explicitebackend/aiame_knowledge/summarize.py lu intégralement : class SummarizerUnavailable(Exception), _PROVIDERS={'local': _summarize_local} seul provider possible, raise si LOCAL_LLM_BASE_URL vide ou endpoint en erreur ; generate_executive_summary.py capte l'exception ; couverts par test_summarize.py (5) et test_generate_executive_summary.py (7).
déclaréRafraîchissement nocturne automatisé (cron GitHub Actions).github/workflows/knowledge-refresh.yml lu intégralement : schedule '0 2 * * *' + workflow_dispatch, jeton AIAME_TECH_PAT ; cohérent avec repos.json/CLAUDE.md (seule exception Actions payante de la flotte) et confirmé de l'extérieur par portfolio-public.txt ('La seule exception vérifiée aujourd'hui est aiame-knowledge'). Mais aucune preuve d'exécution réussie : output/{corpus,reports,repos}/ sont vides, datés du commit initial (11 août), aucune trace de run GitHub consultée (lecture seule, pas d'appel gh api) — reste 'déclaré', pas 'prouvé'.
prouvéTableau de bord "Le Dossier" (Next.js), preuve cliquable par documentfrontend/src/components/knowledge/{ProvenanceCard,ReceiptDrawer,DocumentsExplorer}.tsx + frontend/src/data/seed/*.json (classified-documents.json, meta.json, repos-count.json) — code câblé et fonctionnel, jamais confirmé déployé publiquement.
absentAPI en direct pour le frontendfrontend/README.md, section « Données », lu intégralement : "Pas d'API en direct : src/data/seed/ contient une copie figée d'un run réel [...] src/lib/api.ts est le point de bascule prévu pour un vrai backend plus tard" — le dépôt le dit lui-même, et aucun import réseau vers un backend knowledge n'existe côté frontend.
absentCertification end-to-endSCRATCH/portfolio-public.txt : "aiame-knowledge certif. e2e absente" — confirmé, entrée retrouvée telle quelle dans le fichier.
Pas d'API en direct côté frontend : le tableau de bord lit un instantané figé (seed JSON), jamais rafraîchi automatiquement (le dépôt le dit lui-même, frontend/README.md).
Aucun test unitaire pour inventory.py, pipeline.py, cli.py ni logging_setup.py (absents de backend/tests/, confirmé par `ls`).
Aucun répertoire docs/ ni fichier ADR dans ce dépôt (confirmé, find vide).
Le compte de dépôts figé dans le seed (12 scannés / 17 connus, 2026-08-13, confirmé par frontend/src/data/seed/repos-count.json) ne reflète pas la taille actuelle de l'org — écart assumé et documenté dans le fichier lui-même, pas corrigé.
La fenêtre de contexte réellement servie par l'endpoint local n'a pas été re-mesurée depuis la bascule de machine (aveu confirmé dans backend/aiame_knowledge/env.py, commentaire LOCAL_LLM_CTX).
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 (lu intégralement) : copie vendorée, checksum-vérifiée, de aiame-doctrine/garde-fous/{garde_fous.sh,test_garde_fous.sh}, posée le 2026-08-20, resynchronisée le 2026-09-22 (aiame-doctrine#52). Contrôlée à chaque push : .githooks/pre-push lignes 39/42/45 (`sha256sum -c scripts/CANONICAL.sha256`, puis exécution de test_garde_fous.sh et garde_fous.sh). Absente à tort du 'consomme' original, qui listait [].
—Aucune URL knowledge.*.aiame.fr dans SCRATCH/probes-2026-09-29.txt (grep vide) ; frontend/README.md confirme l'absence d'API/déploiement en direct ('instantané figé') ; repos.json et CLAUDE.md racine décrivent ce dépôt comme privé.
Modèle de langage
optionnel — l'extraction et la classification (comptage de mots-clés) n'utilisent aucun LLM ; seules les synthèses executive/investisseur en appellent un, unique fournisseur possible ('local', auto-hébergé, jamais un provider frontière — GF-1), avec repli automatique et journalisé en rapport-liste si l'endpoint est injoignable ou mal configuré (SummarizerUnavailable, vérifié dans le code).
Souveraineté
Ce dépôt met en œuvre concrètement GF-1 sur son propre terrain le plus sensible : il lit potentiellement tous les dépôts privés de l'organisation, donc aucun fournisseur de LLM externe (OpenAI, Anthropic, etc.) n'est câblé, ni même désactivable par erreur — un seul provider possible, local et auto-hébergé, sans hôte par défaut (l'opérateur doit le poser explicitement, vérifié : env.py n'a pas de valeur par défaut pour LOCAL_LLM_BASE_URL). GF-1, GF-2 et GF-3 sont vérifiés localement à chaque push, pas seulement déclarés : une copie de garde_fous.sh est vendorée avec somme de contrôle (scripts/CANONICAL.sha256) et exécutée par .githooks/pre-push. Angle mort assumé et documenté dans le code même : la machine qui héberge ce modèle local sert aussi à d'autres charges, et la responsabilité de cette charge n'est pas encore tranchée en interne.
Doctrine incarnée
GF-1
GF-2
GF-3
UAX-LOI-PREUVE.b
Tests
6fichiers · 26fonctionsNon exécutée dans cette revue (consigne lecture seule) ; comptage statique recompté indépendamment : grep -c '^def test_' backend/tests/*.py = test_generate_category_report(1) + test_extract_docs(7) + test_summarize(5) + test_generate_executive_summary(7) + test_env_defaults(2) + test_classify_docs(4) = 26 fonctions sur 6 fichiers de test (confirme le compte original). Mesure publique datée retrouvée dans SCRATCH/portfolio-public.txt, au-delà de 'certif. e2e absente' : "Suite pytest réelle existe et passait avant le changement de déclencheur" (référence au passage en workflow_dispatch seul, PR#9) — point manqué par la fiche originale, qui affirmait à tort qu'aucune mesure au-delà de 'certif. e2e absente' n'existait dans ce fichier.
Dates
2026-08-11 · 2026-09-22 : suppression des deux workflows Actions dormants (ci.yml, garde-fous.yml, commit 45bbeea, PR#18, confirmé par `git log -- .github/workflows/`) — seul knowledge-refresh.yml (cron nocturne) subsiste, et le hook .githooks/pre-push local devient la seule spécification vivante des vérifications ; ce dépôt reste, nommément, la seule exception org-wide où Actions tourne encore payant (rafraîchissement quotidien réel, confirmé par portfolio-public.txt).
Un moteur qui audite le dérapage éthique d'un produit IA contre sa propre doctrine — et s'applique d'abord à lui-même.
Aiame Red simule les détournements possibles d'un produit d'intelligence artificielle (glissement de vocabulaire, jugement de personnes, absence de bouton d'arrêt) et produit une fiche de constats datée, reliée aux articles concernés du règlement européen sur l'IA. Le moteur applique d'abord cette grille à six briques internes d'AIAME, y compris la vitrine publique d'AIAME : les manques qu'il trouve sur lui-même (aucun mécanisme de re-scan automatique, par exemple) sont écrits noir sur blanc plutôt que masqués. Aujourd'hui, rien n'est vendu : l'offre est proposée en bac à sable uniquement (page transparence : offered_sandbox_only), aucune commande réelle n'existe, et le palier de veille continue reste retiré de la vente.
Capacités — prouvé, déclaré, absent
prouvéMoteur d'audit déterministe (règles R1 à R10)backend/aiame_red/rules.py:126-382 définit r1_semantic_slippage … r10_autonomy, assemblées dans RULES et appelées par engine.py ; backend/pyproject.toml déclare dependencies=["pyyaml>=6.0"] comme seule dépendance obligatoire du moteur. Recompté par grep dans cette revue : 54 fonctions de test dans backend/tests/*.py (test_baseline.py 12, test_probe.py 11, test_rules.py 23, test_send_alert.py 8 — total vérifié = 54, non ré-exécutés dans cette lecture) ; dernière mesure publique datée : portfolio-public.txt (2026-09-24) « 28/28 tests rejoués en direct le 09-08, moteur relancé contre specs/BASELINE.json : zéro dérive » — citation vérifiée mot pour mot contre le fichier source.
prouvéGarde-fous locaux pre-push (intégrité vendorée + tests + self-audit).githooks/pre-push (lu intégralement dans cette revue) enchaîne sha256sum -c scripts/CANONICAL.sha256, scripts/test_garde_fous.sh, scripts/garde_fous.sh, tools/uv-venv-health/check.sh, uv run pytest tests/, puis aiame_red.cli --ci --baseline specs/BASELINE.json — bloque le push sur tout échec (fail=1 → exit 1). Le fichier dit lui-même : « NON ACTIF sur un clone/worktree frais » tant que git config core.hooksPath .githooks n'a pas été exécuté.
prouvéSonde de réalité read-only (GET/HEAD, loopback + allowlist nommée)backend/aiame_red/probe.py (lu dans cette revue) : validate_target_host() refuse tout --target hors loopback sauf hôte explicitement listé via --allow-prod-host (aiame-doctrine/DECISION-2026-09-14-probe-prod-allowlist.md, présent sur disque, vérifié) ; READONLY_METHODS = {"GET", "HEAD"} ; 11 fonctions de test dans tests/test_probe.py, recompté.
déclaréAuto-audit hors GitHub Actions (timer systemd, hôte AIAME privé)Aucun .github/workflows/ dans ce dépôt (confirmé par find dans cette revue). Le commit b6aa330 (#37, 2026-09-22, lu intégralement) affirme un timer systemd vérifié en direct (sudo systemctl list-timers, dernier passage 2026-09-21) sur un serveur du réseau privé AIAME, hors de ce dépôt (aiame-infra#78-83) — non re-vérifié par moi dans cette lecture. Le README.md (§« Le moteur tourne d'abord sur nous », note du 2026-09-14) précise lui-même que ce déclencheur planifié n'a pas encore réellement tourné : « attend deux réglages côté propriétaire de l'infra (secrets…), listés dans aiame-infra#78 » — cette réserve du dépôt lui-même confirme le statut déclaré plutôt que prouvé.
prouvéÉtat de dérive assumé et versionné (BASELINE.json)backend/specs/BASELINE.json (lu intégralement) : 6 cibles (aiame-angel, aiame-hand, aiame-prd, aiame-rag, aiame-sov, aiame-vitrine), chacune avec sa liste `blocking` explicite ou vide (aiame-rag et aiame-vitrine : blocking = []) — recompté et confirmé caractère par caractère dans cette revue.
déclaréAlerte e-mail sur échec d'auditbackend/scripts/send_alert.py (lu intégralement, stdlib smtplib, 8 fonctions de test dans test_send_alert.py) fonctionne en isolation — confirmé par grep dans cette revue : « send_alert » n'apparaît nulle part dans backend/aiame_red/ ni dans .githooks/pre-push. Son orchestration réelle (déclenchement après un échec de self-audit) vit dans aiame-infra, hors de ce dépôt, non vérifiable depuis ici.
prouvéMatrice de traçabilité doctrine ↔ règles (TRACEABILITY.yml)backend/TRACEABILITY.yml (577 lignes, wc -l vérifié, lu intégralement) recense 35 clause_id (recompté par grep "^\s*- clause_id:" dans cette revue — le chiffre de 72 avancé initialement était faux, corrigé ici), avec statuts checked (5), partially-checked (12), gap (8), out-of-engine-scope (6), meta-gap (1), coverage-gap (1), self-referential-gap (1), not-yet-audited-in-practice (1) — plus de variété que les 5 statuts cités initialement. Sa propre vue rendue (TRACEABILITY.md) est restée figée au commit #24 (9abf296, 2026-09-06, confirmé par git log --date=short) et contredit aujourd'hui le YAML sur MISSION-b2b-buyer-only (TRACEABILITY.md ligne 43 : « no rule checks it »), mis à jour au commit #35 (6368607, 2026-09-20, confirmé) qui a ajouté la règle produit P1 (rules.py, PRODUCT_RULES) : dérive doc/code de 14 jours calendaires, toujours présente au 2026-09-29, dans l'outil dont le métier est de détecter ce type de dérive ailleurs.
absentVeille continue (re-scan automatique, alerte, historique par client)README.md ligne 34 (§Le modèle) : « pas encore vendable », retirée de la vente le 2026-08-19 (commit aa70977, confirmé). backend/FINDINGS-LOG.md ligne 114 (lu) documente le retrait : aucun cron, aucune stack de monitoring, aucun historique par client en infrastructure.
Ce qui est absent, en toutes lettres
Veille continue : ABSENTE en infrastructure (cron, stack de monitoring, historique par client) — retirée de la vente le 2026-08-19 ; README.md et backend/FINDINGS-LOG.md le disent en toutes lettres.
CI GitHub Actions : ABSENTE — dossier .github/workflows/ supprimé (commit b6aa330, #37, 2026-09-22, confirmé), remplacée par un hook pre-push local et un timer systemd externe à ce dépôt.
Gate --check anti-dérive pour TRACEABILITY.yml (règle orpheline / clause sans preuve) : spécifiée dans backend/FINDINGS-LOG.md, non construite.
Extraction AST du code-vérité (articles=[...] de rules.py) pour vérifier TRACEABILITY.yml automatiquement : spécifiée, non construite.
TRACEABILITY.md (vue rendue humaine) : pas régénérée depuis le 2026-09-06 (commit #24) alors que son propre YAML source a changé le 2026-09-20 (commit #35) — contradiction toujours présente au 2026-09-29, confirmée par git log dans cette revue.
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 vérifie l'intégrité de garde_fous.sh + test_garde_fous.sh vendorés depuis aiame-doctrine/garde-fous/ ; recontrôlé à chaque push par .githooks/pre-push (sha256sum -c). Confirmé dans vendoring.txt (SCRATCH), seule entrée pour aiame-red.
aiame-doctrinecopie-doctrinebackend/TRACEABILITY.yml cite 35 clause_id (recompté, corrigé — pas 72) de aiame-doctrine/reference/CLAUSES.yml par ID (jamais le texte intégral), plus des DECISION-*.md nommés (no-sale-before-e2e, probe-prod-allowlist) dont l'existence sur disque a été vérifiée dans cette revue et qui contraignent du code réel (probe.py:validate_target_host).
—README.md (§Le modèle) + portfolio-public.txt (2026-09-24) : « pas de surface de déploiement propre (CLI/librairie) — pas de vérification HTTP directe possible » ; aucune entrée pour aiame-red dans probes-2026-09-29.txt (vérifié) ; aucune arête dans graph.json pour aiame-red (nœud présent, zéro edge — cohérent avec l'absence de surface HTTP). L'offre se présente via aiame.fr (contact), pas comme un service self-service séparé.
Modèle de langage
oui — moteur déterministe, pyyaml seule dépendance obligatoire du moteur (backend/pyproject.toml, vérifié), aucun appel modèle câblé dans le chemin d'exécution ; httpx est une dépendance optionnelle pour la sonde read-only (probe.py), pas un LLM.
Souveraineté
Cœur d'audit 100% local (pyyaml seul, aucun réseau) ; la sonde de réalité optionnelle ne fait que des GET/HEAD en lecture, refusée par défaut hors localhost, avec une seule exception nommée par une décision de gouvernance datée.
Doctrine incarnée
FIRST-DOCTRINE-no-sale-before-e2e
AXIOM-C3
B2H-A6.3
GF-1
GF-4
DECISION-2026-09-14-probe-prod-allowlist
Tests
4fichiers · 54fonctionsportfolio-public.txt (2026-09-24) : « 28/28 tests rejoués en direct le 09-08, moteur relancé contre specs/BASELINE.json : zéro dérive » — citation vérifiée mot pour mot. Le nombre de fonctions de test a crû depuis (54 aujourd'hui dans 4 fichiers, recompté par grep dans cette revue : 12+11+23+8=54) sans nouvelle mesure publique rejouée depuis le 09-08.
Dates
2026-07-28 · 2026-08-19 — retrait de « Veille continue » de la vente après auto-audit (aucun cron/monitoring/historique en infra) ; ce constat devient clause_id FIRST-DOCTRINE-no-sale-before-e2e, la toute première doctrine écrite de l'organisation (aiame-doctrine/DECISION-2026-08-19-no-sale-before-e2e-clean.md, présence confirmée sur disque).
Workspace — l'inventaire et les garde-fous d'entrée
Le dépôt qui dit quels dépôts forment AIAME, et qui refuse un push sans preuve. Il ne porte aucun produit.
Ce dépôt est le point d'entrée de l'espace de travail. Sa liste unique des dépôts, repos.json, nomme les 43 dépôts de l'organisation et les exclusions avec leur raison ; il s'y exclut lui-même, puisqu'il ne peut pas se cloner lui-même. Il porte aussi la doctrine d'espace de travail (CLAUDE.md : jamais de push sur main, un garde-fou jamais vu échouer ne prouve rien, Claude ne décide pas de publier) et, sous tools/, les instruments qui l'appliquent : santé git, anti-fuite d'adresses, cartographie de la flotte, et cette Galaxie. Chaque push passe par un hook qui rejoue les suites concernées. Une limite : la commande qui compare l'inventaire à l'organisation GitHub n'a pas été rejouée pour cette fiche — elle a dépassé 120 secondes dans cet environnement.
Capacités — prouvé, déclaré, absent
prouvéListe unique des dépôts, avec les exclusions et leur raisonrepos.json : 43 entrées dans « repos » (jq '.repos|length', 2026-10-04), clé « excluded » avec un champ « why » par entrée.
prouvéHook pre-push qui rejoue les suites avant tout push.githooks/pre-push : run_check pour CANONICAL.sha256, test_garde_fous, anti-fuite, cartographie-flotte, git-health, uv-health ; passé sur les pushes de PR #203, #209, #210 (2026-10-04).
déclaréComparaison de l'inventaire à l'organisation GitHub (bootstrap.sh --check)bootstrap.sh en-tête : « --check compare repos.json a l'org GitHub » ; rejoué le 2026-10-04 avec timeout 120 s : interrompu (« Terminated »), aucun résultat. CLAUDE.md : « bootstrap.sh n'a jamais tourné sur une machine réellement neuve ».
Ce qui est absent, en toutes lettres
Le chemin « clonage effectif » de bootstrap.sh n'a jamais tourné sur une machine neuve (CLAUDE.md) ; la comparaison avec l'organisation n'a pas été rejouée pour cette fiche.
—Dépôt privé, sans service ni surface web : outillage et doctrine d'espace de travail.
Modèle de langage
oui — le dépôt ne contient aucun appel à un modèle : ses outils sont des scripts Bash et Python déterministes ; le garde-fou GF-1 vendoré tourne au pre-push.
Souveraineté
Aucune donnée d'utilisateur ; le dépôt ne tient que des listes de dépôts, de la doctrine et des scripts. Les secrets vivent hors de l'arbre versionné et la racine est une liste blanche : un fichier oublié n'est pas suivi (CLAUDE.md règle 7).
Doctrine incarnée
CLAUDE.md règles 1-12
Tests
16fichiers · 65fonctionsMesure de revue 2026-10-04 : 16 harnais test_*.sh sous tools/, 65 appels « cas » comptés par grep (approximation : un cas = un appel, pas une fonction de test).
Dates
2026-08-07 · 2026-10-04 — classé comme étoile de la Galaxie (branche doctrine).
Pile
Bash, Python 3 (outils de tools/), git hooks (.githooks), jq
aiame-creator · antériorité · référence
Pièce d'antériorité
Pièce de référence pour dater un travail antérieur à AIAME : un document texte statique, sans code ni service.
Ce dépôt n'est pas un produit : il conserve une pièce de référence, un unique document texte, pour dater un travail antérieur à la création de l'écosystème. Il ne contient que ce document et les garde-fous doctrinaux communs à tout dépôt AIAME. Rien à installer, rien à visiter : c'est une pièce d'archive, pas un service.
Capacités — prouvé, déclaré, absent
prouvéPièce de référence (document texte statique)aiame-creator : un document texte (4 347 octets), lu intégralement ; contenu non reproduit ici (dépôt privé, voir ne_pas_dire)
prouvéGarde-fous doctrinaux GF-1..4 vendorés depuis aiame-doctrine, vérifiés en pre-push localscripts/garde_fous.sh + scripts/CANONICAL.sha256 (34 lignes, vérifié `wc -l`) + .githooks/pre-push ; `git config --get core.hooksPath` = `.githooks` actif sur ce checkout ; SCRATCH/vendoring.txt confirme la source aiame-doctrine
absentSuite de tests applicativegrep 'def test_' / '#[test]' / 'test(' sur tout le dépôt = 0 résultat (revérifié) ; document statique par conception (portfolio public 2026-09-24 : 'rien à construire ni déployer')
Ce qui est absent, en toutes lettres
Aucun code applicatif, aucune suite de tests (0 fichier de test détecté)
Aucune CI GitHub active : le garde-fou ne tourne plus qu'en pre-push local depuis la suppression du workflow (2026-09-22), jamais rejoué en CI depuis
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 + scripts/garde_fous.sh, resynchronisés à plusieurs reprises (commits df5a093, e2a857e, vérifiés dans git log) depuis aiame-doctrine ; confirmé par SCRATCH/vendoring.txt
Consommé par
—
Surface publique
—dépôt privé (dates.txt : 'privé' ; repos.json) ; absent de graph.json et de probes-2026-09-29.txt ; aucune route Traefik dans les arêtes détectées
Modèle de langage
sans objet — corpus documentaire statique, aucun code exécuté
Souveraineté
Sans objet : aucune donnée traitée, aucun service exécuté ; un seul fichier texte archivé dans un dépôt privé hébergé sur GitHub.
Doctrine incarnée
GF-1
GF-2
GF-3
GF-4
Tests
0fichiers · 0fonctionsportfolio-public.txt 2026-09-24 : 'certif. e2e absente' ; 'Document statique — rien à construire ni déployer, par conception'
Dates
2026-07-28 · 2026-09-22 : PR#8 (d416763, 13:58) restaure le contrôle d'intégrité CANONICAL.sha256 dans le pre-push, absent depuis la suppression du workflow Actions par PR#7 (9b17f67, 13:29) — 29 minutes d'écart, même classe de régression que la règle 12 du workspace
Pile
texte brut (.txt), bash (garde-fous vendorés)
aiame-doctrine · doctrine et décisions · vivant
aiame-doctrine
La source canonique de la doctrine éthique d'AIAME : Constitution, chartes, décisions datées, registre des clauses et garde-fous. Les textes n'y sont jamais retranscrits ni corrigés sur place ; toute évolution s'écrit dans une nouvelle décision datée.
Le 28 juillet 2026, onze textes fondateurs sont extraits mot pour mot de conversations privées, avec la décision de fork. Le 7 août, un horodateur tiers indépendant (RFC 3161) date leur archive : seul un condensat de 69 octets quitte la machine, jamais le contenu. Depuis, la doctrine avance par décisions datées (21 fichiers au 2026-09-30) et jamais par retouche du texte historique. Chaque fichier de décision n'a connu qu'un seul commit, et les douze textes ancrés sont restés identiques octet pour octet à l'archive horodatée. Le dépôt contient aussi les générateurs des pages légales des services AIAME, les garde-fous de l'organisation et l'outil qui vérifie leurs copies dans les autres dépôts.
Capacités — prouvé, déclaré, absent
prouvéTextes historiques jamais édités en place ; on corrige par une nouvelle décision datéegit log --follow : chacun des 12 textes racine (11 chartes et la décision de fork) n'a qu'un seul commit (8e6624b, 2026-07-28). Extraction de provenance/aiame-doctrine-2026-08-07.tar.gz et comparaison avec cmp : 12/12 identiques octet pour octet (rejoué le 2026-09-30). Chacun des 21 fichiers DECISION-*.md n'a qu'un seul commit.
prouvéAntériorité ancrée par un horodatage RFC 3161 indépendant, sans publier le contenuRejoué le 2026-09-30. sha256sum -c SHA256SUMS : OK. openssl ts -verify sur le .tsq : Verification: OK. Jeton freetsa.org, série 0x06D1CD22, 7 août 2026 10:58:47 GMT. Mutation : archive plus 1 octet, résultat « message imprint mismatch » puis FAILED. Requête .tsq : 69 octets (wc -c).
prouvéGarde-fous GF-1 à GF-5, dont on a prouvé qu'ils savent échouer (harnais de mutation) ; copies à jour dans 34 dépôts déclarésRejoué le 2026-09-30. garde-fous/test_garde_fous.sh : 47 cas, 0 échec. garde-fous/verifier-copies.sh : 34 consommateurs (33 dépôts frères et la racine de l'espace de travail), 68 fichiers, tous à jour. garde_fous.sh appliqué à ce dépôt : GF-1 à GF-5 OK. GF-3 n'émet qu'un avertissement et ne bloque pas. verifier-copies ne voit que les consommateurs déclarés dans sa liste, et seulement en local.
prouvéNettoyage des variables GIT_* prouvé : le harnais de mutation ne peut pas écrire dans le vrai dépôtgarde-fous/test_lavage_git.sh rejoué le 2026-09-30 : 2 cas, 0 échec. Le harnais nettoyé laisse le dépôt de test intact. Le même harnais privé de la ligne de nettoyage l'abîme, ce qui prouve que le test sait voir le défaut.
prouvéGénérateurs des pages légales (mentions légales, CGV, confidentialité) de quatre services AIAMElegal/build_legal.py, build_legal_sov.py, build_legal_angel.py, build_legal_price.py, avec le gabarit commun _gabarit.py. Un GET du 2026-09-30 sur sov.services.aiame.fr/mentions-legales.html renvoie 200 et contient « GÉNÉRÉ par aiame-doctrine/legal/build_legal_sov.py ». Le site principal, lui, sert une sortie plus ancienne : voir les manques.
prouvéRegistre structuré des clauses de doctrine (CLAUSES.yml), versionné à part des textesreference/CLAUSES.yml compte 69 clauses, chacune avec un clause_id stable, une source et un statut : 52 STILL BINDING, 11 QUARANTINED-PROTECTED, 4 SUPERSEDED-IN-EMPHASIS, 2 NEEDS OWNER CONFIRMATION. Le journal des versions de reference/REFERENCE.md va de v0.1.0 (2026-08-19) à v0.6.0 (2026-09-28).
absentIntégration continue GitHub Actions sur ce dépôtWorkflow garde-fous.yml supprimé (commit e76d6ca, 2026-09-22), plus aucun dossier .github/. Les mêmes contrôles tournent en local avant chaque push (.githooks/pre-push : harnais, test de nettoyage GIT_*, garde_fous.sh ; core.hooksPath=.githooks vérifié sur ce clone).
Ce qui est absent, en toutes lettres
Un seul horodatage RFC 3161 (2026-08-07). Les 20 décisions écrites depuis ne sont couvertes par aucun jeton, alors que PROVENANCE.md dit lui-même que toute évolution significative « mérite un nouveau jeton ».
www.aiame.fr sert des pages légales commitées le 2026-08-06 : le GET du 2026-09-30 est identique au fichier du dépôt vitrine. Elles diffèrent de ce que build_legal.py produit aujourd'hui : pas d'en-tête « GÉNÉRÉ », pas de version anglaise, alors que le générateur les produit depuis le 2026-09-25. La régénération n'a pas été redéployée.
Le README du dépôt est en retard sur ses propres scripts. Il annonce 12 cas pour test_garde_fous.sh (47 mesurés). Il liste 17 consommateurs, dont un sous son nom d'avant renommage (services-manager), contre 34 déclarés dans verifier-copies.sh. Il renvoie vers un workflow CI supprimé le 2026-09-22.
Le portfolio public affiche encore, pour ce dépôt, « 1/25 copie vendorée à jour » (mesure du 2026-09-08), alors que le rejeu du 2026-09-30 donne 34/34.
Deux clauses sont en attente de confirmation du propriétaire : MISSION-b2b-buyer-only depuis le 2026-09-28, et FAM-status (Charte Family) depuis le 2026-08-19. Aucun texte n'a été réécrit, volontairement.
Pages légales encore en BROUILLON selon legal/STATUT.md (2026-09-25) : CGU de Sov, CGV et confidentialité d'Angel.
verifier-copies.sh ne peut tourner qu'en local (dépôt privé), et le contrôle avant push n'est actif que si core.hooksPath est configuré sur le clone.
Dépend de
aiame-prdcopie-doctrinereference/CLAUSES.yml:22-25 : les cinq lois UAX sont référencées par la source « aiame-prd:README.md#4.1-Les-cinq-lois-UAX » (ex. ligne 602), sans être dupliquées. MISSION-b2b-buyer-only (ligne 92) cite aiame-prd:MISSION-2027.md.
aiame-ivxautreprovenance/PROVENANCE.md (dernier paragraphe) : les certificats de vérification sont « repris » du kit de provenance IVX. sha256 identiques, vérifié le 2026-09-30 : cacert.pem 2151b611… et tsa.crt 8bfb0305… dans aiame-ivx/provenance/ et dans aiame-doctrine/provenance/.
—Dépôt privé, sans service HTTP propre. Ses générateurs produisent les pages légales d'autres surfaces : en-tête « GÉNÉRÉ par aiame-doctrine » constaté en direct sur sov.services.aiame.fr/mentions-legales.html (GET 200 le 2026-09-30). www.aiame.fr/mentions-legales.html (GET 200 le 2026-09-30) est identique au fichier du dépôt vitrine, commité le 2026-08-06, sans cet en-tête.
Modèle de langage
Sans objet. Aucun appel à un modèle ni aucun client réseau dans le code (git grep sur *.py et *.sh). Les seules mentions d'openai ou d'anthropic sont celles du garde-fou GF-1 qui les interdit, et les fichiers de test qui vérifient qu'il les détecte.
Souveraineté
Aucune donnée d'usager et aucun fichier de secret suivi (GF-2 vert le 2026-09-30). Les seules données personnelles sont l'identité et les coordonnées de l'éditeur, que la loi (LCEN) impose de publier dans les mentions légales. L'ancrage RFC 3161 n'a transmis au tiers horodateur qu'une requête de 69 octets contenant le condensat, jamais le contenu. Les certificats de vérification sont conservés dans le dépôt, donc la vérification se fait hors ligne.
Doctrine incarnée
EXTRAIT-JAMAIS-ECRIT
LOI-PREUVE
NO-BULLSHIT
FORK-E2-E3
MUET-INVENDU
RIEN-VENDU-AVANT-E2E
TRANSPARENCE-COUT-REVENU
GARDE-FOU-PROUVE
TRIANGLE-VERIFICATION
NON-COMPARATIF
INITIATIVE-BORNEE
Tests
2fichiers · 0fonctionsAucun compte de tests n'est publié pour ce dépôt. Dernière mesure publique : portfolio (vérification du 2026-09-08), « 1/25 copie vendorée à jour ». Rejeu local non public du 2026-09-30 : test_garde_fous.sh 47 cas et test_lavage_git.sh 2 cas, 0 échec ; verifier-copies.sh 34/34. Ce sont deux harnais de mutation en shell, sans test pytest.
Dates
2026-07-28 · 2026-09-29 : 21ᵉ décision datée. AIAME mesure d'abord sa propre exposition avant de proposer un instrument de souveraineté à quiconque, et cette mesure ne sort pas de l'organisation.
Pile
Markdown (textes et décisions), YAML (CLAUSES.yml), Python standard (générateurs legal/), Bash (garde-fous, harnais de mutation), OpenSSL (vérification RFC 3161)
aiame-ivx · antériorité · recherche
Recherche IVX — provenance et antériorité
Recherche privée sur une archive logicielle héritée, pour en extraire des idées vers l'écosystème — preuve d'antériorité horodatée.
Ce dépôt étudie, en lecture seule et à huis clos, un ancien logiciel hérité, pour en extraire les idées qui valent la peine d'être reconstruites — jamais le code lui-même. La preuve que ce travail existait à une date donnée est ancrée hors de l'organisation, par un service d'horodatage indépendant, vérifiable par quiconque possède les trois fichiers de preuve. Rien ici n'est un produit : c'est de la matière première pour des décisions prises ailleurs.
Capacités — prouvé, déclaré, absent
prouvéCartes de recherche (mutualisation, sécurité/authentification) + briefs de décisionQuatre cartes de recherche dans docs/ (mutualisation avec le partenaire, sécurité et authentification, extraction de fonctionnalités, revue de schéma SQL) + 4 fichiers docs/adr-briefs/, tous présents sur disque et lus
prouvéHorodatage RFC 3161 indépendant de l'archive de recherchere-vérifié en direct pendant cette revue : `openssl ts -verify -queryfile provenance/ivx.tsq -in provenance/ivx-freetsa.tsr -CAfile provenance/cacert.pem -untrusted provenance/tsa.crt` → 'Verification: OK' (TSA freetsa.org)
prouvéGarde-fous doctrinaux GF-1..4 vendorés + pre-push actifscripts/CANONICAL.sha256 (23 lignes, vérifié `wc -l`) + .githooks/pre-push ; `core.hooksPath`=`.githooks` actif sur ce checkout
absentÉlision systématique du nom de l'éditeur/produit historique dans tout document suiviContredite par l'état réel du dépôt, vérifié en direct : le README classe `docs/` et `docs/adr-briefs/` comme non suivis en git ('Tracked? no'), mais `git ls-files docs/` liste bien les 8 fichiers comme suivis ; et au moins deux d'entre eux, commités, contiennent un alias technique qui inclut un fragment du nom élidé (fragment non reproduit ici, par prudence — même principe que le ne_pas_dire ci-dessous). La politique existe et s'applique à la prose, mais n'est pas 'systématique' au sens où la fiche d'origine la présentait.
déclaréAudit de complétude des idées extraites (20/45 items sans disposition, comblés)commit cb2b36c 'recherche IVX : audit de complétude — 20/45 idées sans disposition, comblées (#2)' — chiffre auto-rapporté dans le message de commit, non recompté indépendamment
absentCode applicatif / suite de testsgrep 'def test_' / '#[test]' / 'test(' = 0 sur tout le dépôt (revérifié) ; portfolio public 2026-09-24 : 'Aucun code applicatif'
Ce qui est absent, en toutes lettres
Aucun code applicatif, 0 test
CI GitHub désactivée depuis le 27/08 (facturation), non réactivée : la doctrine vendorée n'est plus vérifiée qu'en local
Une décision d'architecture côté partenaire (audit/révocation de session) : brief écrit ici, mais au dernier état lu dans ce dépôt (2026-08-06) la décision elle-même restait à rédiger côté partenaire — état non revérifié côté partenaire lors de cette revue
Le README affirme deux choses que la vérification contredit : que `docs/` et `docs/adr-briefs/` ne sont pas suivis en git, et que le nom d'éditeur hérité est élidé partout (voir la capacité ci-dessus, statut rétrogradé de « déclaré » à « absent »)
Même correctif same-day retrait-workflow/restauration-CANONICAL du 2026-09-22 (PR#9→#10, 27 min d'écart) que dans aiame-creator et aiame-prd — ce dépôt non plus ne figure pas dans la liste des 10 dépôts de la règle 12 du CLAUDE.md racine (détail dans la carte aiame-creator)
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 + scripts/garde_fous.sh, resynchronisés depuis aiame-doctrine (commits 1e2b05a, 809821b, bdb85ed, vérifiés dans git log) ; confirmé par SCRATCH/vendoring.txt
—dépôt privé (README : 'Private research staging' ; dates.txt : 'privé') ; absent de graph.json et de probes-2026-09-29.txt
Modèle de langage
sans objet — corpus de recherche documentaire, aucun code exécuté
Souveraineté
Dépôt privé hébergé sur GitHub. L'unique donnée qui sort est un condensat cryptographique (jamais l'archive), envoyé à un service d'horodatage tiers indépendant pour ancrer une date, pas un contenu.
0fichiers · 0fonctionsportfolio-public.txt 2026-09-24 : 'certif. e2e absente' ; 'Aucune preuve de déploiement recherchée par conception'
Dates
2026-07-31 · 2026-07-31 : ancrage RFC 3161 de l'archive de recherche (freetsa.org) — vérifié de nouveau, en direct, lors de cette revue (2026-09-29) : toujours 'Verification: OK'
La mémoire de travail des sessions d'IA qui construisent AIAME : 368 notes en texte simple, aucun code de produit, et une copie vérifiée des garde-fous de l'organisation. Son scanneur anti-secret propre était resté débranché pendant un mois ; il a été rebranché le 2026-09-29.
Ce dépôt n'est pas un produit. C'est la mémoire de travail que les sessions d'IA se transmettent d'une conversation à l'autre pendant qu'elles construisent AIAME : 368 notes en texte simple, dont 265 sont référencées par un index. Il s'applique la discipline qu'il documente. Il contient une copie vérifiée par somme de contrôle des garde-fous de l'organisation, et un scanneur qui doit bloquer un envoi si une vraie valeur de secret se glisse dans une note. Ce scanneur, écrit le 8 août 2026, était appelé à chaque envoi. Le 27 août, le contrôle d'avant envoi a été réécrit après l'arrêt de l'intégration continue payante, et l'appel a disparu. Il n'a été rebranché que le 29 septembre, sur signalement d'un outil de santé des garde-fous.
Capacités — prouvé, déclaré, absent
prouvéMémoire de session (368 notes .md, index MEMORY.md)`git ls-files '*.md' | wc -l` donne 368 (2026-09-30). MEMORY.md fait 200 lignes et renvoie à 265 notes distinctes. 206 notes portent une date dans leur nom.
prouvéGarde-fous vendorés (GF-1 à GF-5)`sha256sum -c scripts/CANONICAL.sha256` donne OK sur garde_fous.sh et test_garde_fous.sh, avec des sommes identiques à aiame-doctrine/garde-fous/ (rejoué le 2026-09-30). Copie déclarée dans aiame-doctrine/garde-fous/verifier-copies.sh:130. .githooks/pre-push l'exécute, et core.hooksPath=.githooks est actif sur le clone principal.
prouvéScan anti-secret dans la prose (SM-1)scripts/scan-secrets.sh (42 lignes) et son harnais de mutation scripts/test_scan-secrets.sh (8 cas, dont 2 témoins négatifs) ont été créés le 2026-08-08 (commit e4da157) ; le scan était alors appelé par pre-push. La réécriture du hook du 2026-08-27 (commit c7fdb24, #2) a perdu cet appel. Le harnais, lui, n'avait jamais été appelé par un hook. Les deux ont été recâblés par le commit 2337697 (#12, 2026-09-29).
déclaréMasquage anti-fuite des noms réels de tiers et de domainesCommit 6642fef (#11, 2026-09-28) : 7 fichiers modifiés. Le message du commit annonce 28 fuites masquées, puis « 0 fuite » après passage de tools/anti-fuite/check.py (aiame-workspace) : ce décompte n'a pas été rejoué ici. Le garde vit dans .githooks/pre-push d'aiame-workspace (l.138-164, câblé le 2026-09-26) et lit la liste des dépôts dans repos.json. Il ne se déclenche pas quand on pousse aiame-memory.
absentService ou code applicatifHors .md, les seuls fichiers suivis sont .githooks/pre-push et 5 fichiers sous scripts/ ; il n'y a ni pyproject.toml, ni package.json, ni Cargo.toml.
prouvéVérification locale sans coût ActionsLe commit be08f2e (#9, 2026-09-22) supprime .github/workflows/garde-fous.yml. Le commit 45edf27 (#10) remet sha256sum -c dans pre-push, qui relance GF-1 à GF-5 et SM-1 (harnais puis scan) à chaque envoi.
Ce qui est absent, en toutes lettres
Aucun code applicatif ni service (voulu : c'est un dépôt de notes)
Le scan anti-secret SM-1 n'a été appelé par aucun hook du 2026-08-27 au 2026-09-29 ; son harnais de mutation n'avait jamais été appelé avant le 2026-09-29
Le message du correctif date le trou « depuis le 10/08 », alors que l'historique git montre la perte d'appel le 2026-08-27
SM-1 ne reconnaît que des formes connues de secrets : une valeur sensible d'une autre forme lui échappe
Le garde anti-fuite des noms réels de tiers n'est pas dans ce dépôt : il vit dans aiame-workspace et ne se déclenche que lorsqu'on pousse ce dernier
Le hook pre-push demande encore « Ne PAS supprimer garde-fous.yml », alors que ce fichier a été supprimé le 2026-09-22 (#9)
Sur 368 notes, 103 ne sont référencées par aucun lien de l'index
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 : les sommes de garde_fous.sh et de test_garde_fous.sh sont identiques à celles d'aiame-doctrine/garde-fous/ ; `sha256sum -c` donne OK (2026-09-30).
aiame-workspaceautreSa protection anti-fuite dépend de tools/anti-fuite/check.py, lancé par aiame-workspace/.githooks/pre-push:155, qui parcourt les dépôts de repos.json, dont aiame-memory (repos.json:112) ; c'est la source du masquage 6642fef. Le trou SM-1 a été trouvé par tools/gates-health/check.py:112 (commit 2337697).
Consommé par
—
Surface publique
—Dépôt privé (dates.txt), sans pyproject ni service ; aucune arête dans graph.json et aucune entrée dans probes-2026-09-29.txt.
Modèle de langage
Sans objet : ce dépôt ne contient aucun service exécutable (ni pyproject, ni package). Le contenu est rédigé pour l'essentiel par des sessions Claude Code (44 des 74 commits portent un co-auteur Claude). C'est le sujet du dépôt, pas une dépendance à l'exécution.
Souveraineté
Rien n'est exposé : le dépôt est privé, sans service ni route publique. Son principal risque est une fuite dans la prose (noms réels de tiers, valeurs de secret). Le scan de secrets vit dans ce dépôt ; le scan des noms de tiers vit dans aiame-workspace. Le premier est resté débranché du 27 août au 29 septembre 2026.
Doctrine incarnée
GF-1
GF-2
GF-3
GF-4
Tests
2fichiers · 55fonctionsPortfolio public du 2026-09-24 : « Dépôt de notes, désormais 183 fichiers .md (montés de ~120), pas de code à construire ni déployer ». Mesuré le 2026-09-30 : 368 fichiers .md suivis. L'écart vient surtout du rattrapage du 2026-09-24 (commit 666488e : 172 notes déjà sur disque, enfin committées, 184 → 356). Tests : 2 harnais de mutation, 47 cas dans test_garde_fous.sh (vendoré) et 8 cas dans test_scan-secrets.sh (propre au dépôt), non exécutés dans cette revue.
Dates
2026-08-08 · 2026-09-29 : régression silencieuse (REGBUG) fermée. scan-secrets.sh et son harnais de mutation sont recâblés dans pre-push (commit 2337697). L'appel au scan avait été perdu lors de la réécriture du hook du 2026-08-27 (commit c7fdb24), et non le 10/08 comme le dit le message du correctif.
Corpus interne des spécifications produit : la feuille de route et les règles éthiques que le reste de l'écosystème doit respecter.
Ce dépôt n'est pas un produit mais le document fondateur qui décrit ce que les produits doivent devenir : une feuille de route confidentielle à usage interne. Il pose notamment cinq règles précises — les « lois UAX » — qui gouvernent la manière dont l'intelligence artificielle d'AIAME doit se comporter (jamais agir seule, toujours une preuve pour chaque chiffre affiché, un écran pour une seule intention…). Ces règles, elles, sont publiques : elles sont enregistrées comme doctrine officielle et s'appliquent à tout l'écosystème.
Capacités — prouvé, déclaré, absent
prouvéCorpus de spécifications produit (PRD Aiame v1.3, PRD Elzéard v2, PRD Le Pouls v1.0, MISSION-2027, POC Graine)fichiers présents et lus : README.md (57686 octets), PRD_Aiame_2026-2030_v1.3.md (88791 octets), PRD_Pouls_v1.0.md, MISSION-2027.md, POC_Graine_v0.1.md (tailles vérifiées `wc -c`)
prouvéCinq lois UAX, source canonique de clauses de doctrine publiqueaiame-doctrine/reference/CLAUSES.yml : clauses UAX-LOI-REGARD, UAX-LOI-INITIATIVE-BORNEE, UAX-LOI-SOBRIETE, UAX-LOI-APPRENTISSAGE-CONSENTI, UAX-LOI-PREUVE.a/.b, sourcées explicitement 'aiame-prd:README.md#4.1' (vérifié ligne par ligne)
prouvéGarde-fous doctrinaux GF-1..4 vendorés + pre-push actifscripts/CANONICAL.sha256 (27 lignes, vérifié `wc -l`) + .githooks/pre-push ; `core.hooksPath`=`.githooks` actif sur ce checkout
prouvéAnti-fuite appliquée aux PRD stratégiques (masquage des noms de clients réels par nom de verticale)commits d4d963b 'masque les noms clients réels dans les PRD stratégiques' et 7f2b7c4 'masquage par NOM DE VERTICALE (BTP / transit)', 2026-08-28 (dates vérifiées dans git log, pas 08-22 comme la fiche d'origine l'indiquait)
absentCode applicatif / service à déployergrep 'def test_' / '#[test]' / 'test(' = 0 sur tout le dépôt (revérifié) ; portfolio public 2026-09-24 : 'Aucun code applicatif, rien à déployer'
Ce qui est absent, en toutes lettres
Aucun code applicatif, rien à déployer (statut documentaire, pas un service)
GAP confirmé dans aiame-doctrine/reference/CLAUSES.yml (ligne 632) : UAX-LOI-PREUVE.b est explicitement marquée 'GAP — no aiame-red rule checks this; the Capability dataclass has no sources/provenance field at all'
Même correctif same-day retrait-workflow/restauration-CANONICAL du 2026-09-22 (PR#13→#14, 26 min d'écart) que dans aiame-creator et aiame-ivx — ce dépôt non plus ne figure pas dans la liste des 10 dépôts de la règle 12 du CLAUDE.md racine (détail dans la carte aiame-creator)
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 + scripts/garde_fous.sh, resynchronisés depuis aiame-doctrine (commits 16b20db, c664c11, 42036a8, vérifiés dans git log) ; confirmé par SCRATCH/vendoring.txt
—dépôt privé, classification interne dans l'en-tête du document lui-même ; absent de graph.json et de probes-2026-09-29.txt
Modèle de langage
sans objet — dépôt de spécification, aucun code exécuté
Souveraineté
Dépôt privé hébergé sur GitHub, classé « confidentiel, usage interne » par son propre en-tête ; aucune donnée traitée, aucun service exécuté.
Doctrine incarnée
UAX-LOI-REGARD
UAX-LOI-INITIATIVE-BORNEE
UAX-LOI-SOBRIETE
UAX-LOI-APPRENTISSAGE-CONSENTI
UAX-LOI-PREUVE.a
UAX-LOI-PREUVE.b
DECISION-2026-07-28-FORK.md
Tests
0fichiers · 0fonctionsportfolio-public.txt 2026-09-24 : 'certif. e2e absente' ; 'classé dev au sens «pas de service», pas au sens «en cours de construction»' (changement pré-prod → dev noté et expliqué la même page)
Dates
2026-07-15 · 2026-07-28 : corpus PRD (Aiame v1.3, Elzéard v2 + brief) commité explicitement 'for IP anteriority' (commit 0541f7a, vérifié)
Pile
Markdown
aiame-auth · identité · déployé
aiame-auth — identité commune des produits AIAME
Identité commune des produits AIAME : jetons courts signés Ed25519, vérifiés localement par chaque produit, sessions révocables côté serveur.
Quand vous vous connectez à un produit AIAME (Angel, Sov…), c'est ce service qui vérifie votre mot de passe et vous remet un « laissez-passer » signé, valable 15 minutes, que chaque produit contrôle seul avec une clé publique, sans rappeler le service à chaque clic. Le jeton de renouvellement est à usage unique : s'il est rejoué (vol présumé), toute la session est coupée côté serveur, sans dépendre de votre navigateur. Vos droits — quel produit, quelle organisation, quel rôle — sont relus dans la base à chaque requête, jamais crus sur parole. Un seul annuaire pour tous les produits, hébergé par AIAME, sans fournisseur d'identité tiers.
Capacités — prouvé, déclaré, absent
prouvéJeton d'accès court (15 min) + jeton de renouvellement rotatif (14 j), signature Ed25519backend/app/domain/identity/token_service.py:30 (ACCESS_TTL_SECONDS = 15*60) et :34 (REFRESH_TTL_SECONDS = 14 j) ; tests backend/tests/test_auth_api.py:154 (login) et :193 (rotation) ; sonde GET 2026-09-29 sur /v1/auth/public-key → 200, algorithm EdDSA (probes-2026-09-29.txt:9). Relu sur disque le 2026-09-29.
prouvéDétection de réutilisation : un renouvellement rejoué révoque toute la famille de sessionbackend/tests/test_auth_api.py:209 test_refresh_reuse_kills_the_whole_family ; revendication atomique en base : backend/app/infrastructure/db/refresh_repository.py:52 claim_head_for_rotation (UPDATE conditionnel, ADR-AA-001 §Suites d'audit, course TOCTOU corrigée « prouvé par mutation » — la mutation elle-même est déclarée dans l'ADR, non rejouée ici)
prouvéVérification locale par les produits : vérificateur vendoré, sommes de contrôle, 7 consommateursverifier/CANONICAL.sha256 ; sha256 remesuré le 2026-09-29 par la revue : les 3 fichiers (verify_access_token.py, settings_mixin.py, test_verify_access_token.py) sont byte-identiques au canonique dans aiame-angel, aiame-sov, aiame-rag, aiame-services, aiame-price, aiame-fin, aiame-mcp (7/7) ; importés en code réel, ex. aiame-sov/backend/aiame_sov/core/security.py:30, aiame-angel/backend/aiame_angel/api/auth_guard.py:32 ; algorithme épinglé et `exp` obligatoire : verifier/verify_access_token.py:88-89
prouvéMulti-tenant produit + organisation, droits relus en base à chaque requêtebackend/tests/test_auth_api.py:277 test_me_reflects_a_membership_change_without_re_login ; ADR-AA-001 décision 2 ; backend/app/infrastructure/db/membership_repository.py:3 (relu par requête, jamais un claim JWT) ; schéma organization.parent_org_id nullable dès la 1re migration (alembic/versions/5a7113396678_initial_identity_schema.py:52)
prouvéPremier administrateur nommé, dernier administrateur protégé, aucune énumération de comptesbackend/tests/test_auth_api.py:102, :118 (inscription fermée une fois un admin présent), :325 (409 LAST_ADMIN), :165 (corps 401 byte-identique email inconnu / mauvais mot de passe — le test n'asserte que le corps, pas le temps de réponse) ; le bcrypt exécuté dans les deux cas est prouvé par le code, non par le test : backend/app/services/auth_service.py:72 (_DUMMY_HASH), :298 et :303
prouvéRécupération de compte par email : jeton opaque à usage unique, révocation de toutes les sessions, limitation de débitbackend/tests/test_password_reset.py:170 (sessions antérieures révoquées), :230 (second usage refusé) ; backend/app/core/rate_limit.py:18 ; routes backend/app/api/v1/auth.py:376 et :411. L'envoi d'email réel en production est seulement DÉCLARÉ (infra/storage-01/README.md §2026-09-17), non vérifiable d'ici ; ADR-AA-002 reste « proposé », non accepté par l'owner
absentConnexion via un fournisseur externe (OAuth)ADR-AA-001 décision 4 (ligne 29-33) : « prêt pour OAuth par construction » (type credential extensible) mais aucune route ni code ; les 12 routes de backend/app/api/v1/auth.py:219-430 ne connaissent que le mot de passe
absentDésactivation ou effacement d'un compteaucune route delete/deactivate dans backend/app/api/v1/auth.py (grep des décorateurs @router) ; ADR-AA-001:85-87 : « aucun endpoint de désactivation n'existe en v1 » ; is_active n'est vérifié qu'au bootstrap-membership, au login et aux deux étapes de réinitialisation (backend/app/services/auth_service.py:275, :332, :542, :607), pas sur /me ni /refresh
Ce qui est absent, en toutes lettres
ABSENT : connexion via fournisseur externe (OAuth) — préparé par le schéma, aucune route (ADR-AA-001 décision 4).
ABSENT : désactivation et effacement de compte — aucune route ; ADR-AA-001 le nomme « non atteignable en v1 » ; /me et /refresh ne re-vérifient pas is_active (seuls bootstrap-membership, login et la réinitialisation le font : backend/app/services/auth_service.py:275, :332, :542, :607).
ABSENT : purge/rétention automatisée des jetons de renouvellement, de réinitialisation et des événements d'audit (ADR-AA-002 §Ce qui est délibérément différé, ligne 113-115).
ABSENT : détecteur de dérive amont pour verifier/ — aiame-doctrine/garde-fous/verifier-copies.sh ne couvre que garde_fous.sh et test_garde_fous.sh (ligne 2, liste :55-98) ; la parité 7/7 constatée le 2026-09-29 a été remesurée à la main par cette revue, aucun mécanisme ne la garantit dans la durée (le CANONICAL.sha256 dit lui-même ce qu'il ne prouve pas).
ABSENT : CI GitHub (`actions/permissions` → enabled:false, relu via gh api le 2026-09-29 ; .github/workflows supprimé le 2026-09-22, commit d7eef68, PR#18) et protection de branche (indisponible sur ce plan GitHub, DECISION-2026-09-28-branch-protection-sweep) ; la seule garde est le hook pre-push local, actif sur ce clone (core.hooksPath = .githooks) mais non versionné — inactif sur tout clone frais.
ABSENT : ADR-AA-002 acceptée — statut « proposé » (docs/adr/ADR-AA-002:3) depuis le 2026-09-13 alors que la PR#13 est fusionnée (ca3fa45) et le code en production.
ABSENT : preuve d'envoi d'email réel en production — le mode « journalise au lieu d'envoyer » sans identifiants SMTP est silencieux (backend/app/core/email.py:37-39), configuré le 2026-09-17 selon infra/storage-01/README.md §48-55, non vérifiable d'ici.
ÉCART : le chiffrement au repos du 25/09 ne couvre pas tout ce que ce service utilise sur son serveur. L'écart restant est assumé par le propriétaire dans une décision datée (DECISION-2026-09-26), mais il n'était nommé nulle part dans ce dépôt.
ÉCART : backend/README.md:111 annonce encore « 66 tests » alors que README.md:28 dit 83 et que 83 cas sont collectés (80 def test_ dont 1 paramétré ×4, backend/tests/test_domain.py:31) ; PR#20 (fe5750a) n'a touché que README.md racine et le hook.
ÉCART : la table d'endpoints de backend/README.md:28-34 liste 7 routes et en omet 5 existantes (bootstrap-membership, invite-membership, password-reset-request, password-reset-confirm, reset-password).
ÉCART : ADR-AA-002:65 promet une page de réinitialisation « jamais de nom de produit » ; backend/static/reset-password.html:153 nomme Angel et Sov.
ABSENT : frontend de connexion propre — chaque produit consommateur porte sa propre page de login (4 frontends lisent NEXT_PUBLIC_AUTH_URL : aiame-angel, aiame-rag, aiame-services, aiame-sov) ; endpoint JWKS mentionné comme « futur » dans backend/app/core/config.py:22-23, non construit.
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 (source aiame-doctrine garde-fous/garde_fous.sh + test_garde_fous.sh, resynchronisé le 2026-09-22) ; `sha256sum -c scripts/CANONICAL.sha256` depuis la racine du dépôt : 2/2 OK, remesuré le 2026-09-29 ; exécuté par .githooks/pre-push:60-66
aiame-infraroute-publiqueaiame-infra/ansible/roles/vitrine/defaults/main.yml:499 route Traefik `auth-svc` → auth.services.aiame.fr (+ :705 `auth-dev-svc` vers le même service) ; graph.json arête route internet→aiame-auth ; infra/storage-01/README.md (DNS + proxy appliqués par l'owner)
aiame-agri-gersautredocs/adr/ADR-AA-002:80-82 : motif de réinitialisation de mot de passe repris de aiame-agri-gers avec deux écarts délibérés ; backend/app/core/rate_limit.py:6 s'en démarque explicitement (pas de default_limits) — filiation de conception, aucune dépendance de code ni d'exécution
https://auth.services.aiame.fr/v1/auth/public-keysonde GET du 2026-09-29 (probes-2026-09-29.txt:9) : 200, clé publique Ed25519 PEM + "algorithm":"EdDSA" ; route Traefik auth-svc dans aiame-infra ; API seule, pas de page d'accueil (un seul fichier HTML statique, backend/static/reset-password.html) ; page transparence publique (aiame-fr.github.io/transparence.html:110-111) : not_offered « pas encore câblé pour la vente »
Modèle de langage
oui — aucune bibliothèque ni appel de modèle de langage dans backend/pyproject.toml (grep openai/anthropic/llm/ollama/mistral : 0) ; le garde-fou GF-1 (aucun modèle frontière dans le chemin d'exécution) est vendoré depuis aiame-doctrine et exécuté par le hook local .githooks/pre-push (étapes 1-3) — hook non versionné, actif sur le clone principal seulement (voir manques)
Souveraineté
La clé privée de signature est générée sur un serveur AIAME et n'entre jamais dans le code ni dans une variable d'environnement (backend/.gitignore bannit *.pem et *.key) ; les produits ne reçoivent que la clé publique. L'annuaire des comptes (PostgreSQL) reste sur un serveur AIAME du réseau privé ; seul un proxy est exposé sur Internet. Aucun fournisseur d'identité tiers, aucun code Elzéard (0 occurrence mesurée dans backend/ et verifier/). Chiffrement au repos : lacune enregistrée le 19/09 (DECISION-2026-09-19), partiellement fermée le 25/09 (DECISION-2026-09-25) : la base des comptes est chiffrée, l'écart restant est nommé dans les manques ; incident au redémarrage documenté et résolu le 26/09 (DECISION-2026-09-26).
10fichiers · 90fonctionsportfolio public 2026-09-24 (carte datée du 2026-09-08) : « 66 tests passent en local, rejoué en direct — CI GitHub désactivée depuis le 27/08 ». Depuis : README racine annonce 83 (PR#20 fe5750a, 2026-09-24) ; recomptage grep de cette revue le 2026-09-29 sans exécution : 9 fichiers backend/tests = 80 `def test_` (dont 1 paramétré ×4 → 83 cas collectés) + 1 fichier verifier/ = 10 `def test_`. Non exécutés dans cette revue.
Dates
2026-08-17 · 2026-09-11 — six copies divergentes du vérificateur de jeton (aiame-angel, aiame-price, aiame-sov, aiame-services, aiame-fin, aiame-mcp), aucune identique, sans somme de contrôle, consolidées en un paquet canonique checksum-pinné (PR#12, commit a568b8a) ; en généralisant, la copie d'aiame-angel n'exigeait pas le claim `exp` : un jeton sans expiration y aurait été valable indéfiniment (verifier/README.md §Origine, verifier/CANONICAL.sha256)
Pile
Python 3.12, FastAPI, SQLModel + Alembic (migrations, test de dérive modèles/migrations : backend/tests/test_migrations.py:29), PyJWT — EdDSA / Ed25519, bcrypt, slowapi (limitation de débit), PostgreSQL en production, SQLite pour les tests, Docker Compose, Traefik (proxy public, via aiame-infra), uv, pytest, ruff
Un agrégateur qui combine des compteurs agrégés venant de plusieurs clients d'un partenaire. Il est conçu pour tourner chez ce partenaire, jamais sur l'infrastructure d'AIAME, et ne tourne nulle part aujourd'hui.
Ce dépôt écrit par AIAME est prévu pour combiner, une fois par semaine, des compteurs agrégés venant de plusieurs clients d'un partenaire, en tendances par métier ; la sortie ne porte aucun identifiant de client. Chaque client déclaré doit avoir une clé, et une case trop fine (moins de cinq contributions) est écartée, jamais affichée comme un zéro. Le code est écrit et testé (27 cas verts rejoués le 30 septembre), mais il ne tourne nulle part : où il s'exécutera chez le partenaire, comment les exports lui arriveront et comment les clés seront distribuées restent non décidés, et son propre README le dit. La relecture a aussi trouvé deux écarts entre ce que le code annonce et ce qu'il vérifie réellement. Le seuil compte des contributions et non des clients distincts. Rien n'interdit non plus deux clients déclarés avec la même clé. Les deux sont décrits plus bas.
Capacités — prouvé, déclaré, absent
prouvéDéchiffrement et vérification authentifiée d'un export client (AES-256-GCM + HMAC-SHA256)compass/crypto.py : _decrypt_aes_gcm, _verify_hmac_token (hmac.compare_digest), decrypt_and_verify ; test_crypto.py, 7 fonctions (9 cas avec paramétrage) : mauvaise clé, texte altéré, entrée illisible, jeton expiré, jeton forgé → None, jamais d'exception
prouvéSeuil k≥5 réappliqué au niveau agrégat (une case n'est publiée qu'avec au moins 5 contributions)compass/aggregate.py l.30 SEUIL_K = 5, l.76 « if len(valeurs) < SEUIL_K: continue » ; test_aggregate.py, 7 fonctions
absentComptage d'entreprises DISTINCTES par case (et non de contributions)annoncé par le README (point 3) et la docstring d'aggregate.py, mais le code compte len(valeurs), pas les tenant_id distincts : cinq exports portant le même tenant_id publient une case avec tenants_contributeurs=5 (reproduit en mémoire le 2026-09-30) ; cli.py dérive le tenant du nom de fichier sans extension (fichier.stem), donc deux fichiers d'un même client comptent deux fois
prouvéAucun identifiant de client dans la sortie (mais une case peut ne refléter qu'un seul client, voir « Comptage d'entreprises distinctes »)compass/aggregate.py : AggregateCell = (action, total, tenants_contributeurs), aucun champ tenant_id ; test_aggregate.py l.35-43 asserte que l'entrée porte tenant_id et que la sortie ne le porte jamais
prouvéClé obligatoire pour chaque client déclarécompass/config.py l.52-55 : RegistreInvalide si key_b64 manquante ou vide ; test_config.py, test_missing_key_b64_raises
absentRefus d'une même clé partagée entre plusieurs clientsconfig.py ne compare pas les clés entre entrées : un registre où deux clients ont la même key_b64 se charge sans erreur (reproduit le 2026-09-30 sur un fichier temporaire hors dépôt)
absentHébergement ou déploiement propre chez AIAMEREADME, point 1 : « never a live AIAME-hosted service » ; pyproject.toml, description : « never a live AIAME-hosted service » ; aucun dossier infra/ ni .github/
absentTransport réel de l'export hebdomadaireREADME, section « What this repo does not decide » : « undecided by any ADR » ; compass/cli.py, docstring : dépôt de fichiers de référence, « entirely out of this module's scope and undecided »
absentDistribution ou rotation des clés par clientREADME, « Key provisioning » : « how that registry is generated, rotated, or delivered … is not specified anywhere » ; compass/config.py, docstring l.8 : « What is NOT yet decided anywhere: how this registry is provisioned, rotated, or delivered »
absentSomme de contrôle de son propre code pour les copies chez le partenaireseul scripts/CANONICAL.sha256 existe (pour les garde-fous copiés) ; aucun CANONICAL.sha256 racine couvrant compass/*.py, alors que le dépôt se dit « vendored-only » (aiame-sov-kernel et aiame-scheduler en ont un)
prouvéSuite de tests25 fonctions de test sur 4 fichiers à la racine (test_crypto.py 7, test_aggregate.py 7, test_config.py 6, test_cli.py 5), 27 cas avec paramétrage ; rejoué le 2026-09-30 : 27 passed (Python 3.10.13 système, cryptography 42.0.8, pytest 9.1.1, hors workspace uv)
Ce qui est absent, en toutes lettres
Le seuil annoncé « au moins 5 entreprises distinctes par case » n'est pas celui que le code applique : aggregate.py compte les contributions, pas les clients distincts (5 exports d'un même client publient une case, reproduit le 2026-09-30), et cli.py compte deux fois un client qui a deux fichiers. À corriger avant tout déploiement.
Rien ne refuse deux clients déclarés avec la même clé : config.py exige une clé par entrée mais ne vérifie pas qu'elles diffèrent.
Aucune somme de contrôle de son propre code (pas de CANONICAL.sha256 racine) alors qu'il est destiné à être copié chez le partenaire.
Aucune ADR locale dans ce dépôt — la décision qui le justifie vit dans les dépôts du partenaire.
Transport de l'export hebdomadaire, distribution des clés et lieu exact d'exécution chez le partenaire : explicitement non décidés (README, « What this repo does not decide »).
Aucun déploiement référencé dans ce dépôt (ni infra/, ni workflow) — code seul, zéro credential.
Le hook pre-push, recopié d'un autre dépôt, cite une PR #13 et des workflows (garde-fous.yml, tests.yml) qui n'ont jamais existé ici, et conseille encore de « ne PAS supprimer » un workflow — consigne abandonnée le 2026-09-22, avant la création du dépôt.
Absent de la page portfolio public — dépôt créé le 2026-09-26, après sa dernière mise à jour (2026-09-24).
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256, en-tête : « Source canonique : aiame-fr/aiame-doctrine, garde-fous/garde_fous.sh », « Vendoré le 2026-09-26, à l'amorçage de ce dépôt » ; identique au canonique au 2026-09-30 (sha 6558a1be…) ; suivi par aiame-doctrine/garde-fous/verifier-copies.sh l.55
aiame-storeautreREADME, point 1 : « Same distribution pattern as aiame-store's blob/db (checksum-verified vendoring), not its embedding/ exception » — modèle de distribution repris, aucun code partagé
Consommé par
—
Surface publique
—Absent de probes-2026-09-29.txt ; aucun dossier infra/ ni .github/ ; README : « compass-py is not deployed by anything here »
Modèle de langage
oui — chiffrement et agrégation entièrement déterministes (AES-GCM, HMAC, seuil numérique) ; imports : argparse, base64, hashlib, hmac, json, sys, time, dataclasses, pathlib, typing, cryptography — aucun appel à un modèle
Souveraineté
Écrit par AIAME mais conçu pour ne jamais tourner sur l'infrastructure d'AIAME : hébergement, clés et données restent chez le partenaire, par décision écrite (README point 1, description de pyproject.toml). Une seule dépendance hors bibliothèque standard : cryptography.
Doctrine incarnée
GF-4
CODING-privacy
CODING-golden-rules
Tests
4fichiers · 25fonctionsAbsent du portfolio public (dépôt créé le 2026-09-26). Mesure de revue, non publique : 27 passed (25 fonctions, dont une paramétrée ×3) rejoué le 2026-09-30, Python 3.10.13 système, cryptography 42.0.8, pytest 9.1.1, hors workspace uv.
Dates
2026-09-26 · 2026-09-26 — créé et fusionné le même jour (PR #1, 18:07), avec ses garde-fous copiés d'aiame-doctrine dès l'amorçage (en-tête de scripts/CANONICAL.sha256).
Bibliothèque de journalisation et de transparence IA (règlement européen sur l'IA, art. 12/13/50), copiée et vérifiée dans trois applications AIAME.
Quand une application AIAME fait appel à une IA — par exemple un moteur de recherche documentaire avec sources citées —, le règlement européen sur l'IA impose au minimum de le dire à la personne qui l'utilise. Ce dépôt est une petite bibliothèque sans serveur propre, que trois applications AIAME embarquent en copie vérifiée octet par octet : elle inscrit les usages d'IA dans un journal en base de données où son code ne fait qu'ajouter, jamais réécrire — par convention de code, pas par un verrou du moteur de base de données, et les trois applications poursuivent sans erreur si l'écriture échoue ; elle fournit la phrase d'avertissement obligatoire ; elle signale si un usage déclaré touche une catégorie sensible du règlement, sans jamais conclure d'elle-même qu'un système est « sûr ». Ce n'est pas une certification : la décision juridique reste humaine, et le dépôt l'écrit noir sur blanc.
Capacités — prouvé, déclaré, absent
prouvéJournal d'événements IA persisté en base, ajout seulbackend/aiame_compliance/logger.py:18-71 (record_event, aucune fonction update/delete exposée), models.py:24-25 (class ComplianceEvent, table compliance_event) ; tests/test_logger.py (3 tests) ; appelé hors tests dans les trois consommateurs : aiame-rag services/pipeline_logging.py:72 et agents/research_agent.py:404, aiame-sov services/rag_service.py:99, aiame-one services/rag_service.py:103
prouvéSignal de risque qui ne renvoie jamais « sûr » par défautbackend/aiame_compliance/packs/eu_fr.py:47-99 (UNCLASSIFIED si rien ne correspond, UNACCEPTABLE prime sur HIGH) ; tests/test_risk.py:6 test_no_indicators_returns_unclassified_not_a_safe_default — vérifié ligne à ligne
prouvéMention de transparence art. 50 (fr/en), erreur bruyante si langue inconnuepacks/eu_fr.py:102-126 ; tests/test_disclosure.py:16 test_unknown_language_raises_not_silently_falls_back ; utilisée dans aiame-rag api/v1/chat.py:136 et search.py:80, aiame-sov services/rag_service.py:401, aiame-one services/rag_service.py:190 (en)
prouvéRésumé qui dit « données insuffisantes » plutôt qu'inventer un chiffrebackend/aiame_compliance/report.py:24-32 ; tests/test_report.py:8 test_empty_system_reports_insufficient_data_not_zero
prouvéLecture des événements par un routeur optionnel, derrière l'authentification de l'application hôterouter.py:72-120 ; monté dans aiame-rag api/main.py:84 (rôle admin, confirmé grep) et aiame-sov main.py:106 (manager/admin, confirmé grep) ; un seul GET le 2026-09-29 sur la route montée par aiame-sov → HTTP 401 « Not authenticated » (montée et gardée, pas 404, corps confirmé) ; tests/test_router.py (8 tests). NON monté dans aiame-one (aucun compliance_events.py — confirmé, absent de l'arbre)
prouvéCopie vendorée byte-identique, somme de contrôle rejouée, dans trois applicationscmp le 2026-09-29 : 10/10 fichiers IDENTIQUES au canonique dans aiame-rag, aiame-sov, aiame-one (et non 9/9 — CANONICAL.sha256 de chaque consommateur liste bien 10 entrées : __init__, disclosure, logger, models, report, risk, router, packs/__init__, packs/eu_fr, packs/registry), tous épinglés sur le commit 1af7ce8 (PR#6, 2026-09-28) ; chaque consommateur a backend/tests/test_vendored_compliance_checksum.py. Côté dépôt : scripts/CANONICAL.sha256 n'était rejoué par rien du 2026-09-11 (PR#3, création du pre-push sans ce contrôle) au 2026-09-29 (REGBUG fermé par PR#9, .githooks/pre-push:40-41 — diff vérifié)
absentJournal inviolable garanti par le moteur de base de données (WORM)docs/adr/ADR-COMPLY-001-fondations.md:92-95 : « insert-only par convention de code … pas par garantie technique au niveau du moteur de base de données. Limite connue, pas résolue ici » — ligne vérifiée
absentPolitique de rétention / purge des événementsdocs/adr/ADR-COMPLY-001-fondations.md:96-99 : « aucune politique de durée n'est imposée par ce dépôt ; à définir par consommateur » — ligne vérifiée
Ce qui est absent, en toutes lettres
Store append-only/WORM garanti par le moteur de base de données : ABSENT (ADR-COMPLY-001 §Non-objectifs, lignes 92-95) — insert-only par convention de code seulement.
Tâche de rétention/purge : ABSENT — aucune durée n'est imposée par le dépôt (ADR lignes 96-99), à définir par consommateur.
Second pack de juridiction : ABSENT — packs/registry.py:18 ne connaît que eu_fr, délibérément (extraire une abstraction seulement quand un second pack réel existe).
Routeur de lecture dans aiame-one : ABSENT — aucun compliance_events.py (confirmé, absent de l'arbre), seuls aiame-rag et aiame-sov le montent.
Exécution automatique de la suite pytest : ABSENT — .githooks/pre-push (lu intégralement) ne lance que sha256sum, test_garde_fous.sh et garde_fous.sh ; aucun .github/ dans l'arbre (git ls-files confirmé vide sur ce motif). Les 29 tests ne sont appelés que par une main humaine.
Certification de conformité légale : ABSENT par conception (README §« Ce que ce dépôt N'EST PAS », lu intégralement) — un signal de routage vers une décision humaine, jamais une classification automatique.
README périmé sur les chemins : cite backend/app/vendored/… et app/api/v1/chat.py (texte du README relu intégralement, toujours ainsi) alors que les paquets consommateurs sont aiame_rag/aiame_sov/aiame_one depuis le 2026-09-28 (PR#7, confirmé : commit 1f4f566 « rename backend package app -> aiame_compliance ») ; .githooks/pre-push:20-21 demande de ne pas supprimer un .github/workflows/garde-fous.yml qui n'existe pas dans l'arbre (confirmé), et son propre titre d'étape dit « GF-1/2/3/4 » (pre-push:46) alors que le script vendoré garde_fous.sh couvre en réalité GF-1 à GF-5 (les cinq sections vérifiées dans le script lui-même) — la spécification citée dans le commentaire pre-push:20-21 est elle-même un précédent à vérifier, pas à croire sur parole.
NOUVEAU (non vu dans la fiche d'origine) : la garantie « échoue bruyamment, jamais silencieusement » que revendique le docstring de logger.py — en l'opposant explicitement au scaffold retiré d'aiame-rag — ne tient dans AUCUN des trois consommateurs réels. pipeline_logging.py (aiame-rag, lignes 45-81), rag_service.py (aiame-sov, lignes 98-108) et rag_service.py (aiame-one, lignes 102-112) enveloppent TOUS les trois l'appel à record_event dans un try/except qui avale l'exception et se contente d'un logger.warning (« Failed to persist … (non-fatal) »). Le choix « best-effort » que le docstring de logger.py attribue nommément au seul ancien scaffold aiame-rag est en réalité la pratique des trois appelants actuels, pas une exception isolée déjà corrigée.
Écart avec la baseline publique (portfolio 2026-09-24, carte datée 09-08) : « 14/14 tests » et « vendoré dans aiame-rag » — aujourd'hui 29 fonctions de test dans 6 fichiers (compte revérifié par grep indépendant : 5+4+7+2+3+8=29) et trois consommateurs. Le portfolio est en retard sur ce dépôt, pas l'inverse ; la remarque du portfolio sur un README disant « n'est câblé dans aucun consommateur » est réglée depuis PR#3 (2026-09-11).
Texte français de la mention art. 50 sans accents (« systeme », « generees », packs/eu_fr.py:104-105, lignes lues directement) — servi tel quel par les trois applications.
Dépend de
aiame-doctrinecopie-doctrinescripts/CANONICAL.sha256 : garde_fous.sh + test_garde_fous.sh vendorés le 2026-09-11, resynchronisés le 2026-09-22 (aiame-doctrine#52, GF-5 .css/.html — commentaire vérifié dans le fichier) ; rejoués par .githooks/pre-push:43-47. Aucun autre lien AIAME trouvé (graph.json : nœud sans arête sortante ; args.json : aucune clé 'edges' le mentionnant ; pyproject.toml ne déclare que des paquets PyPI tiers)
—Bibliothèque sans service propre : aucune mention dans aiame-infra (grep 2026-09-29 sur *.tf/*.yml, aucune ligne), aucune route Traefik dans graph.json (edges type=route : 10 lignes, aucune ne cite aiame-compliance). La seule trace en ligne est la route de lecture montée par aiame-sov (main.py:106, confirmé) — un GET le 2026-09-29 → 401 « Not authenticated » (corps confirmé), montée et gardée — c'est la surface d'aiame-sov, pas celle de ce dépôt.
Modèle de langage
oui — bibliothèque déterministe : aucun appel de modèle ni dépendance IA (backend/pyproject.toml : sqlmodel seul, fastapi optionnel) ; GF-1 « aucun fournisseur frontière » rejoué au pre-push
Souveraineté
Code AIAME sans dépendance Elzéard ni tiers (pyproject.toml, ligne 4 : « AIAME-only: no Elzeard code dependency, ever. ») : la bibliothèque s'exécute dans le processus et la base de données de chaque application hôte, sur des serveurs AIAME ; aucun appel réseau, aucun modèle. La copie est vendorée avec somme de contrôle (rien n'est téléchargé à la construction) et la juridiction est explicite : pack eu_fr, échec bruyant sur un nom de pack inconnu (packs/registry.py:21-33).
Doctrine incarnée
CONST-7.1
CONST-7.2
UAX-LOI-PREUVE.b
MANIFESTO-responsible-ai
UAX-LOI-INITIATIVE-BORNEE
CONST-3.2
Tests
6fichiers · 29fonctionsportfolio public 2026-09-24 (carte datée 09-08) : « 14/14 tests rejoués en direct, ruff propre » — chiffre périmé : 29 fonctions `def test_` dans 6 fichiers au 2026-09-29 (compte revérifié indépendamment par grep -c sur chaque fichier), non exécutées dans cette revue (lecture seule)
Dates
2026-09-01 · 2026-09-01 : réponse owner (aiame-workspace#54, question 1) — aucun déploiement AIAME n'est haut-risque Annexe III ; l'article 50 (transparence) devient la cible réelle et suffisante, enregistré le jour même dans ADR-COMPLY-001 (dates confirmées : dates.txt et git log concordants). Puis 2026-09-28 : les trois consommateurs portent la même copie épinglée sur 1af7ce8 (PR#6, confirmé merge commit), vérifiée octet par octet le 2026-09-29 (10/10 fichiers, pas 9/9).
Pile
Python ≥ 3.12, SQLModel (table compliance_event), FastAPI — optionnel, routeur de lecture seul (extra `fastapi`), pytest + ruff, uv / hatchling (paquet aiame_compliance), garde-fous shell vendorés depuis aiame-doctrine (GF-1 à GF-5, script vérifié : couvre bien les cinq)
aiame-mcp · intégration hôte · vivant
aiame-mcp — le pont MCP embarqué
Le connecteur unique, écrit une fois, qui donne à un logiciel hôte un accès honnête aux services AIAME, sans jamais détenir leurs identifiants.
aiame-mcp permet à un logiciel hôte — par exemple l'ERP d'un partenaire — d'utiliser les services AIAME (authentification, recherche documentaire, stockage) comme des outils normalisés, via le protocole MCP (« Model Context Protocol »). Il tourne chez l'hôte, avec les identifiants et le réseau de l'hôte : AIAME ne détient nulle part une clé permanente vers les données de quiconque. Quand un service AIAME est absent ou en panne, chaque outil le dit clairement au lieu d'inventer une réponse. Ce dépôt ne vend rien : c'est une pièce d'infrastructure interne, pas un produit visible du public.
Capacités — prouvé, déclaré, absent
prouvéDégradation honnête sur les 9 outilsbackend/tests/test_offline_honesty.py contient DEUX tests (grep confirmé, pas un seul) : test_every_tool_answers_honestly_when_the_world_is_down (auth/Angel morts, rag/store/knowledge non configurés — les 9 outils répondent par enveloppe structurée) et test_no_tool_ever_returns_ok_against_a_dead_backend, dont le docstring dit lui-même corriger une régression de revue (« l'ancienne version testait 3/8 outils en prétendant tester tous »).
prouvéVérification locale de jeton (EdDSA), zéro réseaubackend/aiame_mcp/vendored/verify_access_token.py + backend/tests/test_auth_local.py (8 fonctions test_ confirmées par grep : alg confusion HS256 rejeté, clé publique absente = fermé, jeton refresh rejeté comme access, produit erroné rejeté).
prouvéClient Garage (stockage) vendoré byte-identique à aiame-storebackend/aiame_mcp/vendored/CANONICAL.sha256 lu intégralement : 4 lignes de checksum, historique daté 2026-08-22 et 2026-09-11 + backend/tests/test_vendored_checksum.py (2 fonctions test_, paramétrées).
prouvéContrat de manifeste structurel (un outil = une capacité = un scope)backend/aiame_mcp/manifest/schema.py + backend/tests/test_manifest_registry.py — 8 fonctions test_ confirmées par grep (scope=name, read_only figé True, classification sans « never », noms dupliqués refusés).
prouvé9 outils MCP câblés (manifest, auth, rag, store, knowledge, Angel, one)backend/aiame_mcp/adapters/{angel,auth,base,knowledge,one,rag,store}.py lus, chacun avec sa route HTTP réelle (POST /api/v1/rag/search, POST /v1/routes/demo/solve, GET /api/v1/intake/summary, GET /v1/auth/me) + test_adapters_services.py (10 fonctions test_) et test_server_inprocess.py (4 fonctions test_).
absentTransport HTTP tailnet (phase 2)docs/adr/ADR-MC-001-fondations-v1.md ligne 111 : « Phase 2 — esquisse seulement, aucun code v1 » ; ligne 113 décrit un transport HTTP streamable lié à une IP tailnet, à l'état de design. Aucun code correspondant dans backend/.
absentOutils d'écriture aiame-one (upload, commentaire vocal, brouillon de graine)backend/aiame_mcp/manifests/one.py, docstring : aiame-one fait de l'ingestion (upload, voice comment, seed-draft) — tout en écriture — et le schéma v1 fige read_only=True ; seul GET /api/v1/intake/summary est déclaré. Une ADR séparée est requise pour l'écriture.
prouvéGarde-fous locaux remplaçant la CI supprimée.githooks/pre-push lu intégralement (aucun .github/workflows/ dans le dépôt) : sha256sum -c scripts/CANONICAL.sha256, scripts/test_garde_fous.sh, scripts/garde_fous.sh, puis uv sync --all-packages --all-groups + ruff + pytest ; le hook cite lui-même le gap trouvé le 2026-09-22 (étape CANONICAL.sha256 absente du mirroir initial) et la règle 6 CLAUDE.md (sync scopé désinstalle des membres du venv partagé) comme raison du --all-packages.
Ce qui est absent, en toutes lettres
Transport HTTP tailnet : design seul (ADR-MC-001 ligne 111 « esquisse seulement, aucun code v1 »).
Manifestes possédés par chaque dépôt (migration prévue ADR-MC-001) : en 2026-09-29 tous les manifestes vivent encore dans aiame-mcp.
Classe de jeton machine longue durée : question ouverte, renvoyée au ledger aiame-auth.
Pas de certification e2e (portfolio-public.txt ligne 96 : « aiame-mcp certif. e2e absente »).
CORRECTION : contrairement à ce que dit repos.json (note datée du 2026-08-22, jamais rafraîchie), aiame-mcp N'EST PAS « pas encore membre du workspace uv racine » — il l'est devenu le 2026-09-06 (uv.lock racine, `aiame-mcp-backend` en membre editable). Ne pas recopier cette affirmation de repos.json sans la vérifier contre uv.lock : c'est précisément le piège que la doctrine de l'espace de travail (CLAUDE.md, § « précédent cité ») met en garde.
Dépend de
aiame-authvendoré-checksumbackend/aiame_mcp/vendored/verify_access_token.py + settings_mixin.py, CANONICAL.sha256 daté 2026-09-11 ; edge confirmé dans graph.json (outbound_call, config.py:28, auth_url) ; adaptateur auth_whoami → GET /v1/auth/me (confirmé en lisant adapters/auth.py)
aiame-storevendoré-checksumbackend/aiame_mcp/vendored/garage_client.py, CANONICAL.sha256 daté 2026-08-22/2026-09-11, contenu lu intégralement
aiame-ragappel-serviceconfig.py:29 (rag_url) ; edge confirmé graph.json (outbound_call) ; adapters/rag.py:24-25 → POST /api/v1/rag/search, lu et confirmé
aiame-angelappel-serviceconfig.py:30 (angel_url) ; edge confirmé graph.json (outbound_call) ; adapters/angel.py:26-28 → POST /v1/routes/demo/solve, lu et confirmé
aiame-oneappel-serviceconfig.py:31 (one_url) ; edge confirmé graph.json (outbound_call) ; adapters/one.py:19-21 → GET /api/v1/intake/summary, lu et confirmé
aiame-knowledgedépendance-cheminadapters/knowledge.py docstring lu intégralement : « aiame-knowledge has NO server API — it is a CLI pipeline writing artifacts under output/ » ; config.py knowledge_output_dir lit ces artefacts localement, pas d'appel réseau
Consommé par
—
Surface publique
—aucune entrée pour aiame-mcp dans probes-2026-09-29.txt (grep confirmé, fichier vide sur ce terme) — cohérent avec le dépôt : serveur stdio, sans surface HTTP par conception. portfolio-public.txt (ligne 97-98) confirme indépendamment : « pas d'URL possible par conception (stdio), donc pas de preuve live applicable ».
Modèle de langage
sans objet — aiame-mcp n'appelle lui-même aucun LLM ; c'est une couche de transport/adaptation qui relaie verbatim l'état (y compris un marqueur « LLM indisponible ») déjà produit par d'autres services (ex. aiame-knowledge), sans jamais l'interpréter.
Souveraineté
Le serveur tourne DANS la frontière de l'hôte, lancé et configuré par l'hôte, avec les identifiants de l'hôte — jamais une clé AIAME permanente vers les données de qui que ce soit (ADR-AA-001 : « Elzéard, s'il apparaît un jour, est un TENANT d'AIAME — jamais l'inverse »). « Central » signifie écrit une fois, pas hébergé centralement : distribution par tag git épinglé.
Doctrine incarnée
CONST-7.1
CONST-7.2
CONST-2.1
CONST-1.2
CODING-ai-layer
Tests
13fichiers · 92fonctionsCORRECTION : la fiche précédente affirmait à tort « portfolio-public.txt ne donne pas de compte de tests pour aiame-mcp » — c'est faux, vérifié par grep direct : portfolio-public.txt (ligne 97-98, daté du texte 2026-09-24) cite « 91 tests réels rejoués en direct le 09-08 (montés de 89), ruff propre (...) CI GitHub désactivée depuis le 27/08 : les 4 derniers commits, dont celui qui a fait grandir la suite à 91, n'ont jamais tourné sur GitHub — seulement rejoués en local ». C'est un compte pytest exécuté (inclut l'expansion des tests paramétrés, ex. test_vendored_checksum.py), donc non directement comparable au compte de fonctions `def test_` fait ici (13 fichiers, 92 fonctions, grep du 2026-09-29). Autre correction : la fiche précédente attribuait l'écart 91→92 à « 10 tests ajoutés depuis dans test_review_fixes.py et test_outcome_mapping.py » — vérifié faux par `git log --follow` : ces deux fichiers existaient déjà au commit du 2026-09-07 (celui-là même où le README affichait « 91 »), avant même le re-vendorage de verify_access_token.py (2026-09-11). Le rename #16 (2026-09-28) n'a touché aucun fichier de test (git log --follow confirmé sur les deux fichiers). L'origine exacte de l'écart 91 (pytest, exécuté) vs 92 (def test_, grep) n'est pas élucidée ici — lecture seule, pas de pytest relancé — et ne doit pas être présentée comme telle.
Dates
2026-08-22 · 2026-09-28 (#16) — renommage du paquet `app` → `aiame_mcp` : commentaire du build-system dans backend/pyproject.toml, lu verbatim, confirme la raison donnée : « a package literally named app collided with 15 other aiame-fr repos sharing the same uv workspace venv ».
Pile
Python 3.12+, SDK officiel `mcp` 2.x (stdio) — pyproject.toml : `mcp>=2,<3`, pydantic / pydantic-settings, httpx, PyJWT[crypto] (vérification EdDSA locale), uv — MEMBRE du workspace uv racine depuis le 2026-09-06 (commit `3932859`, glob `aiame-*/backend`) : `aiame-mcp-backend` figure dans le `uv.lock` de la racine (lignes 22 et 339, source editable `aiame-mcp/backend`). La fiche précédente et repos.json (note du 2026-08-22, jamais mise à jour) disent encore « pas encore membre » — c'est un état obsolète depuis 23 jours, pas l'état actuel., pytest / pytest-asyncio / respx / ruff (dev)
aiame-optaplanner · résolution · vivant
Aiame Optaplanner — moteur de résolution
Bibliothèque de résolution générique (planification d'équipes et tournées), sans domaine métier, honnêteté prouvée par construction du code.
Ce dépôt ne vend rien et n'a pas d'écran : c'est le moteur mathématique qui, une fois branché par un produit comme Aiame Angel, décide qui fait quoi, et dans quel ordre une tournée doit se dérouler. Il ne prétend jamais avoir trouvé la meilleure solution possible quand ce n'est pas prouvé : pour la planification d'équipes, soit il démontre l'optimalité, soit il déclare l'écart — jamais l'un présenté pour l'autre. Depuis que le produit infirmier qui vivait ici est parti vers un autre dépôt fin août, aucune évolution métier n'a été ajoutée : seules des corrections d'outillage et de sécurité.
Capacités — prouvé, déclaré, absent
prouvéPlanification d'équipes CP-SAT avec preuve d'optimalité ou écart obligatoirebackend/aiame_optaplanner/rostering/ports.py __post_init__ (lignes 30-34) : ValueError si OPTIMAL porte un gap ou si FEASIBLE le cache ; verrouillé par backend/tests/rostering/test_ports.py, relu ligne à ligne (exactement 4 fonctions, une par combinaison) et test_feasible.py
prouvéTournée VRPTW heuristique, jamais 'optimale' par constructionbackend/aiame_optaplanner/routing/value_objects.py : RouteSolveMethod n'a qu'un membre (HEURISTIC_LOCAL_SEARCH), vérifié en lisant le fichier ; verrouillé par backend/tests/routing/test_solve_method_vocabulary.py
prouvéDéterminisme signalé, jamais cachébackend/tests/routing/test_routing_solver.py::test_same_inputs_produce_byte_identical_route_five_runs et ::test_caller_ordering_never_changes_the_route (fichier présent, fonctions comptées)
prouvéZéro modèle frontière (LLM) dans le chemin d'exécutiongrep -rniE 'openai|anthropic|gemini' backend/aiame_optaplanner backend/tests rejoué : aucun résultat ; seule dépendance = ortools (bibliothèque open source locale)
absentService réseau / API propreaucun dossier .github/ ni route FastAPI dans le dépôt (find confirmé) ; README : « bibliothèque, sans web framework » ; absent des 21 arêtes de graph.json (ni source ni cible) et de probes-2026-09-29.txt ; portfolio-public.txt confirme explicitement (ligne datée 09-08) : « seul consommateur trouvé org-wide = aiame-angel (import de chemin local, pas de déploiement propre) »
absentCI GitHubaucun .github/workflows/ dans le dépôt (find confirmé, vide) ; git show d85ed9b confirme la suppression réelle du seul fichier qui existait (.github/workflows/garde-fous.yml, 24 lignes) le 2026-09-22 (PR#46) ; seule vérification = hook .githooks/pre-push local (pytest+ruff+CANONICAL.sha256, script lu). Note : le README (section « Vérifier ») dit encore « Pas de CI GitHub, sauf garde-fous.yml » — phrase devenue fausse depuis PR#46, le git log fait foi, pas le README
prouvéSuite de tests complète (30 fonctions, 6 fichiers)grep -rc 'def test_' backend/tests rejoué = 30 sur exactement 6 fichiers (comptés, non exécuté, conformément à la méthode imposée) ; portfolio-public.txt (ligne datée, mesure rejouée en direct le 09-08) : « 30/30 tests verts + ruff propre »
Ce qui est absent, en toutes lettres
Aucun dossier docs/ ni ADR dans ce dépôt — seule documentation : README.md (racine + backend/), et ce README contient une phrase stale sur la CI (voir capacité « CI GitHub »)
Aucune API réseau, aucun service hébergé — bibliothèque en-process uniquement, assumé par le dépôt lui-même et confirmé par portfolio-public.txt (« pas de déploiement propre »), pas un trou caché
Certification e2e absente (portfolio public)
CI GitHub absente — .github/workflows supprimé (pas seulement désactivé) ; seule vérification = hook pre-push local, actif uniquement si `git config core.hooksPath .githooks` a été fait sur le clone
Un seul consommateur trouvé dans toute la flotte (aiame-angel), et par dépendance de chemin relatif — pas par le mécanisme générique de workspace uv (exclu par son nom explicite dans pyproject.toml racine, pour rester utilisable depuis un worktree)
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 (garde_fous.sh + test_garde_fous.sh), première commande de vendoring le 2026-08-21 (git show f1c29d9, pas le 08-20), resynchronisés 2026-09-22 (dcf7cf9) et 2026-09-23 (ec2dc9a) ; .githooks/pre-push exécute sha256sum -c à chaque push (lu)
—Bibliothèque consommée en-process, sans route API ni frontend propre : aucune URL plausible. Absente des 21 arêtes de graph.json (ni source ni cible) et de probes-2026-09-29.txt. Le produit qui l'embarque, Aiame Angel, est public sur angel.services.aiame.fr, mais ce n'est pas ce dépôt (à ne pas confondre) : c'est explicitement le dépôt Angel, pas celui-ci, dont le déploiement historique porte encore un nom de conteneur hérité de l'ancienne fusion — un fait qui appartient à la carte Angel, pas à celle-ci.
Modèle de langage
oui — aucun import openai/anthropic/gemini dans backend/aiame_optaplanner ni backend/tests (grep rejoué). L'unique dépendance externe (ortools) est un solveur mathématique open source, pas un appel à un modèle de langage.
Souveraineté
Le code tourne entièrement en local, en process, dans le service qui l'importe (aujourd'hui Aiame Angel) — aucun appel réseau vers un tiers. La seule dépendance externe, OR-Tools, est une bibliothèque open source installée localement, pas un appel au cloud de Google.
Doctrine incarnée
CODING-ethical-principles
GF-1
UAX-LOI-PREUVE.b
Tests
6fichiers · 30fonctionsportfolio-public.txt (extrait daté 2026-09-24, mesure elle-même rejouée en direct le 2026-09-08) : « 30/30 tests verts + ruff propre »
Dates
2026-08-13 · 2026-08-27 (PR#42) — scission du produit infirmier vers aiame-angel : ce dépôt redevient bibliothèque pure. Zéro commit métier depuis, vérifié en direct (`git log bca15f9..HEAD -- .` = 5 commits) ; les 5 commits suivants (f4a983a 27/08, daa5192 11/09, d85ed9b 22/09, dcf7cf9 22/09, ec2dc9a 23/09) sont tous chore/fix d'outillage ou de sécurité, dates rejouées une à une.
Pile
Python 3.12, OR-Tools (CP-SAT + constraint_solver, bibliothèque open source locale), pytest, ruff, uv (dépendance de chemin relatif depuis aiame-angel ; exclu du workspace org par nom explicite)
aiame-racines · annuaire gouv.fr · spike
Racines
Un spike qui prouve qu'une adresse d'entreprise et une distance entre deux villes peuvent porter la même preuve qu'un montant de facture.
Ce dépôt ne vend rien et ne décide de rien : il vérifie une seule hypothèse technique. Peut-on faire confiance à une fiche d'entreprise (nom, adresse, distance) de la même façon qu'à un montant de facture — c'est-à-dire en pouvant toujours remonter jusqu'à la source officielle qui la prouve ? Il interroge deux bases de données publiques de l'État français (l'annuaire des entreprises et l'adresse nationale), sans clé ni compte, et refuse d'afficher une donnée qu'il ne peut pas prouver. Le nom d'un futur produit, le secteur visé et le département pilote restent des questions ouvertes, non tranchées ici. Ce que ce dépôt montre surtout, c'est la discipline de l'organisation qui l'a produit : un garde-fou de sécurité qui ne s'exécutait jamais a été trouvé et corrigé le jour même de sa découverte.
Capacités — prouvé, déclaré, absent
prouvéPreuve de provenance étendue au texte et aux coordonnées géographiquescore/provenance.py:38-61 (Unite.TEXTE/COORDONNEE/METRES, Regle.DISTANCE_HAVERSINE) + tests/test_provenance.py (17 fonctions `def test_`, section explicitement dédiée à la mutation manuelle des tests — vérifié par lecture, pas rejoué)
prouvéRecherche d'une entreprise par son numéro SIRET auprès du registre officiel de l'Étatpacks/annuaire/adapters/sirene.py + tests/test_sirene.py (3 fonctions `def test_`, compte vérifié par grep). Le README documente une exécution réseau réel via `python demo.py --reseau-reel`, mais ne date pas précisément cette exécution — seul le statut global du dépôt est daté 2026-09-10 ; ne pas présenter cette date comme celle de l'exécution elle-même
prouvéAucune donnée personnelle (dirigeants d'entreprise) n'est jamais transformée en fait prouvétests/test_sirene.py::test_extraire_pieces_ne_touche_jamais_aux_donnees_personnelles ; SOURCES.md confirme le champ retiré des fixtures avant commit
prouvéLocalisation d'une adresse et distance à vol d'oiseau entre deux adressespacks/annuaire/adapters/ban.py + core/geo.py (haversine), tests/test_ban.py (7 fonctions `def test_`) et test de régression contre une distance Paris-Marseille calculée indépendamment
prouvéSéparation stricte entre le moteur générique et le métier local d'annuaire (« coreless »)tests/test_coreless.py : 7 fonctions `def test_`, dont 2 paramétrées sur les 7 fichiers de core/ = 19 cas exécutés dans ce seul fichier (pas 51 — 51 est le total de LA SUITE ENTIÈRE, cf. champ tests ci-dessous) ; imports et vocabulaire vérifiés par analyse syntaxique AST
prouvéAucune donnée non prouvable n'est affichée : une adresse ou un SIRET introuvable devient une case grise, jamais inventéetests/test_fiche.py::test_fiche_siret_introuvable_est_grise_jamais_fabriquee
prouvéZéro modèle de langage dans le codegrep aucune occurrence openai/anthropic/gemini/llm/gpt dans core/, packs/, tests/, README/SOURCES (hors le motif de détection lui-même dans le garde-fou vendoré) ; GF-1 du garde-fou vendoré (garde-fous/garde_fous.sh) le vérifie mécaniquement à chaque push — hook actif dans ce worktree (core.hooksPath=.githooks vérifié)
absentRépertoire local d'entreprises comme produit destiné aux TPEREADME.md : « Déploiement, exposition publique : ABSENT » ; aucun dossier infra/, aucune entrée dans les sondes HTTP du 2026-09-29 ; README : « Aucune décision produit n'est prise ici »
Ce qui est absent, en toutes lettres
Nom de produit, secteur et département pilote : question owner ouverte, hors périmètre de ce dépôt (README §État honnête)
Déploiement ou exposition publique : ABSENT, aucune décision prise
Persistance / base de données : le registre de preuve vit en mémoire seulement, rien n'est sauvegardé entre deux exécutions
Recherche ou index de proximité au-delà de deux points : ABSENT (seule une distance entre exactement 2 points est calculée)
Authentification, interface utilisateur, import de réseaux sociaux : ABSENT (l'import depuis un réseau social est explicitement écarté, pas seulement différé)
La copie de code héritée d'aiame-pouls (core/*.py) n'a pas de somme de contrôle : contrairement au garde-fou vendoré, une dérive silencieuse du canonique aiame-pouls ne serait pas détectée automatiquement ici
CI GitHub : désactivée organisation-wide (règle 11) ; le seul filet est un hook pre-push local, lui-même non actif par défaut sur un clone ou worktree frais tant que `git config core.hooksPath .githooks` n'a pas été exécuté
Dépend de
aiame-doctrinevendoré-checksumgarde-fous/CANONICAL.sha256 — copie vendorée du garde-fou garde_fous.sh (aiame-doctrine, commit d4b9b2f), vérifiée par sha256sum à chaque push
aiame-poulsautreREADME.md : core/moteur.py, contexte.py, carte.py « copiés verbatim d'aiame-pouls », provenance.py « étendu » depuis aiame-pouls — copie de code, contrairement au garde-fou ci-dessus cette copie n'a AUCUN checksum de dérive (aucun fichier .sha256 ne la couvre). Nuance trouvée en lisant le code : core/montant.py se déclare lui-même dans sa docstring hoisté du parser Factur-X vendoré (donneur `poc-invoice`), pas directement d'aiame-pouls — la chaîne de lignée exacte de ce fichier précis est donc à un maillon de plus que ce que dit le README
—README.md : « Déploiement, exposition publique : ABSENT » ; aucune entrée « aiame-racines » dans SCRATCH/probes-2026-09-29.txt (sondes HTTP du jour) ; aucun dossier infra/ dans le dépôt
Modèle de langage
oui — aucune dépendance, import ou URL de modèle de langage dans le code ; vérifié par grep et par le garde-fou vendoré GF-1 exécuté à chaque push
Souveraineté
Les deux seules API appelées (recherche-entreprises.api.gouv.fr, api-adresse.data.gouv.fr) sont des services publics ouverts, sans clé ni compte. AIAME mesure d'abord sa propre exposition avant de proposer un instrument de souveraineté à quiconque.
5fichiers · 39fonctionsportfolio-public.txt (2026-09-24) : « 45/45 tests réels rejoués en local, identique au chiffre annoncé par le README » — ce chiffre a depuis évolué avec l'ajout de la fonctionnalité département (commit 9c2a0c6, daté 2026-09-26 en git log, confirmé) ; le README actuel annonce 51/51, cohérent avec 39 fonctions `def test_` vérifiées par grep sur les 5 fichiers de tests/ (7+7+5+17+3=39), dont 2 paramétrées sur 7 fichiers de core/ (39 - 2 + 14 = 51) ; non ré-exécuté dans cette revue (lecture seule)
Dates
2026-09-10 (dates.txt confirme la date ; le tout premier commit git est en réalité 90cf5e6 « chore: initialisation du dépôt (branche par défaut vide) », suivi une minute plus tard le même jour par ff480cc « feat: spike provenance SIRET/SIRENE + geocodage BAN + distance » — ff480cc est le premier commit de CONTENU, pas le premier commit du dépôt) · 2026-09-29 : un garde-fou de sécurité vendoré (le harnais de mutation garde-fous/test_garde_fous.sh) était présent dans le dépôt mais jamais appelé par le hook pre-push depuis sa création — trouvé par un outil de flotte (tools/gates-health, aiame-workspace#139) à sa toute première exécution, et corrigé le jour même (commit 53e105d, vérifié dans git log).
Pile
Python, requests (client HTTP), pytest
aiame-rag-core · RAG · vivant
Le moteur commun de réponses sourcées
Le moteur commun qui vérifie qu'une réponse générée par IA reste fondée sur les documents réellement trouvés, recopié à l'identique dans trois services AIAME.
Quand un service AIAME répond à une question en s'appuyant sur des documents (moteur de recherche documentaire avec sources citées, ou « RAG »), c'est ce dépôt qui fait le travail commun : chercher les bons passages, écrire une réponse, puis vérifier qu'elle ne cite rien qui n'a pas été réellement trouvé. Ce n'est pas un service que l'on appelle directement — c'est une copie de code, accompagnée d'une empreinte numérique de contrôle, recopiée à l'identique dans les trois produits qui en ont besoin. Il est né le 13 septembre 2026 pour remplacer trois moteurs différents qui faisaient chacun ce travail un peu différemment, avec des niveaux de vérification inégaux.
Capacités — prouvé, déclaré, absent
prouvéPipeline en 5(+2) étapes (recherche, reclassement, génération, avec 2 étapes de garde bornées)backend/aiame_rag_core/pipeline.py (574 lignes, recompté en direct 29/09 — la fiche initiale disait 567 ; ported depuis aiame-rag) ; backend/tests/pipeline/test_pipeline.py, 16 fonctions test_ (tests écrits, non exécutés dans cette revue)
prouvéRegistre de 5 gardes de sécurité 100% déterministes (zéro modèle)backend/aiame_rag_core/gates/registry.py, DEFAULT_REGISTRY.names() liste 5 gardes (fondement par citation, sujet sensible, injection dans le contenu récupéré, disclosure de périmètre, critique agrégée) ; 33 fonctions test_ dans backend/tests/gates/ (recompté en direct : 7+2+8+4+5+7)
prouvé6ᵉ garde : vérification affirmation par affirmation, avec appel modèlebackend/aiame_rag_core/research/claim_verification.py, 12 fonctions test_ (recompté en direct) ; le fichier lui-même documente pourquoi elle est exclue du registre des 5 gardes (nécessite son propre appel LLM) — absente des 3 copies vendorées à ce jour (aucune ne contient de dossier research/, vérifié en direct dans aiame-rag, aiame-sov, aiame-one)
déclaréMode recherche agentique (boucle outil), prêt mais non activébackend/aiame_rag_core/research/agent.py, 13 fonctions test_ (recompté en direct) ; son propre docstring : « ce module construit un état prêt à activer, il ne décide pas de l'activer » — dépend d'un indicateur de config jamais positionné, question amont (aiame-rag#43) toujours sans décision owner (confirmé dans le docstring)
prouvéVendorage à somme de contrôle, vérifié dans les 3 consommateurssha256sum -c passe aujourd'hui (29/09, revérifié en direct, depuis backend/ de chaque dépôt) dans aiame-rag, aiame-sov, aiame-one ; réellement importé (pas du code mort) — aiame-sov/backend/aiame_sov/services/{rag_service,learning_service,eip_service}.py importent directement ses modules (portfolio public 24/09 confirmé)
absentCertification bout-en-bout du pipelineportfolio public 2026-09-24 : « aiame-rag-core certif. e2e absente » ; aucun dossier e2e/ ni infra/ dans ce dépôt (bibliothèque, pas un service déployé)
absentContrat de flux de réponse (streaming) progressifbackend/aiame_rag_core/__init__.py : « the streaming contract... land here incrementally » — aucune occurrence de ce contrat dans le code (grep -ri stream sur aiame_rag_core/ ne renvoie que cette phrase de scaffold) ; le dépôt le dit lui-même
prouvéGarde-fous vendorés depuis aiame-doctrine, câblés en pre-push localscripts/CANONICAL.sha256 vérifié en direct (sha256sum -c passe) ; scripts/garde_fous.sh + test_garde_fous.sh câblés dans .githooks/pre-push (lignes 30/33/36, vérifié) — Actions désactivé sur ce dépôt, règle 11
Ce qui est absent, en toutes lettres
Certification bout-en-bout (e2e) du pipeline : absente (portfolio public 24/09, confirmé — aucun dossier e2e/ ici)
Contrat de streaming de réponse : absent — seulement une phrase de scaffold dans __init__.py, aucun code
Mode recherche agentique et 6ᵉ garde (vérification par affirmation) : code réel et testé dans ce dépôt mais vendoré nulle part — aucun des 3 consommateurs n'a de dossier research/ à ce jour (vérifié en direct)
Contenu vendoré dans les 3 consommateurs : pinné à deux commits différents selon le consommateur, pas un seul (aiame-rag : be4609e du 17/09 ; aiame-sov et aiame-one : 74cf9a47 du 16/09, plus ancien) — 12 à 13 jours de retard sur le dépôt source selon le consommateur, pas 11 partout ; le renommage du 28/09 et tout ce qui l'a suivi n'y sont pas
Dépend de
aiame-doctrinecopie-doctrinescripts/CANONICAL.sha256 vendore garde_fous.sh et test_garde_fous.sh depuis aiame-doctrine/garde-fous/ ; sha256sum -c passe (vérifié en direct le 29/09) ; graph.json ne montre aucune autre arête pour ce dépôt (bibliothèque vendorée, aucun appel réseau)
—Bibliothèque vendorée, pas un service réseau — absente de probes-2026-09-29.txt et de toute route dans graph.json (aucune arête pour ce dépôt, vérifié) ; le README le dit lui-même : « Pas un service ».
Modèle de langage
optionnel — les 5 gardes du registre principal sont 100% déterministes (regex/règles, zéro appel modèle, prouvé en lisant leur code) ; le pipeline de génération et la 6ᵉ garde (vérification par affirmation) appellent un modèle de langage fourni par le produit consommateur — jamais construit ni hébergé par ce dépôt lui-même.
Souveraineté
Bibliothèque privée, jamais un service réseau ni une dépendance pip installée en direct — copiée à la main avec somme de contrôle dans chaque consommateur (motif déjà éprouvé par aiame_compliance). Le modèle de langage et la base vectorielle restent le choix et l'hébergement de chaque produit, jamais de ce dépôt (le câblage fournisseur est délibérément non vendoré, par décision ADR).
Doctrine incarnée
CODING-explainability
CODING-ai-layer
CONST-7.1
CONST-7.2
CODING-golden-rules
Tests
13fichiers · 98fonctionsAucun compte de tests publié à ce jour ; portfolio public 2026-09-24 atteste seulement du vendoring vérifié par somme de contrôle et de l'import réel dans aiame-sov, pas d'une exécution de la suite de tests. Compte de 98 fonctions / 13 fichiers recompté en direct le 29/09 (grep -c "def test_" par fichier, somme manuelle) et confirmé exact.
Dates
2026-09-13 · 2026-09-28 : renommage du paquet backend app -> aiame_rag_core (collision avec ~15 autres dépôts aiame-fr dans le même venv uv partagé) — les 3 copies vendorées restent toutes antérieures au renommage, au mode recherche et à la 6ᵉ garde, mais PAS au même commit source : aiame-rag est pinné sur be4609e (17/09), aiame-sov et aiame-one sur un commit plus ancien, 74cf9a47 (16/09) — vérifié en direct dans les en-têtes des 3 fichiers CANONICAL.sha256
aiame-registre · moteur de règles / conformité · spike
aiame-registre
Prototype technique qui projette un registre d'obligations déjà écrit par un humain sur les faits déclarés d'une entreprise : trois issues possibles, jamais un verdict de conformité.
Une TPE ou une PME accumule des obligations réglementaires (facturation électronique, seuils d'effectif, calendrier européen de l'IA…) sans savoir lesquelles la concernent vraiment, ni à partir de quand. Ce prototype technique (un « spike », pas un produit) croise un registre de lignes déjà rédigées et sourcées par un humain avec les faits qu'une entreprise a bien voulu déclarer. Pour chaque ligne, il rend l'une de trois réponses : s'applique, hors champ, ou indéterminé quand un fait manque. Un fait manquant n'est jamais deviné. Chaque réponse porte sa raison, son échéance et le moins fiable des deux niveaux de fiabilité, celui de la ligne ou celui du fait utilisé. Ce n'est explicitement pas un conseil juridique : l'outil ne lit lui-même aucun texte de loi, et chaque sortie commence par le rappeler. Aucun produit ne l'utilise encore.
Capacités — prouvé, déclaré, absent
prouvéTrois issues, jamais deux : applique / n_applique_pas / indetermineaiame_registre/predicat.py:112 evaluer() ; tests/test_predicat.py:26 test_un_faux_domine_un_indetermine, :63 test_cle_inconnue_du_moteur_ne_s_applique_jamais_par_accident ; suite rejouée le 2026-09-30 (26 passés, environnement : /usr/bin/python3 3.10.13, PyYAML 6.0.3, pytest 9.1.1 — pas le 9.0.3 épinglé, lancé avec -p no:cacheprovider)
prouvéAucun verdict de conformité dans la sortietests/test_projection.py:76 test_la_sortie_ne_prononce_jamais_un_verdict_de_conformite, vert le 2026-09-30 ; avertissement fixe projection.py:19 AVERTISSEMENT, placé en tête du document par rendre_yaml (projection.py:94) ; second balayage indépendant garde-fous/verifier_verdict.py rejoué : « VERT : aucune formulation de verdict de conformité »
prouvéNiveau de fiabilité jamais rehaussé : le moins fiable entre la ligne et les faits utilisésprojection.py:30 _pire() ; tests/test_projection.py:50 test_grade_projete_est_le_pire_ligne_ou_fait, vert le 2026-09-30
prouvéFraîcheur calculée depuis un budget en jours, « à revérifier » par défaut au-delà ou sans budgetregistre.py:41 Ligne.fraicheur() (sans budget → a_reverifier) ; tests/test_projection.py:66 test_fraicheur_bascule_au_bout_du_budget, vert le 2026-09-30
prouvéGarde-fous doctrinaux GF-1 à GF-5 vendorés avec somme de contrôle, et prouvés capables d'échouersha256sum -c garde-fous/CANONICAL.sha256 : 2/2 OK ; bash garde-fous/garde_fous.sh . requirements.txt : 5/5 OK ; bash garde-fous/test_garde_fous.sh : « 47 cas, 0 échec » — tous rejoués le 2026-09-30 ; les deux derniers appelés par .githooks/pre-push depuis le commit 726193c
absentUn consommateur produit réel branché sur ce moduleREADME §« Prochaine étape (pas ici) » : décision propriétaire ; grep 'aiame_registre|aiame-registre' dans aiame-sov et aiame-one = 0 résultat au 2026-09-30
absentLecture d'une source primaire (Légifrance ou équivalent)README §« Ce que ça ne fait pas » : « Aucune source primaire » ; SOURCES.md : « Aucune ». Le registre projeté est écrit et vérifié ailleurs (aiame-workspace, registre-obligations.yml + tools/verifier-registre/)
Ce qui est absent, en toutes lettres
ABSENT : aucun consommateur produit réel branché — décision propriétaire en attente
ABSENT : aucune source primaire lue par ce dépôt lui-même, par construction
Registre de test figé au 2026-09-29 (17 lignes) : la suite ne prouve rien sur le registre vivant, qui évolue ailleurs
Aucune version de Python déclarée ; pytest épinglé 9.0.3 mais vérifié ici sous 9.1.1
Garde pre-push inactif sur un clone neuf tant que core.hooksPath n'est pas configuré (dit par le hook lui-même)
Dépend de
aiame-workspaceautretests/fixtures/registre-2026-09-29.yml:1 « INSTANTANÉ DE TEST — copie de aiame-workspace/registre-obligations.yml au 2026-09-29 (main 69f75d6) » ; à l'exécution, le registre vivant est passé en argument (--registre, exemple du README) — pas d'import de code
aiame-doctrinevendoré-checksumgarde-fous/CANONICAL.sha256 : « Source canonique : aiame-fr/aiame-doctrine … Vendoré le 2026-09-29 depuis le commit 7a897184 » ; sha256sum -c OK le 2026-09-30
aiame-racinesautre.githooks/pre-push:3-4 « Motif copié depuis aiame-racines/.githooks/pre-push » ; CANONICAL.sha256 : sommes « identiques à la copie d'aiame-racines le même jour » — copie de gabarit, aucune dépendance d'exécution
Consommé par
—
Surface publique
—aucune — bibliothèque/outil en ligne de commande local, dépôt privé, aucun service réseau
Modèle de langage
oui — aucun client de modèle ni client HTTP dans aiame_registre/ (grep, 2026-09-30) ; GF-1 vendoré rejoué vert le 2026-09-30
Souveraineté
Aucun réseau par construction : lit deux fichiers YAML locaux (le registre, les faits de l'entreprise) et en écrit un troisième. Aucune dépendance à un fournisseur externe à l'exécution, aucune donnée qui quitte la machine.
Doctrine incarnée
CONST-7.1
CONST-7.2
MANIFESTO-decision-support
UAX-LOI-PREUVE.b
GF-1
GF-2
GF-3
GF-4
Tests
3fichiers · 26fonctionsAucune mesure publique (dépôt privé, absent du portfolio public). Rejoué en lecture seule le 2026-09-30 : 26 tests passés (/usr/bin/python3 3.10.13, PyYAML 6.0.3, pytest 9.1.1) ; garde-fous 5/5 OK et harnais de mutation 47 cas, 0 échec
Dates
2026-09-29 · 2026-09-29 : premier commit à 13:49 (heure de Paris) ; défaut de câblage de son garde-fou trouvé et corrigé 42 minutes plus tard (commit 726193c, 14:31)
Pile
Python 3 (aucune version déclarée ; suite verte sous 3.10.13 le 2026-09-30), PyYAML 6.0.3, pytest (épinglé 9.0.3 dans requirements.txt, sans séparation dev), aucune dépendance réseau
aiame-scheduler · planification de jobs · vivant
Le planificateur qui prouve qu'il tourne
Une brique qui rend vérifiable le démarrage d'un planificateur de tâches — écrite après avoir trouvé, ailleurs dans l'organisation, un planificateur qui n'avait jamais tourné.
Ce petit dépôt fournit la brique qui démarre et arrête proprement un planificateur de tâches périodiques avec l'application, plus un test que chaque consommateur recopie et qui vérifie mécaniquement que le planificateur tourne vraiment. Il a été créé le 24 août 2026 après la découverte, dans aiame-agri-gers, d'un planificateur écrit mais jamais démarré — un défaut invisible tant que personne ne le vérifie. Le jour même, un service de veille de prix (aiame-price) l'a copié à l'identique et le démarre depuis son cycle de vie applicatif, test compris. Dans aiame-agri-gers, le problème n'a pas été réglé en adoptant la brique : le 11 septembre, le planificateur mort y a été supprimé, avec les tâches d'archivage automatique qui n'avaient jamais tourné.
Capacités — prouvé, déclaré, absent
prouvéDémarrage/arrêt propre du planificateur, câblé au cycle de vie FastAPIscheduler.py, classe SchedulerLifespan (__aenter__ appelle start(), __aexit__ appelle shutdown(wait=False))
prouvéPreuve mécanique que le planificateur tourne réellement, pas une suppositiontests/test_scheduler_started.py, 2 fonctions : la première asserte scheduler.running False avant, True pendant, False après l'application ; la seconde qu'une tâche enregistrée est présente une fois démarré. Rejoué le 2026-09-30 : 2 passed (Python 3.10.13 système, pytest 9.1.1, hors workspace uv)
prouvéCopiée à l'identique et câblée chez un vrai consommateuraiame-price/backend/vendored/scheduler.py : diff vide contre l'original (2026-09-30), même sha 2f83df01… dans aiame-price/backend/vendored/CANONICAL.sha256 l.49 ; aiame-price/backend/aiame_price/main.py:85 « async with SchedulerLifespan(scheduler) » ; tests/test_scheduler_wiring.py = copie du test ; ajouté par le commit 25c7661 du 2026-08-24 (premier commit de contenu d'aiame-price)
absentAdoption par aiame-agri-gers, le dépôt qui a motivé sa créationaiame-agri-gers, commit 966d684 (2026-09-11, sur main) « scheduler jamais démarré supprimé » : backend/app/workers/scheduler.py (47 lignes) supprimé, apscheduler retiré de pyproject — code mort retiré, brique jamais adoptée ; docs/ADR-SC-001-extraction.md (Consequences) le listait comme « an obvious retrofit candidate … not done as part of this extraction »
absentBroker ou file de messages (Celery, Redis)scheduler.py n'importe que BackgroundScheduler (en mémoire, dans le processus) ; README « What this is » : « no Celery, no Redis, no message broker » — choix délibéré
Ce qui est absent, en toutes lettres
Le dépôt qui l'a motivé (aiame-agri-gers) ne l'a jamais adopté : il a supprimé son planificateur mort le 2026-09-11 (966d684) — l'archivage automatique prévu n'existe donc pas là-bas.
Le README, la docstring de scheduler.py et ADR-SC-001 décrivent encore le fichier d'aiame-agri-gers comme présent (constat daté du 2026-08-24), sans mentionner sa suppression du 2026-09-11.
CI GitHub Actions désactivée org-wide le 2026-08-27, workflows supprimés le 2026-09-22 — seule vérification restante : hook pre-push local + le test recopié chez chaque consommateur.
Un seul consommateur réel à ce jour (aiame-price, vérifié par grep sur la flotte le 2026-09-30) — pas encore un motif éprouvé à large échelle.
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 — garde_fous.sh et test_garde_fous.sh copiés depuis aiame-doctrine le 2026-08-24, depuis une branche GF-5 alors non fusionnée (aiame-doctrine PR #23), resynchronisés le 2026-09-22 (aiame-doctrine#52) ; identiques au canonique au 2026-09-30 (sha 6558a1be…), suivis par aiame-doctrine/garde-fous/verifier-copies.sh l.112
aiame-sov-kernelautredocs/ADR-SC-001-extraction.md, Decision : « on the exact model of aiame-sov-kernel » ; repos.json : « checksum-vendoree (modele aiame-sov-kernel) » — modèle de distribution repris, aucun code partagé
—Absent de probes-2026-09-29.txt ; aucun dossier infra/ ni .github/ ; bibliothèque à copier par conception, jamais un service hébergé (README, section « What this is not »)
Modèle de langage
sans objet — aucun composant IA/LLM, pure orchestration de tâches planifiées
Souveraineté
Aucun service externe (pas de broker, pas de service tiers) ; une seule bibliothèque open source, APScheduler — tourne entièrement dans le processus du consommateur qui la copie.
Doctrine incarnée
CONST-7.1
GF-3
Tests
1fichiers · 2fonctionsportfolio-public.txt (2026-09-24) : aucun compte de tests ; « CI réellement verte à la création (24/08, 3 runs), mais désactivée depuis le 27/08 (facturation, non réactivée) : 2 PR mergées depuis (27/08, 29/08) » — périmé depuis (4 fusions de plus, le 2026-09-11 et le 2026-09-22). Mesure de revue, non publique : 2 passed rejoué le 2026-09-30 (Python 3.10.13 système, hors workspace uv).
Dates
2026-08-24 · 2026-08-24 — le jour même de sa création, aiame-price copie scheduler.py dans son premier commit de contenu (25c7661, 07:34, avant même la fusion de la PR #1 d'aiame-scheduler à 08:05) : premier consommateur réel, câblé dès le départ plutôt qu'ajouté après coup.
Le contrôleur à base de règles qui notait la fiabilité des réponses IA (vérifiée, déduite, heuristique, incertaine, spéculative) — remplacé depuis, et dont l'histoire écrite se corrige elle-même en public.
Extrait le 21 août 2026 d'aiame-sov et d'aiame-one, ce petit dépôt tient en deux fichiers. Le premier est une notation à base de règles de la fiabilité d'une réponse produite par une IA : vérifiée, déduite, heuristique, incertaine ou spéculative. « Vérifiée » exige que chaque preuve porte un identifiant d'enregistrement et que la confiance moyenne atteigne au moins 0,75. Le second contient deux avertissements issus d'un audit interne (FD-01) : le périmètre documentaire réellement interrogé, et un avertissement sur les questions touchant à la santé ou à la psychologie. Copiés à l'identique, somme de contrôle à l'appui, dans aiame-sov et aiame-one du 21 août au 14 septembre, ils ont ensuite été absorbés par un moteur commun plus large, aiame-rag-core. Fait rare : quand une décision écrite plus tard a affirmé à tort que cette copie n'avait jamais eu lieu, la correction a été ajoutée à côté du texte fautif au lieu de l'effacer.
Capacités — prouvé, déclaré, absent
prouvéNotation à base de règles de la fiabilité d'une réponse IA (vérifiée/déduite/heuristique/incertaine/spéculative)critique_service.py (117 lignes), fonction critique() : « verified » exige que chaque preuve porte un `id` et une confiance moyenne ≥ 0,75 ; tests/test_critique_service.py, 9 fonctions de test ; suite rejouée le 2026-09-30 : 15 passed (Python 3.10.13 système, pytest 9.1.1, hors workspace uv, sans cache ni bytecode écrit)
prouvéAvertissement santé/psychologie déclenché par mots-clés (FD-01 M2), trous documentéssafety.py : HEALTH_PSYCH_WARNING + _HEALTH_PSYCH_PATTERN ; tests/test_safety.py, 4 des 6 fonctions portent sur ce filtre, dont test_health_psych_pattern_known_irregular_morphology_gap (le filet de mots-clés documente lui-même ce qu'il rate, safety.py l.25-37). Le noyau fournit le texte et le filtre ; l'attacher à la réponse dépend du consommateur.
prouvéDéclaration du périmètre du corpus interrogé (FD-01 M1)safety.py, fonction corpus_scope_warning() ; tests/test_safety.py : test_corpus_scope_warning_empty, test_corpus_scope_warning_non_empty_reflects_counts
prouvéCopie vérifiée par somme de contrôle, réellement utilisée un peu plus de trois semaines par deux consommateurshistorique git local des consommateurs : aiame-sov d13dab9 (2026-08-21, PR #30 « vendore critique_service.py + safety.py depuis aiame-sov-kernel »), ba9ee1c (resync 2026-08-22), df931a3 (migration vers aiame-rag-core, 2026-09-14, PR #128) ; aiame-one c782352 (PR #13, 2026-08-21), d26d22a (resync 2026-08-22), 49c8d6d (2026-09-14, PR #21). Concorde avec docs/ADR-SK-003-superseded.md, section « Correction (2026-09-23) ».
absentConsommateur actif aujourd'huiaucune somme de critique_service.py (3f04cb05…) dans les fichiers *.sha256 d'aiame-sov ni d'aiame-one (grep, 2026-09-30) ; aiame-doctrine/garde-fous/verifier-copies.sh l.102 : « aiame-sov-kernel retiré le 2026-09-13 : superseded par aiame-rag-core »
absentDéploiement ou service hébergé propreaucun dossier infra/, aucun dossier .github/ ; bibliothèque à copier par conception (README, « What this is not »)
absentIntégration continue (CI) GitHub activegit log : f0131e7 (2026-08-27) « garde pre-push local (Actions desactive, facturation) », c149faf (2026-09-22) « retire le(s) workflow(s) Actions dormant(s) » — seule vérification restante : .githooks/pre-push (sommes de contrôle racine et scripts/, garde-fous, pytest)
absentCopie des garde-fous à jour du canoniquescripts/garde_fous.sh : sha256 c6f9eafe… (intact localement, sha256sum -c OK) ≠ canonique aiame-doctrine/garde-fous/garde_fous.sh 6558a1be… (mesuré 2026-09-30) ; dernière resync e886b7f, 2026-09-11 ; dépôt retiré de verifier-copies.sh, donc cette dérive n'est plus surveillée
Ce qui est absent, en toutes lettres
Aucun déploiement, aucune infrastructure propre — bibliothèque à copier uniquement, par conception.
Plus aucun consommateur : aiame-sov et aiame-one ont migré vers aiame-rag-core le 2026-09-14 ; aucune somme de ce noyau n'y figure aujourd'hui.
CI GitHub Actions désactivée org-wide le 2026-08-27, workflows supprimés le 2026-09-22 — seule vérification restante : le hook pre-push local.
La copie locale des garde-fous est en retard sur le canonique d'aiame-doctrine (dernière resync le 2026-09-11) et plus aucun outil ne surveille cette dérive.
Deux sources racontent encore une version fausse, en sens opposés : l'inventaire du workspace (repos.json) dit « jamais vendoré dans aucun consommateur », version corrigée le 2026-09-23 ; la page portfolio du 2026-09-24 dit encore « vendoré dans aiame-sov et aiame-one » au présent.
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 — garde_fous.sh et test_garde_fous.sh copiés depuis aiame-doctrine (en-tête « Vendoré le 2026-08-20 », alors que le premier commit du dépôt date du 2026-08-21) ; dernière resync e886b7f le 2026-09-11 ; en retard sur le canonique au 2026-09-30
aiame-redautresafety.py met en œuvre les mitigations M1/M2 exigées par l'audit FD-01 d'aiame-red (README « Why this exists » ; docs/ADR-SK-001-extraction.md, Context) — exigence d'audit, pas de code partagé
aiame-sovautredocs/ADR-SK-001-extraction.md : critique_service.py et le bloc FD-01 extraits d'aiame-sov (où M1/M2 avaient été construits le 2026-08-18), identiques à la copie d'aiame-one ; l'import app.models.enums reprend la structure des consommateurs
—Absent de probes-2026-09-29.txt ; aucun dossier infra/ ni .github/ dans le dépôt ; bibliothèque à copier par conception, jamais un service hébergé (README, section « What this is not »)
Modèle de langage
oui — code entièrement à base de règles (regex, seuils de confiance 0,4 / 0,75), zéro dépendance ML/LLM ; seuls imports : dataclasses, re et app.models.enums (fourni par le consommateur, simulé en test par tests/stubs) — vérifié en lisant critique_service.py et safety.py en entier
Souveraineté
Bibliothèque auto-suffisante, sans aucune dépendance externe, conçue pour la ligne de produits à modèle local (Ollama) selon son README — mais sans exécution propre : elle ne vivait que dans le code de qui la copiait, et plus personne ne la copie.
Doctrine incarnée
UAX-LOI-PREUVE.a
CODING-explainability
CODING-ethical-principles
CONST-7.1
GF-1
Tests
2fichiers · 15fonctionsportfolio-public.txt (2026-09-24) : aucun compte de tests ; « certif. e2e absente », « safety.py / critique_service.py identique à PR#2, vert avant le blocage », et encore « vendoré dans aiame-sov et aiame-one » au présent (périmé). Mesure de revue, non publique : 15 passed rejoué le 2026-09-30 (Python 3.10.13 système, pytest 9.1.1, hors workspace uv).
Dates
2026-08-21 · 2026-09-23 — correction publique d'ADR-SK-003 (commit 822bef9, PR #12) : l'ADR documente sa propre erreur factuelle (la copie avait bien eu lieu, contrairement à ce qu'elle affirmait) ; le diff est purement additif, aucune ligne du texte d'origine n'est retirée.
Pile
Python 3, re (stdlib), dataclasses (stdlib), pytest
aiame-standards · référentiels de standards internationaux · vivant
AIAME Standards — la mémoire des codes qui ne bougent presque jamais
Trois tables de correspondance (pays, devises, langues) embarquées et datées, pour arrêter de laisser chaque dépôt deviner ou valider à moitié un code ISO — né d'une duplication mesurée ailleurs dans la flotte entre deux contrôles du même identifiant, de rigueur différente.
Ce dépôt existe parce qu'une étude sur la liaison de données ouvertes (AIAME-DATA-LINKING-STANDARDS-ETUDE-2026.md, aiame-workspace#131) a mesuré que la flotte ne dépendait d'aucune bibliothèque de référence pour les codes pays/devise/langue, et — en corrigeant une duplication SIREN trouvée dans la foulée (deux validateurs de rigueur différente pour le même identifiant, aiame-fin#45/#46 et aiame-sov#174) — a proposé la même discipline pour les identifiants réellement internationaux. Trois tables (ISO 3166-1, ISO 4217 actif, ISO 639-1) sont générées une fois depuis Unicode CLDR via Babel, puis embarquées comme snapshot daté : aucun appel réseau à l'exécution, aucune dépendance déclarée. Le script qui les a produites (`scripts/regenerate.py`) a été exécuté pour de vrai, pas seulement écrit — les 258 pays, 160 devises actives et 184 langues du dépôt sont son résultat réel, pas un exemple illustratif. Décision explicite du propriétaire à la création : scope international seulement, pas de retrofit des référentiels français déjà construits ailleurs (COG/NAF dans aiame-sov).
Capacités — prouvé, déclaré, absent
prouvéCode -> nom français pour ISO 3166-1 (pays), ISO 4217 actif (devises), ISO 639-1 (langues)aiame_standards/{countries,currencies,languages}.py — 258/160/184 entrées (compté par grep sur les fichiers réels, 2026-09-30). tests/test_*.py : 20 fonctions, rejouées en direct (uv run pytest -q, 20 passed).
prouvéDevises retirées exclues par construction (pas seulement par convention)tests/test_currencies.py::test_withdrawn_currencies_are_excluded — FRF/DEM/AFA absents, vérifié en direct ; scripts/regenerate.py filtre via babel.numbers.get_territory_currencies(start_date=today, tender=True).
prouvéZéro dépendance d'exécutionpyproject.toml : `dependencies = []` (lu directement). Babel n'apparaît que dans `[dependency-groups] dev` implicitement via scripts/regenerate.py, jamais importé par aiame_standards/ lui-même (vérifié : aucun `import babel` hors de scripts/regenerate.py).
prouvéIntégrité de la copie vendorée des garde-fous vérifiée avant chaque push.githooks/pre-push (lu intégralement) : sha256sum -c garde-fous/CANONICAL.sha256 en tout premier contrôle ; rejoué en direct à la création du dépôt, vert.
absentConsommateur réel (un autre dépôt vendore ce paquet)Dépôt créé le 2026-09-30 ; aiame_standards/CANONICAL.sha256 existe pour un futur consommateur, mais aucun dépôt de la flotte ne le vendore encore (grep CANONICAL.sha256 croisant "aiame-standards" dans les autres dépôts : aucun résultat).
absentIntégration continue (CI) GitHub activeActions désactivées à la création (gh api actions/permissions enabled:false, réglage vérifié) ; aucun .github/workflows/ dans le dépôt — règle 11, aiame-workspace/CLAUDE.md.
Ce qui est absent, en toutes lettres
ABSENT : aucun consommateur réel — le pacte de dédup (CANONICAL.sha256) est en place, personne ne l'utilise encore.
ABSENT, DÉCIDÉ : ISO 3166-2 (subdivisions), codes numériques ISO 3166-1, noms en langues autres que le français — hors périmètre de cette tranche.
ABSENT, DÉCIDÉ : COG (communes/départements/régions françaises) et code NAF — déjà construits dans aiame-sov (core/geo_insee.py), pas rapatriés ici (décision owner, 2026-09-30).
Dépend de
aiame-doctrinevendoré-checksumgarde-fous/CANONICAL.sha256 (lu intégralement) : copie vendorée de garde_fous.sh et test_garde_fous.sh, source citée aiame-fr/aiame-doctrine, garde-fous/garde_fous.sh, vendorée le 2026-09-30 ; sha256sum -c vérifié vert le jour même.
Consommé par
—
Surface publique
—Aucune surface publique — bibliothèque à vendorer, jamais un service hébergé (README.md, section « Utiliser »).
Modèle de langage
sans objet — aucun composant IA/LLM, tables de correspondance statiques uniquement
Souveraineté
Exécution locale par construction : zéro appel réseau, zéro dépendance déclarée. La seule sortie vers un tiers a lieu une fois, hors exécution, lors d'une régénération volontaire (scripts/regenerate.py lit les données CLDR embarquées dans le paquet Babel installé localement — pas un appel réseau non plus, Babel embarque ses propres données).
Doctrine incarnée
CONST-3.1
CONST-7.1
CONST-7.2
Tests
3fichiers · 20fonctions20 passed, mesuré en direct à la création du dépôt (2026-09-30, uv run pytest -q).
Dates
2026-09-30 ·
Pile
Python 3.12, pytest, hatchling (build), Babel (génération ponctuelle seulement, pas une dépendance du paquet)
aiame-store · stockage · vivant
AIAME Store — les mécanismes de stockage communs
Le code des mécanismes de stockage communs à AIAME : sauvegarde chiffrée et base de données par client, distribuées aux autres dépôts par copie vérifiée (vendoring) ; le calcul d'embeddings est conçu comme un service privé partagé, jamais vendoré selon la doctrine propre du dépôt — sauf une exception mesurée aujourd'hui : une copie vendorée en existe bel et bien chez un consommateur.
Ce dépôt n'héberge rien lui-même : il écrit une fois les recettes de stockage (sauvegarde chiffrée, base de données par client, calcul de similarité de textes) que d'autres services AIAME et partenaires copient chez eux, avec une empreinte numérique qui prouve que la copie n'a pas été modifiée depuis la source. Le module de calcul d'embeddings — une façon de comparer des textes entre eux sans les stocker — est conçu pour tourner uniquement sur un serveur privé, jamais chez un fournisseur d'intelligence artificielle externe ; son README le décrit même comme la seule exception « jamais vendorée » du dépôt, un service partagé plutôt qu'une copie — sauf qu'une copie vendorée existe en pratique aujourd'hui chez un consommateur. Les tests automatisés existent (13 fonctions au total) et ont été rejoués avec succès fin août 2026 ; la vérification automatique par GitHub a été coupée par choix (coût), remplacée par un contrôle local qui ne s'active pas de lui-même sur une copie fraîche du dépôt.
Capacités — prouvé, déclaré, absent
prouvéPipeline de sauvegarde chiffrée + client objet compatible S3 (Garage)blob/test_garage_client.py : 7 fonctions de test (grep -c '^def test_', vérifié). blob/README.md §Provenance : signature SigV4 vérifiée octet pour octet contre le vecteur de test officiel AWS get-vanilla, et un aller-retour PUT/GET réel sur du matériel Garage de production (190 KB et 7 MB, identiques octet pour octet, 2026-08-07).
déclaréGabarit de provisioning Postgres par client, pgvector-prêtdb/docker-compose.db.yml + db/README.md §Provenance : motif restart/healthcheck repris tel quel d'incidents de production réels antérieurs. Aucun fichier de test dans db/ (0 occurrence de 'def test_', vérifié par grep) : le changement d'image vers pgvector/pgvector:pg16 lui-même n'est pas démontré dans ce dépôt.
prouvéService de calcul d'embeddings sans état, zéro rétention structurelleembedding/test_main.py : 6 fonctions de test (vérifié), dont test_no_persistence_primitives_imported qui analyse les imports du module lui-même plutôt que de faire confiance à la docstring. embedding/main.py : endpoints /embed et /healthz, 503 si EMBEDDING_BACKEND_URL/EMBEDDING_MODEL absent (lu ligne à ligne).
prouvéRefus structurel d'un fournisseur d'IA frontière (GF-1)scripts/garde_fous.sh ligne 33-45 : grep bloquant sur openai/anthropic/api.openai.com/api.anthropic.com/generativelanguage.googleapis dans tout .py/.ts/.tsx/.rs, lu directement (pas seulement cité par le README). scripts/CANONICAL.sha256 vendoré depuis aiame-doctrine, appliqué en tout premier par .githooks/pre-push.
prouvéModule embedding en réalité consommé par vendoring (pas seulement le service tailnet prévu par la doctrine du dépôt)aiame-voice/backend/aiame_voice/vendored/aiame_store_embedding/CANONICAL.sha256 : copie checksum-vérifiée, byte-identique à aiame-store/embedding/main.py (source citée : commit aa3c261, 2026-08-20), présente sur disque et confirmée indépendamment par vendoring.txt ligne 37 — alors qu'aiame-store/README.md décrit ce module comme « jamais vendoré », service privé du réseau interne, exception sanctionnée par une décision d'architecture.
absentService de calcul d'embeddings réellement déployé et joignable (en tant que service HTTP live)portfolio-public.txt (2026-09-24) : « Aucune route live trouvée pour embedding-compute à ce jour malgré son statut de service déployable. » Aucune entrée aiame-store dans probes-2026-09-29.txt aujourd'hui non plus (grep vérifié) — pas de nouvelle preuve de mise en service depuis. Ceci ne contredit pas la capacité précédente : la seule consommation réelle mesurée est une copie de code (vendoring), pas un appel réseau vers un service vivant.
prouvéIntégrité de la copie vendorée des garde-fous vérifiée avant chaque pushgit log : commit 9518e0a (#14, 2026-09-22) « restaure le controle d'integrite CANONICAL.sha256 manquant » — le hook .githooks/pre-push (lu intégralement) relance sha256sum -c scripts/CANONICAL.sha256 en tout premier contrôle ; le message du commit documente lui-même que ce contrôle avait disparu pendant plusieurs PR avant d'être restauré, trouvé par un audit post-bulk-merge des 30 PR, pas par le mécanisme lui-même.
absentCI GitHub Actions active sur ce dépôtdates.txt : statut « privé ». .github/workflows/ absent du dépôt (vérifié : ls sort en erreur, répertoire inexistant). Commit 46b3630 (#13) « retire le(s) workflow(s) Actions dormant(s) » confirmé par git show --stat (2 fichiers, 53 suppressions).
Ce qui est absent, en toutes lettres
ABSENT : aucun fichier de test pour le mécanisme db/ (0 fonction 'def test_', vérifié par grep) — le passage à pgvector/pgvector:pg16 n'est démontré par aucun test dans ce dépôt.
ABSENT : aucune route live trouvée pour le service embedding-compute malgré son statut de service déployable (portfolio public 2026-09-24, reconfirmé sans nouvelle preuve le 2026-09-29).
ABSENT : pas de dossier docs/ ni d'ADR versionné dans ce dépôt. Les décisions qui le gouvernent vivent chez le partenaire Elzéard, hors de ce dépôt et hors de cette page.
ABSENT : pas de CI GitHub Actions active sur ce dépôt (.github/workflows/ n'existe plus, vérifié) ; seul un hook pre-push local protège les pushes, et ce hook est lui-même inactif par défaut sur un clone ou worktree fraîchement créé.
CORRIGÉ : graph.json ne montre en effet aucune arête pour ce nœud (0 appel HTTP/route mesuré depuis ou vers ce dépôt aujourd'hui, cohérent avec un rôle de bibliothèque) — mais ce n'est pas « aucune interconnexion » : vendoring.txt prouve qu'aiame-voice tient une copie checksum-vérifiée du module embedding, un lien de dépendance réel qu'un graphe d'appels HTTP ne peut pas capturer par construction.
NOTE mineure : .githooks/pre-push contient encore un commentaire disant de ne pas supprimer .github/workflows/garde-fous.yml (« reste la specification a laquelle revenir ») — ce fichier a pourtant déjà été supprimé par le commit #13 (règle 11 durcie, 2026-09-22) ; commentaire non mis à jour, sans risque fonctionnel mais trace de doctrine obsolète laissée dans le dépôt.
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 (lu intégralement) : copie vendorée de garde_fous.sh et test_garde_fous.sh, source citée aiame-fr/aiame-doctrine, garde-fous/garde_fous.sh, vendorée le 2026-08-20 et resynchronisée le 2026-09-22 (aiame-doctrine#52) ; vérifiée par sha256sum -c en tout premier contrôle de .githooks/pre-push.
—Aucune URL publique https pour ce dépôt dans probes-2026-09-29.txt (aucune entrée « store » dans le fichier, vérifié par grep) ; le dépôt ne décrit lui-même aucune surface publique — mécanismes vendorés plus un service tailnet privé, jamais exposé publiquement par conception (embedding/README.md, section 'What this directory does NOT decide', titre original en anglais).
Modèle de langage
optionnel — les mécanismes de sauvegarde et de base de données n'impliquent aucun LLM ni modèle d'IA ; le calcul d'embeddings est un module séparé et optionnel, toujours conçu pour rester auto-hébergé (jamais un fournisseur frontière), avec un contrôle structurel (GF-1, imports interdits) plutôt qu'une simple déclaration.
Souveraineté
Exécution conçue pour rester privée par construction sur le module de calcul (serveur auto-hébergé, jamais un fournisseur d'IA externe, vérifié par un contrôle structurel des imports — pas seulement déclaré) — même si la distribution réelle de ce module s'est faite au moins une fois par copie vendorée plutôt que par le service partagé que sa propre doctrine prévoit (voir surprise). Les mécanismes de sauvegarde et de base de données sont volontairement portables : sans nom de client ni convention figée, capables de tourner sur n'importe quelle infrastructure hébergeuse.
Doctrine incarnée
CONST-2.1
CONST-3.1
CONST-7.1
CONST-7.2
Tests
2fichiers · 13fonctionsportfolio-public.txt (2026-09-08) : « 13 tests rejoués en direct le 09-08, tous verts — CI GitHub désactivée depuis le 27/08 (facturation, non réactivée), 3 PR mergées depuis sans aucun check GitHub, seulement un hook local lui-même 'NON ACTIF sur un clone/worktree frais' par son propre commentaire. » Le compte de 13 fonctions (7 dans blob/test_garage_client.py + 6 dans embedding/test_main.py) mesuré aujourd'hui par grep correspond exactement à ce chiffre public daté.
Dates
2026-08-20 · 2026-09-22 (#14) : un contrôle d'intégrité vendoré (CANONICAL.sha256) disparu du hook pre-push pendant plusieurs PR est retrouvé et restauré — trouvé en audit, pas par le mécanisme lui-même.
Transforme une phrase dite à voix haute en l'action d'écran la plus proche, par comparaison de sens — sans IA générative, sans mémoire de ce qui a été dit.
Un dirigeant qui dit à voix haute « je veux voir mes devis » n'a pas besoin de cliquer dans un menu : ce service compare le sens de sa phrase à la liste des actions que l'écran affiche vraiment et renvoie la plus proche, ou, honnêtement, aucune réponse s'il n'est pas assez sûr. Il ne comprend pas le langage comme le ferait une intelligence artificielle générative : il mesure une ressemblance entre deux phrases, rien de plus, et ne garde jamais le texte prononcé. Le service tourne en interne depuis le 17 septembre 2026, mais aucun produit ne l'appelle encore en pratique : l'intégration côté partenaire (le cockpit d'Elzéard) n'a pas commencé.
Capacités — prouvé, déclaré, absent
prouvéRoutage par similarité d'embeddings, zéro LLMbackend/aiame_voice/route.py (fonction _cosine + route_utterance) ; embedding.py n'importe que le module vendoré aiame_store_embedding ; grep -rniE 'openai|anthropic|gemini|claude' sur tout le code source et pyproject.toml : aucune occurrence — vérifié à nouveau en direct
prouvéZéro rétention du texte prononcébackend/tests/test_route.py:131 test_no_persistence_primitives_imported (preuve structurelle, pas juste une affirmation) ; route.py ne fait ni log ni écriture du texte de l'énoncé — lu en entier, confirmé
prouvéRéponse honnête « pas de correspondance confiante » sous le seuilbackend/aiame_voice/route.py CONFIDENCE_THRESHOLD=0.7, retourne RouteResponse(match=None) sous ce seuil ; backend/tests/test_route.py:99 test_route_below_confidence_threshold_returns_no_match
prouvéNe recommande jamais une action hors du périmètre autorisé par l'appelantbackend/aiame_voice/route.py filtre les candidats sur eligible_ids fourni par l'appelant ; backend/tests/test_route.py:59 test_route_never_returns_an_action_outside_eligible_ids
prouvéDégradation explicite (503/502) si le service d'embeddings est indisponible, jamais un vecteur devinébackend/tests/test_embedding.py:13 test_embed_raises_503_when_backend_unconfigured et :22 test_embed_never_defaults_to_a_guessed_model ; vendored/aiame_store_embedding/embedding_service.py:48 (503) et :56/:60 (502) — code source relu ligne par ligne
prouvéDéployé en interne, réellement joignableinfra/storage-01/docker-compose.yml + git log (PR#2, 2026-09-17, « déploiement storage-01 ») ; portfolio-public.txt (2026-09-24) confirme un healthz interne répondant 200 en direct ce jour-là — aucune sonde plus récente disponible (probes-2026-09-29.txt ne contient aucune entrée aiame-voice), donc la fraîcheur de cette preuve s'arrête au 24/09, pas à aujourd'hui
absentConsommé par un produit réelREADME.md du dépôt : « No product has synced an action registry against it yet » ; infra/storage-01/README.md : /route renvoie 404 pour tout product_id ; SCRATCH/graph.json : aiame-voice est un nœud isolé, aucune arête entrante ni sortante détectée (vérifié : le fichier ne liste aucune edge source ou target = aiame-voice)
absentCertification bout-en-boutaucun dossier e2e dans le dépôt (arborescence complète relue) ; portfolio public 2026-09-24 : « aiame-voice certif. e2e absente » (et l'aveu org-wide : aucun des 37 dépôts audités n'a de harnais e2e)
Ce qui est absent, en toutes lettres
Aucun produit n'a encore synchronisé de registre d'actions — /route renvoie 404 pour tout product_id à ce jour (README.md, infra/storage-01/README.md)
Pas de certification bout-en-bout (aucun dossier e2e dans ce dépôt ; confirmé absent sur les 37 dépôts audités par le portfolio public)
Pas de cache partagé multi-instance : le registre d'actions est en mémoire process-local (registry.py, commentaire explicite : « a multi-instance deployment would need a shared cache — out of scope until that's real »)
Aucune interconnexion détectée avec un autre dépôt aiame-fr côté cartographie statique (SCRATCH/graph.json : nœud isolé, 0 arête)
Dépend de
aiame-storevendoré-checksumbackend/aiame_voice/vendored/aiame_store_embedding/CANONICAL.sha256 — copie vendorée depuis aiame-store, embedding/main.py, commit aa3c26114f9445da005c068ea61d8006b70ac2d1 (2026-08-20) ; sha256sum -c relancé en direct depuis backend/ : OK, aucune dérive locale
aiame-doctrinecopie-doctrinescripts/CANONICAL.sha256 — copie vendorée depuis aiame-doctrine garde-fous/garde_fous.sh, commit f08e51c6ee0e3a5f6ab696fc2c82c248bf43c101 (2026-09-17) ; sha256sum -c relancé en direct : OK pour garde_fous.sh et test_garde_fous.sh ; réellement invoquée, pas seulement présente — .githooks/pre-push l'exécute à chaque push (sha256sum -c, garde_fous.sh, test_garde_fous.sh)
Consommé par
—
Surface publique
—infra/storage-01/README.md : « Tailnet-private, no public Traefik route » ; aucune entrée aiame-voice dans SCRATCH/probes-2026-09-29.txt (rien à sonder côté public) ; SCRATCH/graph.json : la liste des routes Traefik publiques (miroir, fin, angel, auth, sov, hand) ne mentionne pas aiame-voice ; repos.json le classe hébergé en interne, pas sur un sous-domaine public
Modèle de langage
oui — aucun modèle génératif : uniquement un service d'embeddings auto-hébergé (Ollama), utilisé pour de la comparaison de similarité, jamais de génération de texte. Vérifié : aucun import openai/anthropic/gemini dans le code source.
Souveraineté
Backend d'embeddings auto-hébergé sur une machine privée du réseau AIAME (jamais un fournisseur frontière) ; aucune dépendance à un service tiers hors de l'organisation.
Doctrine incarnée
CONST-7.1
CONST-7.2
GF-1
CODING-privacy
UAX-LOI-PREUVE.b
FOUND-privacy-first
Tests
4fichiers · 18fonctionsportfolio public 2026-09-24 : « 18 tests locaux passent », healthz interne vérifié en direct (200 {"status":"ok"}) ce jour-là — recompté aujourd'hui par grep -c 'def test_' sur les 4 fichiers (3+1+4+10=18) : identique, aucune dérive depuis le 24/09 malgré 2 commits (PR#7, PR#8) survenus entre-temps
Dates
2026-09-17 · 2026-09-17 : PR#2 fusionnée le jour même de la création du dépôt. Passage direct du scaffold au déploiement réel sur un serveur AIAME du réseau privé.
Le point de caisse transversal d'AIAME : encaissement multi-moyens, suivi des commandes ; la facture officielle reste à construire, jamais simulée.
aiame-fin est le service qui encaisserait un paiement le jour où un service AIAME serait vendu ; il garde la trace de chaque commande (aujourd'hui, uniquement des commandes de test). Les moyens de paiement (carte, virement) sont branchés mais tournent partout en mode test : aucun argent réel ne circule encore. La brique qui doit un jour émettre de vraies factures électroniques officielles (obligation française de septembre 2026) est commencée : elle sait construire le document mais ne peut pas encore le transmettre, et le service le dit lui-même plutôt que de faire semblant.
Capacités — prouvé, déclaré, absent
prouvéEncaissement multi-moyens (carte, virement) en mode test uniquement, avec bascule par configurationGET https://fin.services.aiame.fr/health sondé le 2026-09-29 (200, adapter stripe: mode=mock, configured=false, real=false) ; ADR-AF-002 ; backend/aiame_fin/adapters/{stripe_psp,sumup_psp,sepa_transfer}.py — vérifié sur disque, contenu inchangé
prouvéConfirmation de paiement vérifiée côté serveur, jamais sur la foi du seul message reçubackend/tests/test_webhook_signature.py (7 fonctions, confirmé par grep — HMAC-SHA256 constant-time, code lu) ; test_e2e_stripe_webhook.py et test_e2e_sumup_webhook.py existent et pilotent un vrai flux (Stripe CLI / navigateur Playwright réel) mais sont `skipif` sans identifiants live — non exécutés dans cette revue ; le README cite une exécution réussie le 2026-08-22 (déclaratif, non ré-observé aujourd'hui)
prouvéCommande réservée aux professionnels (bac à sable) : case « j'agis à titre professionnel » obligatoirebackend/aiame_fin/api.py:133 (POST /v1/checkout) et :221 (POST /v1/checkout/form) — pro_declaration absent/false → requête rejetée, code lu ; backend/tests/test_compliance.py (15 fonctions, confirmé par grep)
prouvéRésiliation d'abonnement en un seul appel, protégée par preuve de possession de la commandebackend/aiame_fin/api.py:466-489 DELETE /v1/subscriptions/{id}, code lu — exige `?order=` comparé en temps constant à l'id de commande. Le commentaire cité par la fiche d'origine (« measured 2026-08-07 ») décrit en réalité la FAILLE alors trouvée (annulation non authentifiée), pas une vérification du comportement correct actuel ; le correctif (contrôle de possession) est bien présent dans le code lu aujourd'hui, d'où le maintien en `prouvé`, mais la preuve citée était mal qualifiée
absentÉmission d'une facture électronique officielle réellement transmise (obligation française de septembre 2026)backend/aiame_fin/adapters/aiame_invoicing.py:153 retourne littéralement issued: False, aucune branche/variable d'environnement ne peut le faire varier (code lu) ; /health.capabilities.invoicing = « planned (AIAME-internal) »
prouvéExport des commandes vers le grand livre coût/revenu public d'AIAMEGET /v1/admin/orders/export (api.py:427), gardé par backend/aiame_fin/admin_auth.py (vérification Ed25519 vendorée d'aiame-auth, code et CANONICAL.sha256 lus, checksums concordent) ; backend/tests/test_admin_export.py (15 fonctions, confirmé par grep)
déclaréFacturation offerte comme service transversal à Elzéard, tenant par défaut et gratuitADR-AF-004 (Accepted, 2026-08-26, lu) le déclare ; docs/adr-briefs/ADR-AF-005 (2026-09-07, lu en entier) constate zéro appel réel dans un sens ou l'autre à ce jour, des deux côtés du dépôt — confirmé
Ce qui est absent, en toutes lettres
Émission de facture officielle réellement transmise : le code retourne littéralement issued: False, sans aucune branche possible (adapters/aiame_invoicing.py:153, lu).
Emballage Factur-X (PDF/A-3) et validation Schematron EN 16931 externe : non construits (brief ADR-AF-005 §2.1, lu — incrément E1 partiel, 12/103 tests).
Adaptateur Chorus Pro (soumission à la plateforme publique) : aucun fichier dans l'arbre, confirmé — bloqué sur des identifiants PISTE que seul le owner peut fournir (brief ADR-AF-005 §2.1, incrément E3).
Dépendance vivante entre aiame-fin et Elzéard promise par ADR-AF-004 : zéro appel réel constaté dans un sens ou l'autre, des deux côtés (brief ADR-AF-005 §1-2, lu en entier).
Numérotation séquentielle légale des factures (L441-9) : next_invoice_number() existe (services/orders.py:274, lu) mais n'est jamais appelée sur le chemin de production — api.py:274 passe order.invoice_number, toujours None à la création (orders.py:149) — confirmé sur code lu.
Paiement réel : en production, les adaptateurs restent en mode mock (stripe configured=false/real=false sondé le 2026-09-29).
Rail Wero (EPI) : amorce câblée (« seam ready », README ligne 50 et ADR-AF-002 lus) mais non intégré, en attente de l'ouverture de l'API e-commerce EPI en France.
https://fin.services.aiame.frGET /health interrogé le 2026-09-29 (SCRATCH/probes-2026-09-29.txt) → HTTP 200, JSON avec état honnête par adaptateur (stripe: mode=mock, configured=false, real=false). Route Traefik publique confirmée (ansible/roles/vitrine/defaults/main.yml lignes 229/439/458, aiame-infra, routes `fin` et `fin-svc`) et par SCRATCH/graph.json (2 arêtes route publique). Route historique aiame.fr/api toujours active en parallèle (README lu, ligne 28 : contrat gelé).
Modèle de langage
oui — aucun import openai/anthropic/gemini/ollama dans backend/ (grep refait aujourd'hui, zéro résultat) ; pyproject.toml ne déclare que fastapi/httpx/pydantic/sumup/pyjwt/defusedxml ; GF-1 (garde_fous.sh vendoré, scripts/CANONICAL.sha256 vérifié) l'impose
Souveraineté
Le classement des rails de paiement place le virement SEPA et Wero (paiement de compte à compte, sans prestataire de carte) devant les paiements par carte, mais le réglage par défaut en production reste Stripe pour l'expérience d'achat — un choix assumé comme pragmatique, pas souverain, réversible par une seule variable d'environnement (ADR-AF-002, lu).
Doctrine incarnée
MISSION-b2b-buyer-only
FIRST-DOCTRINE-no-sale-before-e2e
TRANSPARENCY-cost-revenue-commitment
GF-4
B2H-A1.2
UAX-LOI-PREUVE.b
Tests
17fichiers · 145fonctionsrecompté par grep aujourd'hui (2026-09-29) : `def test_` sur backend/tests/*.py (16 fichiers, hors __init__/conftest) = 135, + backend/aiame_fin/vendored/test_verify_access_token.py (vendoré) = 10 → total 145 sur 17 fichiers. Chiffre de la fiche d'origine CONFIRMÉ exact. Portfolio public 2026-09-08 : 108 tests passés en local (dernière exécution réelle publique) ; CI GitHub désactivée depuis le 27/08, aucun check depuis — ces 145 sont un compte statique, non une exécution.
Dates
2026-07-28 · 2026-08-26 — ADR-AF-004 (Accepted) : la facturation devient un service transversal offert à Elzéard en OEM, tenant par défaut gratuit, sans changer la direction de dépendance interdite (aiame-fr ne dépend jamais d'Elzéard).
Prototype interne : moteur d'entreprise « sans cœur métier » + signal de retard de paiement, calculé pour chaque client par rapport à son propre historique, sans IA générative. Le calcul s'exécute nativement côté serveur (Rust, mesuré, parité < 1e-4 avec Python) et compile aussi vers un binaire WASM taillé pour le navigateur (85 221 octets) — mais rien sur disque ne prouve qu'il ait jamais tourné dans un navigateur ou un moteur JS.
Aiame Graine est un prototype de moteur pour petites entreprises qui affiche, chaque matin, une liste des factures impayées triée par urgence. Une brique expérimentale y ajoute un signal de dérive de paiement, calculé pour chaque client par rapport à son propre historique — sans intelligence artificielle générative, avec un petit modèle de calcul (quelques centaines d'octets) réimplémenté en Rust et mesuré nativement côté serveur, avec une parité numérique prouvée face à Python (écart < 1e-4). Ce même code compile vers un binaire WASM taillé pour le navigateur (85 221 octets, sous le seuil de 2 Mo fixé par le garde-fou) ; mais aucun script, ni dans l'historique git ni ailleurs sur disque, ne charge et n'exécute réellement ce binaire dans un navigateur ou un moteur JS — c'est une affirmation du README du dépôt, jamais une mesure retrouvée. Le cœur du moteur ne connaît aucun métier : retirer la brique "relances impayées" ne le casse pas, preuve qu'il pourrait un jour porter d'autres usages. Ce dépôt vendore aussi, depuis son tout premier commit, le garde-fou canonique d'aiame-doctrine, et porte une partie de son protocole de test de scoring directement depuis aiame-pouls — deux dépendances réelles qu'une fiche antérieure avait laissées à zéro. C'est un prototype interne non déployé publiquement, qui doit encore prouver sa valeur auprès de vrais clients pilotes.
Capacités — prouvé, déclaré, absent
prouvéMoteur "sans cœur métier" (4 primitives : contexte, événements, carte, action)core-orchestrator/backend/app/core/{contexte,events,carte,action}.py (+ moteur.py) ; test_coreless.py démarre le moteur sans aucun pack (moteur.flux() == []) ET détecte par regex une injection fautive d'import `packs.*` dans un fichier de test créé à la volée (mutation testée, vérifié en lisant le fichier) — 38 fonctions de test Python + 5 tests Rust recomptés directement dans le code (grep), pas rejoués
prouvéIngestion CSV de facturespacks/relances/lecture.py ; core-orchestrator/backend/tests/test_ingestion.py (4 fonctions de test comptées) sur une fixture 4 lignes (soldée / non échue / 2 en retard)
prouvéCarte "On vous doit" triée par jours de retardpacks/relances/cartes.py:carte_encours ; test_flux_relances.py (4 fonctions comptées) vérifie tri et exclusion des factures soldées/non échues ; endpoint GET /flux confirmé dans core-orchestrator/backend/app/main.py
prouvéSignal de dérive de paiement, entraîné pour chaque client sur son propre historiquepacks/relances/scoring.py (gradient boosting sur souches de décision, stdlib Python pure) ; test_scoring.py (7 fonctions comptées) + test_f2_auc.py (3 fonctions comptées) — kill-test : gain AUC mesuré dans le code du test, étiquettes détruites font retomber le gain (protocole confirmé en lisant test_f2_auc.py) ; NOTE LIENS : scoring.py et test_f2_auc.py déclarent explicitement porter ce protocole depuis `aiame-pouls/tests/test_f2_auc.py` — lien manquant dans `consomme`, ajouté ci-dessous
prouvéRust→WASM : compilation navigateur + parité Python↔Rust mesurée (exécution navigateur NON prouvée)crates/aiame-infer/src/lib.rs (4 tests `#[test]`) + tests/parite_python.rs (1 test, parité numérique Python↔Rust < 1e-4 sur un modèle réellement entraîné) — ces 5 exécutions Rust natives sont réelles. `wasm-pack build --target web --release` compile bien un binaire navigateur, taille mesurée 85 221 octets < 2 Mo (.githooks/pre-push, message du commit 726cf29). MAIS : `crates/aiame-infer/pkg/` n'est PAS suivi par git (`git ls-files` vide) — c'est un artefact de build local, pas un livrable versionné — et aucun script Node/JS n'existe nulle part dans l'historique du dépôt (`git grep "node "`, `git log -- crates/aiame-infer` : un seul commit). La phrase du README « le .wasm compilé rechargé et scoré en direct via un vrai script Node/JS » — reprise telle quelle par la fiche source — n'a AUCUNE preuve sur disque : c'est une affirmation README, pas une mesure (règle zéro bullshit : un README n'est pas une preuve). Le volet « identique navigateur/serveur » du récit doit donc être lu comme : serveur = prouvé (Rust natif), navigateur = compile et respecte la garde de taille, mais n'a jamais été exécuté nulle part que nous ayons pu retrouver.
prouvéExplication du score à 3 facteurs, texte réel produit par le pipelinepacks/relances/cartes.py:carte_encours_scoree, couvert par test_flux_cerveau.py (4 fonctions comptées) ; endpoint GET /flux/cerveau confirmé dans main.py ; texte du type "habituellement X j, là Y j, montant Z× médiane" ; un client sans historique retombe honnêtement sur le tri naïf, jamais un score inventé
prouvéZéro modèle frontière dans le code d'exécutiongrep -rniE "openai|anthropic|gemini" sur tout le dépôt (hors .venv/, target/) : aucune occurrence, exit 1 — rejoué en direct dans cette revue ; garde-fous vendorés dans scripts/CANONICAL.sha256 dès le premier commit (6869adc, 2026-09-02), câblés en hook .githooks/pre-push seulement depuis le 2026-09-22 (7cdd406, PR#5) — .githooks/ absent avant cette date, confirmé par `git log`
absentInterface visuelle du Flux (frontend)aucun répertoire frontend dans le dépôt (confirmé par find) ; le README l'écrit lui-même en toutes lettres ("l'API est testée et fonctionnelle ; aucune interface ne l'affiche encore")
Ce qui est absent, en toutes lettres
F2 sur historiques réels (verdict définitif de la valeur du scoring) — nécessite des pilotes réels, pas seulement le monde synthétique déjà prouvé
IMAP, export ERP — l'ingestion ne lit que des CSV locaux
Classification TinyML de mails, extraction TinyML de champs PDF — 2 des 3 briques prévues du sprint "Cerveau", seul le scoring de dérive est construit
LLM (brouillons de relance) + mode dégradé — prévu pour un sprint ultérieur, pas commencé
Envoi de mail réel — l'action est déclarée et testée dans le manifeste, aucun code ne l'exécute
Frontend (Next.js, Flux visuel) — l'API existe et fonctionne, rien ne l'affiche
Persistance (SQLite ou équivalent) — les factures sont relues depuis les CSV à chaque requête, jamais stockées
Indicateur North-Star ("heures rendues") — rien ne le mesure
Falsifications F1, F3, F5, F6 du PRD — exigent respectivement des pilotes réels, un LLM, une instrumentation North-Star, du matériel cible
Exécution réelle du .wasm dans un moteur JS/navigateur (script Node ou test navigateur) — jamais retrouvée sur disque malgré l'affirmation du README (« rechargé et scoré via un vrai script Node/JS ») ; `crates/aiame-infer/pkg/` n'est même pas suivi par git, c'est un artefact de build local
Écart avec le portfolio public daté 2026-09-24 : celui-ci affirme encore "CI déclenchée sur push/PR, 3 checks verts sur HEAD dont un job qui compile la cible wasm32" — ce workflow GitHub Actions a été supprimé le 2026-09-22 (PR#5, antérieure à la date du portfolio), remplacé par un hook pre-push local ; la carte publique n'a pas été rafraîchie depuis
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 : « Source canonique : aiame-fr/aiame-doctrine, garde-fous/garde_fous.sh » — vendoré dès le tout premier commit (6869adc, 2026-09-02) et resynchronisé le 2026-09-22 (commentaire du fichier référence aiame-doctrine#52, GF-5 .css/.html)
aiame-prddépendance-cheminREADME.md référence `../aiame-prd/POC_Graine_v0.1.md` comme spécification implémentée par ce sprint (§5 « S1-S2 Squelette », §3.3 « Cerveau ») ; le fichier existe réellement au chemin relatif sur disque (sibling du dépôt dans l'arbre de travail)
aiame-poulsautrepacks/relances/scoring.py, docstring : « Porté depuis aiame-pouls/tests/test_f2_auc.py » et « identiques bit à bit à la version prouvée par le F2 d'aiame-pouls » ; core-orchestrator/backend/tests/test_f2_auc.py compare explicitement son protocole à celui d'aiame-pouls (30 factures d'historique vs 15) — code copié/adapté, pas un import Python live, mais un lien réel et cité en plusieurs endroits
Consommé par
—
Surface publique
—Aucune URL pour ce dépôt dans les sondes du jour (probes-2026-09-29.txt) ; README confirme l'absence de frontend, de persistance et de déploiement ("ABSENT" en toutes lettres) ; le portfolio public (aiame-fr.github.io, extrait daté 2026-09-24) classe ce dépôt en "Pré-prod", sans URL affichée ; dates.txt confirme le dépôt "privé".
Modèle de langage
oui — aucun import openai/anthropic/gemini détecté dans le code (grep exhaustif rejoué en direct dans cette revue, exit 1) ; le score est un gradient boosting sur souches en stdlib Python pure, réimplémenté directement en Rust, jamais un modèle de fondation ni un appel externe
Souveraineté
Le score est entraîné et exécuté localement, par client, sur son propre historique de factures — aucun appel à un service tiers ni à un modèle de fondation. L'inférence Rust est mesurée nativement côté serveur (cargo test, parité < 1e-4 face à Python) et compile vers un binaire WASM taillé pour le navigateur (85 221 octets, sous garde de taille) ; son exécution réelle dans un navigateur ou un moteur JS n'est PAS prouvée sur disque, malgré l'affirmation du README du dépôt — nuance absente de la fiche précédente. Cette souveraineté est prouvée au niveau du code côté serveur ; le dépôt reste un prototype interne non déployé, donc pas encore prouvée au niveau d'un service en production, ni au niveau du navigateur.
Doctrine incarnée
GF-1
GF-2
UAX-LOI-PREUVE.a
UAX-LOI-PREUVE.b
CODING-explainability
Tests
13fichiers · 43fonctionsportfolio-public.txt (extrait daté 2026-09-24, section "Pré-prod") : "38/38 tests rejoués en direct ... cargo test 5/5" — compte identique à celui recompté ici en lisant le code (38 fonctions de test Python + 5 tests Rust = 43 au total ; 11 fichiers de test Python + 2 fichiers de test Rust = 13 fichiers), mais cette même carte publique dit aussi "CI déclenchée sur push/PR", affirmation devenue fausse depuis le 2026-09-22 (voir manques)
Dates
2026-09-02 · 2026-09-22 (PR#5 à 13:29:21+02:00 puis PR#6 à 13:58:40+02:00, même jour, 29 minutes d'écart, confirmé par `git log --date=iso-strict`) : le workflow GitHub Actions dormant est retiré au profit d'un hook pre-push local (doctrine "règle 11"), et la même après-midi une deuxième PR trouve et corrige que ce hook ne reprenait pas la couverture Rust/WASM (cargo test + build wasm) du workflow défunt — restée sans AUCUNE vérification entretemps, ni CI ni hook.
Pile
Python 3 (FastAPI, Pydantic), Rust → WASM (wasm-bindgen, wasm-pack, opt-level=z + LTO), pytest, cargo test, ONNX (export interop/debug seulement, écarté pour le chemin WASM), CSV en fichiers plats (pas de base de données)
aiame-ledger · transparence coût/revenu · vivant
Le grand livre d'AIAME sur elle-même
Le grand livre coût/revenu de chaque service AIAME : un chiffre non mesuré s'affiche gris honnête, jamais deviné, jamais mis à zéro.
Ce dépôt applique à AIAME elle-même la règle qu'elle demande à ses propres outils : chaque chiffre affiché doit remonter à une pièce réelle (facture, export de commande), sinon il s'affiche en gris plutôt que d'être inventé. Aujourd'hui, le registre fonctionne et les tests existent, mais aucune facture n'a encore été saisie à la main et aucun service n'a de vraie vente : tout est en bac à sable. Un instantané du tableau a été publié à la main le 2026-09-06 sur la page transparence d'aiame.fr, reliée depuis le pied de page de la vitrine. Il n'y a pas de republication automatique : chaque mise à jour reste une décision humaine.
Capacités — prouvé, déclaré, absent
prouvéRegistre de provenance (Pièce/Fait/RegistreProvenance)core/provenance.py (vendoré depuis aiame-pouls, ADR-LEDGER-001 §2, relu sur disque) ; tests/test_provenance.py porte 7 cas depuis le donneur (commit bfff1ad, 2026-09-11) ; câblé dans cli.py::cmd_verify (appelle registre.verifier_tout(), vérifié ligne 119).
prouvéRègle d'allocation par pourcentage tracé (jamais d'arrondi)core/provenance.py:54-62 (class Regle, ALLOCATION, relu sur disque) ; packs/e3/allocation.py:41-54 produit un fait gris nommé (jamais un partage égal par défaut) si aucune politique n'existe pour le couple pool/service — code lu directement.
prouvéChiffre non mesuré = gris honnête, jamais zéro fabriquédata/publication/LEDGER-STATUS.json relu directement sur disque (sortie locale du CLI, générée le 2026-09-06, absente de git) : les 2 services offered_sandbox_only (aiame-red, aiame-sov) affichent etat: gris avec revenu_sandbox_raison_gris explicite ; les 3 not_offered affichent etat: not_wired_for_sale avec revenu_sandbox_raison_gris: null — la raison y est portée par l'état lui-même, pas par un texte. revenu_sandbox_cents: null dans les 5 cas, jamais 0.
prouvéCadence de fraîcheur vérifiable (90 jours)packs/e3/freshness.py, SEUIL_JOURS_PAR_DEFAUT=90, relu sur disque (ADR-LEDGER-003) ; instantane_perime() compare genere_le à aujourd_hui sans deviner. Dernière publication connue : 2026-09-06 → 23 jours écoulés au 2026-09-29, sous le seuil.
prouvéZéro dépendance à un modèle de langagerequirements.txt ne liste que pytest==9.0.3 et PyYAML==6.0.2 ; grep -rniE "openai|anthropic" --include=*.py (2026-09-29, rejoué) : aucune occurrence ; garde-fous/garde_fous.sh GF-1 (relu, lignes 33-42) bloque explicitement ces imports.
prouvéGarde-fou doctrinal vendoré, somme de contrôle vérifiée à chaque push.githooks/pre-push relu intégralement : exécute sha256sum -c garde-fous/CANONICAL.sha256 puis bash garde-fous/test_garde_fous.sh — ce second appel a été RAJOUTÉ le 2026-09-29 (commit e653d52, PR#11, message confirmé par git show) après qu'un audit externe (aiame-workspace#139, tools/gates-health, cité verbatim dans le commit) a trouvé que l'étape portait ce nom sans jamais lancer le harnais de mutation.
absentContrôle de dérive sur les fichiers vendorés depuis aiame-poulsgarde-fous/CANONICAL.sha256 relu intégralement au HEAD e653d52 : 2 lignes de hash seulement (garde_fous.sh, test_garde_fous.sh). git show 0f53095 -- garde-fous/CANONICAL.sha256 confirme le diff exact : les lignes -a85d36f8…core/provenance.py et -9c4cc14f…core/montant.py (ajoutées par bfff1ad le 2026-09-11) ont été supprimées le 2026-09-22 par la resynchronisation, remplacées par les nouvelles lignes de garde_fous.sh au lieu de s'y ajouter.
prouvéPublication de l'instantané sur aiame.fr (page transparence, reliée depuis le pied de page de la vitrine)Copie manuelle de data/publication/transparence.html dans aiame-fr.github.io, commit ed7aa2d du 2026-09-06 (message : « Lien ajouté au pied de page d'index.html » ; page déplacée sous /vitrine/ le 2026-09-09, commit 9d68ede). GET du 2026-09-30 : www.aiame.fr/transparence.html 200, identique octet pour octet au fichier du dépôt vitrine (« Régénéré à la main le 2026-09-06 depuis aiame-ledger ») ; www.aiame.fr/vitrine/ 200, lien /transparence.html dans son pied de page. Aucune republication automatique (README : pas de cron). Le README du dépôt dit encore « Reste ouvert, volontairement » (texte du 2026-08-22, antérieur à la publication).
Ce qui est absent, en toutes lettres
Aucune vente réelle : les 5 services E3 sont offered_sandbox_only ou not_offered (E3-SERVICES.yml, LEDGER-STATUS.json généré 2026-09-06, relus) — aucun n'est sold_real.
data/costs/ et data/allocation-policies/ sont vides en v1 (confirmé par ls) : aucune facture réelle saisie, aucune politique de répartition choisie (décision du propriétaire, README de chaque dossier — pas un oubli).
Le README du dépôt affirme encore que la publication « reste ouverte, volontairement » (texte du 2026-08-22), alors que l'instantané est publié sur aiame.fr et relié depuis le pied de page de la vitrine depuis le 2026-09-06 : README en retard. L'instantané publié n'a pas été régénéré depuis le 2026-09-06, et la page d'accueil (portfolio) n'y renvoie pas.
Contrôle de dérive (checksum) sur core/provenance.py et core/montant.py, vendorés depuis aiame-pouls : documenté comme ajouté le 2026-09-11 (bfff1ad) mais silencieusement supprimé lors d'une resynchronisation le 2026-09-22 (0f53095, diff vérifié), toujours absent au 2026-09-29 (CANONICAL.sha256 relu).
Deux exécutions CI (workflow_dispatch, 06-09) sont restées « queued » plus de 2 jours sans jamais être assignées à un runner, jamais relancées depuis (portfolio-public.txt, phrase retrouvée verbatim, cas non revérifié depuis le 08-09).
Dépend de
aiame-poulsvendoré-checksumcore/provenance.py et core/montant.py vendorés depuis aiame-pouls (2026-08-22, ADR-LEDGER-001 §2, en-tête du fichier relue) — checksum de dérive documentée mais actuellement absente (voir capacité ci-dessus, vérifié dans CANONICAL.sha256).
aiame-doctrinevendoré-checksumgarde-fous/garde_fous.sh + test_garde_fous.sh vendorés depuis aiame-doctrine (commentaire d'en-tête relu, commit cd773b8), checksum active dans garde-fous/CANONICAL.sha256, resynchronisé le 2026-09-22 (commit 0f53095, diff vérifié).
aiame-finappel-servicepacks/e3/ingest_fin.py relu : un seul GET authentifié vers aiame-fin (/v1/admin/orders/export, gardé par aiame-auth selon le docstring), déclenché par cli.py regenerate --fin-base-url (confirmé cli.py:32,63-65), jamais par défaut.
—Dépôt privé (SCRATCH/dates.txt : « privé »). Aucune entrée dans SCRATCH/probes-2026-09-29.txt. Sa sortie data/publication/transparence.html (générée le 2026-09-06, hors git) a été copiée à la main dans aiame-fr.github.io (commit ed7aa2d du 2026-09-06, page « Régénéré à la main le 2026-09-06 depuis aiame-ledger »). www.aiame.fr/transparence.html : GET 200 le 2026-09-30, identique octet pour octet au fichier du dépôt vitrine. Le même commit a posé le lien de pied de page ; depuis que le portfolio est devenu la page d'accueil (commit 9d68ede, 2026-09-09), ce lien figure dans le pied de page de www.aiame.fr/vitrine/ (GET 200 le 2026-09-30), pas sur l'accueil. Le README du dépôt (« Reste ouvert, volontairement », texte du 2026-08-22) n'a pas été mis à jour.
Modèle de langage
oui — requirements.txt = pytest + PyYAML uniquement, grep openai/anthropic rejoué sur *.py (2026-09-29) : 0 occurrence, GF-1 du garde-fou vendoré le couvre.
Souveraineté
Aucune donnée quittant l'infrastructure AIAME : les seules sources sont des fichiers YAML commités à la main et un appel HTTP interne (aiame-fin, gardé par aiame-auth). Aucun service tiers, aucun hébergement étranger.
11fichiers · 77fonctionsNon publiée. Seule mesure connue : le commit interne bfff1ad (2026-09-11) déclare « 77 passed » (70 existants + 7 portés depuis aiame-pouls) — recompté par grep -c "def test_" sur les 11 fichiers tests/test_*.py de ce jour (2026-09-29) : 77 fonctions, 11 fichiers, exactement cohérent. Suite non ré-exécutée dans cette revue (lecture seule, aucun pytest lancé). portfolio-public.txt (2026-09-24) ne mentionne que « certif. e2e absente », rien sur le compte unitaire.
Dates
2026-08-22 · 2026-09-29 (commit e653d52, PR#11) : REGBUG fermé le jour même où tools/gates-health (aiame-workspace#139) l'a trouvé, à sa première exécution sur la flotte — l'étape « test_garde_fous » du hook pre-push ne lançait en réalité que la somme de contrôle, jamais le harnais qui prouve que le garde sait échouer.
Pile
Python 3.10 (stdlib + PyYAML 6.0.2), pytest 9.0.3 (négatif/mutation par construction — chaque test prouve aussi que la règle sait échouer), sqlite3 (stdlib, persistance snapshot — confirmé core/persistence.py:20,49,89), urllib (stdlib, seul appel réseau : export aiame-fin, confirmé packs/e3/ingest_fin.py), CLI pur, pas de framework web, pas de cron
aiame-one · intake documentaire · spike
Aiame One — l'accueil des documents
Documents et voix d'un client transformés en brouillon ERP où chaque champ porte sa preuve, ou reste vide plutôt que d'inventer.
Pendant un rendez-vous chez un client, un consultant dépose les documents disponibles (devis, factures, contrats) dans une page et peut aussi dicter un commentaire oral ; le tout est lu par un moteur de recherche documentaire installé localement, jamais envoyé à un service extérieur. Aiame propose ensuite un premier brouillon de fiche (société, contacts, chantiers, devis) où chaque valeur affiche le document exact d'où elle vient — et une case reste vide plutôt que d'être devinée. Rien n'est chargé automatiquement : un humain relit chaque champ avant toute utilisation. C'est aujourd'hui un outil de démonstration à un seul poste, pas un service déployé.
Capacités — prouvé, déclaré, absent
prouvéIngestion multi-format (PDF, DOCX, texte) vers un pipeline documentairebackend/aiame_one/services/text_extraction.py + backend/tests/test_text_extraction.py (9 fonctions de test, recompté par grep) ; pypdf/python-docx déclarés dans backend/pyproject.toml (vérifié)
prouvéBrouillon de fiche client avec traçabilité par champ (verified/heuristic)backend/aiame_one/services/seed_draft_service.py ; backend/tests/test_seed_draft.py (29 fonctions de test, recompté par grep), dont test_verified_field_names_the_document_that_backs_it (existe, vérifié par nom)
prouvéGarde-fous anti-hallucination déterministes (identifiants croisés, contacts non ancrés dans un document, libellé de champ pris pour un nom)backend/tests/test_seed_draft.py : test_cross_filed_row_is_flagged_on_both_tables_although_every_field_is_verified, test_a_contact_whose_name_is_in_no_document_is_dropped, test_a_field_label_echoed_back_as_a_name_is_dropped — les trois noms de test vérifiés présents dans le fichier
prouvéIsolation stricte par engagement client (une base par session, jamais partagée)backend/tests/test_isolation.py::test_two_engagement_sessions_never_leak_into_each_other (présent, vérifié) ; backend/aiame_one/models/rag.py sans champ tenant (isolation physique, pas une clause WHERE, confirmé par grep + README §Data isolation)
prouvéFonctionne sans aucun LLM configuré : dégrade en tableau vide + avertissement, jamais une ligne fabriquéebackend/aiame_one/services/llm_provider.py — classe réelle : NullProvider (pas "NoOpProvider" comme l'affirmait la fiche précédente ; corrigé après lecture du fichier), docstring "never raises, never calls out" ; backend/tests/test_seed_draft.py::test_no_llm_provider_yields_empty_tables_with_warning (présent, vérifié)
prouvéVendoring à somme de contrôle (dérive amont détectable) depuis aiame-rag-core, aiame-compliance et aiame-doctrinesha256sum -c rejoué en direct le 2026-09-29 (cette revue, depuis backend/) : aiame_one/vendored/aiame_rag_core/CANONICAL.sha256 → 7/7 OK ; aiame_one/vendored/aiame_compliance/CANONICAL.sha256 → 10/10 OK ; scripts/CANONICAL.sha256 (garde_fous.sh depuis aiame-doctrine, depuis la racine) → 2/2 OK
déclaréCommentaires vocaux transcrits et ingérés comme document citablebackend/aiame_one/services/transcription.py suit un motif WHISPER_URL déjà utilisé côté partenaire (selon le README). WHISPER_URL est vide par défaut dans backend/.env.example (vérifié), et le refus explicite est testé (test_voice_comment_without_whisper_url_is_honest_503). Le seul test « whisper configuré » (test_voice_comment_ingests_transcript_when_whisper_configured) remplace entièrement la fonction transcribe() par un mock, sans appel à un vrai endpoint : la nuance de la fiche précédente est confirmée.
absentVérification continue en CI GitHubaucun fichier .github/workflows/ dans ce dépôt — supprimé par le commit ec8b5ed (PR#31, 2026-09-23), et non par f2c94de comme l'affirmait la fiche précédente (f2c94de ne fait que retirer un check checksum mort à l'intérieur de ci.yml, sans supprimer le fichier — vérifié par git show) ; remplacé par le hook .githooks/pre-push, dont le commentaire dit lui-même "NON ACTIF sur un clone/worktree frais — core.hooksPath n'est pas versionné". Correction supplémentaire : `git config --get core.hooksPath` renvoie `.githooks` (donc actif) sur le clone utilisé pour CETTE revue — l'affirmation de la fiche précédente ("renvoie vide") ne s'est pas reproduite ; la mise en garde du hook reste juste comme description du mécanisme général (rien ne garantit qu'un clone/worktree futur soit configuré), mais n'était pas l'état vérifié de ce clone précis
Ce qui est absent, en toutes lettres
Pas de test e2e réel — seulement des tests unitaires/intégration offline (SQLite, LLM_PROVIDER=none), confirmé par le portfolio public (« certif. e2e absente »)
Pas d'OCR pour les documents scannés/image — UnsupportedFormatError explicite, jamais un saut silencieux (vérifié dans text_extraction.py, confirmé par README)
Couvre 4 tables sur 21 du cockpit historique (societe, contacts, chantiers, devis) — v1 volontairement partielle (README)
Pas de CI GitHub active depuis le 27/08 ; les 2 dernières PR mergées (dont le renommage #36) n'ont eu aucun check GitHub — seul le hook pre-push local couvre le dépôt, non versionné (un clone/worktree frais doit configurer core.hooksPath à la main pour l'activer)
Pas d'authentification, pas de multi-tenant — un seul opérateur, un seul engagement à la fois, assumé comme tel dans le README, pas encore comme un manque à combler
Dépend de
aiame-doctrinecopie-doctrinescripts/garde_fous.sh + scripts/test_garde_fous.sh, revérifiés en direct contre scripts/CANONICAL.sha256 (sha256sum -c → 2/2 OK)
aiame-rag-corevendoré-checksumbackend/aiame_one/vendored/aiame_rag_core/{gates,retrieval}/*.py, checksum revérifié en direct (7/7 OK) — remplace depuis le 2026-09-14 la copie manuelle d'aiame-sov-kernel
aiame-compliancevendoré-checksumbackend/aiame_one/vendored/aiame_compliance/*.py (dont packs/), checksum revérifié en direct (10/10 OK)
aiame-sovautreREADME.md §Vendoring debt : backend/aiame_one/models/schemas/rag.py et services/{rag_service,llm_provider}.py copiés depuis aiame-sov, SANS somme de contrôle — dette de duplication assumée par écrit, dérive amont non détectée automatiquement
—aucune entrée pour aiame-one dans probes-2026-09-29.txt, aucun domaine dans repos.json, aucun dossier infra/docker dans le dépôt — README décrit exclusivement une exécution locale (`uv venv` + `npm run dev`) par un opérateur unique pendant un rendez-vous client, jamais un service hébergé
Modèle de langage
optionnel — LLM_PROVIDER=none par défaut dans .env.example ; sans modèle configuré, le moteur dégrade en tableaux vides + avertissement explicite (jamais de ligne fabriquée), prouvé par des tests dédiés (test_no_llm_provider_yields_empty_tables_with_warning)
Souveraineté
Aucune infrastructure d'inférence n'est provisionnée par ce dépôt : WHISPER_URL/OLLAMA_BASE_URL/MISTRAL_URL sont des dépendances déclarées seulement, pointées vers un serveur AIAME du réseau privé quand elles existent — le code reste constructible et testable hors ligne sans elles.
Doctrine incarnée
UAX-LOI-PREUVE.a
UAX-LOI-PREUVE.b
CODING-explainability
CODING-privacy
UAX-LOI-INITIATIVE-BORNEE
MANIFESTO-decision-support
Tests
12fichiers · 86fonctionsportfolio public 2026-09-08 : 74 tests backend rejoués en direct (le README affichait encore 66/66 à ce moment, écart alors de 8) ; compte relu sans exécution le 2026-09-29 pour cette revue (grep, non ré-exécuté) : 79 fonctions de test backend + 7 côté frontend (format.test.ts) = 86 fonctions sur 12 fichiers, et le README du dépôt affiche désormais 79/79 (auto-corrigé par PR#28 puis #31, avec garde-fou anti-récidive ajouté) — chiffres recomptés indépendamment et confirmés identiques à la fiche précédente
Dates
2026-08-06 · 2026-09-28/29 (PR#36, mergée le jour de cette revue) : renommage du paquet backend `app` → `aiame_one` pour éliminer une collision de namespace dans le .venv uv partagé de toute la flotte (même mécanisme de risque que celui documenté au niveau de l'espace de travail) — dernier push du dépôt.
Un registre qui n'affiche jamais un chiffre sans pouvoir montrer la facture d'où il vient.
Le Pouls est un prototype de deux tableaux de trésorerie pour une TPE : « ce qu'on vous doit » et « ce qui arrive dans les 14 jours ». Chaque montant affiché se relie, en un clic, à la facture ou au relevé bancaire qui le prouve ; si une pièce manque, la case reste vide plutôt que d'afficher un zéro trompeur. C'est un prototype interne : aucune API HTTP, aucun déploiement, pas de site à visiter — le développement fonctionnel est arrêté depuis le 2026-09-11 (le parseur Factur-X vendoré est marqué « figé » dans le code lui-même, ADR-AF-004) ; la maintenance qui a suivi ne porte que sur les garde-fous et l'intégrité de la copie vendorée.
Capacités — prouvé, déclaré, absent
prouvéRegistre de provenance (expliquer/vérifier)core/provenance.py ; tests/test_provenance.py (9 fonctions dont test_nfr_latence_expliquer_sous_300ms) ; tests/test_coherence.py (3 fonctions test_mutation_* — montant, somme, pièce — qui prouvent que le contrôle sait échouer). Vérifié en relisant le code : compte de fonctions confirmé par grep.
prouvéLatence moyenne d'explication sous 300 ms (moyenne sur 100 appels ; le p95 visé par le PRD n'est pas mesuré)core/provenance.py:328-332 (méthode mesurer_expliquer, moyenne sur 100 tours) ; tests/test_provenance.py:71-75, seuil 300 ms — le chiffre « 0,003 ms » vient du README, non ré-exécuté dans cette revue (lecture seule).
prouvéCarte « On vous doit » (C1) et « Ça arrive » (C3)packs/relances/c1.py, c3.py ; tests/test_c1.py (10 fonctions), tests/test_c3.py (11 fonctions) — comptes confirmés par grep ; demo.py --expliquer c1:encours (option --expliquer présente dans le parseur argparse de demo.py)
prouvéBrouillon de relance sans LLM (mode dégradé)packs/relances/relance.py (« zéro LLM, zéro GPU, zéro envoi », ligne 9) ; tests/test_relance_template.py (10 fonctions, confirmé par grep)
prouvéSéparation stricte moteur / métier (« coreless »)tests/test_coreless.py (7 fonctions) — lu directement : 0 import de packs/demo sous core/ (AST), 0 mot de VOCABULAIRE_METIER prononcé par core/ hors docstring (AST, fonction _est_docstring dédiée), et un test de comportement (moteur démarre sans pack). FICHIERS_CORE = 7 fichiers .py réels sous core/.
absentAPI HTTP exposéeREADME.md, tableau « État honnête » : « API HTTP | ABSENT | non écrit — la démo est en CLI » ; aucune route/framework web trouvé (grep flask/fastapi/route sur tout le dépôt, hors mentions métaphoriques de « l'API du badge » dans les docstrings de core/provenance.py) ; absent des sondes HTTP du 2026-09-29
absentRelance dictée (LLM/Whisper)README.md : « ABSENT, ASSUMÉ » — étage supprimé délibérément (dépendance GPU non louée, notée 20/07/2026) ; aucune trace dans le code
prouvéHarnais de kill-test (signal TinyML vs règle naïve)tests/test_f2_auc.py (5 fonctions, confirmé par grep) — structure vérifiée par lecture directe du code : SEUIL_MORT_F2 = 0.10, test_f2_le_gain_atteint_le_seuil_de_survie exige gain >= seuil, test_le_kill_test_peut_tuer mélange les étiquettes et exige que le gain s'effondre sous ce seuil. Les valeurs numériques précises citées par le README (gain mesuré 22,7 pts ; −16 pts signal détruit) ne sont pas ré-exécutées dans cette revue (lecture seule) : déclaré, pas re-prouvé ici. Portée : monde synthétique (graine fixe GRAINE_ALEA=20260801), pas des historiques réels.
Ce qui est absent, en toutes lettres
Aucune API HTTP — seule une démonstration en ligne de commande existe
Aucun déploiement, aucune exposition publique
La relance dictée (étage LLM) est absente et assumée comme telle
Le signal TinyML n'a été mesuré que sur un monde synthétique, jamais sur des historiques réels de clients
Le bus d'événements prévu par la doctrine « Graine » n'est pas construit : rien ne publie ni ne consomme
Le parseur Factur-X vendoré est marqué « HISTORIQUE/GELÉ » depuis le 2026-09-11 (ADR-AF-004) ; un correctif fonctionnel a néanmoins suivi le même jour sur core/montant.py (rejet Infinity/NaN). Depuis (22/09 → 29/09), seuls des commits garde-fous/CI : pas d'évolution produit.
Dépend de
aiame-doctrinevendoré-checksumgarde-fous/CANONICAL.sha256 (garde_fous.sh, test_garde_fous.sh) — vérifié par git log sur le fichier : resynchronisé pour la dernière fois le 2026-09-22 (commit 293bc42, GF-5 .css/.html)
—Aucune URL — prototype en ligne de commande, jamais déployé ; absent des sondes HTTP du 2026-09-29. Présent dans le portfolio public (portfolio-public.txt) comme entrée POC dédiée (« aiame-pouls certif. e2e absente », cartes C1/C3 décrites), avec un compte de tests resté à 80 alors que le dépôt en compte 90 depuis le 22/09 (commit 17ea4ac) — le portfolio n'a pas été rafraîchi depuis. Cité séparément, en plus, comme référence de lignée par l'entrée aiame-racines du même portfolio.
Modèle de langage
oui — étage LLM (relance dictée) retiré délibérément le 2026-08 (dépendance GPU non louée) ; le pipeline entier, y compris la génération du brouillon de relance, est déterministe (templates remplis depuis les pièces).
Souveraineté
Tourne entièrement en local, sans appel réseau sortant vers un tiers : ingestion CLI de fichiers XML/CSV posés sur disque, aucune dépendance à un fournisseur cloud ou LLM externe.
Doctrine incarnée
UAX-LOI-PREUVE.a
UAX-LOI-PREUVE.b
CONST-7.1
CONST-7.2
CODING-explainability
MANIFESTO-decision-support
Tests
9fichiers · 72fonctionsNon exécuté dans cette revue (règle de la revue : lecture seule). Le README annonce 90/90 tests verts ; 72 fonctions `def test_` comptées par grep (vérifié : tests/test_f2_auc.py 5, test_c3.py 11, test_c1.py 10, test_coherence.py 6, test_montant.py 4, test_provenance.py 9, test_ingestion.py 10, test_coreless.py 7, test_relance_template.py 10 = 72). L'écart s'explique par deux `@pytest.mark.parametrize` : test_coreless.py sur les 7 fichiers réels de core/ (2 fonctions paramétrées × 7 cas = +12) et test_montant.py sur 7 valeurs IEEE-754 (« Infinity », « inf », « -Infinity », « -inf », « nan », « -nan », « snan » — 1 fonction × 7 cas = +6), soit 72 + 12 + 6 = 90 — vérifié en lisant les deux fichiers, cohérent avec le compte annoncé. Le portfolio public (portfolio-public.txt), lui, cite encore 80 : périmé depuis le 22/09. Le hook .githooks/pre-push du dépôt (lu directement) compare lui-même à chaque push le compte réel mesuré au compte annoncé par le README et échoue en cas d'écart (ajouté après deux dérives passées, 65→80 puis 80→90).
Dates
2026-08-01 · 2026-09-11 — le dépôt marque lui-même, dans le code, le parseur Factur-X qu'il vendore comme « HISTORIQUE/GELÉ » : le foyer canonique de ce parsing est officiellement passé à aiame-fin (ADR-AF-004). Nuance trouvée en vérifiant par git blame/log : ce n'est pas « sans changement depuis » au sens strict — le même jour, ~7 h plus tard, un correctif fonctionnel réel (commit b90cbd1) a corrigé core/montant.py pour rejeter Infinity/NaN au lieu de planter, trouvé en revue adversariale côté aiame-sov — sur un fichier qui porte pourtant le même en-tête « HISTORIQUE/GELÉ ». Depuis, seuls des commits garde-fous/CI (22/09, 23/09, 29/09) : aucune évolution produit.
Un agent qui surveille des prix commerciaux publics d'un fournisseur, domaine par domaine, et publie les changements via une API ouverte, embarquable.
AIAME Price est un programme automatisé qui va lire, à intervalles réguliers, les prix qu'un fournisseur affiche publiquement, et qui garde la trace de chaque changement. Sa première cible — un grand fournisseur de matériel BTP — s'est révélée impossible à suivre honnêtement : ses prix ne sont visibles qu'aux professionnels déjà connectés, donc le projet a préféré retirer officiellement cette piste plutôt que de prétendre qu'elle fonctionne. Aujourd'hui, c'est un catalogue de démonstration, aux données volontairement inventées, qui prouve que le mécanisme — planification automatique, historique des prix, petit widget réutilisable ailleurs — tient réellement debout. Le tableau de bord ne permet aucune modification : on y consulte seulement ce qui a été observé.
Capacités — prouvé, déclaré, absent
prouvéPlanification automatique des vérifications de prixbackend/vendored/scheduler.py (vendoré depuis aiame-scheduler) câblé dans le lifespan FastAPI (backend/aiame_price/main.py, fonction lifespan) ; backend/tests/test_scheduler_wiring.py prouve que scheduler.running passe à True au démarrage de l'app et redevient False à l'arrêt. Vérifié sur disque, grep direct.
prouvéAPI publique embarquable de prixGET /api/v1/embed/prices/{slug}/{sku}, montée comme sous-application FastAPI isolée avec son propre CORS (backend/aiame_price/main.py, app.mount("/api/v1/embed", embed_app)) ; contrat documenté dans docs/EMBED_API.md ; backend/tests/test_api_embed.py (8 fonctions de test, comptées par grep). Widget correspondant confirmé sur disque : frontend/app/(embed)/embed/.
prouvéTableau de bord en lecture seule (aucune mutation exposée)frontend/app/(dashboard)/ — Server Components Next.js ; grep direct sur ce dossier ne retourne aucune directive 'use client' ni appel de mutation (POST/fetch method).
prouvéJournalisation structurée des changements de prix (stub, aucun canal externe)aiame_price/pipeline/notifications.py:notify_price_changed, appelé depuis le pipeline ; backend/tests/test_pipeline.py vérifie via caplog que le journal est écrit ("Price changed: test-source/A1"). Le fichier documente lui-même l'absence d'email/Slack/webhook câblé.
prouvéVérification de jeton d'accès sur le déclenchement manuel de scrapebackend/aiame_price/api/auth_guard.py utilise vendored/verify_access_token.py (vérification locale par clé publique, aucun appel réseau vers aiame-auth) ; backend/tests/test_api_scrape.py::test_scrape_requires_auth_when_enabled prouve un 401 quand AUTH_REQUIRED=True (monkeypatch confirmé sur disque). Désactivé par défaut (AUTH_REQUIRED=false).
déclaréTraçabilité de l'historique HTML brut (stockage d'objets)aiame_price/pipeline/blob_storage.py vendore garage_client.py (aiame-store) ; désactivé par défaut (BLOB_STORAGE_ENABLED=false), aucune instance Garage disponible dans cet environnement — tests/test_blob_storage.py confirmé sur disque, teste bien le chemin activé mais uniquement contre un transport simulé (monkeypatch), jamais contre du vrai matériel.
prouvéGarde-fou frontière collecte-tierce (GF-5)scripts/CANONICAL.sha256 vendore garde_fous.sh + test_garde_fous.sh depuis aiame-doctrine, vérifié par sha256sum -c dans .githooks/pre-push à chaque push (ligne confirmée : run_check "CANONICAL.sha256" sh -c 'sha256sum -c scripts/CANONICAL.sha256') ; resynchronisé le 2026-09-22 (couverture .css/.html étendue, PR#27).
absentSurveillance réelle des prix d'un fournisseur BTP tiersSOURCES.md, section 'Conclusion (2026-09-21)' : verticale RETIRÉE, jugée non viable pour un scraping anonyme. Source.enabled=False (script d'amorçage de la source BTP), jamais programmée par le planificateur ; seule la source de démonstration btp-demo-fasteners (domaine réservé .invalid) est réellement active — confirmé sur disque.
Ce qui est absent, en toutes lettres
Certification e2e : absente (portfolio public daté 2026-09-24).
Verticale commerciale BTP (fournisseur tiers) : absente — retirée le 2026-09-21 ; aucune source tierce réelle n'est scrapée à ce jour, seule une source démo à données fictives est active.
Confirmation que le déploiement public reflète le code actuel : absente — infra/storage-01/README.md documente lui-même un redéploiement nécessaire au 2026-09-21 ('one redeploy behind main'), et rien depuis ne confirme qu'il ait eu lieu, alors que 10 PR ont fusionné après cette note (#24-#33, vérifié par git log).
Canal de notification externe (email, messagerie d'équipe, webhook) : absent — le stub ne fait que journaliser.
Preuve d'écriture réelle vers un stockage d'objets : absente — la traçabilité HTML n'est testée que contre un transport simulé, aucune instance de stockage disponible dans cet environnement.
Tests automatisés du frontend : absents — aucun fichier .test./.spec. trouvé dans frontend/ (recherche confirmée sur disque).
Rapprochement de SKU entre plusieurs sources : explicitement différé, non construit (une seule source vivante à ce jour).
Dépend de
aiame-doctrinecopie-doctrinescripts/CANONICAL.sha256 vendore garde_fous.sh + test_garde_fous.sh depuis aiame-doctrine/garde-fous (GF-5), dès le premier commit (2026-08-24), resynchronisé le 2026-09-22 (PR#27). SOURCES.md porte aussi, depuis le 2026-09-29, un extrait local du registre de contrainte d'aiame-doctrine (usage interne, jamais publié).
aiame-schedulervendoré-checksumbackend/vendored/scheduler.py + CANONICAL.sha256, câblé dans le lifespan FastAPI ; backend/tests/test_scheduler_wiring.py prouve scheduler.running=True. Vérifié sur disque.
aiame-authvendoré-checksumbackend/vendored/verify_access_token.py + settings_mixin.py, utilisé par api/auth_guard.py ; vérification locale par clé publique, aucun appel réseau au service ; vendoré le 2026-09-11 en remplacement d'un jwt.decode écrit à la main (commentaire du fichier, vérifié).
aiame-storevendoré-checksumbackend/vendored/garage_client.py, utilisé par aiame_price/pipeline/blob_storage.py ; désactivé par défaut (BLOB_STORAGE_ENABLED=false). Vérifié sur disque.
https://price.dev.aiame.fr/api/v1/healthSonde GET du 2026-09-29 (probes-2026-09-29.txt) → 200 {"status":"ok"}. Hôte de préproduction (convention *.dev.aiame.fr de l'org, distincte de *.services.aiame.fr = prod) ; seul ce point de terminaison de santé a été sondé, pas le tableau de bord. infra/storage-01/README.md date son propre statut du 2026-09-21 ("LIVE, one redeploy behind main") et rien dans le dépôt ne confirme que ce redéploiement ait eu lieu depuis — mais le compte exact est 10 PR fusionnées après cette note (#24 à #33, vérifié par git log --format='%h %ad %s'), pas 4 comme une version antérieure de cette fiche l'affirmait.
Modèle de langage
oui — aucune dépendance LLM ni service d'embedding trouvée dans backend/pyproject.toml ou dans le code (recherche négative confirmée sur disque : openai/anthropic/claude/gpt-/llm/embedding, zéro occurrence) ; pipeline entièrement déterministe (règles + BeautifulSoup).
Souveraineté
Déploiement prévu sur un serveur AIAME du réseau privé de l'organisation, pas un cloud tiers. La seule sortie réseau du produit est la lecture de pages publiques d'un fournisseur tiers (HTTP GET, aucune API commerciale payante), aujourd'hui inactive puisque la seule verticale prévue a été retirée. L'API publique ne renvoie jamais de donnée de tenant ou négociée.
12fichiers · 63fonctionsnon vérifié — portfolio-public.txt (2026-09-24) ne donne pas de décompte chiffré pour aiame-price, seulement « certif. e2e absente » et le statut de préproduction du host de dev ; décompte ci-dessus obtenu par grep direct sur backend/tests/ et backend/vendored/ (recompté indépendamment, identique : 12 fichiers test_*.py, 63 fonctions def test_), non exécuté.
Dates
2026-08-24 · 2026-09-21 — verticale BTP (fournisseur tiers) déclarée officiellement retirée et non viable (SOURCES.md), remplacée par une source de démonstration explicitement fictive (btp-demo-fasteners).
SVCMGR est la console interne d'AIAME qui active services et licences, avec un statut mesuré en direct, jamais déclaré.
SVCMGR est le tableau de bord interne à l'équipe AIAME, pas un produit destiné aux clients : il sert à activer ou couper chaque service et à définir qui a accès à quel palier (Gratuit / Pro / Entreprise). Il ne gère plus lui-même les mots de passe : l'identité passe entièrement par le service d'authentification transversal d'AIAME (aiame-auth), sans qu'un seul mot de passe ne soit stocké ici. Sa sonde de santé refuse d'inventer un état : un service injoignable reste marqué « inconnu », jamais faussement « en marche » ou « arrêté ». Une mesure de trafic autrefois fabriquée (des chiffres aléatoires écrits en base à chaque cycle) a été retirée après un audit interne de l'organisation qui a trouvé la dérive.
Capacités — prouvé, déclaré, absent
prouvéAuthentification déléguée, zéro mot de passe localbackend/aiame_services/core/security.py (vérification de jeton Ed25519 vendorée depuis aiame-auth, aucun hash de mot de passe dans models/user.py) ; sondé en direct 2026-09-29 : https://auth.services.aiame.fr/v1/auth/public-key répond 200 ; frontend/src/lib/authConfig.ts (jeton en cookie httpOnly, jamais localStorage) ; 10 tests dans backend/tests/test_auth.py — compte revérifié par grep -c 'def test_' : exact
prouvéSonde de santé à verdicts honnêtes (jamais « arrêté » par défaut)backend/aiame_services/services/health_probe.py (probe_one/apply_probe) + backend/tests/test_health_probe.py, 9 tests contre de vrais sockets (pas des mocks) : un hôte injoignable rend `unknown`, jamais `stopped` — commit a0bd623 (2026-09-22), code relu intégralement, correspond au commentaire du fichier
prouvéFin de la fabrication de métriques (metrics_available: false)commit 517225b (2026-09-06) : `random.randint` écrivait autrefois request_count/uptime_seconds en base à chaque tick de 5s ; supprimé après un balayage org-wide de claims périmés (2026-08-23) ; backend/aiame_services/api/v1/ws.py:36 renvoie désormais `metrics_available: false` — code lu en entier, correspond au message de commit
prouvéZéro appel externe (polices vendorées)commit eef66af (2026-09-21) « vendorise Syne et JetBrains Mono, zéro appel à Google » — trouvé par le garde-fou GF-5 étendu aux .css/.html (aiame-doctrine#52), lui-même créé après avoir trouvé ce @import Google Fonts servi en production
prouvéGate locale avant push (garde-fous vendorés + tests + build).githooks/pre-push (lu en entier) exécute sha256sum -c scripts/CANONICAL.sha256, garde_fous.sh, 32 fonctions pytest (backend/tests/, grep -rc 'def test_' recompté à 32), et le build frontend — mais ne s'active que si `git config core.hooksPath` est réglé sur la machine (inactif sur un clone/worktree neuf, le hook le dit lui-même). Note : le hook contient lui-même un commentaire périmé (« 16 def test_ réels ») jamais mis à jour depuis que le compte est passé à 32 — dérive interne au hook, sans effet sur ce qu'il exécute
absentSuite e2e navigateuraucun fichier *.test.*/*.spec.*/playwright dans frontend/ (find, hors node_modules, recherché aussi par sous-dossier) ; portfolio public 2026-09-24 : « aiame-services certif. e2e absente » — toujours vrai le 29/09
Ce qui est absent, en toutes lettres
Aucune suite e2e navigateur (frontend/, ni playwright ni équivalent trouvé) — portfolio public 2026-09-24 le disait déjà, toujours vrai le 29/09
Aucun test frontend d'aucune sorte (0 fichier *.test.*/*.spec.* hors node_modules)
CI GitHub Actions supprimée (commit 63c94ec, 2026-09-22) : les 32 fonctions de test backend ne sont rejouées qu'en local, jamais à distance, et seulement si le hook pre-push est activé sur la machine qui pousse
Le propre runbook du dépôt (docs/RUNBOOK-auth-migration.md, dernière mise à jour 2026-09-10) qualifie lui-même de « genuinely unknown from outside the host » le fait que la migration des comptes existants ait bien tourné avant la bascule en production ; aucun commit postérieur dans ce dépôt ne referme cette question — non vérifié depuis cette lecture (29/09)
Le passage à PostgreSQL, cité comme « prêt » dans une version antérieure de cette fiche, n'est en réalité qu'une case non cochée d'une checklist de production dans ARCHITECTURE.md — `asyncpg` n'est même pas encore listé en dépendance ; SQLite reste la seule base réellement branchée
Dépend de
aiame-authappel-servicefrontend/src/lib/authConfig.ts:12 — NEXT_PUBLIC_AUTH_URL ; login BFF échange les identifiants contre un jeton, puis GET /api/v1/auth/me côté backend ; confirmé aussi par graph.json (edge outbound_call aiame-services→aiame-auth, même fichier:ligne)
aiame-authvendoré-checksumbackend/aiame_services/vendored/verifier/CANONICAL.sha256 (lu en entier) — vérificateur de jeton Ed25519 re-vendoré depuis aiame-auth/verifier/ le 2026-09-11, consolidant six copies indépendantes qui avaient dérivé dans l'org
aiame-doctrinecopie-doctrinescripts/CANONICAL.sha256 (lu en entier) — garde_fous.sh et test_garde_fous.sh vendorés depuis aiame-doctrine/garde-fous/, resynchronisés le 2026-09-22 (GF-5 .css/.html) ; confirmé aussi présent dans vendoring.txt
https://svcmgr.services.aiame.fr/sondé en direct le 2026-09-29 (GET, probes-2026-09-29.txt) : HTTP 307 sur /, cohérent avec frontend/src/app/page.tsx qui redirige systématiquement vers /dashboard, lui-même protégé par l'authentification aiame-auth — ce n'est pas un service ouvert au public, c'est une console d'administration interne accessible en HTTPS, pas un espace citoyen.
Modèle de langage
oui — aucune dépendance à un modèle de langage dans backend/pyproject.toml ni frontend/package.json ; console CRUD + WebSocket pure, aucun appel LLM lu dans le code.
Souveraineté
Auto-hébergé sur l'infrastructure propre d'AIAME (la famille *.services.aiame.fr, dont svcmgr, est couverte par la vérification en direct d'un certificat Let's Encrypt actif citée par le portfolio public) ; plus aucune dépendance à un tiers pour sa fonction depuis le retrait de l'appel à Google Fonts (21/09) — seule dépendance restante : le service d'identité aiame-auth, lui aussi interne à l'organisation.
Doctrine incarnée
CONST-7.1
CONST-7.2
Tests
6fichiers · 32fonctionsportfolio public 2026-09-24 : « 16 tests backend réels (montés de 12) » — mesure locale du 29/09 (grep -rc "def test_" backend/tests/*.py) : 32 fonctions sur 6 fichiers réels (test_auth:10, test_health_probe:9, test_utcnow:3, test_ws_services:4, test_health:2, test_migration:4 = 32, recompté ligne par ligne), doublé depuis la dernière mesure publique, toujours jamais rejoué par CI
Dates
2026-08-01 · 2026-08-21 — ADR-AA-001 : bascule complète de l'authentification propre vers la vérification locale de jetons aiame-auth (Ed25519), suppression du mot de passe local ; déployée fin août, confirmée en production le 2026-09-09 après résolution d'un incident réseau qui bloquait toute connexion (relogin testé en direct, 401 correct sur identifiants invalides). Date de création et jalon revérifiés contre `git log --reverse` et docs/RUNBOOK-auth-migration.md : exacts.
Pile
Python 3.12, FastAPI, SQLModel, SQLite (seule base branchée en pratique — le passage à PostgreSQL n'est qu'une case non cochée de la checklist de production dans ARCHITECTURE.md, `asyncpg` n'étant même pas encore une dépendance déclarée), Next.js 16 (App Router), TypeScript, React 19, Tailwind CSS 4, WebSocket, PyJWT[crypto] + Ed25519 (vérification seule)
aiame-sov · plateforme · déployé
Aiame Sov
France Sov (Aiame Sov) : plateforme souveraine d'augmentation d'ERP pour dirigeants de TPE/PME, démontrable en ligne, IA optionnelle et tracée.
France Sov présente au dirigeant d'une petite ou moyenne entreprise française des calculs vérifiables sur trois questions (embaucher, investir, augmenter les prix), une lecture de ses factures reçues et relevés bancaires, et des données sur son écosystème économique régional ; la décision reste la sienne. Une démonstration en lecture seule, sur une entreprise fictive, répond en ligne (le service de production est volontairement en pause) ; l'intelligence artificielle n'intervient que pour des tâches optionnelles (une explication en langage courant, une réponse à une question avec ses sources), jamais pour les calculs qui comptent, qui restent des formules vérifiables. Ce qui n'est pas encore prêt est écrit en clair plutôt que caché : une installation ne sert qu'une seule entreprise (pas de partage entre entreprises dans une même instance), un choix assumé et documenté, pas un oubli. Rien n'est vendu : le service est proposé en bac à sable uniquement, sans aucun revenu réel à ce jour.
Capacités — prouvé, déclaré, absent
prouvéRegistre de provenance (Provenance/critique, vendoré depuis aiame-rag-core)backend/aiame_sov/vendored/aiame_rag_core/CANONICAL.sha256 (source aiame-rag-core, commit 74cf9a4, 2026-09-16) ; module importé dans backend/aiame_sov/services/{rag_service,eip_service,learning_service}.py — vérifié par grep des imports (rag_service.py:51-64, eip_service.py:30, learning_service.py:31)
prouvéMoteur Décisions — 3 questions dirigeant (embaucher/investir/augmenter les prix)backend/aiame_sov/services/decision_adapters.py (adapt_hiring/adapt_equipment_investment/adapt_pricing_change — les 3 formulaires) + backend/aiame_sov/services/eip_service.py (compute_scenario_impacts:210/compare_scenarios:254/explain_scenario:422, méthodes réelles vérifiées par grep) ; frontend/src/components/NouvelleDecisionWizard.tsx. Correction : la fiche initiale attribuait les 3 fonctions de calcul à decision_adapters.py, qui ne contient que les adaptateurs d'entrée.
prouvéImports Factur-X (réception CII) + relevés bancaires CSVbackend/aiame_sov/services/imports/facturx.py ré-exporte le noyau vendoré aiame-fin/invoicing_core (CANONICAL.sha256, ADR-AF-004) ; réception uniquement pour CE module, XML CII structuré. La mention « aucune émission (ADR-SOV-001) » de la fiche initiale est fausse pour le dépôt dans son ensemble : voir la capacité Émission ci-dessous — ADR-SOV-001 documente en réalité l'absence de connecteur ERP à credential permanent (module Integration), pas l'absence de facturation sortante (module Facturation, distinct).
prouvéÉmission de facture (Facturation) — scope limité au régime franchise en base TVAbackend/aiame_sov/services/emission_service.py construit un CII réel via le noyau vendoré checksum-pinné (aiame_sov/vendored/invoicing_core/emission.py:build_cii_xml, présent dans CANONICAL.sha256) ; câblé dans backend/aiame_sov/api/v1/facturation.py, routeur inclus dans backend/aiame_sov/main.py:106 (donc live sur sov.services.aiame.fr, pas du code mort) ; backend/tests/test_facturation.py, 10 fonctions de test comptées. Scope réel et assumé : seul VatRegime.franchise_293b est calculé, tout autre régime lève UnsupportedVatRegime (422) explicitement — pas un rejet silencieux, mais une couverture étroite. Absente de la fiche initiale, qui affirmait l'inverse.
prouvéContrôle d'accès Territoire (require_role sur les routes de mutation/export)backend/aiame_sov/api/v1/regional.py:57 (require_role(Role.admin, Role.manager)) appliqué à 6 routes (lignes 78,96,138,153,171,182) ; backend/tests/test_regional.py, 15 fonctions de test comptées (recompté par grep, exact)
absentCloisonnement multi-tenant de Territoireaucune trace de scoping tenant dans backend/aiame_sov/api/v1/regional.py à la lecture (grep « tenant » : 0 résultat) ; README du dépôt (2026-09-09) : « tenant-scoping reste réellement ABSENT — architecture single-tenant-par-instance assumée (Phase C 2028) »
prouvéAssistance (UAX) — auto-instrumentation opt-in, export, purgebackend/aiame_sov/api/v1/uax.py, backend/aiame_sov/services/module_flags_service.py:112-114 (ModuleName.uax désactivé par défaut, raison citée : « désactivé en attendant la clôture de docs/AIPD-UAX.md ») ; docs/AIPD-UAX.md:3 toujours marqué BROUILLON, non adopté, lu le 2026-09-29
prouvéRepli honnête sans LLM (NullProvider, jamais d'exception)backend/aiame_sov/services/llm_provider.py:208 (class NullProvider, docstring : « Never raises, never calls out ») derrière get_llm_provider():220 ; frontend/src/lib/apiClient.ts, withFallbackTagged (ligne 188)
prouvéTests unitaires frontend (vitest)6 fichiers, 14 fonctions it()/test() comptées le 2026-09-29 (ex. AssistantDemarrage.test.ts) — contredit le README du dépôt (2026-09-09 : « frontend : 0 test unitaire ») ; grep confirme qu'aucun hook (.githooks/pre-push) ni script n'appelle jamais `npm run test:unit`/vitest
Ce qui est absent, en toutes lettres
Cloisonnement multi-tenant de Territoire : ABSENT, assumé mono-tenant par instance jusqu'en 2028 — décision d'architecture documentée, pas un oubli silencieux (README 2026-09-09).
Émission de facture électronique : RÉELLE mais à scope étroit — seul le régime franchise en base TVA (art. 293 B CGI) est calculé (emission_service.py, câblé, 10 tests) ; tout autre régime est refusé explicitement (UnsupportedVatRegime, 422), pas encore couvert. La fiche initiale affirmait à tort une absence totale.
AIPD-UAX : toujours au stade BROUILLON, non adoptée par le responsable de traitement (docs/AIPD-UAX.md, lu le 2026-09-29) — l'activation à l'échelle de l'instance de l'auto-instrumentation reste bloquée.
CI GitHub : ABSENTE de fait (Actions désactivé, règle 11) — la seule passerelle de test réelle est le hook .githooks/pre-push, exécuté localement à chaque push (et qui exécute bien l'e2e Playwright, à la différence de vitest).
Exécution automatisée des tests unitaires frontend (vitest) : ABSENTE malgré 6 fichiers / 14 tests réels dans l'arbre — ni le hook pre-push ni aucune CI ne les invoque jamais.
aiame-authvendoré-checksumbackend/aiame_sov/vendored/aiame_auth_verifier/CANONICAL.sha256 (source aiame-fr/aiame-auth, verifier/, commit 4ffa5aa9, 2026-09-11) ; importé dans backend/aiame_sov/core/security.py:29-30, consommé par backend/aiame_sov/api/deps.py:11,29 — lien manqué par la fiche initiale, qui ne listait aiame-auth qu'en appel-service
aiame-finvendoré-checksumbackend/aiame_sov/vendored/invoicing_core/CANONICAL.sha256 (reception.py/montant.py/model.py/emission.py, ADR-AF-004) ; les 4 fichiers sont checksum-pinnés, y compris emission.py, réellement importé par emission_service.py
aiame-doctrinecopie-doctrinefrontend/public/{mentions-legales,cgu,cgv,confidentialite}.html:1 « GÉNÉRÉ par aiame-doctrine/legal/build_legal_sov.py » (vérifié tel quel) ; scripts/CANONICAL.sha256 vendore garde_fous.sh/test_garde_fous.sh depuis aiame-doctrine (source datée, resynchronisée 2026-09-26)
https://sov.dev.aiame.frdémonstration en lecture seule (entreprise fictive, compte de démonstration), sondée le 2026-10-01 : GET / 200, GET /api/v1/health 200. La surface de production sov.services.aiame.fr est volontairement en pause depuis le 2026-09-30 (503) : elle n'est plus l'adresse présentée.
Modèle de langage
optionnel — 4 des 6 modules produit (Décisions, Territoire, Gouvernance, Intégration) n'appellent jamais de LLM ; seuls Questions (RAG) et l'explication narrative optionnelle d'EIP passent par Ollama local derrière un NullProvider qui ne lève jamais d'exception (backend/aiame_sov/services/llm_provider.py)
Souveraineté
Hébergé sur l'infrastructure européenne d'AIAME (aiame-infra, Traefik, certificat *.aiame.fr). Traitement local-first : Ollama est optionnel, derrière un repli qui ne lève jamais d'exception ; aucune dépendance à un fournisseur d'IA étranger pour fonctionner.
Doctrine incarnée
CONST-7.1
CONST-7.2
CONST-3.1
CONST-3.2
CONST-2.3
CONST-1.2
Tests
55fichiers · 453fonctionsportfolio public 2026-09-24 : aucun chiffre de test cité pour aiame-sov (seulement le correctif Territoire #73 et la confirmation prod) ; dernière mesure interne datée : README 2026-09-09, 195 tests backend collectés (uv run pytest --collect-only) — recompté en direct ici le 2026-09-29 (grep, non exécuté, vérifié fichier par fichier) : 40 fichiers/402 fonctions backend + 6 fichiers/14 fonctions vitest frontend + 9 fichiers/37 test() e2e Playwright
Dates
2026-07-28 · 2026-09-29 — REGBUG (règle 12, CLAUDE.md racine) fermé le jour même : GF-SOV-1/2/3 (langue, pages légales, claims de souveraineté) étaient mortes depuis 6 jours après la suppression de garde-fous.yml (2026-09-22, 37baddb) qui affirmait à tort qu'un autre hook les couvrait déjà — corrigé en d3816dd (#175), .githooks/pre-push l.49 ; vérifié directement par git show sur les deux commits
Pile
FastAPI, SQLModel, PostgreSQL 16, Next.js (frontend), Ollama (optionnel, local), PyJWT[crypto] — vérification EdDSA des jetons aiame-auth, defusedxml (Factur-X), APScheduler, Alembic, Playwright (e2e, exécuté à chaque push via .githooks/pre-push l.126/145 — pas une CI dormante), Vitest (frontend, jamais invoqué par une passerelle automatisée)
Plateforme de coordination d'intérêt public pour les saisonniers agricoles du Gers : orienter vers un humain, jamais vers un algorithme de mise en relation.
Dans le Gers, les récoltes reposent sur des saisonniers qui peinent à se loger, se déplacer et faire valoir leurs droits, pendant que de petites exploitations sans service RH peinent à recruter. Ce dépôt est le socle numérique d'une « Maison du travail saisonnier agricole » : on consulte offres, logements, transports et permanences sans créer de compte, et chaque action mène à une personne (un formulaire de contact, une permanence), jamais à un classement automatique. Rien de ce qu'un employeur ou un partenaire publie n'est visible avant validation humaine, et chaque décision de modération est journalisée. Hébergé et outillé par AIAME hors de son périmètre produit, il dispose d'une réplique de démonstration consultable en ligne ; la mise en service réelle attend des mentions légales réelles — et le dépôt le dit lui-même.
Capacités — prouvé, déclaré, absent
prouvéModération avant publication, un seul module écrit le statut et le journal d'auditbackend/aiame_agri_gers/services/moderation_service.py:1-11 (docstring « the single place that mutates any ContentStatus ») ; grep `"status": ContentStatus` hors de ce module = 1 seul hit, api/v1/demo.py:349 sur les FAQ, exception documentée dans docs/adr/0002 (ligne 40) ; backend/tests/test_moderation.py (3 tests : « every transition writes an AuditLog row ») ; tous les modèles naissent en `draft` (models/offers.py:25, resources.py:26,53,73, engagement.py:28,56,69) — relu sur disque le 2026-09-29 par le relecteur, identique
prouvéConsultation publique sans compte, toute action mène à un humainbackend/aiame_agri_gers/api/deps.py:58 `get_optional_user` (retourne None ligne 66 au lieu de lever) ; frontend/components/ContactRequestForm.tsx:100-185 (5 champs : nom, e-mail, téléphone, catégorie, message) ; backend/tests/test_engagement.py (3 tests, cycle new → assigned → resolved) ; grep `match|matching|rank|ranking|recommend|score|scoring` sur backend/aiame_agri_gers/*.py = 0 hit (aucun moteur de classement dans le code, pas seulement dans la spec) ; page live gers.dev.aiame.fr (GET 2026-09-29) affiche « Une structure publique d'accompagnement, pas une plateforme de recrutement » et le bouton « Demander de l'aide »
prouvéSix rôles et contrôle de propriété sur chaque modificationbackend/aiame_agri_gers/models/enums.py:11-17 (Role) ; core/rbac.py:31 `require_role` ; core/viewer_scope.py:26,35,43 (owns_employer_profile, can_attribute_to_partner_organization, owns_partner_organization_content) ; api/deps.py:112 `get_authenticated_viewer_scope` ; backend/tests/test_ownership_authorization.py (11 tests, non-régression du trou de contrôle d'accès corrigé par le commit 96e991d du 2026-09-09)
prouvéRefus de démarrer en production avec un secret par défaut ; route de démo absente en productionbackend/aiame_agri_gers/core/config.py:63-75 `_reject_weak_jwt_secret_in_production` (placeholder publié ou < 32 octets → ValueError, docstring citant Constitution art. 7) ; main.py:87-88 (`demo` monté seulement hors production, donc 404 sans chemin de code à auditer) ; backend/tests/test_settings_production_guard.py (4 tests) et test_demo_seed.py (3 tests) ; commit e7e4522 du 2026-09-09
prouvéRéinitialisation de mot de passe sans signal d'énumération, e-mail journalisé sans identifiantsbackend/tests/test_password_reset.py (6 tests : réponse identique compte existant ou non, jeton de réinitialisation distinct du jeton de session) ; core/email.py:16-19 (sans SMTP_USERNAME/SMTP_PASSWORD → `email_skipped_no_smtp_credentials`, jamais un faux « envoyé ») ; envoi par `smtplib` standard (email.py:9,28) ; l'envoi SMTP réel en environnement déployé : non vérifié
prouvéRéplique publique de démonstration « mode gris » : bandeau d'avertissement et hors indexationGET https://gers.dev.aiame.fr/ le 2026-09-29 (rédacteur, 0,58 s ; re-vérifié par le relecteur, 0,67 s) → HTTP 200, `<meta name="robots" content="noindex, nofollow">`, bandeau « Environnement de démonstration — aucune donnée réelle, ne l'utilisez pas pour une vraie démarche » ; GET /api/v1/health → {"status":"ok"} ; frontend/components/DemoModeBanner.tsx:7-10 ; aiame-infra ansible/roles/vitrine/tasks/main.yml:831 (déploiement inconditionnel, PR #75 du 2026-09-13)
déclaréAccessibilité RGAAfrontend/app/accessibilite/page.tsx:19 déclare le site « non conforme » (aucun audit RGAA formel) ; WAVE1_FRONTEND_REPORT.md liste les pratiques appliquées (landmarks, focus visible, labels, <dialog> natif) ; docs/compliance-and-accessibility.md §1 renvoie chaque exigence au frontend sans mesure ; aucun test automatisé d'accessibilité (find frontend -name '*.test.*' → 0)
absentMise en service publique réelle (route de production)probes 2026-09-29 : `502 https://gers.services.aiame.fr/ Bad Gateway` ; aiame-infra ansible/roles/vitrine/defaults/main.yml:70 `vitrine_gers_legal_ok: false` (garde statique tant que les pages légales sont des placeholders) ; frontend/app/mentions-legales/page.tsx:23 « Les coordonnées de l'hébergeur du site seront précisées par le porteur·se de projet »
Ce qui est absent, en toutes lettres
Mise en service publique réelle : ABSENT — gers.services.aiame.fr répond 502 (probes 2026-09-29), garde `vitrine_gers_legal_ok: false` tant que mentions légales et confidentialité restent des placeholders (frontend/app/mentions-legales/page.tsx:23).
Audit RGAA : ABSENT — la page /accessibilite se déclare elle-même « non conforme » (frontend/app/accessibilite/page.tsx:19).
Tests frontend et certification e2e : ABSENT — aucun *.test.*/*.spec.*/playwright dans frontend/ ; badge « certif. e2e absente » sur le portfolio public 2026-09-24.
Notification réelle des chargés d'accompagnement : ABSENT — workers/jobs.py:20 est un stub qui journalise (« no email/SMS provider wired up »).
Consentement (ConsentRecord) : modèle et service existent mais ne sont câblés ni à une UI ni à une version de texte légal (docs/compliance-and-accessibility.md §2 et §4).
Envoi d'e-mail réel : non vérifié — sans identifiants SMTP le message est journalisé (core/email.py:16-19) ; aucune preuve d'un envoi en environnement déployé.
Déploiement Terraform/OpenTofu : le README (lignes 26 et 58) annonce « staging/prod via Terraform/OpenTofu », mais aucune trace d'application du module (infra/main.tf) n'existe ; le déploiement réel est un compose lancé à la main sur le serveur de stockage privé et le rôle Ansible vitrine d'aiame-infra. Chemin décrit, jamais exécuté.
Téléversement de fichiers (CV, photos de logement) : ABSENT par conception v1 (docs/adr/0003), donc aucun stockage objet.
Sauvegarde de la base : le dépôt dit lui-même « aucune sauvegarde automatisée » (infra/storage-01/README.md:39-46, écrit le 2026-09-10/11) — mais côté aiame-infra une sauvegarde quotidienne automatisée de second niveau existe depuis le 2026-09-26 (#126, pg_dump de chaque base de chaque conteneur PostgreSQL découvert en direct) : la doc du dépôt est en retard, dans le sens pessimiste.
Écart avec le portfolio public 2026-09-24 : il annonce « 23 tests » (compte exact au commit 22d1861 du 2026-09-07, confirmé par git grep) alors que l'arbre en comptait 52 dès le 2026-09-23 (commit 38aed2d : « 52 passed » sous sqlmodel 0.0.39 et 0.0.46) ; et « Aucune preuve de déploiement, DNS ne résout nulle part » alors que gers.dev.aiame.fr répond depuis le 2026-09-13 et que la route de prod existe (502 volontaire).
Écart avec le portfolio public 2026-09-24 (carte aiame-scheduler) : « le bug qu'il corrige n'est pas encore rétrofité dans aiame-agri-gers » — obsolète : le scheduler jamais démarré a été supprimé le 2026-09-11 (commit 966d684), il n'y a plus rien à rétrofiter.
Dérive commentaire/code : .githooks/pre-push:20 dit encore « Ne PAS supprimer .github/workflows/garde-fous.yml » alors que #20 l'a supprimé le 2026-09-22 (règle 11 durcie) ; le hook n'est actif que si `git config core.hooksPath .githooks` a été lancé (non versionné, dit par le hook lui-même lignes 8-10).
README dit « open-source digital backbone » (ligne 15) alors que le dépôt GitHub est privé (dates.txt : privé) — ne pas dire open source tant que ce n'est pas vrai.
Dépendance verrouillée en retard : backend/uv.lock local est vestigial depuis l'unification du workspace uv (commit 966d684 le dit), sqlmodel sans borne haute (pyproject.toml:10 `>=0.0.39`).
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 scelle scripts/garde_fous.sh et scripts/test_garde_fous.sh (`sha256sum -c` depuis la racine du dépôt le 2026-09-29 : OK, OK) ; .githooks/pre-push:38 lance `sha256sum -c` puis le harnais puis GF-1/2/3/4 ; aiame-doctrine/garde-fous/verifier-copies.sh:124 liste `aiame-agri-gers:scripts/garde_fous.sh` ; resynchronisé le 2026-09-22 (commit 9a4e90d)
aiame-infraroute-publiqueaiame-infra ansible/roles/vitrine/defaults/main.yml:718-729 (routes Traefik gers-api/gers-web, derrière `vitrine_gers_legal_ok`) et :736-747 (gers-dev-api/gers-dev-web, inconditionnels) ; les gabarits d'environnement du rôle vitrine (gers et gers-dev) (toutes deux pointant la base du serveur de stockage privé) ; base PostgreSQL locataire recensée dans machines/machines.conf:27 (déployée le 2026-09-11) ; harnais de mutation ansible/roles/vitrine/test_gers_compose_gate.sh (PR #71 du 2026-09-12) prouve que le garde sait échouer ; PR #65 (DNS, 2026-09-09), #66 (route, 2026-09-10), #75 (réplique dev, 2026-09-13)
https://gers.dev.aiame.fr/Hôte absent des sondes du jour : un GET du rédacteur puis un GET de contrôle du relecteur le 2026-09-29 (HTTP 200 en 0,58 s puis 0,67 s), titre « Maison du travail saisonnier agricole du Gers », meta robots noindex/nofollow, bandeau « Environnement de démonstration » ; /api/v1/health → {"status":"ok"}. C'est la réplique de revue, pas la production : la route de production https://gers.services.aiame.fr/ répond 502 (probes-2026-09-29.txt) car le drapeau légal côté aiame-infra est à false.
Modèle de langage
oui — aucun modèle de langage ni fournisseur d'IA dans le code d'exécution : grep openai/anthropic/ollama/mistral/langchain/llm/embedding sur backend+frontend = 0 hit en code (seuls package-lock.json et une doc infra matchent) ; garde-fou GF-1 vendoré et vérifié par somme de contrôle ; POC_SPEC.md §9 exclut par conception tout moteur de matching, classement ou recommandation, et le grep du code confirme l'absence
Souveraineté
Aucun modèle d'IA ni fournisseur externe dans le chemin d'exécution (GF-1 vendoré depuis aiame-doctrine, scellé par CANONICAL.sha256 — somme recalculée identique le 2026-09-29 — et contrôlé par le hook pre-push quand celui-ci est activé localement, `core.hooksPath` n'étant pas versionné). Les données personnelles vivent dans une base PostgreSQL sur un serveur AIAME du réseau privé, jamais sur la machine publique — y compris pour la réplique de démonstration, qui a sa propre base sur ce même serveur ; seule la couche applicative est exposée. Le déploiement réel passe par un compose lancé à la main sur ce serveur (2026-09-11) et par le rôle Ansible d'aiame-infra ; le module Terraform agnostique décrit dans le dépôt n'a aucune preuve d'exécution. E-mail par SMTP standard (smtplib) sans SDK tiers ; journaux conçus pour ne porter aucune donnée personnelle (règle d'architecture §6.3, non auditée). Conçue pour se redéployer pour un autre territoire sans fork (ADR-0004 : pas de multi-tenant, tout est donnée) — jamais éprouvé à ce jour.
Doctrine incarnée
GF-1
GF-2
CONST-7.1
B2H-A6.3
UAX-LOI-INITIATIVE-BORNEE
CONST-2.1
Tests
13fichiers · 52fonctionsportfolio public 2026-09-24 : « Suite pytest (23 tests) et build frontend fonctionnent réellement en local — rejoué cette session » ; chiffre exact au 2026-09-07 (22d1861), dépassé depuis : 47 au 2026-09-10 (fa3bc12), 49 au 2026-09-13 (e7f99c7), 52 au 2026-09-23 (commit 38aed2d : « sqlmodel 0.0.46 : 52 passed / 0.0.39 : 52 passed »). Non exécutés dans cette revue ; compte par grep `def test_` le 2026-09-29 (13 fichiers backend/tests/test_*.py, 52 fonctions), et les quatre chiffres historiques recomptés par `git grep` à chaque commit cité : 23 / 47 / 49 / 52, identiques.
Dates
2026-08-03 (dépôt GitHub aiame-fr, dates.txt ; premier commit 2026-07-23 dans l'org précédente, déplacé le 2026-08-03) · 2026-09-13 — réplique publique « mode gris » gers.dev.aiame.fr mise en ligne (aiame-infra #75 + commit e7f99c7 : bandeau démo + noindex), vérifiée HTTP 200 le 2026-09-29 ; précédée le 2026-09-09 par deux correctifs de sécurité (contrôle d'accès manquant sur les mutations, seed de démo fermé en production)
Pile
Python 3.12, FastAPI, SQLModel, PostgreSQL 16, Alembic, PyJWT (HS256), passlib/bcrypt, slowapi (limitation de débit), Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS 4, TanStack Query, zod + react-hook-form, Docker Compose, Terraform/OpenTofu (provider kreuzwerker/docker, agnostique — module décrit dans le dépôt, aucune preuve d'exécution ; le déploiement réel passe par aiame-infra), pytest (SQLite en mémoire), ruff, mypy, eslint
aiame-angel · soins infirmiers · déployé
Aiame Angel
Assistant de tournée et de planning pour infirmières à domicile : ordre de visites déterministe, un mode hors-ligne, et ses propres limites affichées à l'écran.
Aiame Angel s'adresse à une infirmière libérale ou à un petit cabinet de soins à domicile. Il ordonne la tournée du jour (qui voir, dans quel ordre, à quelle heure estimée) et prépare le planning d'équipe, en disant chaque fois ce qu'il ne sait pas : distances « à vol d'oiseau », pas d'itinéraire routier, aucune preuve d'optimalité pour la tournée. Un mode hors-ligne est câblé : une visite marquée « faite » en zone blanche est mise en file et n'est affichée comme confirmée qu'après la réponse du serveur (tests navigateur écrits, non rejoués dans cette revue). Rien n'est proposé à la vente : les données restent synthétiques tant que la question de l'hébergement des données de santé n'est pas tranchée.
Capacités — prouvé, déclaré, absent
prouvéTournée du jour (une infirmière, un jour, fenêtres horaires) avec champs d'honnêteté sur chaque réponsebackend/aiame_angel/schemas/routing.py:172-176 (method, deterministic, distance_model="haversine_estimate") ; infrastructure/solver/routing_bridge.py:139-143 propage method/deterministic/solution_budget ; api/v1/routes.py:43-46 : GET /current câblé sans aucun solveur ; tests/test_routing_api.py (16 fonctions), test_routing_persistence.py:204 assert deterministic (aller-retour de persistance, pas le solveur). La preuve de déterminisme du solveur lui-même (test_routing_solver.py) vit dans aiame-optaplanner/backend/tests/routing/, pas ici — TODO.md:46 et backend/README.md:178 citent un chemin local périmé. Relu ligne à ligne le 2026-09-29.
prouvéPlanning d'équipe CP-SAT : brouillon → revue du diff → publication irréversible, convergence OPTIMAL/FEASIBLE + écart affichéinfrastructure/solver/rostering_bridge.py:118-119 (convergence, gap) ; domain/scheduling/schedule_diff.py ; domain/scheduling/ports.py:123-125 (« publishing is a one-way, one-time transition », ScheduleAlreadyPublishedError) ; api/v1/schedules.py:115 POST /{schedule_id}/publish ; tests/test_schedule_review.py (11), test_constraints.py (8, dont congé approuvé = contrainte dure), test_feasible.py (2) ; frontend SolveStatusBadge.tsx:12-28 (« OPTIMAL — preuve mathématique » vs FEASIBLE)
prouvéMode hors-ligne : PWA, file d'écritures idempotente, caches de lecture horodatés « dernière tournée connue à HH:MM »frontend/public/sw.js + manifest.webmanifest ; src/lib/offlineQueue{Engine,Manager,Storage}.ts (statuts pending/syncing/synced/failed), shiftCache.ts, routeCache.ts (112 it() Vitest dans 11 fichiers, comptés non exécutés) ; messages/fr.json:54 « Hors ligne — dernière tournée connue à {time}. » ; e2e/write-queue.spec.ts, shift-cache.spec.ts, ma-tournee.spec.ts utilisent context.setOffline(true) (15 test() Playwright, écrits, non exécutés ici ; portfolio public : « certif. e2e absente ») ; côté serveur idempotency_key obligatoire (schemas/requests.py:24,41) et PATCH /visits/{id} rejouable (tests/test_routing_persistence.py:162 set_status DONE deux fois = un seul completed_at)
prouvéVerrou d'authentification aiame-auth actif en production (mesuré), vérification locale du jetonGET https://angel.services.aiame.fr/api/v1/nurses → 401 {"error_code":"MISSING_TOKEN"}, mesuré par l'auteur puis re-mesuré par le sceptique le 2026-09-29 (un GET chacun) ; infra/storage-01/docker-compose.yml AUTH_REQUIRED="true", clé publique montée en lecture seule ; api/auth_guard.py ; copie vendorée backend/aiame_angel/vendored/verifier/ — sha256sum -c OK et les trois fichiers byte-identiques au canonique aiame-auth/verifier/ le 2026-09-29 (l'en-tête CANONICAL.sha256 consigne que l'ancienne copie maison d'Angel n'exigeait pas le claim exp, corrigé le 2026-09-11)
prouvéCadre réglementaire affiché à l'écran : ce que l'écran applique ET ce que le POC ne fait pasfrontend/src/components/RegulatoryFrame.tsx:5-6 (APPLIES_KEYS prescription/traceability/secrecy/gdpr ; ABSENT_KEYS ngap/scor/ins/hds/routing) rendu lignes 29-41 ; messages/fr.json:117-132 namespace regulatory
prouvéMigrations de schéma Alembic avec test zéro-dérive modèles↔migrationsbackend/alembic/versions/ (3 révisions : 197f557756b8, 7789a02be67c, ace67df96609) ; tests/test_migrations.py:25-35 (1 fonction, compare_metadata) ; init_db() lance command.upgrade(config, "head") (infrastructure/db/init_db.py:32) depuis le lifespan FastAPI (main.py:26-27)
déclaréGarde-fous doctrinaux GF-1..5 et copies vendorées vérifiées à chaque push, sans CI GitHub.githooks/pre-push (sha256sum -c, test_garde_fous.sh, garde_fous.sh, pytest, ruff, tsc, eslint, vitest, e2e sandbox ; trois verdicts VERT/ABSTENTION/ÉCHEC) ; scripts/CANONICAL.sha256 OK et byte-identique à aiame-doctrine/garde-fous/ le 2026-09-29 ; aucun .github/. Déclaré, pas prouvé : l'activation dépend de `git config core.hooksPath` par clone (CONTRIBUTING.md:10-17) et TODO.md:161-166 nomme qu'un hook où TOUT abstient sort quand même en vert — confirmé en lisant le hook (seuls les ÉCHEC posent fail=1 ; ligne 28 « ✅ pré-push au vert », exit 0).
absentContrôle de propriété des visites (une infirmière ne modifie que ses visites)backend/aiame_angel/core/config.py:60 visit_ownership_enforced: bool = False — le garde existe et est testé (tests/test_visit_ownership.py, 16 fonctions) mais n'est pas appliqué en direct : aucun lien compte aiame-auth ↔ infirmière n'existe encore ; tout compte authentifié peut PATCH n'importe quelle visite.
Ce qui est absent, en toutes lettres
Itinéraire routier réel : ABSENT — distance à vol d'oiseau sans coefficient de détour (domain/routing/distance.py:7 « haversine UNDERSTATES real rural road distance ») ; seule hypothèse nommée RURAL_AVERAGE_SPEED_KMH = 60, « a named assumption, not a measurement » (distance.py:11,25)
Application en direct du contrôle de propriété des visites : ABSENT — visit_ownership_enforced = False (core/config.py:60), aucun lien compte↔infirmière ; le garde est écrit et testé (16 fonctions) mais tout compte authentifié peut modifier toute visite
Cotation NGAP, télétransmission SCOR/Ameli, Identité Nationale de Santé, hébergement certifié HDS : ABSENTS — affichés comme tels à l'écran (RegulatoryFrame, fr.json:128-131 regulatory.absent)
Hébergement certifié pour données de santé : non tranché — aiame-doctrine/legal/legal-angel.json donnees_sante_hebergement_conforme = TODO ; conséquence écrite : aucune donnée réelle de patient, même en démonstration
CGV et politique de confidentialité : ABSENTES du site depuis PR #13 (2026-09-24, TODO non résolus ; STATUT.md:18-19 BROUILLON) — mais Footer.tsx:14,18 lie encore /cgv.html et /confidentialite.html : 404 mesuré le 2026-09-29
Écart doc/code : backend/README.md:268 « Dockerfile : ABSENT (décision) » alors que backend/Dockerfile existe et est exactement ce que infra/storage-01/docker-compose.yml:34 construit
Écart doc/code : main.py:27 commente « dev-mode bootstrap: create tables » alors qu'init_db() applique alembic upgrade head (init_db.py:32)
Écart inventaire : repos.json (« cutover du déploiement en attente — infra/storage-01 décrit encore l'état pré-scission »), README.md racine:22 (« bascule à venir ») et la carte publique du portfolio (datée 09-08) disent tous trois que la bascule est à venir ; infra/storage-01/README.md:280 consigne la bascule réelle du 2026-09-16/17 (PR #9)
Preuve de déterminisme citée au mauvais endroit : TODO.md:46 et backend/README.md:178 renvoient à tests/test_routing_solver.py, jamais présent dans l'historique de ce dépôt (vit dans aiame-optaplanner/backend/tests/routing/)
Comptes de tests internes en dérive, annoncée mais non suivie : backend/README.md:202 « 104 tests at the time of writing (the number will drift) », TODO.md:63 « 104 collected », frontend/README.md:117 « 105 tests at the time of writing » — 125 def test_ + 10 vendorés et 112 it()/test() Vitest aujourd'hui (grep, non exécutés)
Hook pre-push : un push où TOUS les contrôles abstiennent sort en vert (TODO.md:161-166, « named, not fixed ») — confirmé en lisant .githooks/pre-push (seuls les ÉCHEC posent fail=1)
File asynchrone de résolution : ABSENT — chaque résolution tourne dans la requête HTTP (TODO.md:131, backend/README.md)
Modification/suppression d'une infirmière enregistrée : ABSENT (api/v1/nurses.py : POST et GET seulement) ; types de vacation en base : ABSENT (catalogue en code, TODO.md:637, backend/README.md:276)
Environnement de préproduction séparé : ABSENT — angel.dev.aiame.fr est un alias qui réutilise le même backend que la production (aiame-infra defaults/main.yml:681-702, service_ref: angel-api)
Allow-list CORS configurable : ABSENT — trois origines codées en dur (core/config.py:18-22), sans effet en same-origin derrière Traefik
Rafraîchissement automatique de « Vos demandes » après synchronisation hors-ligne : ABSENT (TODO.md:373)
Aucun compte de tests publié dans le portfolio public pour ce dépôt ; tests non exécutés dans cette revue (« certif. e2e absente » dans le portfolio du 2026-09-24)
Dépend de
aiame-optaplannerdépendance-cheminbackend/pyproject.toml:46 [tool.uv.sources] aiame-optaplanner = { path = "../../aiame-optaplanner/backend", editable = true } ; infrastructure/solver/routing_bridge.py:30-35 et rostering_bridge.py:24-33 importent aiame_optaplanner.* ; backend/Dockerfile:20 COPY aiame-optaplanner/backend dans le contexte de build (infra/storage-01/docker-compose.yml:33-34 context: .., dockerfile: aiame-angel/backend/Dockerfile)
aiame-authappel-servicefrontend/src/lib/authClient.ts:7 NEXT_PUBLIC_AUTH_URL ?? "https://auth.services.aiame.fr/v1" (login/refresh/logout/me) — arête outbound_call de graph.json ; infra/storage-01/docker-compose.yml AUTH_REQUIRED="true", clé publique montée en lecture seule
aiame-authvendoré-checksumbackend/aiame_angel/vendored/verifier/CANONICAL.sha256 (3 fichiers, source aiame-fr/aiame-auth verifier/) — sha256sum -c OK (depuis backend/aiame_angel/vendored/) et sommes byte-identiques au canonique aiame-auth/verifier/ le 2026-09-29 ; vendoring.txt le liste
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 (garde_fous.sh + test_garde_fous.sh, resynchronisé 2026-09-27 #15) — sha256sum -c OK et byte-identique à aiame-doctrine/garde-fous/ le 2026-09-29 ; vendoring.txt le liste
aiame-doctrinecopie-doctrinefrontend/public/mentions-legales.html ligne 1 : « GÉNÉRÉ par aiame-doctrine/legal/build_legal_angel.py — NE PAS ÉDITER ICI » ; aiame-doctrine/legal/legal-angel.json (4 champs TODO : cgv_version, offre_v1_perimetre, donnees_purge_delai, donnees_sante_hebergement_conforme) ; legal/STATUT.md:17-19
https://angel.services.aiame.frprobes-2026-09-29.txt : /api/v1/health → 200 {"status":"ok"} ; GET uniques 2026-09-29 (auteur, puis re-mesurés une fois par le sceptique) : / → 200, 19 662 octets, titre « Aiame Angel » (frontend/src/app/layout.tsx:11) ; /api/v1/nurses → 401 MISSING_TOKEN (verrou aiame-auth actif) ; /cgv.html → 404 (lien encore présent dans Footer.tsx:14)
Modèle de langage
oui — solveurs déterministes (CP-SAT et recherche locale, via aiame-optaplanner), aucun modèle de langage ni dépendance IA dans pyproject.toml/package.json (grep openai/anthropic/llm : 0) ; GF-1 (« frontier-in-execution », bloquant) rejoué par scripts/garde_fous.sh dans le hook pre-push local — activation par clone via core.hooksPath, non prouvée ici.
Souveraineté
Application et base de données sur un serveur AIAME du réseau privé ; l'entrée publique termine TLS et relaie les requêtes sur ce réseau (aiame-infra, routes angel-api/angel-web). Jetons vérifiés localement contre la clé publique aiame-auth, sans appel tiers par requête ; aucune police, script ou import externe (GF-5 rejoué contre l'arbre réel le 2026-09-27, PR #15 : « aucune violation nouvelle »). Limite nommée : l'hébergement certifié pour données de santé n'est pas tranché (aiame-doctrine/legal/legal-angel.json), d'où données synthétiques uniquement.
Doctrine incarnée
CONST-7.1
CONST-2.1
UAX-LOI-PREUVE.b
UAX-LOI-INITIATIVE-BORNEE
FIRST-DOCTRINE-no-sale-before-e2e
GF-3
Tests
32fichiers · 262fonctionsPortfolio public 2026-09-24 (carte aiame-angel datée 09-08) : aucun compte de tests publié pour ce dépôt — seulement « /api/v1/nurses → 401 MISSING_TOKEN » et « certif. e2e absente ». Comptés ici sans exécution (grep, recomptés par le sceptique le 2026-09-29, identiques) : backend 125 def test_ dans 15 fichiers + 10 dans le vérificateur vendoré (1 fichier) ; frontend 112 it()/test() dans 11 fichiers Vitest + 15 test() dans 5 specs Playwright. Les README internes disent « 104 at the time of writing » (backend) et « 105 at the time of writing » (Vitest) : en dérive.
Dates
2026-08-27 · 2026-09-17 — bascule réelle du déploiement vers les conteneurs construits depuis ce dépôt (PR #9, fusionnée le 2026-09-17) : pendant trois semaines après la scission, la production tournait encore l'image du monolithe pré-scission construite le 2026-08-24, et un correctif de sécurité (#8, fusionné le 2026-09-16) qu'on croyait déployé ne l'était pas (infra/storage-01/README.md:280-291)
Ce que chaque formation Parcoursup attend, dit par la formation elle-même : ses attendus, ce que sa commission regarde en premier, ce qu'elle conseille. Pour qu'un lycéen sache quoi travailler, assez tôt pour agir. Rien n'est noté, prédit ni classé.
Chaque formation publie sur Parcoursup ses attendus, une grille qui pondère ses critères, et chaque année un rapport de sa commission avec des conseils aux candidats. Ces textes existent, mais éparpillés entre une page et un PDF par formation. La Boussole les rassemble sans les réécrire : pour une formation, ce qu'elle attend, comment un dossier est lu, ce que la commission conseille et ce qui peut écarter un dossier. L'élève coche les points qu'il veut travailler ; sa liste reste dans son navigateur. Deux instantanés horodatés (RFC 3161) tiennent les fiches de 26 521 formations (14 252 du jeu statistique 2025, 12 269 de la cartographie 2026) et 16 098 rapports, parce que chaque rapport est remplacé l'année suivante à la même adresse ; ce n'est pas la preuve que tout y est. Mesuré sur ces 26 521 pages : 22 236 complètes, 3 510 sans grille de commission, 772 pages d'erreur. Le catalogue des 25 749 formations lisibles tient en 52 lots, et la page, un seul fichier, le garde hors ligne une fois téléchargé, avec des filtres par type exact de formation et par concours. Un guide des études longues (classes préparatoires, écoles d'ingénieurs et de commerce, université, MBA, sigles) est écrit avec nos mots : 44 affirmations, chacune rattachée à une page de l'Onisep dont une copie privée est conservée avec sa date et son empreinte. « Maths sup » y est signalé comme une expression courante que ni l'Onisep ni les pages lues n'emploient. Une veille quotidienne guette le début du remplacement des rapports ; une récolte hebdomadaire des données ouvertes de l'Onisep alimente le corpus de référence.
Capacités — prouvé, déclaré, absent
prouvéAucune requête réseau depuis la page du prototype (30 formations)prototype/test_boussole.py (Playwright + chromium) enregistre toute requête non file:// et exige zéro (page du prototype de 30 formations, pas le client du catalogue complet) ; exécuté par .githooks/pre-push, vert le 2026-09-30.
prouvéPage reconstruite depuis les données, jamais éditée à la main.githooks/pre-push reconstruit prototype/boussole.html depuis prototype/data.json et exige une égalité octet pour octet (cmp).
prouvéAppels externes déclarés : robots.txt, débit, SOURCES.mdGF-5 (garde_fous.sh vendoré) vert au pre-push ; contre-testé le 2026-09-30 : 3 violations sans SOURCES.md, 1 sans la mention robots.
déclaréExtraction fidèle aux pages officiellesComparé le 2026-09-30 sur 30/30 formations (nombre de critères = nombre de « N sur 4 » de la page brute, grille = 100 %) par un script ponctuel NON versionné — à transformer en test. Depuis le 2026-10-03, une vérification MÉCANIQUE tourne sur les 26 521 pages stockées (grille = 100 %, nombre de critères = nombre de « N sur 4 » de la page, attendus présents) : EXTRACTION-MEASURE.md ; elle ne vérifie pas que les mots sont les bons, d'où le statut déclaré.
prouvéInstantané horodaté de 14 252 formations (fiches et rapports 2025)provenance/snapshot-2025/ : `sha256sum -c SHA256SUMS` puis `openssl ts -verify -data manifest.jsonl -in manifest.tsr -CAfile cacert.pem -untrusted tsa.crt` donnent OK (jeton freetsa.org, série 0x08BBE268, 2026-10-01 07:57:12 GMT ; rejoué sur main après le merge d'aiame-orientation#4 ; un octet ajouté au manifeste fait échouer la vérification). Le manifeste liste 14 252 fiches et 12 840 rapports avec fichier. prototype/verify_snapshot.py re-hache les fichiers : 25 850 fichiers, 0 écart le 2026-10-01 ; testé sur un instantané factice corrompu. Limite : les 7,2 Go bruts ne sont que sur storage-01, donc cette re-vérification-là n'est rejouable que par le propriétaire. report-sessions.jsonl : les 12 840 rapports sont de la session 2025 (métadonnées PDF Info et XMP concordantes), contrôlé contre le titre imprimé en page 1 sur 209 PDF (209 concordent) ; prototype/test_report_sessions.py rejoue les cas limites et la jointure exacte avec le manifeste. Le contrôle sur 209 PDF a été lancé une fois et n'est pas rejouable depuis le dépôt. Couverture : 14 252 des 25 805 formations de la cartographie 2026 (voir manques).
prouvéInstantané complémentaire horodaté de 12 269 formations (fiches et rapports 2025)provenance/snapshot-2025-complement/ : `sha256sum -c SHA256SUMS` puis `openssl ts -verify -data manifest.jsonl -in manifest.tsr -CAfile cacert.pem -untrusted tsa.crt` (jeton freetsa.org, série 0x08D36A4F, 2026-10-03 08:53:26 GMT, soit deux jours après le téléchargement ; un octet ajouté au manifeste fait échouer la vérification, contrôlé le 2026-10-03). Le manifeste liste 12 269 fiches et 3 258 rapports avec fichier (3 232 PDF), 9 011 fiches sans lien de rapport, 0 échec. prototype/verify_snapshot.py sur storage-01 le 2026-10-03 : 15 501 fichiers, 0 écart ; les 3 232 PDF sont datés du 2025-09-12 au 2025-12-16 ; report-sessions.jsonl : 3 258 lignes, toutes session 2025. prototype/test_demande.py recompte les deux manifestes et refuse un programme présent dans les deux. Limites : le jeton ne couvre pas report-sessions.jsonl ; le contrôle sur le titre imprimé n'a été fait que sur le 1er instantané ; les 1,3 Go bruts ne sont que sur storage-01.
prouvéVeille du remplacement des rapports : décisions d'alerte et détection de cécitéprototype/test_watch_sessions.py (au pre-push) : cinq classes de réponse, statuts quiet/started/transition/settled/blind, alerte sur progression seulement, « aveugle » jamais lu comme « calme », alerte non envoyée réessayée, ligne de manifeste à moitié écrite tolérée. 12 modifications du code essayées le 2026-10-01 (script ponctuel non versionné), toutes détectées par les tests.
déclaréVeille déclarée dans Ansible, installée et active sur storage-01Minuterie systemd --user orientation-watch.timer sur storage-01 (deploy/watch/) ; scripts déployés identiques à main (sha256, 2026-10-01) ; premier run réel le 2026-10-01 à 10:45 UTC : 60 URL sur 60 identiques au manifeste, statut quiet, alerte d'installation acceptée par le serveur SMTP. Runs suivants (2026-10-02 06:32 et 2026-10-03 06:30 UTC) : 60 sur 60 identiques, statut quiet, lus dans le journal sur storage-01. Déclarée dans aiame-infra : rôle orientation-watch (aiame-infra#171), dont le test hors ligne vérifie que le rendu des deux unités est octet pour octet celui installé (9 modifications essayées, toutes vues) ; rejouée sur storage-01 le 2026-10-03 : un seul changement (dossier d'état 0775 → 0750), scripts et unités inchangés (sha256 avant/après), puis un second passage à 0 changement. Limite : visible seulement sur storage-01, et la réception du message n'est pas vérifiée.
prouvéListe des formations d'un instantané : cartographie moins ce qu'un manifeste détient déjàprototype/test_snapshot_lists.py (au pre-push) : jeu statistique seul, cartographie (dernière session seulement), union, complément, mode inconnu refusé, ancienne ligne de commande inchangée. Vérification ponctuelle sur les données réelles du 2026-10-01 : 25 805 − 13 536 = 12 269 (les données ne sont pas dans le dépôt).
prouvéTest e2e de la Boussole : comportements, contraste, mises en page, capturesprototype/e2e/test_boussole_e2e.py (Playwright + chromium 119, au pre-push) : 1 531 vérifications vertes le 2026-10-03 ; zéro requête réseau, pas d'erreur console, aucun défilement horizontal à 320, 390 et 1280 px en clair et en sombre, contraste WCAG AA sur 38 paires par thème (plus bas : 5,03:1 clair, 4,75:1 sombre), 22 captures comparées à prototype/e2e/baselines/. 20 casses volontaires de la page dans une copie : 19 détectées et 1 contrôle de tolérance qui doit passer (prototype/e2e/README.md) ; le test a trouvé trois défauts de la page, corrigés. Limites : Chromium seul, pas de lecteur d'écran, 30 formations ; sans le même Chromium les captures s'abstiennent (code 77, jamais lu comme un vert) ; les captures de référence n'ont pas encore été relues par le propriétaire.
prouvéMesure d'extraction sur les 26 521 pages archivéesprototype/measure_extraction.py et measure_reports.py, tests prototype/test_measure_extraction.py (13 modifications du code de mesure, toutes détectées). Résultat du 2026-10-03 (EXTRACTION-MEASURE.md) : 22 236 pages complètes (83,8 %), 3 510 sans grille de commission, 772 pages d'erreur « Erreur 404 ! » dont 716 de formations absentes de la cartographie 2026, 25 749 pages lisibles ; 499 rapports sur 500 d'un échantillon tiré (graine 20261003) sont lisibles. La mesure a fait trouver un défaut du lecteur (4 pages dont la liste de critères s'arrêtait trop tôt), corrigé (aiame-orientation#12). Mécanique, pas sémantique.
prouvéCatalogue de 25 749 formations en 52 lots, restitué sans perteCATALOGUE-FORMAT.md et prototype/test_catalogue.py (au pre-push, 21 modifications du code de construction, toutes détectées) : un index (rows code, établissement, ville, zone, formation, drapeaux, lot, concours) et 52 lots de 500 formations à table de chaînes propre, un manifeste catalogue.json avec sha256 et taille de chaque fichier ; la reconstruction rend exactement les enregistrements d'origine. 121,8 Mo décodés en un seul JSON → 48,1 Mo (11,9 Mo compressés) en lots. Le catalogue lui-même n'est pas dans le dépôt : il se reconstruit sur storage-01.
prouvéClient unique pour tout le catalogue : recherche, filtres, épingles, hors ligneprototype/client/index.html (un fichier, sans framework) ; prototype/client/test_client_e2e.py (Playwright + chromium, au pre-push) : 2 278 vérifications (démarrage et recherche, fidélité des 128 formations d'un jeu d'essai tiré du vrai catalogue, épingles, intégrité sha256 de chaque fichier chargé, hors ligne, passage d'une ancienne version à une nouvelle, concours, guide, mises en page et contraste, ouverture en file://) et 37 modifications volontaires de la page, toutes détectées. En-têtes servis : default-src 'none', connect-src 'self' (aucune requête vers un autre site). Essai réel du 2026-10-03 : un profil de navigateur rempli avec l'ancienne version en ligne (54 fichiers de catalogue en cache, une épingle) puis rouvert après la mise à jour : la nouvelle version apparaît à la deuxième ouverture (cache de la page, voulu), l'épingle et le cache sont conservés, la liste, le guide et une formation épinglée s'ouvrent hors ligne.
prouvéGuide des études longues : chaque affirmation vérifiée contre sa sourceprototype/client/guide.json (44 affirmations, 16 sources Onisep avec date de publication, date de lecture et sha256 de la copie stockée) ; prototype/client/verify_guide.py, joué sur storage-01 contre les copies stockées : 76 phrases de contrôle retrouvées dans la page citée, dates de publication concordantes, « maths sup » et « maths spé » absents de toutes les pages Onisep stockées (donc signalés comme expressions courantes, non sourcées), aucune prépa de deuxième année, aucun type « Master » ni « MBA » dans le catalogue ; prototype/client/test_guide.py (13 modifications du vérificateur, toutes détectées ; un détecteur refuse neuf mots consécutifs copiés d'une source). Limite : les pages Onisep sont protégées, le guide les cite et ne les reproduit pas ; la couverture MBA se limite à la fiche Onisep.
déclaréRécolte hebdomadaire des données ouvertes Onisep, déclarée dans Ansibleprototype/edu/ : lecteur de robots.txt RFC 9309 maison (test_robots.py, 9 modifications détectées, sur les vrais robots.txt de 10 sources), récolte (test_harvest.py, 21 modifications détectées : robots.txt vérifié redirections comprises, une requête à la fois, licence autorisée, requêtes conditionnelles), lanceur hebdomadaire qui n'envoie un message que si la récolte a mal tourné (test_weekly.py). Première récolte à la main le 2026-10-03 sur storage-01 : 59 fichiers Onisep (environ 220 Mo, licence ODbL) ; le passage suivant fait 82 requêtes, 59 fichiers inchangés, 0 erreur. Rôle edu-harvest d'aiame-infra (#176) : test hors ligne à 8 contrôles et 29 modifications, rejoué sur storage-01 le 2026-10-03 (4 changements voulus), minuterie systemd --user active, premier passage prévu le 2026-10-04 à 05:36 UTC : PAS ENCORE VU, d'où « déclaré ». Seules les deux sources Onisep sont planifiées ; les fichiers des ministères refusés par leur robots.txt (213) ne sont pas récoltés, aucune exception.
déclaréServie par un rôle Ansible isolé, journal d'accès du serveur coupéRôle boussole-web d'aiame-infra (#172) : projet compose et fichier de routage à part, aucun port publié, noindex, journal d'accès du serveur de la page coupé. Les vérifications finales du rôle (manifeste servi = manifeste vérifié, certificat valide, en-têtes de sécurité, absence de journal côté client) ont réussi lors du déploiement du 2026-10-03 ; le rejeu suivant ne change rien. Déclaré : ce que lit un visiteur dépend de la machine, que cette page ne sonde pas (aucune URL publiée ici).
Ce qui est absent, en toutes lettres
Le texte des rapports des commissions n'est pas dans le catalogue servi (il demande pdftotext, absent de storage-01) : la page montre les attendus, critères et conseils des fiches, pas encore ceux des rapports PDF
Couverture : les deux instantanés tiennent 26 521 codes de formation (14 252 + 12 269), horodatés ; ce qui est absent des deux listes (formations hors cartographie 2026 et jeu statistique, ou créées après l'export) n'est pas couvert, taille inconnue. Les 11 263 / 1 006 (apprentissage / hors apprentissage) viennent du cadrage du 2026-10-01 et n'ont pas été recalculés sur les pages stockées
Le contrôle de fidélité de l'extraction est mécanique (grille, critères, attendus) sur les 26 521 pages ; que les mots soient les bons reste vérifié à la main sur 30 formations seulement
Demande SIES non envoyée
Grille %, quotas et oui/non sur l'algorithme existent déjà chez SupTracker (vérifié sur leur site le 2026-09-30) : non refaits ici, et SupTracker n'est pas contacté (décision propriétaire)
Instantanés : les jetons ne couvrent ni errors.jsonl ni report-sessions.jsonl (l'année de session, dans un fichier séparé car le manifeste horodaté ne doit pas changer), le jeton du complément date de deux jours après le téléchargement (l'ancrage antérieur est la date du push), et les 8,5 Go bruts ne sont que sur storage-01
Un lien de rapport (programme 47562) répond HTTP 500 côté Parcoursup ; 1 411 fiches n'ont aucun lien de rapport ; 9 011 fiches du complément n'en ont aucun non plus
La veille n'a que son message hebdomadaire pour dire que la minuterie ou la machine est morte : le rôle Ansible la rend rejouable, il ne la surveille pas. Rien ne compare les copies vendorées d'aiame-infra (scripts et unités) à celles d'aiame-orientation, seulement les sommes côté infra
Guide : il repose sur 16 pages Onisep, protégées (copie privée, non republiable ; reproduire demande l'autorisation écrite de l'Onisep, non demandée) ; la couverture des MBA se limite à la fiche Onisep ; « maths sup » et « maths spé » ne sont dans aucune page lue, le guide les signale comme expressions courantes, non sourcées
Données des ministères : 213 fichiers listés sur data.gouv.fr sont refusés aux robots par leur robots.txt et le bulletin officiel répond 403 ; ils ne sont pas récoltés, aucune exception n'est ouverte (décision du propriétaire). Les conditions d'usage du site de données ouvertes de l'Onisep ne sont pas lues : rien n'en est republié
La récolte hebdomadaire est silencieuse quand tout va bien : si la minuterie meurt, rien ne le dit (elle écrit weekly.jsonl, rien ne le lit) ; son premier passage planifié (2026-10-04) n'est pas encore vu
Le client est servi à une adresse de développement non indexée ; l'annonce « gratuit pour toujours » n'est écrite nulle part (décision du propriétaire)
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 : garde_fous.sh (6558a1be…) et test_garde_fous.sh (a0b6000b…), mêmes sommes qu'aiame-doctrine/garde-fous/ sur origin/main (2026-09-30).
aiame-infraautreLa veille envoie ses alertes avec le fichier de réglages SMTP partagé de la flotte (rôle smtp-alert d'aiame-infra) et une copie octet pour octet de ansible/roles/sov-backup/files/send_alert.py (sha256 979dcd4a…, identique sur storage-01 le 2026-10-01). Dépendance d'exécution sur storage-01 : aucune somme de contrôle versionnée côté aiame-orientation. Le rôle orientation-watch d'aiame-infra (#171) vendore aussi watch_sessions.py et report_sessions.py, avec leurs sommes. Le rôle boussole-web (aiame-infra#172) sert le client ; le rôle edu-harvest (aiame-infra#176) vendore robots.py, harvest.py, weekly.py, sources.json et send_alert.py, sommes dans son CANONICAL.sha256, et son test refuse qu'une source refusée par robots.txt entre au planning.
Consommé par
—
Surface publique
—Servie le 2026-10-03 sur une adresse de développement du domaine d'AIAME, non indexée (noindex) et sans lien sur cette page : l'ouvrir au public est une décision du propriétaire, non prise. Aucune sonde, faute d'URL publiée ici. Rôle aiame-infra boussole-web (#172).
Modèle de langage
oui : aucun modèle de langage, ni à l'extraction ni dans la page ; GF-1 vert au pre-push.
Souveraineté
La page ne parle qu'à son propre serveur (default-src 'none', connect-src 'self'), sans police, script ni compteur tiers ; le serveur de la page ne tient pas de journal d'accès (le routeur de la flotte placé devant n'a pas été vérifié). Tout ce qui est récolté l'est depuis storage-01 : dossierappel.parcoursup.fr (pages et rapports publics, etalab-2.0) et, au plus deux exports du portail de données ouvertes du ministère par exécution ; des requêtes d'exploration ont aussi été faites à la main sur l'API de ce portail, dont le robots.txt interdit /api/ (SOURCES.md, décision du propriétaire en suspens). Pour le corpus : l'API de data.gouv.fr, api.opendata.onisep.fr (données ouvertes, ODbL) et, pour une copie PRIVÉE servant à vérifier le guide, 17 pages de www.onisep.fr, jamais republiées ; le robots.txt de chaque hôte est lu avant chaque passage et les fichiers qu'il refuse ne sont pas pris. Pour l'horodatage, seul un condensat de 32 octets (jamais un fichier) est envoyé à freetsa.org. Les alertes passent par le canal e-mail de la flotte. Les domaines sont déclarés dans SOURCES.md.
Doctrine incarnée
GF-1
GF-2
GF-3
GF-4
GF-5
Tests
13fichiers · 0fonctionsnon vérifié — dépôt créé le 2026-09-30. Treize scripts à assertions, pas une suite pytest, tous au pre-push (vert le 2026-10-03) : prototype/test_boussole.py et prototype/e2e/test_boussole_e2e.py (page du prototype, 1 531 vérifications), prototype/client/test_client_e2e.py (client du catalogue complet, 2 278 vérifications, 37 modifications volontaires détectées), test_catalogue.py, test_measure_extraction.py, prototype/client/test_guide.py, prototype/edu/test_robots.py, test_harvest.py, test_weekly.py, test_report_sessions.py, test_demande.py (lettre au SIES à jour), test_watch_sessions.py (veille) et test_snapshot_lists.py.
Dates
2026-09-30 · 2026-09-30 : pilote 30 formations, Boussole hors ligne, instantané lancé sur storage-01, dépôt créé (décision propriétaire, nom aiame-orientation) ; 2026-10-01 : instantané terminé et manifeste horodaté RFC 3161 (aiame-orientation#4) ; 2026-10-01 : année de session des rapports dans un fichier séparé du manifeste (aiame-orientation#5) ; 2026-10-01 : couverture du 1er instantané corrigée (14 252 des 25 805 formations), instantané complément lancé et veille quotidienne installée sur storage-01 (aiame-orientation#7) ; 2026-10-01 : test e2e complet de la Boussole (aiame-orientation#8) ; 2026-10-03 : instantané complément terminé, vérifié et horodaté RFC 3161 (aiame-orientation#9) ; 2026-10-03 : veille déclarée dans un rôle Ansible d'aiame-infra (aiame-infra#171) et rejouée sur storage-01 ; 2026-10-03 : mesure d'extraction sur les 26 521 pages (aiame-orientation#11, #12), format du catalogue en 52 lots (#13), client pour tout le catalogue (#14) servi par le rôle boussole-web (aiame-infra#172), concours visibles (#19) ; 2026-10-03 : corpus éducatif Onisep (#20), guide des études longues (#21), récolte hebdomadaire (#22, aiame-infra#176) installée sur storage-01
Pile
Python 3 (bibliothèque standard + pdftotext), HTML + JavaScript sans framework ni compilation, un seul fichier, Playwright + chromium pour le test navigateur, shell sh/bash (pre-push, garde-fous), OpenSSL (horodatage RFC 3161, vérification), systemd --user (minuterie de la veille sur storage-01), Cache API + service worker (la page seule) dans le navigateur, nginx derrière Traefik, Docker Compose (rôle aiame-infra boussole-web)
aiame-rag · recherche scientifique (RAG) · vivant
aiame-rag — recherche documentaire ArXiv
Moteur de recherche documentaire avec sources citées (RAG) sur des articles ArXiv : une garde bloque la citation d'un article jamais fourni au modèle, et la journalisation de transparence prévue par le règlement européen sur l'IA est câblée (sans certification) — pas encore public.
aiame-rag lit et interroge de vrais articles scientifiques publiés sur ArXiv pour répondre à une question avec des sources citées — un moteur de recherche documentaire augmenté par l'IA, pas un chatbot généraliste. Un garde-fou vérifie chaque réponse générée pour s'assurer qu'elle ne cite jamais un article qu'elle n'a pas réellement consulté : un essai réel a montré que le modèle pouvait inventer des articles plausibles, ce garde existe précisément pour intercepter ce cas. Le service n'utilise aucun modèle d'IA propriétaire dans son chemin d'exécution : un modèle hébergé par AIAME répond aux questions, pas un fournisseur cloud étranger. À ce jour, aucune adresse publique de l'application elle-même n'a pu être vérifiée en fonctionnement — seules ses bases de données tournent sur l'infrastructure d'AIAME.
Capacités — prouvé, déclaré, absent
prouvéPipeline RAG complet sur ArXiv (ingestion → embeddings → Qdrant → retrieval → rerank → génération)backend/aiame_rag/services/rag_engine_advanced.py:32 importe réellement le pipeline vendoré aiame_rag_core (vérifié ligne par ligne) ; ETAT-DES-TESTS.md §5 documente une vraie dépendance à un Qdrant vivant (9 erreurs par vrai timeout de connexion, pas un mock) ; .githooks/pre-push (lignes 65-100) lance en direct un conteneur Qdrant jetable via Docker pour la suite pytest, avec ABSTENTION explicite si Docker est indisponible.
prouvéGarde de fondement par citation — empêche l'IA de citer un article jamais fourni (anti-hallucination)backend/aiame_rag/vendored/aiame_rag_core/gates/citation_grounding.py existe et est vendoré (checksum OK) ; backend/tests/test_claim_verification.py compte réellement 27 fonctions de test (recompté par grep) ; commit c489cf3 (#112, 2026-09-27) confirmé en git log, message vérifié : documente précisément le cas mistral-nemo inventant un contenu attribué à un ID pourtant authentique.
prouvéAucun modèle frontière dans le chemin d'exécution (GF-1) — LLM et embedder image auto-hébergésbackend/aiame_rag/config.py (ollama_model=mistral-nemo:latest, commentaire explicite « NEVER a frontier cloud API (GF-1) », et note qu'un fournisseur OpenAI-compatible reste possible en opt-in explicite via RAG_LLM_PROVIDER, jamais le défaut) ; commits 2f1ba2c et 3228c38 confirmés en git log. GF-1 est aussi câblé dans services/llm_factory.py et référencé dans backend/tests/test_llm_factory.py, pas seulement en commentaire.
prouvéJournalisation et transparence IA (règlement européen sur l'IA, art. 12/13/50) câblées dans le code vivant, pas du code mort — sans certificationaiame_compliance vendoré importé aux 5 points d'entrée cités, vérifiés ligne par ligne : api/v1/search.py:11, api/v1/chat.py:19, api/v1/chat_enhanced.py:30, services/pipeline_logging.py:12, agents/research_agent.py:35 ; checksum revérifié en direct ce jour (sha256sum -c depuis backend/ sur CANONICAL.sha256) → 10/10 OK.
prouvéAuthentification transversale AIAME (aiame-auth) vérifiée sur les routes sensiblesbackend/aiame_rag/core/security.py importe verify_access_token du vendoré aiame_auth_verifier, utilisé dans api/deps.py (vérifié) et api/v1/chat.py (websocket, vérifié) ; checksum revérifié en direct, 4/4 OK ; frontend/src/lib/config.ts:3 pointe NEXT_PUBLIC_AUTH_URL vers auth.services.aiame.fr, confirmé aussi dans SCRATCH/graph.json et SCRATCH/args.json (edge aiame-rag→aiame-auth).
prouvéBoucle d'auto-calibration honnête — ne modifie jamais le comportement réel sans promotion manuelle expliciteETAT-DES-TESTS.md (mise à jour du 2026-08-24, Phase 4, PR #38 confirmée en git log) : adapt_pipeline_parameters tourné en direct contre la vraie base (confirmée vide), rapporte honnêtement action="skipped", samples_used=0 ; promote_adaptation() jamais planifiée, seulement invocable à la main. test_adaptation.py compte réellement 6 fonctions de test (recompté par grep).
absentDéploiement public de l'application elle-même (au-delà de ses bases de données)infra/storage-01/docker-compose.yml, commentaire d'en-tête confirmé : « aiame-rag's own FastAPI app is NOT deployed here, only its datastores » ; sonde du 2026-09-29 sur rag.services.aiame.fr renvoie un code 000 avec un fragment HTML tronqué — ni une réponse HTTP propre ni un NXDOMAIN net (à distinguer de la mesure antérieure du 09-08, citée dans portfolio-public.txt, qui trouvait NXDOMAIN sur les trois domaines plausibles — l'état a donc changé entre les deux mesures sans qu'une route fonctionnelle apparaisse).
Ce qui est absent, en toutes lettres
Aucune route publique vérifiée pour l'application elle-même (le service applicatif n'est pas déployé sur l'infra documentée, seules ses bases de données le sont).
ETAT-DES-TESTS.md — le document que le propre README du backend désigne comme référence datée — n'a pas été mis à jour depuis le 2026-08-24 (dernier chiffre documenté : 60 passed / 1 deselected / 0 failed) alors que 77 commits (recompté par git log, confirmé) et la suite de tests elle-même (288 fonctions dans 31 fichiers aujourd'hui, recompté par grep — pas 284) ont suivi depuis.
CI GitHub supprimée (règle 11 de l'espace de travail) ; la seule vérification restante est le hook pre-push local, explicitement documenté dans le propre .githooks/pre-push de ce dépôt comme NON ACTIF par défaut sur un clone/worktree frais tant que `git config core.hooksPath .githooks` n'a pas été exécuté à la main.
Couverture frontend très inégale : 4 fichiers de test (10 assertions it/test au total, recompté) pour 8 zones d'application (admin, api, chat, compliance, dashboard, login, papers, search) — frontend/README.md est resté le README par défaut de create-next-app, jamais personnalisé (vérifié).
La boucle d'adaptation automatique (QueryFeedback) n'a aujourd'hui aucun point d'entrée public pour recevoir de vrais retours utilisateurs — explicitement noté dans ETAT-DES-TESTS.md comme décision produit/sécurité non tranchée, pas oubliée.
Aucune exécution réelle de la suite de tests n'a été faite pendant cette revue (lecture seule imposée) — les comptages viennent de grep, pas d'un pytest rejoué.
Dépend de
aiame-authvendoré-checksumbackend/aiame_rag/vendored/aiame_auth_verifier/CANONICAL.sha256 : source aiame-fr/aiame-auth, verifier/, commit 4ffa5aa (2026-09-11) ; checksum revérifié en direct ce jour, 4/4 OK.
aiame-authappel-servicefrontend/src/lib/config.ts:3, variable NEXT_PUBLIC_AUTH_URL → https://auth.services.aiame.fr/v1 ; confirmé indépendamment comme unique arête sortante d'aiame-rag dans SCRATCH/graph.json et SCRATCH/args.json (clé edges).
aiame-rag-corevendoré-checksumbackend/aiame_rag/vendored/aiame_rag_core/CANONICAL.sha256 : source aiame-fr/aiame-rag-core, backend/app/pipeline.py + gates/*.py, commit be4609e (2026-09-17) ; importé réellement dans services/rag_engine_advanced.py:32 (vérifié) ; checksum revérifié en direct, 10/10 OK.
aiame-compliancevendoré-checksumbackend/aiame_rag/vendored/aiame_compliance/CANONICAL.sha256 : source aiame-fr/aiame-compliance, backend/app/*.py, commit 1af7ce8 (2026-09-28) ; checksum revérifié en direct, 10/10 OK.
aiame-doctrinecopie-doctrinescripts/CANONICAL.sha256 : copie vendorée de garde-fous/garde_fous.sh + test_garde_fous.sh depuis aiame-doctrine ; dernière resynchronisation confirmée à la date exacte du 2026-09-22 (aiame-doctrine#52, GF-5 ouvre *.css).
—SCRATCH/probes-2026-09-29.txt : https://rag.services.aiame.fr/ renvoie un code 000 (pas un statut HTTP valide) malgré un fragment HTML tronqué en retour — ni un NXDOMAIN net ni une réponse 200 propre. Ce résultat diffère de la mesure antérieure citée dans portfolio-public.txt (09-08 : NXDOMAIN sur les trois domaines plausibles) — l'état du DNS/de la route a changé entre les deux dates sans qu'aucune route fonctionnelle n'apparaisse. infra/storage-01/docker-compose.yml (commentaire d'en-tête, vérifié) confirme indépendamment que seuls Qdrant et Redis sont déployés sur l'infra AIAME pour ce dépôt, pas l'application FastAPI/Next.js elle-même. Conclusion : pas de route publique vérifiable aujourd'hui.
Modèle de langage
non — RAG génératif via un LLM auto-hébergé (Ollama, mistral-nemo) ; jamais un modèle frontière (cloud) dans le chemin d'exécution (GF-1, prouvé dans config.py et llm_factory.py)
Souveraineté
Choix explicites et documentés en faveur de modèles auto-hébergés dans le chemin d'exécution (LLM auto-hébergé plutôt qu'un service cloud, modèle d'image ouvert exécuté localement plutôt qu'une API commerciale) ; les données propres à l'application (base applicative) sont hors du périmètre lu ici — seules les bases Qdrant/Redis de collecte sont documentées comme hébergées sur l'infrastructure privée d'AIAME.
Doctrine incarnée
GF-1
CODING-explainability
UAX-LOI-PREUVE.b
MANIFESTO-decision-support
GF-3
TRANSPARENCY-cost-revenue-commitment
Tests
31fichiers · 288fonctionsportfolio-public.txt (audit 2026-09-24, mesure datée du 09-08) : 14/14 tests verts contre un vrai conteneur Qdrant de test, rejoué en direct — CI GitHub désactivée depuis le 27/08, 27 commits mergés depuis sans aucun check GitHub selon cet audit (seulement en local). Recompté indépendamment par git log ce jour : 50 commits depuis le 09-08 (pas 77 — ce chiffre de 77 est celui, distinct, des commits depuis la dernière mise à jour d'ETAT-DES-TESTS.md le 08-24, à ne pas confondre), aucun revérifié publiquement depuis.
Dates
2026-07-28 · 2026-08-24 (PR #38, confirmée en git log) : la boucle d'adaptation Phase 4 est vérifiée en direct contre la vraie base configurée (confirmée entièrement vide) et rapporte honnêtement action="skipped" plutôt qu'un chiffre fabriqué — incarnation concrète du « zéro bullshit mesuré » de l'org, dans le code lui-même.
Aiame — une image astronomique européenne par jour (APOD)
Une image d'astronomie par jour, la même pour chaque visiteur, sans compte ni traqueur.
Chaque jour, ce service affiche la même image astronomique à tous ses visiteurs. Elle est choisie par une règle publique que n'importe qui peut recalculer soi-même, pas par un algorithme opaque. Les images viennent des archives publiques de l'Agence spatiale européenne (ESA/Hubble, ESA/Webb) et de l'Observatoire européen austral (ESO), sous licence CC BY 4.0. Elles sont relayées par un serveur AIAME situé en Europe : le navigateur du visiteur ne contacte jamais ces organismes, et c'est le serveur qui télécharge les images, en vérifiant leur empreinte. Aucun compte, aucun cookie, aucun script tiers. Des tests vérifient deux de ces engagements (aucun cookie posé, aucune image servie depuis un hôte tiers) plutôt que de se contenter de les afficher.
Capacités — prouvé, déclaré, absent
prouvéImage du jour déterministe et identique pour tous, algorithme public et rejouableservices/apod/backend/tests/test_selection.py : 25 fonctions test_ (dont test_golden_vectors_reproduce_exactly:49, test_selection_module_uses_no_stdlib_randomness:73) ; services/apod/docs/ALGORITHM.md + implémentations de référence indépendantes services/apod/docs/reference/select.py et select.js ; vecteurs tests/vectors/selection_vectors.json
prouvéService en ligne sur apod.services.aiame.frsonde GET du 2026-09-29 (probes-2026-09-29.txt) : `200 https://apod.services.aiame.fr/`, page HTML rendue ; README : « VÉRIFIÉ 2026-09-22 » ; hôte déclaré dans aiame-infra/terraform/dns/aiame_fr_dns.tf:58-67
prouvéAucun cookie posé, vérifié par un test et pas seulement affirméservices/apod/backend/tests/test_compliance.py:85 (test_no_endpoint_sets_a_cookie, 8 chemins), assertion ligne 97 ; test lu, pas exécuté dans cette revue
prouvéLe navigateur du visiteur ne contacte jamais ESA/Hubble, ESA/Webb ou l'ESOtest_compliance.py:76 (test_image_urls_handed_to_clients_are_always_local) et :118 (test_frontend_never_declares_a_remote_image_host : aucun `remotePatterns` dans next.config.ts) ; api.py:144-145 ne renvoie que des URL locales /api/image/{date}
prouvéCollecte bornée : trois flux JSON à adresse fixe, lus seulement quand un humain gèle le manifeste, une seconde entre deux appelsservices/apod/backend/src/aiame_apod/ingestion.py:57-70 (3 URL codées en dur), :269 (`asyncio.sleep(1.0)`) ; freeze.py:4 (« run by a human, not by a scheduler ») ; test_compliance.py:100 (le module api n'importe ni ingestion ni freeze) ; SOURCES.md, tableau des 3 domaines
prouvéRelais d'images côté serveur, chaque fichier vérifié par son empreinteapi.py:303 (`relay.fetch(..., expected_sha256=asset.sha256)`) ; scheduler.py : préchargement quotidien à 00:05 UTC, non critique (« If it dies, every answer stays correct ») ; les octets viennent des CDN des organismes (cdn.esahubble.org, cdn.esawebb.org, cdn.eso.org, listés dans data/manifest/gen-0001.json), téléchargés par le serveur au préchargement ou à la première demande si absents du cache
absentL'ancien domaine eu.aiame.frREADME.md : mort depuis le 2026-09-13, NXDOMAIN mesuré le 2026-09-22 ; sonde du 2026-09-29 : `000 https://eu.aiame.fr/` et `000 https://eu.aiame.fr/api/apod`
absentTexte complet de la licence EUPL-1.2 dans le fichier LICENSEREADME.md, section Licence : « LICENSE currently carries the official EUPL notice and a pointer to the authoritative text, not the full text itself »
absentService « face-mesh » inscrit comme prévu dans le README : rien n'est construitREADME.md, table « Planned » : `face-mesh`, rien de construit (aucun dossier services/face-mesh) ; le dossier `rust/` d'apod est vide par conception (services/apod/docs/README.md)
Ce qui est absent, en toutes lettres
eu.aiame.fr, le nom encore porté par repos.json et par le dépôt, ne résout plus depuis le 2026-09-13 (sonde du 2026-09-29 : 000)
Le nom mort reste écrit 37 fois dans 19 fichiers suivis par git (mesuré le 2026-09-30, `git ls-files | xargs grep -o 'eu\.aiame\.fr'`), dont 6 dans le README qui documente sa mort — le README annonce « ~30 other places » hors de lui-même, cohérent ; parmi eux le User-Agent envoyé à l'ESA et à l'ESO (ingestion.py:74, relay.py:33)
SOURCES.md affirme que le User-Agent porte « une adresse de contact qui fonctionne » : l'URL de projet qu'il annonce ne résout plus (l'e-mail qu'il contient n'est pas concerné)
Texte complet de la licence EUPL-1.2 absent du fichier LICENSE (seule la notice et un pointeur)
Le contrat d'événements `aiame:analysis:*` (frontend/src/lib/events.ts) n'a aucun consommateur, le fichier le dit lui-même
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 couvre scripts/garde_fous.sh ET scripts/test_garde_fous.sh ; `sha256sum -c` OK le 2026-09-30, sommes identiques à aiame-doctrine/garde-fous/ ; vérifié au pre-push (.githooks/pre-push:49)
aiame-workspacedépendance-cheminservices/apod/frontend/package.json : "@aiame/find-workspace-root": "workspace:*" (paquet de aiame-workspace/tools/find-workspace-root), utilisé par next.config.ts ; aiame-workspace/pnpm-workspace.yaml liste "aiame-apod/services/*/frontend" et pyproject.toml racine "aiame-*/services/*/backend"
https://apod.services.aiame.fr/sonde GET du 2026-09-29 (probes-2026-09-29.txt) : 200, page HTML servie. eu.aiame.fr, encore cité dans repos.json et dans le dépôt, est injoignable (000) et NXDOMAIN d'après le README (mesure du 2026-09-22).
Modèle de langage
sans objet — aucun appel à un modèle de langage : la sélection est un calcul déterministe (SHA-256 + permutation) documenté dans services/apod/docs/ALGORITHM.md ; la copie vendorée du garde-fou GF-1, lancée au pre-push (.githooks/pre-push:58) avec son harnais de mutation, est conçue pour bloquer l'import d'un fournisseur frontière.
Souveraineté
Servi depuis un serveur AIAME situé dans un centre de données de l'Union européenne, déployé par aiame-infra. Les dépendances externes sont des organisations intergouvernementales européennes (ESA, ESO) : leurs trois flux JSON ne sont lus qu'au gel du manifeste, lancé par un humain ; les images elles-mêmes sont téléchargées par le serveur depuis leurs CDN (préchargement quotidien, ou première demande si le cache est vide), jamais par le navigateur du visiteur.
Doctrine incarnée
FOUND-privacy-first
CONST-2.1
CONST-3.1
CONST-7.1
MOTION-non-personalizable
GF-1
Tests
4fichiers · 61fonctions« 66/66 tests rejoués localement » le 2026-09-08, carte aiame-eu du portfolio public (www.aiame.fr, portfolio-public.txt:48). 66 = 61 fonctions + 5 cas paramétrés supplémentaires (test_ingestion.py:59, 4 cas ; :72, 3 cas). Non exécutés dans cette revue. S'y ajoute le harnais de mutation vendoré scripts/test_garde_fous.sh, lancé au pre-push avec pytest (.githooks/pre-push:46, :68).
Dates
2026-08-07 (dépôt GitHub et premier commit après reconstruction ; construit localement le 2026-08-01, perdu, reconstruit depuis un transcrit — README, « Founding note ») · 2026-09-22 : le README découvre et documente la mort du domaine (PR #16), après neuf jours à le marquer « VÉRIFIÉ » · 2026-09-13 : eu.aiame.fr cesse de résoudre (route renommée en apod.services.aiame.fr, aiame-infra#73, enregistrement DNS jamais créé)
Pile
Python (FastAPI), APScheduler (préchargement quotidien des images, non critique), Next.js (export statique, aucun runtime Node sur le serveur), Rust/WASM (prévu, absent)
aiame-core · mathématiques d'asymétrie · vivant
AIAME Core — mathématiques d'asymétrie
Bibliothèque Rust/WASM de calcul d'asymétrie faciale (Kabsch, Laplacien, spectral) : référence mathématique tenue à jour, sans consommateur actif.
aiame-core est une petite bibliothèque de calcul écrite en Rust, compilable pour le navigateur (WASM), qui mesure l'asymétrie d'un maillage de points 3D — par exemple un visage — sans l'interpréter. Elle ne conclut rien : elle calcule un nombre, une lecture, et un écart par rapport à une mesure antérieure. Aujourd'hui, ce dépôt n'est branché à aucun produit : c'est aiame-miroir, gratuit et public, qui porte l'implémentation réellement utilisée du même corpus mathématique ; aiame-core reste en réserve, corrigé si un bug y est trouvé, prêt si un futur besoin s'en présente. Rien ici n'est vendu, ni même déployé.
Capacités — prouvé, déclaré, absent
prouvéSignature d'asymétrie sur un maillage (centrage + normalisation + distance miroir)src/lib.rs:28-58 (fonction exportée wasm_bindgen `compute_aiame`) + src/core/asymmetry.rs — 4 tests directement sur ce fichier (ex. `hand_derived_golden_value`, `mirrored_pairs_have_zero_asymmetry`), comptés par grep '#[test]', non ré-exécutés dans cette revue (lecture seule).
prouvéDérive mesurée par rapport à une baseline, échec loud (NaN) plutôt que panique wasm sur baseline incompatiblesrc/lib.rs:44-59 (match sur `Option<Vec<f32>>`, `f32::NAN` si longueur différente) + commentaire du code documente le danger corrigé (panic sous `panic="abort"` tuait toute l'instance wasm) — présent parmi les 7 tests de lib.rs, comptés par grep.
prouvéAlignement rigide par l'algorithme de Kabschsrc/math/kabsch.rs — implémenté, 2 tests golden ; MAIS jamais appelé par `compute_aiame`, la seule fonction exportée en WASM (`grep -rn kabsch src/lib.rs` : aucun résultat, seuls `crate::core::asymmetry::*` et `crate::math::geometry::*` sont importés) — inatteignable pour tout consommateur JS aujourd'hui.
prouvéLaplacien de graphe et décomposition spectralesrc/math/laplacian.rs (1 test) + src/math/spectral.rs (`eigen_spectrum`, 2 tests) — golden vectors testés ; jamais appelés hors de leurs propres tests, absents de `compute_aiame` — même situation que Kabsch.
déclaréExport WASM consommable par un frontend (`crate-type = cdylib`, wasm-bindgen)Cargo.toml (`crate-type=["cdylib"]`, dépendance `wasm-bindgen = "0.2"`) + attributs `#[wasm_bindgen]` dans src/lib.rs — mais aucune vérification automatisée actuelle (ni CI GitHub, supprimée, ni le hook pre-push local, qui ne lance que `cargo test` natif) ne construit réellement la cible `wasm32-unknown-unknown` depuis le code présent ; seul artefact `.wasm` trouvé dans target/ date du 21/08 19:11, antérieur à la suppression du module mort (11/09) — pas une preuve à jour.
absentZéro consommateur réel dans l'org (bibliothèque en lecture seule)docs/adr/ADR-CORE-001-perception-b2h-reference.md (revue org-wide 2026-09-10/11, zéro consommateur trouvé, lu intégralement) — recoupé par graph.json (le nœud aiame-core n'a aucune arête entrante ni sortante) et par le README du dépôt lui-même, qui affiche ce statut en titre de section.
prouvéGarde-fous doctrinaux vendorés et vérifiés par somme de contrôle avant chaque pushscripts/CANONICAL.sha256 (source aiame-doctrine/garde-fous, resynchronisé le 2026-09-22, aiame-doctrine#52) + .githooks/pre-push (`sha256sum -c scripts/CANONICAL.sha256`, `cargo test --verbose` depuis #12). VÉRIFIÉ EN DIRECT le 2026-09-29 sur le clone de travail principal : `git config core.hooksPath` retourne `.githooks` (réglage local du clone), le hook y est donc ACTIF, et `sha256sum -c scripts/CANONICAL.sha256` passe (OK sur les deux fichiers). La fiche d'origine affirmait le contraire (hooksPath vide, hook inactif dans ce clone) : affirmation fausse, contredite par mesure directe.
prouvéZéro dépendance frontière IA (LLM) dans le code d'exécutionCargo.lock lu intégralement : seules dépendances wasm-bindgen/nalgebra et leurs transitives — aucune mention openai/anthropic (grep -i vide) ; scripts/garde_fous.sh (GF-1, vendoré, checksum vérifié) grep ces motifs et est exécuté par pre-push.
prouvéÉnergie d'une région du maillage (`region_energy`) — implémentée et testée, jamais câbléesrc/core/regions.rs — 1 test golden (`region_energy_is_the_mean_squared_norm`) ; `grep -rn region_energy` sur tout le dépôt ne montre aucun appel hors de son propre fichier de test — un quatrième module dans la même situation que Kabsch/Laplacien/spectral (implémenté, testé, jamais atteint par `compute_aiame`), absent de la fiche d'origine malgré le motif répété ailleurs dans la même fiche.
Ce qui est absent, en toutes lettres
Aucun consommateur réel dans l'org (ADR-CORE-001, 2026-09-10/11, recoupé par graph.json le 2026-09-29 : le nœud aiame-core n'a aucune arête).
Kabsch, Laplacien, décomposition spectrale ET énergie de région sont implémentés et testés isolément, mais jamais appelés par `compute_aiame`, la seule fonction exportée en WASM — inatteignables pour un consommateur JS aujourd'hui (4 modules dans ce cas, pas 3).
CI GitHub totalement supprimée (pas seulement désactivée) depuis le 2026-09-23 (commit 5a448c7, #11) — aucun répertoire .github/ dans l'arbre, vérifié en direct.
Aucun contrôle, local ou distant, ne construit réellement la cible wasm32-unknown-unknown depuis le code actuel — le hook pre-push ne lance que `cargo test` natif.
Aucune surface de déploiement, frontend ou API — bibliothèque pure, par conception.
Dépend de
aiame-doctrinecopie-doctrinescripts/CANONICAL.sha256 vérifie scripts/garde_fous.sh et scripts/test_garde_fous.sh, copie vendorée depuis aiame-doctrine/garde-fous/, resynchronisée le 2026-09-22 (aiame-doctrine#52) ; intégrité contrôlée par sha256sum dans .githooks/pre-push, HOOK VÉRIFIÉ ACTIF en direct sur ce clone (git config core.hooksPath = .githooks).
—Aucune route Traefik ni sous-domaine ne cible aiame-core dans SCRATCH/graph.json (nœud sans arête) ni ansible/roles/vitrine ; aucune entrée dans SCRATCH/probes-2026-09-29.txt ni SCRATCH/args.json (clé edges). Bibliothèque Rust/wasm sans serveur ni API par construction — le README le dit lui-même (« référence en lecture seule, pas de consommateur actif »).
Modèle de langage
oui — code Rust pur (maths de géométrie/algèbre linéaire), aucune dépendance LLM dans Cargo.lock, GF-1 (garde-fou doctrinal vendoré) le vérifie avant chaque push.
Souveraineté
Bibliothèque sans aucune entrée/sortie réseau : elle prend des tableaux de flottants en paramètre et renvoie un nombre. Compilée en WASM, elle est conçue pour s'exécuter entièrement dans le navigateur du même côté que les données du visage, sans jamais les transmettre à un serveur — mais ce dépôt lui-même n'est aujourd'hui chargé par aucun produit, donc cette propriété n'est démontrée en usage réel que par son jumeau actif, aiame-miroir.
Doctrine incarnée
FACE-6.1
FACE-8.1
E2-SHIPPING-mute-and-unsold
CONST-2.1
COMM-principle
ADR-CORE-001
Tests
7fichiers · 22fonctionsportfolio public 2026-09-24 (carte datée 09-08) : « 22/22 tests réels rejoués en local le 09-08, identique » — recompté par grep '#[test]' le 2026-09-29 sur le code actuel : 22 fonctions confirmées, mais dans 7 fichiers source distincts, pas 8 (core/asymmetry.rs, core/regions.rs, math/kabsch.rs, math/laplacian.rs, math/spectral.rs, math/geometry.rs, lib.rs) ; non ré-exécuté dans cette revue (lecture seule).
Dates
2026-07-28 · 2026-09-11 : ADR-CORE-001 acte le statut « référence en lecture seule » après une revue org-wide n'ayant trouvé aucun consommateur réel, et supprime le module mort src/analysis/monthly_spectral_stability.rs jamais câblé depuis le commit initial (commit 1fbb44d, même jour).
La règle d'un référent visuel commun : pendant une mesure, l'écran montre à tous la même image plutôt que le visage de la personne mesurée. Elle est écrite ici, mais mise en œuvre dans aiame-apod. Le seul code du dépôt est un collecteur d'images spatiales (EU-APOD) : aucun appelant, aucun test, aucune trace d'exécution.
Aiame Motion pose une règle avant toute mesure du visage. Pendant la mesure, l'utilisateur regarde en plein écran une image du jour, la même pour tout le monde : une photo d'astronomie publique qui n'a aucun rapport avec lui. L'écran ne lui renvoie donc pas son propre visage en boucle. Le texte canonique de cette règle est dans aiame-doctrine (MOTION-V0), et le README de ce dépôt en est une copie. Ce dépôt ne la met pas en œuvre : il n'a pas d'interface. C'est le service apod d'aiame-apod qui s'en charge. Son composant Motion gère le plein écran et émet les deux événements définis par la règle, avec la source « aiame-motion ». Le seul code présent ici est un script écrit pour collecter ces images auprès d'organismes scientifiques européens (ESA, ESO). Son propre en-tête le dit : personne ne l'appelle, il n'a aucun test, et la base de données où il devait écrire n'est déployée nulle part. aiame-apod a repris cette fonction en lisant les interfaces publiées de ces organismes, sans aspirer leurs pages.
Capacités — prouvé, déclaré, absent
déclaréDoctrine du référent perceptif communREADME.md : 8 sections, copie textuelle (mise en forme retirée) de aiame-doctrine/MOTION-V0.md, qui est canonique et donne naissance à la clause MOTION-non-personalizable (reference/CLAUSES.yml:403). Aucun fichier d'interface dans ce dépôt (git ls-files = backend/, scripts/, .githooks/, README.md, SOURCES.md).
prouvéMise en œuvre du référent (dans aiame-apod, pas ici)aiame-apod/services/apod/frontend/src/components/Motion.tsx:37 émet aiame:analysis:active/inactive, :76 requestFullscreen ; lib/events.ts:23 source "aiame-motion" ; docs/EVENT-CONTRACT.md:13. https://apod.services.aiame.fr/ a répondu HTTP 200 (probes-2026-09-29.txt:14).
absentOrchestrateur « Aiame Hub » qui reçoit les événementsLe README (§5) dit que les événements sont « captés par Aiame Hub, l'orchestrateur central ». Aucun dépôt de ce nom dans repos.json (vérifié le 2026-09-30).
absentCollecteur EU-APOD (ESA/Hubble/ESO → MongoDB)backend/src/aiame_motion/apod/eu/crawler.py (522 lignes) existe. Son docstring (l.19-47) et SOURCES.md (mesuré le 2026-09-06) indiquent : aucun appelant, la seule mention étant mongodb_import.py:191 `print(" Run crawler.py first!")` ; zéro test ; aucun MongoDB déployé. Revérifié le 2026-09-30 : aucune occurrence de « mongo » dans les fichiers yml/j2/sh d'aiame-infra.
absentTests automatisés du code du dépôtAucun `def test_` ni pytest sous backend/ (grep, 2026-09-30). Le seul harnais présent est la copie vendorée scripts/test_garde_fous.sh, qui teste le garde-fou de l'organisation et pas ce code.
prouvéGarde-fous vendorés (GF-1 à GF-5)`sha256sum -c scripts/CANONICAL.sha256` donne OK sur les 2 fichiers, avec des sommes identiques à aiame-doctrine/garde-fous/ (rejoué le 2026-09-30). garde_fous.sh exécute GF-1 à GF-5 (l.33-77). Copie déclarée dans aiame-doctrine/garde-fous/verifier-copies.sh:64.
prouvéManifeste des domaines tiers cités (GF-5)SOURCES.md nomme les 4 domaines que cite réellement crawler.py (esahubble.org, www.esa.int, www.eso.org, github.com : l.71-94) et déclare pour chacun « jamais appelé depuis ce dépôt » ; GF-5 bloque en l'absence de manifeste.
prouvéVérification locale sans coût ActionsLe commit 4a3da7b (#11, 2026-09-22) supprime .github/workflows/garde-fous.yml. Le commit ef7cd0c (#12, 2026-09-22) remet sha256sum -c dans .githooks/pre-push, qui relance aussi le harnais et garde_fous.sh. core.hooksPath=.githooks est actif sur le clone principal (lu le 2026-09-30).
déclaréMesure de sa propre exposition aux tiers cités (usage interne)Section ajoutée à SOURCES.md le 2026-09-29, en deux fois (commit 1465ff6, #13, puis commit e0b3a02, #14). Le fichier la dit lui-même hypothétique, puisque le collecteur ne tourne pas. Usage strictement interne (DECISION-2026-09-29, décision 2).
Ce qui est absent, en toutes lettres
Aucune mise en œuvre du référent dans ce dépôt (aucun fichier d'interface) : elle existe dans aiame-apod, pas ici
L'orchestrateur « Aiame Hub » censé recevoir les événements, selon le README, n'existe dans aucun dépôt de l'organisation
Aucun test du code du dépôt (aucun `def test_` sous backend/)
Le collecteur n'a aucun appelant et aucun magasin de données déployé ; il ne lit pas robots.txt, et son user_agent pointe encore vers une adresse GitHub de gabarit (crawler.py:94)
SOURCES.md contient deux versions successives de la même section, ajoutées le même jour (#13 puis #14), qui ne concordent pas entre elles
Le hook pre-push demande encore « Ne PAS supprimer garde-fous.yml », alors que ce fichier a été supprimé le 2026-09-22 (#11) : le commentaire décrit une règle abandonnée
Le README désigne l'APOD de la NASA comme source initiale, alors que la mise en œuvre réelle (aiame-apod) lit des archives européennes
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 : les sommes de garde_fous.sh (6558a1be…) et de test_garde_fous.sh (a0b6000b…) sont identiques à celles d'aiame-doctrine/garde-fous/ ; `sha256sum -c` donne OK (2026-09-30).
aiame-doctrinecopie-doctrineREADME.md reprend le texte de aiame-doctrine/MOTION-V0.md, qui est canonique, extrait le 2026-07-28 et figé.
—Ce dépôt n'a aucun serveur HTTP : main.py est un gabarit qui affiche « Hello from python! ». Aucune entrée à son nom dans probes-2026-09-29.txt. La surface publique qui met en œuvre sa règle appartient à aiame-apod (https://apod.services.aiame.fr/, HTTP 200 le 2026-09-29) : elle ne doit pas être attribuée à ce dépôt.
Modèle de langage
oui : backend/pyproject.toml ne dépend d'aucun modèle de langage (beautifulsoup4, httpx, lxml, motor, pymongo, python-dotenv). Le seul code exécutable ne parle à aucun modèle.
Souveraineté
Ce dépôt ne traite aucune donnée aujourd'hui : son collecteur ne tourne pas. S'il tournait, il appellerait des organismes scientifiques européens (ESA, ESO), et son identifiant d'appel pointe encore vers une adresse GitHub de gabarit. La lecture réelle des images passe par aiame-apod, à partir des interfaces publiées de ces organismes. AIAME mesure sa propre exposition à ces tiers en interne avant d'en parler à quiconque.
Doctrine incarnée
MOTION-non-personalizable
FOUND-no-addiction
COMM-principle
GF-1
GF-2
GF-3
GF-4
Tests
1fichiers · 47fonctionsPortfolio public du 2026-09-24 : « Écart doc/réalité majeur : le README décrit un produit d'analyse biométrique, le code réel est un scraper d'images sans rapport — ni l'un ni l'autre n'a de test ni de preuve de déploiement ». Les chiffres ci-dessus comptent les 47 cas du harnais vendoré scripts/test_garde_fous.sh (copie identique à celle d'aiame-doctrine) : zéro test porte sur le code propre du dépôt (mesuré le 2026-09-30). Depuis, la mesure publique est partiellement dépassée : le référent est mis en œuvre et en ligne via aiame-apod.
Dates
2026-02-02 · 2026-09-06 : SOURCES.md et l'en-tête de crawler.py écrivent l'état réel du collecteur (aucun appelant, aucun test, aucune infrastructure) au lieu de le laisser passer pour un collecteur actif (commit e1c78fb)
Une pause sur l'image du jour, la même pour tout le monde, suivie au plus une fois d'une question de recherche facultative sur ce qui a été regardé. Huit champs montrés avant envoi, un reçu, un retrait qui efface. Rien sur la personne.
La Pause reprend l'image du jour d'aiame-apod et son mouvement minimal de dix secondes. Quand on en sort, et seulement après un cycle complet, sans réglage « mouvement réduit » et pour la première fois sur ce navigateur, une question facultative est proposée : avez-vous remarqué quelque chose changer ? La réponse vérifie une affirmation de la doctrine jamais mesurée, selon laquelle le mouvement est perceptible sans être interprétable. Ce qui serait envoyé est montré en entier avant l'envoi. Un reçu permet ensuite de vérifier sa ligne dans le jeu de données publié, ou de la retirer. La page d'après est la même pour tout le monde, qu'on ait répondu ou non.
Capacités — prouvé, déclaré, absent
prouvéContribution fermée à huit champsbackend/src/aiame_pause/contribution.py : extra="forbid", StrictInt/StrictBool. backend/tests/test_contract.py refuse six champs ajoutés et toute coercition ; mutations vérifiées le 2026-09-30 (schéma ouvert : 6 échecs ; int au lieu de StrictInt : 2 échecs).
prouvéAucune adresse conservée, aucun cookiebackend/Dockerfile lance uvicorn avec --no-access-log ; backend/tests/test_privacy.py exécute ce CMD exact et cherche une adresse marqueur, avec contrôle positif sans le drapeau. Aucun module ne lit request.client (test AST). Aucune route ne pose de cookie (test sur toutes les routes).
prouvéRetrait qui efface les octetsbackend/src/aiame_pause/store.py réécrit le fichier du jour sans la ligne ; backend/tests/test_withdrawal_and_dataset.py vérifie que l'identifiant n'apparaît plus nulle part sous le répertoire de données. Mutation « retrait sans effet » : 4 échecs.
prouvéMême page après la pause pour tout le mondefrontend/tests/after.test.js : huit parcours rendent un HTML identique, sans remerciement ni compteur. Vérifié une fois dans Chromium sans interface le 2026-09-30 (HTML identique entre « envoyé » et « refusé »).
déclaréProtocole de recherche pré-enregistrédocs/PROTOCOL.md, écrit avant toute réponse : question, conditions, limites (pas de vraie condition témoin, image du jour confondue avec le mouvement, auto-sélection). Le seuil de 200 premières réponses par mouvement est une proposition non relue.
absentService en ligneAucune route aiame-infra pour /pause/ ni /pause/api/ au 2026-09-30 ; publier reste une décision humaine (CLAUDE.md, règle 10).
Ce qui est absent, en toutes lettres
Non déployé : aucune route, aucune donnée collectée
Aucun produit hôte n'intègre la pause ; le contrôle G4 (aucune requête avant un clic dans le produit hôte) n'existe donc pas
Licence du jeu de données non décidée ; /dataset le dit au lieu d'en impliquer une
Le parcours complet dans un vrai navigateur a été vérifié une fois, il n'est pas automatisé
Le seuil de 200 premières réponses par mouvement n'a été relu par personne
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 : garde_fous.sh (6558a1be…) et test_garde_fous.sh (a0b6000b…), mêmes sommes qu'aiame-doctrine/garde-fous/ sur origin/main (2026-09-30).
aiame-apodvendoré-checksumvendored/CANONICAL.sha256 : frontend/motion.css (bloc Motion d'apod, octet pour octet) et vendored/aiame-eu/motion.py (référence de la règle aiame-motion-by-date/1), comparés au checkout aiame-apod voisin par les tests.
aiame-apodappel-servicefrontend/src/main.js lit /api/apod (même domaine, credentials "omit") pour l'image et le mouvement du jour.
Consommé par
—
Surface publique
—Non déployé au 2026-09-30 : aucune route aiame-infra pour /pause/ ni /pause/api/.
Modèle de langage
oui : backend/pyproject.toml dépend de fastapi, pydantic et pydantic-settings, et d'aucun modèle de langage. Aucun import de client HTTP dans backend/src (test AST).
Souveraineté
Aucun appel sortant côté serveur. La page ne lit que l'API publique d'apod, sur le même domaine. Rien n'est déployé à ce jour, donc aucune donnée n'est traitée.
Doctrine incarnée
FOUND-no-addiction
E2-SHIPPING-mute-and-unsold
MOTION-non-personalizable
UAX-LOI-APPRENTISSAGE-CONSENTI
CONST-7.1
GF-1
GF-2
GF-3
GF-4
Tests
7fichiers · 37fonctionsnon vérifié — dépôt créé le 2026-09-30, absent de portfolio-public.txt. Le compte additionne 25 def test_ dans backend/tests (54 cas une fois paramétrés, 54 passés le 2026-09-30) et 12 test( dans frontend/tests (12 passés), vérifié par grep.
Dates
2026-09-30 · 2026-09-30 : construit comme aiame-eu/services/pause (aiame-eu#21), puis extrait avec son historique dans son propre dépôt le même jour (décision propriétaire)
Pile
Python 3.12, FastAPI + pydantic (strict), fichiers JSONL en ajout seul, sans base de données, HTML + modules ES sans framework ni compilation, node --test (sans dépendance), shell sh/bash (garde-fous vendorés, hook pre-push)
aiame-hand · lecture manuscrite · bêta interne
AIAME HAND
Bêta interne : une page manuscrite photographiée est lue par un modèle de vision auto-hébergé chez AIAME, jamais présentée comme fiable par défaut.
AIAME HAND est une bêta interne accessible sur hand.dev.aiame.fr : on dépose la photo (ou le PDF) d'une page écrite à la main, et un modèle de lecture d'image installé sur un serveur propre à AIAME la retranscrit en texte, sans jamais envoyer l'image à un service extérieur. Un bandeau reste affiché en permanence pour rappeler que la lecture peut inventer des mots sur une page dense — elle ne remplace jamais une relecture humaine. Un parent peut donner un accusé simple (nom et e-mail, sans vérification d'identité) pour l'usage par un adolescent de 16 à 18 ans ; le cas des 11-14 ans n'est pas encore traité. Le projet vise à terme un objectif plus ambitieux — apprendre l'écriture d'une seule personne dans la durée — mais n'y est pas encore.
Capacités — prouvé, déclaré, absent
prouvéTranscription manuscrite via modèle de vision auto-hébergébackend/app/api/transcribe.py (POST /transcribe → Ollama, un modèle vision hébergé sur le réseau privé) ; backend/app/config.py:3 OLLAMA_HOST pointe un serveur AIAME du réseau privé ; sonde 2026-09-29 : GET https://hand.dev.aiame.fr/api/health → 200 {"status":"ok"}
prouvéCalibration few-shot par exemples réels (alphabet/chiffres + corrections)backend/app/api/transcribe.py:_build_messages() + backend/app/api/calibration.py + backend/app/models.py (CalibrationSample) ; commentaire daté 2026-09-27 dans config.py : mesuré en direct, les corrections réelles suppriment la fabrication sur page dense, l'alphabet seul non
prouvéBandeau de fiabilité toujours visiblefrontend/src/app/page.tsx:186 — "⚠️ Bêta — la transcription peut être inventée, pas seulement approximative."
prouvéAucune image envoyée à un tiers (modèle sur infrastructure propre AIAME)backend/app/config.py:3 OLLAMA_HOST pointe un serveur AIAME du réseau privé ; aucun import openai/anthropic/gemini dans backend/app/ (grep vérifié) ; conforme au garde-fou GF-1 vendoré (scripts/CANONICAL.sha256, somme vérifiée en pre-push, source aiame-doctrine:garde-fous/garde_fous.sh)
déclaréContrôle parental (accusé déclaratif, palier 16-18 ans)backend/app/api/parent.py + backend/app/config.py (PARENT_CONSENT_TEXT) — mécanisme câblé (endpoint, table ParentAcknowledgment) mais le code lui-même le qualifie de "zéro vérification d'identité au-delà de la saisie", pas une vérification d'âge réelle
prouvéFonctionnement hors ligne partiel (coquille PWA)frontend/public/sw.js — precache la coquille (page/JS/CSS/icônes/worker pdf.js) ; commentaire explicite dans le fichier : "/api/* : toujours le réseau, jamais le cache" (la transcription elle-même n'est jamais mise en cache)
prouvéCouverture e2e (Playwright) du parcours principal dépôt→lecturefrontend/e2e/hand.spec.ts — 4 fonctions test() vérifiées par grep : accueil+zone de dépôt, manifeste PWA/service worker, dépôt d'image (attend une issue honnête — succès, modèle occupé ou timeout — jamais un silence, capture d'écran), bouton caméra dédié. Ne couvre ni /calibration ni /parent, et n'affirme jamais l'exactitude du texte transcrit — seulement que l'état "en cours" se termine.
absentAuthentification utilisateurbackend/app/config.py:1 — le code lui-même : "no secrets, no auth (internal beta, same posture as poc-profil)"
absentCouverture de test backend au-delà du contrôle de santébackend/tests/ ne contient qu'un fichier de test, test_health.py, une seule fonction (grep -c 'def test_' backend/tests/*.py = 1) ; rien pour /transcribe, /calibration, /parent côté backend — l'e2e Playwright (capacité séparée ci-dessus) couvre le parcours de dépôt depuis le navigateur mais pas ces trois endpoints unitairement, ni /calibration ni /parent du tout
Ce qui est absent, en toutes lettres
Aucune authentification (bêta interne, assumé explicitement dans le code : "no secrets, no auth")
Couverture de test backend quasi nulle : un seul fichier, une seule fonction (test_health) ; l'e2e Playwright couvre le parcours de dépôt principal mais rien pour /calibration ni /parent
Aucun ADR ni documentation de décision versionnée dans docs/ — ce dossier ne contient que deux fichiers de données d'échantillon (une capture d'écran et un PDF), pas de texte de doctrine
Pas de portée multi-compte : CalibrationSample et ParentAcknowledgment sont conçus pour un seul foyer/utilisateur (docstring du code lui-même dans backend/app/models.py)
Palier 11-14 ans (légalement bloquant, consentement conjoint requis) explicitement non traité — le texte de consentement actuel ne doit pas être réutilisé tel quel pour ce palier (commentaire de backend/app/config.py)
Contrôle parental non vérifié d'identité : un déclaratif nom+email suffit, jamais présenté comme fort dans le code
Dépend de
aiame-doctrinevendoré-checksumaiame-hand/scripts/CANONICAL.sha256 — garde_fous.sh et test_garde_fous.sh vendorés depuis aiame-doctrine/garde-fous/, intégrité vérifiée par sha256sum en pre-push
aiame-onecopie-doctrinefrontend/src/app/page.tsx:10-12 — commentaire explicite dans le code : la forme de la zone de dépôt (clic + glisser-déposer + capture caméra dédiée) est "adapted from ... via aiame-one/frontend/src/components/UploadDropzone.tsx" ; lien absent du graphe statique (aiame-cartographe) mais trouvé par lecture directe du fichier
https://hand.dev.aiame.frsonde lecture seule du 2026-09-29 (probes-2026-09-29.txt) : GET https://hand.dev.aiame.fr/api/health → 200 {"status":"ok"} ; aucune autre route sondée ce jour-là — absent de portfolio-public.txt (2026-09-24), donc non listé publiquement malgré un endpoint qui répond. Route Traefik publique confirmée dans l'infra (hand-api sous /api, hand-web sur le host nu) : l'exposition n'est pas un artefact de test, c'est un déploiement réel en production sur le sous-domaine dev.
Modèle de langage
non. Utilise un modèle vision hébergé sur un serveur AIAME du réseau privé : aucun appel à un fournisseur commercial (OpenAI/Anthropic/Gemini), conforme au garde-fou GF-1 vendoré.
Souveraineté
Image et modèle restent sur l'infrastructure propre d'AIAME (réseau privé, aucun tiers) ; mais aucune authentification aujourd'hui et dépendance à une seule machine GPU partagée sans redondance connue.
Doctrine incarnée
GF-1
B2H-A2.1
CONST-1.2
UAX-LOI-APPRENTISSAGE-CONSENTI
Tests
2fichiers · 5fonctionsnon vérifié — aiame-hand absent de portfolio-public.txt (2026-09-24), aucune mesure publique datée trouvée. Le compte (2 fichiers, 5 fonctions) additionne backend/tests/test_health.py (1) et frontend/e2e/hand.spec.ts (4), vérifié par grep.
Dates
2026-09-27 (dates.txt ; dernier push 2026-09-29 selon dates.txt — le clone local lu pour cette revue ne montre que jusqu'au 2026-09-28 14:08, probablement un simple retard de fetch local, non réconcilié ici) · 2026-09-27 : cause racine d'un blocage réseau (une taille de paquet mal réglée sur le réseau privé) trouvée et corrigée le jour même du premier commit, documentée dans aiame-infra et dans le README du dépôt, permettant la première mesure réelle de lecture manuscrite ce jour-là.
Pile
FastAPI, SQLModel, SQLite, httpx, Next.js (App Router, export statique), pdf.js 4.10.38, PWA (manifest + service worker écrit à la main), Ollama (modèle vision hébergé sur le réseau privé), Playwright (e2e)
aiame-miroir · visage + main · déployé
Aiame Miroir
Instrument gratuit qui mesure la géométrie du visage et de la main dans le navigateur, sans aucune interprétation, sans serveur, sans compte.
Aiame Miroir affiche des mesures de géométrie du visage et de la main — position, angle, symétrie — calculées entièrement dans votre navigateur, jamais envoyées ailleurs. Le panneau de mesure n'interprète rien : seulement des chiffres reproductibles. Une couche de lecture narrative optionnelle, désactivée par défaut et réversible en un clic, s'affiche avec la mention « Lecture non-factuelle — projection narrative, pas une mesure ». C'est une démonstration gratuite et sans compte, muette et jamais vendue.
Capacités — prouvé, déclaré, absent
prouvéViseur muet — l'image caméra n'est jamais peinteAucun appel drawImage() dans frontend/src (grep exhaustif, revérifié) ; seuls ctx.clearRect/fillRect peignent le maillage et un fond opaque — frontend/src/hooks/useMediaPipe.ts:139-170, frontend/src/components/DeuxVous.tsx:213
prouvéZéro requête réseau pendant une session de capturefrontend/tests/egress.spec.ts lu intégralement (revérifié) : intercepte toute requête sortie, échoue si une seule quitte localhost, contrôle positif sur hand_landmarker.task. Dernière exécution automatique documentée publiquement : portfolio-public.txt (2026-09-08), job egress vert — non rejouée depuis, voir capacité suivante
prouvéModèles MediaPipe vendorés, sha256 épinglé, téléchargés seulement à l'installationfrontend/scripts/download-models.js:36-50 (URL storage.googleapis.com + sha256 vérifié avant écriture, revérifié) ; frontend/.gitignore ignore public/mediapipe/
prouvéGarde-fous doctrinaux vendorés depuis aiame-doctrine, intégrité vérifiablesha256sum -c scripts/CANONICAL.sha256 rejoué en direct pendant cette revue (lecture seule, depuis la racine du dépôt) → OK pour scripts/garde_fous.sh et scripts/test_garde_fous.sh
déclaré133 fonctions de test comptées (77 Rust, 53 frontend, 3 sessions e2e), non rejouées automatiquement depuis le 22/09Compte direct par grep, revérifié indépendamment, non exécuté (règle de revue) : wasm/src 77 #[test] (lib.rs 45, unified.rs 19, deux_vous.rs 13) ; frontend/src/lib 53 test(/it( sur 3 fichiers ; frontend/tests 3 fichiers .spec.ts — 9 fichiers de test au total. README (daté 27/08) cite 72 tests Rust — le dépôt a évolué depuis, le chiffre n'a pas suivi. Le workflow qui lançait cargo-test/frontend/egress a été supprimé le 22/09 (commit e14ff5a, confirmé par git show) et .githooks/pre-push (lu intégralement) ne mirroite que CANONICAL.sha256, test_garde_fous.sh, garde_fous.sh et un check media-biométrique
déclaréLint de vocabulaire dérivé de la CHARTE-COMMUNICATION — présent et câblé en script, lancé à la main seulementfrontend/scripts/lint_vocabulaire.sh : motifs regex dérivés des catégories de vocabulaire que la CHARTE-COMMUNICATION interdit (médical, psychologique interprétatif, bien-être normatif). La liste exacte n'est pas reproduite ici, pour ne pas publier ce que le contrôle cherche (même règle que DECISION-2026-09-13-red-report-redaction.md). Script lancé par npm run lint:vocabulaire, confirmé présent et câblé. Il est absent de .githooks/pre-push et du job CI supprimé le 22/09 : rien ne le fait tourner automatiquement aujourd'hui.
absentAnalyse d'impact RGPD art. 9 (AIPD/DPIA) et registre des traitementsdocs/RGPD-ART9-ANALYSE.md le déclare lui-même : 'Ce n'est pas une analyse d'impact (AIPD/DPIA)… Aucun de ces artefacts n'existe pour cet espace de travail à ce jour' — pas de base légale documentée, pas de texte de consentement dédié avant capture caméra
absentConformité au référentiel Aiame MotionREADME.md, section « État honnête » : explicitement reportée à une décision humaine, non traitée dans ce dépôt
Ce qui est absent, en toutes lettres
Aucune AIPD/DPIA ni registre des traitements RGPD (le dépôt le déclare lui-même, docs/RGPD-ART9-ANALYSE.md)
Aucun texte de consentement RGPD dédié avant capture caméra — seule la permission native du navigateur (même document)
Depuis la suppression du workflow CI le 2026-09-22 (commit e14ff5a), aucune preuve d'exécution automatique de cargo-test / vitest / egress.spec.ts — .githooks/pre-push ne mirroite que le job garde-fous, pas les 3 autres jobs qu'avait le workflow supprimé
README « état honnête » daté du 27/08 cite 72 tests Rust ; compte direct aujourd'hui (grep) : 77 — non mis à jour depuis
Conformité au référentiel Aiame Motion, explicitement reportée à une décision humaine (README)
lint_vocabulaire.sh existe et est câblé en script npm mais n'est appelé par aucun garde-fou automatique aujourd'hui (ni pre-push, ni CI)
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 (garde_fous.sh + test_garde_fous.sh vendorés depuis aiame-doctrine/garde-fous/) ; sha256sum -c rejoué en direct aujourd'hui → OK. Confirmé unique lien réel : graph.json ne montre aucune arête sortante d'aiame-miroir vers un autre dépôt aiame-fr, seulement une route entrante (internet → aiame-miroir)
https://miroir.dev.aiame.fr/Sondé en direct aujourd'hui (SCRATCH/probes-2026-09-29.txt) : GET → 200, HTML servi avec CSS /miroir. Le README et le portfolio public citent la forme https://dev.aiame.fr/miroir/ (chemin, daté 2026-08-27) — la forme observée aujourd'hui est un sous-domaine (miroir.dev.aiame.fr), cohérente avec les autres services sondés le même jour (price., hand., health.) : dérive de convention de routage non confirmée au niveau infra dans cette revue (repo aiame-infra hors périmètre).
Modèle de langage
oui — instrument purement géométrique (WASM + landmarks), aucune dépendance à un modèle de langage dans package.json ni Cargo.toml (revérifié par grep)
Souveraineté
Aucune donnée biométrique ne quitte jamais le navigateur de la personne : la question de souveraineté se déplace en amont, sur l'hébergement du code et des modèles vendorés, pas sur un flux à protéger en transit ou au repos.
Doctrine incarnée
E2-SHIPPING-mute-and-unsold
B2H-A2.2
B2H-A3.1
B2H-A6.3
B2H-A1.3
B2H-A5.1
Tests
9fichiers · 133fonctionsportfolio-public.txt (2026-09-08) : « dev.aiame.fr/miroir/ live, vérifié en direct — quatre jobs CI distincts (cargo-test 72 tests, frontend, egress zéro-fuite) » ; régression notée le 24-09 (Actions redésactivé) et workflow supprimé le 22-09 (commit e14ff5a) — aucune exécution automatique documentée depuis
Dates
2026-08-18 · 2026-08-27 (phase 6) : frontend Next.js déployé en direct — viseur muet qui ne peint jamais l'image caméra, six refus explicites avant toute capture ; sondé 200 en direct le 2026-09-29
Le dépôt qui construit et déploie toute la flotte : serveurs, certificats, garde-fous testés par mutation, règles d'accès du réseau privé écrites et appliquées.
C'est la salle des machines : ce dépôt commande les serveurs, pose les certificats de sécurité et livre chaque autre service AIAME dessus. Il ne vend rien lui-même ; il rend possible que les autres soient joignables, chiffrés et sauvegardés. Fin septembre 2026, l'équipe a découvert que le réseau privé partagé entre AIAME et son partenaire n'avait jamais eu de règles d'accès écrites. Elle a écrit puis appliqué cette politique en une dizaine de correctifs sur deux jours (dépôt privé), dont un test en aperçu qui a évité de bloquer l'accès du propriétaire lui-même avant l'application réelle. Les vérifications tournent en local avant chaque envoi de code (aucune minute de calcul payante consommée), avec un harnais qui fabrique délibérément des fautes pour prouver que les gardes les détectent.
Capacités — prouvé, déclaré, absent
prouvéProvisionnement des serveurs (Terraform, hébergeur Hetzner)Trois modules sous terraform/ (serveur, DNS, bordure ; fichiers .tf réels, vérifiés sur disque) ; Makefile cibles tf-init/tf-plan/tf-apply/tf-validate (lignes 78-126) ; README.md ligne 56 : type de serveur et centre de données déclarés, vérifiés tels quels
déclaréDéploiement orchestré (Ansible, Traefik v3, conteneurs Docker, certificat wildcard auto-renouvelé)README.md décrit le mécanisme ACME/Let's Encrypt ; ansible/roles/vitrine/tasks/main.yml (1196 lignes, vérifiées wc -l) câblé et invoqué par `make play-vitrine` — code câblé vu, mais aucun journal de renouvellement réel consulté (lecture seule)
prouvéGarde-fous doctrinaux vendorés, prouvés par un harnais de mutation qui fabrique la fautescripts/garde_fous.sh (GF-1 à GF-4 confirmés par grep) + scripts/CANONICAL.sha256 (checksum vs aiame-doctrine, confirmé aussi dans vendoring.txt) ; scripts/test_garde_fous.sh : 452 lignes (wc -l) et exactement 47 appels de la fonction `verifier` (grep -cE, recompté indépendamment), chacun doublé faute/propre
prouvéAuto-vérification de l'écosystème sur une tâche planifiée du serveur (pas de CI payante)ansible/roles/red-selfaudit/ et ansible/roles/guard-watch/ (dossiers tasks/templates/defaults/files réels, vérifiés sur disque) ; portfolio-public.txt ligne 145 corrobore : guard-watch réellement déployé, timer systemd hebdomadaire, cycle échec/alerte/récupération daté du 19/09
prouvéPolitique de contrôle d'accès réseau écrite pour le réseau privé partagédocs/gap-tailnet-acl-policy.md + docs/policy-proposal/policy.hujson (existent, contenu vérifié) ; git log : la politique est en fait 10 commits (#136, #139, #140, #142-145, #148-150 — pas 12, et pas '#139 à #150' tel quel : #141/#146/#147 sont des correctifs `vitrine` sans rapport intercalés dans la même plage de numéros de PR), datés du 2026-09-27 (01:04, #136, constat du trou) au 2026-09-28 (15:10, #150) — PAS 2026-09-26. Le verrouillage évité (#148, 2026-09-28 14:35) est confirmé par le message de commit lui-même.
prouvéTransfert chiffré de secrets vers un serveur, sans jamais les afficher ni les écraserscripts/push_secret.sh (chiffrement 'age' confirmé ligne 99, clé éphémère générée côté serveur, refuse d'écraser une destination existante sauf --force, confirmé lignes 56-82) + scripts/test_push_secret.sh (132 lignes, confirmé wc -l)
déclaréDéchiffrement automatique du disque au démarrage d'un serveur, sans démarrage silencieux d'un service sur un volume videRôle Ansible dédié dans ansible/roles/ (dossiers vérifiés sur disque). Il répond à une décision datée d'aiame-doctrine du 2026-09-26, qui documente une panne réelle d'environ 23 heures d'un serveur AIAME du réseau privé avant ce correctif (confirmée par une seconde décision du même jour). Aucun redémarrage réussi de ce mécanisme n'a été observé dans cette revue : l'existence du rôle prouve le code, pas son fonctionnement.
absentPorte de vérification de bout en bout (frontend+backend) avant fusion d'une PRdocs/proposition-porte-ci-e2e.md, ligne 3 : 'Brouillon, non décidé', daté 2026-08-27 ; toujours à ce statut à la date de cette revue (2026-09-29), 33 jours sans décision ni pour ni contre ; portfolio-public.txt ligne 59 le confirme déjà publiquement : 'aiame-infra certif. e2e absente'
Ce qui est absent, en toutes lettres
Porte de vérification e2e (frontend+backend) avant fusion : proposition seulement, 'Brouillon, non décidé' depuis le 2026-08-27 (docs/proposition-porte-ci-e2e.md), toujours sans décision au 2026-09-29 — confirmé aussi publiquement (portfolio-public.txt).
Pas de dossier docs/adr/ formel dans ce dépôt (confirmé, listing de docs/) — les décisions vivent dans docs/gap-*.md (constats) et dans les DECISION-*.md d'aiame-doctrine, pas dans un format ADR numéroté local.
Aucune preuve d'exécution réelle et datée du renouvellement TLS ou des sauvegardes sov (code câblé vu, journal d'exécution non consulté — lecture seule).
Dépend de
aiame-doctrinevendoré-checksumscripts/CANONICAL.sha256 — copie vendorée et datée de garde_fous.sh (GF-1..4), checksum vérifiable, confirmée aussi dans vendoring.txt
aiame-doctrinedépendance-cheminansible/roles/vitrine/tasks/main.yml — invoque directement aiame-doctrine/legal/build_legal.py et build_legal_sov.py au déploiement (confirmé, contenu et zone du fichier vérifiés)
aiame-fr.github.iodépendance-cheminansible/roles/vitrine/tasks/main.yml — 'Deploy static site tree (source of truth = aiame-fr.github.io repo, .html/.json only)' (confirmé mot pour mot)
aiame-sovdépendance-cheminansible/roles/vitrine/tasks/main.yml — pages légales générées et committées dans aiame-sov (PR sov#39), déployées depuis là ; confirmé aussi par graph.json ('internet' -> aiame-sov, routes sov-api/sov-web, ansible/roles/vitrine/defaults/main.yml:268,280)
aiame-servicesdépendance-cheminREADME.md lignes 81-91 § sov.aiame.fr et svcmgr.aiame.fr — 'built ON THE BOX from rsynced source' (confirmé mot pour mot)
aiame-apoddépendance-cheminansible/roles/vitrine/tasks/main.yml — build pnpm @aiame/apod-frontend requis avant déploiement (confirmé)
aiame-miroirdépendance-cheminansible/roles/vitrine/tasks/main.yml — build pnpm aiame-miroir-frontend requis avant déploiement (confirmé) ; corroboré par graph.json ('internet' -> aiame-miroir, route /miroir, defaults/main.yml:431)
aiame-handdépendance-cheminansible/roles/vitrine/tasks/main.yml — build aiame-hand/frontend requis avant redéploiement (confirmé) ; corroboré par graph.json ('internet' -> aiame-hand, routes hand-api/hand-web, defaults/main.yml:778,785)
aiame-agri-gersdépendance-cheminansible/roles/vitrine/tasks/main.yml — déploiement source backend+frontend gers et sa variante 'dev' (confirmé)
aiame-authdépendance-cheminansible/roles/vitrine/tasks/main.yml — déploiement de la clé publique aiame-auth (publiée, pas secrète, ADR-AA-001) (confirmé) ; corroboré par graph.json ('internet' -> aiame-auth, route auth-svc, defaults/main.yml:499)
aiame-angelroute-publiqueLIEN MANQUANT dans la fiche initiale. ansible/roles/vitrine/defaults/main.yml, lignes ~464-486 : routes Traefik publiques angel-api/angel-web vers angel.services.aiame.fr, confirmées aussi par graph.json ('internet' -> aiame-angel, routes 'angel-api'/'angel-web'). Nuance importante : le commentaire du fichier dit explicitement que ce n'est PAS un déploiement de code. L'application tourne sur un serveur AIAME du réseau privé, jamais copiée sur le serveur public, et rien n'y est construit ; si ce serveur privé est indisponible, ces routes répondent 502. C'est donc un simple relai réseau public (reverse-proxy), pas une dépendance de build ou de déploiement comme les autres entrées ci-dessus.
—Dépôt privé, sans service web propre : c'est l'infrastructure qui héberge les autres, pas un site en soi. dates.txt le marque « privé » ; aucune entrée ne le concerne dans les sondes HTTP du jour (probes-2026-09-29.txt, zéro résultat sur 'infra').
Modèle de langage
nuancé. GF-1 (interdiction des fournisseurs frontière dans le chemin d'exécution) est appliqué et prouvé par le harnais de mutation. Mais ce dépôt contient lui-même un appel réel à un modèle de langage : un script de test de charge (locustfile.py) sonde un modèle de langage auto-hébergé sur un serveur AIAME du réseau privé pour mesurer la capacité d'inférence sous charge. C'est un LLM local, hors du périmètre de GF-1 (qui vise les fournisseurs frontière externes, pas l'auto-hébergé), mais c'est bien un appel à un LLM dans le code de ce dépôt. La formulation « aucun appel à un modèle de langage dans ce dépôt » était donc fausse ; d'autres dépôts qu'il déploie (rag, sov…) appellent par ailleurs des LLM, hors périmètre de cette capacité.
Souveraineté
Hébergement loué chez Hetzner, sous contrôle AIAME ; certificat TLS auto-géré (Let's Encrypt) plutôt que délégué à un CDN tiers ; aucune dépendance à un grand fournisseur de cloud constatée dans ce dépôt (grep ciblé sur AWS/GCP/Azure/Cloudflare : zéro résultat dans terraform/, ansible/, README.md).
11fichiers · 47fonctionsnon vérifié — aucune mention d'aiame-infra trouvée dans portfolio-public.txt concernant un compte de tests spécifique à ce dépôt (les seules occurrences 'infra'+'test' concernent aiame-red, pas aiame-infra lui-même) ; comptage refait indépendamment par grep direct sur ce dépôt (hors .venv, node_modules, __pycache__ et le worktree imbriqué) : 11 fichiers (9 .sh + 2 .py, recompté find -iname '*test*'), 'fonctions' = 47 appels de la fonction `verifier` dans scripts/test_garde_fous.sh seul (recompté grep -cE), le plus dense des 11 fichiers de test
Dates
2026-02-05 · 2026-09-27/28 — première politique de contrôle d'accès jamais écrite pour le réseau privé partagé (avant : tout appareil pouvait joindre tout autre), constatée le 2026-09-27 (01:04, commit #136) et appliquée en une dizaine de correctifs (dépôt privé) jusqu'au 2026-09-28 (15:10, commit #150), incluant un test en aperçu ayant évité un verrouillage du compte propriétaire avant application réelle (#148, 2026-09-28 14:35) — la fiche initiale datait ce jalon '2026-09-26/27', ce qui ne correspond à aucun commit réel de cette série.
Pile
Terraform, Ansible, Traefik v3, Docker / Docker Compose, Bash, Python (scripts d'alerte, sondes), systemd (timers de sauvegarde et d'auto-audit)
Les principes dont le code est extrait
LOI-PREUVE · STILL BINDING
La Loi de la Preuve
Tout chiffre affiché et toute recommandation portent leur provenance, cliquable jusqu'à la pièce source (facture, relevé, contrat). Un indicateur non mesuré s'affiche en gris honnête, jamais en vert fabriqué : ce que le moteur ne sait pas prouver, il ne l'affirme pas.
Si quelque chose est incertain ou inconnu, AIAME le dit — « je ne sais pas » plutôt qu'une fausse assurance. Un état s'écrit ABSENT en toutes lettres quand il l'est ; un avancement se déclare avec sa preuve (test, mesure, capture), jamais sur la foi d'un README.
Depuis le 28 juillet 2026, AIAME court sur deux branches cloisonnées : E3, la plateforme locale pour TPE/PME, est l'organe de revenu ; E2, la science de l'asymétrie du visage et de la main, est le cœur protégé. Une part fixe du revenu net de E3 est réservée à la recherche E2, traçable publiquement — le principe est fixé, le pourcentage ne le sera que lorsque E3 aura un revenu.
La science du visage et de la main peut être montrée publiquement, gratuitement et sans compte, à condition de rester muette — des signaux mesurés, zéro interprétation — et de n'être jamais vendue. La règle de communication tient en une ligne : Aiame montre, l'utilisateur comprend, nous ne concluons pas.
Rien n'est vendu avant d'être propre de bout en bout
Première doctrine de l'organisation : aucune capacité n'est mise en vente tant qu'elle n'est pas entièrement propre et démontrée de bout en bout dans un bac à sable réel. Un prix affiché sans infrastructure derrière n'est pas une imprécision marketing, c'est une violation — l'offre « Veille continue » d'aiame-red a été retirée de la vente le 19 août 2026 pour cette raison. À ce jour, aucun service AIAME n'est vendu : au plus proposé en bac à sable.
AIAME s'engage à publier, pour chaque service qui serait vendu, son ratio coût/revenu cumulé sur toute sa vie — conditionné à la seule vérifiabilité du grand livre, jamais à l'allure du chiffre. Aujourd'hui le grand livre affiche gris honnête : aucune commande réelle n'existe, et un service non câblé pour la vente s'affiche comme tel, pas comme « 0 € ».
GARDE-FOU-PROUVE · pratique dérivée du travail, datée 2026-08-01 (hors registre CLAUSES.yml) ; GF-1 à GF-4 STILL BINDING
Un garde-fou jamais vu échouer ne prouve rien
Un contrôle qui affirme « il n'y a aucun X » ne vaut rien tant qu'on n'a pas montré qu'il sait voir un X : on fabrique la violation, on vérifie que le contrôle rougit, on restaure. Les garde-fous d'AIAME (pas de modèle frontière en exécution, pas de secret dans l'arbre, discours contre mesure) sont eux-mêmes éprouvés par un harnais de cas exécutables où chaque contrôle est doublé d'une contre-épreuve, et l'ancrage d'horodatage a été testé en altérant un seul octet.
Local d'abord : les données restent chez l'entreprise
Local par défaut, déployable sous le contrôle de l'utilisateur ; le cloud est toujours optionnel et les données de l'entreprise lui appartiennent. Dans le chemin d'exécution d'un produit audité, aucun modèle frontière : les modèles sont remplaçables et la logique métier n'est jamais couplée à l'un d'eux — un garde-fou bloquant, copié et vérifié par somme de contrôle dans chaque dépôt, le contrôle.
aiame-doctrine:CONSTITUTION.md#2-Privacy-is-a-Human-Right (CONST-2.1) ; aiame-doctrine:AIAME_CODING_AGENT.md#Local-First et #AI-Layer (CODING-ai-layer) ; aiame-doctrine:garde-fous/garde_fous.sh#GF-1 (GF-1)
NON-COMPARATIF · STILL BINDING ; le périmètre commercial de B2H est NEEDS OWNER CONFIRMATION depuis le 2026-09-28 (MISSION-b2b-buyer-only, DECISION-2026-09-28-b2h-third-branch.md)
B2H : jamais de scoring, jamais de comparaison
B2H — Business to Human — est la relation dans laquelle l'humain est le bénéficiaire final : tarification juste et transparente, aucune pression, aucun scoring, aucune comparaison avec d'autres. Deux humains ne sont jamais comparés directement.
AIAME prépare tout et n'exécute rien à effet externe — envoi, paiement, signature, publication — sans validation humaine explicite. L'IA fournit un appui à la décision, avec ses sources et sa confiance ; la décision appartient aux humains. Rendre public, déployer, ouvrir une porte : décision humaine, jamais automatisée.
Le code public n'est jamais écrit, il est extrait — et horodaté
Les textes fondateurs sont des documents historiques conservés mot pour mot ; on les corrige par une nouvelle version datée, jamais en éditant l'ancienne. Toute projection publique se régénère depuis cette source, et chaque dépôt de la flotte porte une copie des garde-fous vérifiée par somme de contrôle. Le corpus est horodaté par un tiers (RFC 3161, 7 août 2026) : seul son condensat a quitté la machine — on date sans montrer.
TRIANGLE-VERIFICATION · STILL BINDING (DEVIL-INTENT-practice) ; décisions datées 2026-09-18 (ACTED) et 2026-09-29 (STANDING)
Le vérificateur est vérifié — et tourne d'abord sur nous
Chaque capacité visible a sa contre-lecture adversariale avant toute mise en public. Trois dépôts forment un triangle : aiame-doctrine définit, aiame-red vérifie les produits, aiame-guard vérifie aiame-red — de façon déterministe, sans modèle de langage. L'audit tourne d'abord sur AIAME elle-même, y compris la mesure de sa propre exposition avant de proposer un instrument de souveraineté à quiconque.
aiame-doctrine:DEVIL-INTENT.md#Positionnement-assume (DEVIL-INTENT-practice) ; aiame-doctrine:DECISION-2026-09-18-aiame-guard-rename-and-greenlight.md#Decision ; aiame-doctrine, décision datée du 2026-09-29 (Registre de contrainte)
La branche de revenu : une plateforme locale pour TPE et PME, et ses produits métier. Rien n'y est vendu aujourd'hui ; au plus proposé en bac à sable.
E2 (mission e2-face)
La recherche protégée sur l'asymétrie du visage et de la main : mathématiques, référent perceptif, contribution de recherche. Elle reste muette et invendue.
perso (mission perso)
Ce qui sert UNE personne : le miroir de mesure et la lecture de l'écriture manuscrite. Le nom « B2H » reste à confirmer par le propriétaire ; ce regroupement est fait par fonction, sans trancher la tarification.
FORK
La décision du 28 juillet 2026 qui sépare E3 et E2, et réserve à la recherche E2 une part fixe du futur revenu net de E3. Le principe est fixé ; le pourcentage le sera quand E3 aura un revenu.
B2H (Business to Human)
La relation dans laquelle l'humain est le bénéficiaire final : tarification juste et transparente, jamais de score ni de comparaison entre personnes.
Muet
Une mesure affichée telle quelle, sans conclusion sur la personne. On dit signal, état, variation ; on ne dit jamais ce que cela signifie pour elle.
Loi de la Preuve
Tout chiffre affiché remonte à sa pièce source. Ce que le moteur ne sait pas prouver, il ne l'affirme pas.
Gris honnête
Un indicateur non mesuré s'affiche en gris, jamais en vert fabriqué ni à zéro sans preuve.
Bac à sable
Proposé à l'essai, sans clé de paiement de production : aucun revenu réel n'est possible.
Spike
Un prototype technique qui prouve une seule chose. Aucune décision de produit n'est prise.
Garde-fous GF-1 à GF-5
Des contrôles lancés avant chaque envoi de code, qui le bloquent en cas de violation : aucun appel à un grand modèle d'IA de pointe dans le code d'exécution (GF-1), aucun fichier de secrets .env suivi par git (GF-2), discours contre mesure, simple avertissement (GF-3), aucun identifiant d'accès permanent aux données des clients du partenaire dans le code (GF-4), et toute collecte chez un tiers déclarée dans un manifeste et faite poliment, avec robots.txt ou limite de débit (GF-5).
Copie vérifiée (vendoring)
Un mécanisme commun recopié octet pour octet dans le dépôt qui l'utilise, avec une empreinte SHA-256 qui prouve que la copie n'a pas été retouchée. Elle ne dit pas si la source a changé depuis.
REGBUG
Une régression silencieuse : un contrôle ou un comportement perdu en effet de bord d'un autre changement, et trouvé seulement après coup. Elle se corrige sur-le-champ, avec la même priorité qu'une faille de sécurité.
Réseau privé
Le réseau chiffré qui relie les machines d'AIAME. Un service joignable seulement par ce réseau n'est pas exposé sur internet.
Comment cette page est faite — et ce qu'elle ne dira jamais
La liste des dépôts vient de l'inventaire de l'espace de travail ; un dépôt né sans fiche fait échouer le générateur.
Chaque capacité est prouvée (un test, un import câblé, une réponse HTTP, une mesure datée), déclarée (un document le dit) ou absente (écrit en toutes lettres).
Avant d'être écrit, le texte est vérifié contre les six phrases que la charte de communication interdit, le vocabulaire médical et interprétatif, toute adresse et toute ressource tierce. Une violation : pas de page.
Rien n'est vendu aujourd'hui : les services sont en bac à sable ou non offerts.
doctrine7 — Ce qu'AIAME EST et ce qui le garde : doctrine canonique, décisions, mémoire, provenance — puis le triangle doctrine → red → guard qui vérifie que les produits tiennent la doctrine et que le vérificateur tient, et la vitrine qui la montre. Tout le reste en est extrait.
corpus5 — Les dépôts de documentation : textes, décisions, spécifications, mémoire — ni API, ni web. Ils se lisent ; leurs scripts (garde-fous, contrôles) servent le texte, ils ne forment pas un service.
socle13 — Le cœur partagé : services et bibliothèques transversaux consommés par les produits (auth, stockage, RAG, planification, voix, conformité) — vendorés avec somme de contrôle ou servis tailnet-privé, jamais un import live.
e3-erp8 — Organe de revenu (FORK 2026-07-28) : augmentation souveraine d'ERP pour TPE/PME — la plateforme et ses cartes.
e3-vertical4 — Produits E3 à domaine métier propre, construits sur le socle — avec ou sans surface publique : une surface publique est une étiquette (web:true), pas une branche.
e2-face4 — Recherche protégée (FORK 2026-07-28) — la science du visage et de la main : mathématiques d'asymétrie, référent perceptif, contribution de recherche — et ses instruments publics (aiame-apod). Muette et invendue.
perso2 — Augmentation personnelle (appelée B2H dans DECISION-2026-09-28, appellation NON confirmée par le propriétaire) — instruments et produits qui servent UNE personne : traitement local, attachables, gratuits ou B2C. Tarification non tranchée. Regroupement par fonction, pas par doctrine.
infra1 — Ce qui fait tourner la flotte : hébergement, DNS, déploiement, outillage d'espace de travail.
Hors de cette page, par décision
Les études stratégiques et de conformité de la racine du workspace (confidentielles par leur propre README).
Le registre de juridiction d'AIAME sur ses propres dépendances (interne, jamais une page — décision datée du 2026-09-29).
Toute valeur d'infrastructure (adresse, port, chemin de secret) ; les noms de machines déjà tolérés publiquement restent génériques ici (« un serveur AIAME sur le réseau privé »).
Le contenu du partenaire Elzéard au-delà du mot lui-même (ses dépôts, ses ADR, ses clients).
Toute tension doctrinale non tranchée par l'organisation (formulée ici avec la version prudente déjà publiée, jamais la version qui la tranche à ma place).
Exclus de l'inventaire par décision écrite : 4 dépôts.