<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Provenance on Boris Dupoux</title><link>https://borisdupoux.com/fr/tags/provenance/</link><description>Recent content in Provenance on Boris Dupoux</description><generator>Hugo -- gohugo.io</generator><language>fr</language><lastBuildDate>Tue, 01 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://borisdupoux.com/fr/tags/provenance/index.xml" rel="self" type="application/rss+xml"/><item><title>Atomes de traitement explicables pour documents et données</title><link>https://borisdupoux.com/fr/research/processing-atoms/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://borisdupoux.com/fr/research/processing-atoms/</guid><description>&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Des systèmes de production pour le rapprochement documentaire et l&amp;rsquo;OCR, développés pour
des clients tels qu&amp;rsquo;un grossiste distributeur et un cabinet d&amp;rsquo;expertise comptable, ont
laissé plusieurs bases de code résolvant chacune les mêmes sous-problèmes (routage des
pages, réglage de l&amp;rsquo;OCR, extraction par LLM, comparaison de champs) avec leurs propres
bogues. La bibliothèque d&amp;rsquo;atomes les consolide en un seul paquet. Sa question centrale est
celle qui sous-tendait les systèmes d&amp;rsquo;origine : &lt;strong&gt;peut-on automatiser un contrôle documentaire
de sorte qu&amp;rsquo;un humain puisse auditer et contester chaque verdict ?&lt;/strong&gt; Extraire un champ ne
suffit pas. Le système doit indiquer si deux documents concordent, pourquoi, et sur la base
de quels éléments.&lt;/p&gt;
&lt;h2 id="approche"&gt;&lt;a href="#approche" class="header-anchor"&gt;&lt;/a&gt;Approche
&lt;/h2&gt;&lt;p&gt;Tout est construit à partir d&amp;rsquo;&lt;strong&gt;atomes&lt;/strong&gt;. Un atome a une seule responsabilité, des
entrées et sorties typées, aucun état global et des dépendances injectées (client LLM,
moteur OCR, stockage). Une chaîne de traitement est une composition d&amp;rsquo;atomes, soit écrite
en code, soit déclarée sous forme de recette YAML validée au chargement, avant toute exécution.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 A["Documents d'entrée (PDF, numérisations, CSV, courriels)"] --&gt; B{"Routage des pages : texte natif ou OCR ?"}
 B -- "natif" --&gt; C["Texte natif positionné"]
 B -- "numérisation" --&gt; D["PaddleOCR (réglages de production)"]
 C --&gt; E["Segmentation &amp; classification"]
 D --&gt; E
 E --&gt; F["Extraction JSON par LLM + vérification d'ancrage verbatim"]
 F --&gt; G["Rapprochement inter-documents (facture / bon de livraison / commande)"]
 G --&gt; H["Verdict tri-état + motif nommé + trace"]
 H --&gt; I["Rapport / revue humaine"]&lt;/pre&gt;&lt;h2 id="le-catalogue"&gt;&lt;a href="#le-catalogue" class="header-anchor"&gt;&lt;/a&gt;Le catalogue
&lt;/h2&gt;&lt;p&gt;Les 459 atomes sont regroupés en 32 familles, un paquet Python chacune, rangées le long de
la chaîne de traitement : &lt;strong&gt;capter&lt;/strong&gt; le monde, le &lt;strong&gt;comprendre&lt;/strong&gt;, &lt;strong&gt;rapprocher&lt;/strong&gt; et décider,
&lt;strong&gt;restituer&lt;/strong&gt;, puis &lt;strong&gt;exploiter&lt;/strong&gt; en production. Deux paquets supplémentaires les assemblent :
&lt;code&gt;steps&lt;/code&gt; (77 étapes nommées et paramétrées) et &lt;code&gt;recipes&lt;/code&gt; (chargement et validation des recettes YAML).&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Série&lt;/th&gt;
					&lt;th&gt;Famille&lt;/th&gt;
					&lt;th style="text-align: right"&gt;Atomes&lt;/th&gt;
					&lt;th&gt;Rôle&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Socle&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;core&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;25&lt;/td&gt;
					&lt;td&gt;types pivots, chaîne de traitement, configuration, résilience (reprises, limites de débit), fichiers, concurrence&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Capter&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;connect&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;40&lt;/td&gt;
					&lt;td&gt;HTTP résilient, boîtes aux lettres (Graph, IMAP), SFTP, OneDrive, source ERP en lecture seule, données ouvertes, piste d&amp;rsquo;audit&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;google&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;24&lt;/td&gt;
					&lt;td&gt;Gmail, Sheets, Drive, Apps Script, avec exécution résiliente&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;web&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;17&lt;/td&gt;
					&lt;td&gt;robots web indépendants du pilote (Selenium, Playwright) : attentes, squelette à reprise, formulaires&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;pdf&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;9&lt;/td&gt;
					&lt;td&gt;texte natif positionné, décision d&amp;rsquo;OCR, rendu, pages, doublons&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ocr&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;9&lt;/td&gt;
					&lt;td&gt;PaddleOCR avec réglages de production, EasyOCR&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;3&lt;/td&gt;
					&lt;td&gt;géométrie de page : lignes, colonnes, redressement, rendu monospace&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;audio&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;16&lt;/td&gt;
					&lt;td&gt;transcription par morceaux, post-traitement des segments, recalage micro ↔ écran&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;vision&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;32&lt;/td&gt;
					&lt;td&gt;flux vidéo / RTSP, détection, suivi, profondeur, segmentation, calibration&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;vlm&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;10&lt;/td&gt;
					&lt;td&gt;lecture d&amp;rsquo;écran par modèle de vision-langage : détection de changement, localisation de libellés&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;geo&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;11&lt;/td&gt;
					&lt;td&gt;mesures géodésiques, position combinée de relevés GPS, filtrage par distance aux lignes, SQL spatial&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;calendar&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;4&lt;/td&gt;
					&lt;td&gt;jours fériés, jours et horaires ouvrés&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Comprendre&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;text&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;32&lt;/td&gt;
					&lt;td&gt;nombres et montants, dates, normalisation, champs par motifs, identifiants&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;segment&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;7&lt;/td&gt;
					&lt;td&gt;pages → documents logiques, numéros de pièce typés, nature de page&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;classify&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;12&lt;/td&gt;
					&lt;td&gt;classement par nom de fichier, expéditeur, motifs pondérés, TF-IDF, visuel, LLM, cascades&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;llm&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;24&lt;/td&gt;
					&lt;td&gt;contrat indépendant du fournisseur, fournisseurs, pool, prompts, extraction structurée&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;anchor&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;5&lt;/td&gt;
					&lt;td&gt;champs et tableaux situés par rapport aux libellés imprimés, texte natif ou OCR&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kb&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;8&lt;/td&gt;
					&lt;td&gt;base de connaissances tracée : journal d&amp;rsquo;événements validé, replié en index SQLite&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Rapprocher&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;match&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;25&lt;/td&gt;
					&lt;td&gt;EAN/GTIN, index, score multicritère, affectation optimale, résolution d&amp;rsquo;entités&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;compare&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;9&lt;/td&gt;
					&lt;td&gt;comparateurs tri-états et explicables de champs, d&amp;rsquo;enregistrements et d&amp;rsquo;ensembles&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;check&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;9&lt;/td&gt;
					&lt;td&gt;contrôles génériques tri-états : totaux, TVA, balance, complétude, vraisemblance&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;reconcile&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;12&lt;/td&gt;
					&lt;td&gt;appariement d&amp;rsquo;ensembles, chaînes commande → livraison → facture, N-voies, lettrage, rapprochement bancaire&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;validate&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;14&lt;/td&gt;
					&lt;td&gt;moteur de règles, identifiants, cohérence des montants, verdicts LLM corrigés, décision finale&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;rules&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;8&lt;/td&gt;
					&lt;td&gt;langage de conditions sûr, tables « premier match » explicables, escalade, machines à états&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;events&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;11&lt;/td&gt;
					&lt;td&gt;événements horodatés : fenêtres, veille des événements attendus, sessions, transitions de statut&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;analytics&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;18&lt;/td&gt;
					&lt;td&gt;analyses supply chain sans pandas : demande, ruptures, taux de service, stock de sécurité&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Restituer&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;export&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;8&lt;/td&gt;
					&lt;td&gt;CSV pour Excel FR, classeurs Excel partagés, rapports HTML / Markdown / PDF&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;report&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;6&lt;/td&gt;
					&lt;td&gt;écarts persistables, synthèses, file de revue&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;render&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;12&lt;/td&gt;
					&lt;td&gt;livrables HTML : diagrammes Mermaid pré-rendus, graphiques ECharts, cartes GeoJSON&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;diagram&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;6&lt;/td&gt;
					&lt;td&gt;diagrammes de processus : lecture draw.io / BPMN JSON, rendu Mermaid et BPMN XML&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Exploiter&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ops&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;26&lt;/td&gt;
					&lt;td&gt;haute disponibilité (battements, élection), démon à déclencheurs horaires, surveillance, contrôles préalables&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;qa&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;7&lt;/td&gt;
					&lt;td&gt;non-régression rédactionnelle (fichiers dorés), rejeu de simulations, accord inter-annotateurs&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="recettes-nommées"&gt;&lt;a href="#recettes-nomm%c3%a9es" class="header-anchor"&gt;&lt;/a&gt;Recettes nommées
&lt;/h3&gt;&lt;p&gt;Chacune des 17 recettes est une liste YAML d&amp;rsquo;étapes nommées &lt;code&gt;&amp;lt;famille&amp;gt;.&amp;lt;atome&amp;gt;&lt;/code&gt;. Trois exemples :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;invoice_multi_doc&lt;/code&gt;&lt;/strong&gt; : un lot de PDF multidocuments devient un ensemble de documents
logiques contrôlés. &lt;code&gt;io.collect&lt;/code&gt; → &lt;code&gt;pdf.read&lt;/code&gt; → &lt;code&gt;segment.documents&lt;/code&gt; → &lt;code&gt;classify.documents&lt;/code&gt; →
&lt;code&gt;llm.extract&lt;/code&gt; → &lt;code&gt;validate.ids&lt;/code&gt; → &lt;code&gt;validate.amounts&lt;/code&gt; → &lt;code&gt;validate.decide&lt;/code&gt; → &lt;code&gt;export.csv&lt;/code&gt;
→ &lt;code&gt;google.sheets.upsert&lt;/code&gt; → &lt;code&gt;connect.notify&lt;/code&gt;. Chaque document finit valide, à vérifier ou invalide.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;doc_reconciliation&lt;/code&gt;&lt;/strong&gt; : un dossier de factures, d&amp;rsquo;avoirs et de bons de livraison,
contrôlé par rapport aux commandes. L&amp;rsquo;extraction LLM gardée (&lt;code&gt;llm.extract_docs&lt;/code&gt;) est
recoupée avec une extraction par motifs (&lt;code&gt;extract.regex&lt;/code&gt;, &lt;code&gt;compare.extractions&lt;/code&gt;,
&lt;code&gt;reconcile.fields&lt;/code&gt;), puis viennent &lt;code&gt;check.document&lt;/code&gt; et &lt;code&gt;check.completeness&lt;/code&gt;, les lignes
face à la commande (&lt;code&gt;compare.reference&lt;/code&gt;), la chaîne commande → livraison → facture
(&lt;code&gt;reconcile.nway&lt;/code&gt;), et enfin un fichier d&amp;rsquo;écarts et une file de revue
(&lt;code&gt;report.discrepancies&lt;/code&gt;, &lt;code&gt;report.review&lt;/code&gt;). 17 étapes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;meeting_transcript&lt;/code&gt;&lt;/strong&gt; : un enregistrement de réunion devient une transcription horodatée
avec locuteurs. &lt;code&gt;audio.decode&lt;/code&gt; → &lt;code&gt;audio.vad&lt;/code&gt; → &lt;code&gt;audio.transcribe&lt;/code&gt; → &lt;code&gt;audio.diarize&lt;/code&gt; →
&lt;code&gt;audio.speakers&lt;/code&gt; → &lt;code&gt;audio.segments&lt;/code&gt; → &lt;code&gt;export.csv&lt;/code&gt; → &lt;code&gt;export.transcript&lt;/code&gt; → &lt;code&gt;connect.notify&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les autres sont notamment &lt;code&gt;delivery_vs_order&lt;/code&gt;, &lt;code&gt;ledger_reconciliation&lt;/code&gt;, &lt;code&gt;invoice_dedup&lt;/code&gt;,
&lt;code&gt;article_base_cleaning&lt;/code&gt;, &lt;code&gt;stock_policy&lt;/code&gt;, &lt;code&gt;mail_to_sheet&lt;/code&gt;, &lt;code&gt;draft_mails&lt;/code&gt;,
&lt;code&gt;pdf_text_extract&lt;/code&gt;, &lt;code&gt;rubric_eval&lt;/code&gt;, &lt;code&gt;screen_session&lt;/code&gt;, &lt;code&gt;camera_flow&lt;/code&gt; et
&lt;code&gt;process_from_transcript&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="latlas"&gt;&lt;a href="#latlas" class="header-anchor"&gt;&lt;/a&gt;L&amp;rsquo;Atlas
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;Atlas est une page HTML unique, consultable hors ligne, générée à partir du code lui-même
(arbres syntaxiques et YAML), sans aucune donnée saisie à la main. Il dessine le catalogue
comme un tableau périodique : chaque famille est un élément doté d&amp;rsquo;un symbole, chaque module
un atome, chaque recette une molécule. Il signale aussi les atomes sans documentation, sans
test ou sans exemple d&amp;rsquo;usage.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Atlas, série « Capter » : un élément par famille (connect, google, web, pdf, ocr, layout, audio, vision, vlm, geo, calendar), avec ses atomes en dessous" class="gallery-image" data-flex-basis="367px" data-flex-grow="153" height="920" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/processing-atoms/atlas-capture-series.png" srcset="https://borisdupoux.com/research/processing-atoms/atlas-capture-series_hu_dfcfb778a533826c.png 800w, https://borisdupoux.com/research/processing-atoms/atlas-capture-series.png 1408w" width="1408"&gt;
&lt;em&gt;La série « Capter » du tableau périodique. Chaque case est une famille, avec son symbole, son nombre de modules et sa taille en milliers de lignes ; chaque tuile en dessous est un atome.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Atlas, série « Rapprocher » : match, compare, check, reconcile, validate, rules, events, analytics" class="gallery-image" data-flex-basis="536px" data-flex-grow="223" height="630" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/processing-atoms/atlas-reconcile-series.png" srcset="https://borisdupoux.com/research/processing-atoms/atlas-reconcile-series_hu_872c082d4171f5de.png 800w, https://borisdupoux.com/research/processing-atoms/atlas-reconcile-series.png 1408w" width="1408"&gt;
&lt;em&gt;La série « Rapprocher » : les familles qui apparient, comparent, contrôlent et décident.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fiche de l’atome compare.fields dans l’Atlas : rôle, règles de dominance et signature complète" class="gallery-image" data-flex-basis="170px" data-flex-grow="71" height="900" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/processing-atoms/atlas-atom-compare-fields.png" width="640"&gt;
&lt;em&gt;La fiche d&amp;rsquo;un atome (&lt;code&gt;compare.fields&lt;/code&gt;) : à quoi il sert, d&amp;rsquo;après sa docstring, puis chaque nom public avec sa signature complète.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="La recette invoice_multi_doc vue comme une molécule : 11 étapes reliées par les clés de contexte qu’elles se transmettent" class="gallery-image" data-flex-basis="590px" data-flex-grow="246" height="572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/processing-atoms/atlas-recipe-invoice-multi-doc.png" srcset="https://borisdupoux.com/research/processing-atoms/atlas-recipe-invoice-multi-doc_hu_9f54a6aa2766961a.png 800w, https://borisdupoux.com/research/processing-atoms/atlas-recipe-invoice-multi-doc.png 1408w" width="1408"&gt;
&lt;em&gt;La recette &lt;code&gt;invoice_multi_doc&lt;/code&gt; en molécule : 11 étapes, les clés de contexte qui les relient et les services requis (en pointillé lorsqu&amp;rsquo;ils sont facultatifs).&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="méthodes"&gt;&lt;a href="#m%c3%a9thodes" class="header-anchor"&gt;&lt;/a&gt;Méthodes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Résultats tri-états.&lt;/strong&gt; Chaque comparaison renvoie &lt;code&gt;ok ∈ {True, False, None}&lt;/code&gt;
(conforme / écart / non concluant) avec un code de motif nommé et une trace. Une valeur
manquante ou illisible compte comme non concluante, jamais comme une anomalie. Les
résultats non concluants sont tout de même comptabilisés, et non écartés en silence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Routage hybride texte natif/OCR.&lt;/strong&gt; Chaque page PDF est classée comme native, OCR ou
vide, selon la quantité de texte natif qu&amp;rsquo;elle contient et la part de ce texte couverte
par des images. L&amp;rsquo;OCR n&amp;rsquo;est exécuté que là où il est nécessaire.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extraction LLM ancrée.&lt;/strong&gt; L&amp;rsquo;extraction JSON structurée est validée par rapport à des
schémas Pydantic. Chaque valeur extraite est ensuite vérifiée mot pour mot dans le texte
source, de sorte que les valeurs altérées ou inventées sont signalées.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rapprochement inter-documents.&lt;/strong&gt; Factures, bons de livraison et commandes sont comparés
ligne à ligne à l&amp;rsquo;aide de tolérances nommées et de règles de dominance. Par exemple, un
montant de ligne concordant peut l&amp;rsquo;emporter sur un écart de prix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provenance.&lt;/strong&gt; Chaque atome porté comporte un en-tête &lt;code&gt;Provenance:&lt;/code&gt; et une entrée qui le
relie à &lt;code&gt;repo@commit:path:lines&lt;/code&gt; dans le code de production d&amp;rsquo;origine. Les bogues découverts
lors du portage ont été corrigés, et chaque correction est couverte par un test de non-régression.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architecture contrôlée.&lt;/strong&gt; Le découpage en couches est vérifié par 30 contrats d&amp;rsquo;import :
un atome n&amp;rsquo;importe que le paquet &lt;code&gt;core&lt;/code&gt;. Un typage strict, un seuil de couverture ≥ 80 % et
une vérification de l&amp;rsquo;absence de noms de clients dans le code source sont également imposés.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abstraction du matériel.&lt;/strong&gt; Les atomes de vision et d&amp;rsquo;audio ciblent &lt;code&gt;cuda&lt;/code&gt;, &lt;code&gt;mps&lt;/code&gt; ou &lt;code&gt;cpu&lt;/code&gt; via un seul paramètre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Évaluation de bout en bout.&lt;/strong&gt; Les tests s&amp;rsquo;exécutent avec de vrais moteurs (PaddleOCR, Ollama &lt;code&gt;qwen3:8b&lt;/code&gt;
et &lt;code&gt;qwen3-vl:8b&lt;/code&gt;) sur des données à vérité terrain connue. Chaque métrique est consignée face à un
seuil dans un rapport JSON/HTML. Les métriques qui n&amp;rsquo;atteignent pas leur seuil sont conservées et
affichées comme en échec.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="résultats"&gt;&lt;a href="#r%c3%a9sultats" class="header-anchor"&gt;&lt;/a&gt;Résultats
&lt;/h2&gt;&lt;p&gt;Base de code (arborescence actuelle) : 459 modules d&amp;rsquo;atomes répartis en 32 familles, 77 étapes
paramétrées, 17 recettes YAML, 30 contrats d&amp;rsquo;import. La suite collecte 2 959 tests unitaires et
de recettes, plus 109 tests de bout en bout exécutés séparément. Les 17 recettes disposent toutes
d&amp;rsquo;au moins un test de bout en bout, et 34 des 35 éléments de l&amp;rsquo;Atlas sont testés de bout en bout.&lt;/p&gt;
&lt;p&gt;Scores de bout en bout sélectionnés (documents synthétiques à vérité terrain connue, modèles 8B locaux) :&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Tâche&lt;/th&gt;
					&lt;th&gt;Moteur&lt;/th&gt;
					&lt;th&gt;Mesure&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Rapprochement facture + bon de livraison / commande&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;qwen3:8b&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;types de documents et champs 14/14 ; écarts attendus 5/5 ; 0 faux écart sur le cas conforme&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Extraction JSON par LLM (4 factures natives)&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;qwen3:8b&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;JSON valide 4/4 ; champs exacts 28/28 ; toutes les valeurs volontairement altérées détectées par l&amp;rsquo;ancrage&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;OCR sur une étiquette photographiée&lt;/td&gt;
					&lt;td&gt;PaddleOCR&lt;/td&gt;
					&lt;td&gt;rappel des mots 0,94 sur la photo brute ; un défaut de rehaussement du contraste (0,65–0,71) a été identifié et corrigé (0,88–0,94)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Reconstruction de tableaux à partir de l&amp;rsquo;OCR&lt;/td&gt;
					&lt;td&gt;PaddleOCR&lt;/td&gt;
					&lt;td&gt;100 % de cellules exactes (police proportionnelle), 95 % (chasse fixe)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="limites--suite"&gt;&lt;a href="#limites--suite" class="header-anchor"&gt;&lt;/a&gt;Limites &amp;amp; suite
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;L&amp;rsquo;ancrage verbatim ne peut pas détecter une valeur présente dans le document mais placée
dans le mauvais champ : un champ absent a été rempli à tort dans 1 cas sur 8.&lt;/li&gt;
&lt;li&gt;Le modèle 8B a jugé un écart de quantité de +50 % comme un écart « mineur », contrairement
à la consigne. Les verdicts du LLM sont donc normalisés et maintenus en aval de règles
déterministes.&lt;/li&gt;
&lt;li&gt;Les scores proviennent principalement de données synthétiques. Un jeu de test sur documents
réels est en cours de constitution en dehors du dépôt, et seuls les cas ayant fait l&amp;rsquo;objet
d&amp;rsquo;une revue sont notés.&lt;/li&gt;
&lt;li&gt;Prochaines étapes : mesurer le taux de rapprochement automatique et le taux de faux positifs
sur des données de production.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="stack-technique"&gt;&lt;a href="#stack-technique" class="header-anchor"&gt;&lt;/a&gt;Stack technique
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Python&lt;/code&gt; · &lt;code&gt;Pydantic&lt;/code&gt; · &lt;code&gt;PyYAML&lt;/code&gt; · &lt;code&gt;PaddleOCR&lt;/code&gt; · &lt;code&gt;Ollama&lt;/code&gt; (&lt;code&gt;qwen3:8b&lt;/code&gt;, &lt;code&gt;qwen3-vl:8b&lt;/code&gt;) · &lt;code&gt;Mistral / Anthropic / OpenAI APIs&lt;/code&gt; · &lt;code&gt;pytest&lt;/code&gt; · &lt;code&gt;mypy&lt;/code&gt; · &lt;code&gt;import-linter&lt;/code&gt; · &lt;code&gt;ruff&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Graphes de connaissances de mission : des preuves de conseil à une ontologie interrogée via MCP</title><link>https://borisdupoux.com/fr/research/mission-knowledge-graph/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://borisdupoux.com/fr/research/mission-knowledge-graph/</guid><description>&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Le conseil en observation des processus produit des logigrammes, des notes d&amp;rsquo;entretien, des
enregistrements d&amp;rsquo;écran et des recommandations. Une fois la mission livrée, ce matériau est
de fait inerte : la mission suivante repart d&amp;rsquo;une page blanche, même lorsque la réponse avait
déjà été trouvée ailleurs. La question de recherche est de savoir comment transformer les
livrables, de &lt;strong&gt;documents en données typées, sourcées et interrogeables&lt;/strong&gt;, afin qu&amp;rsquo;un
assistant puisse répondre à « où avons-nous déjà vu cela, et qu&amp;rsquo;en avions-nous conclu ? » en
citant des preuves vérifiables.&lt;/p&gt;
&lt;p&gt;Deux exigences structurent le travail : la &lt;strong&gt;traçabilité&lt;/strong&gt; (chaque assertion renvoie à sa
preuve) et une stricte &lt;strong&gt;séparation entre preuve et connaissance&lt;/strong&gt; (ce qui a été observé
n&amp;rsquo;est pas ce qui a été généralisé). La génération augmentée par la recherche (RAG) est
rapide à mettre en place, mais cite des passages, pas des assertions vérifiables ; une
ontologie formelle est traçable, mais coûteuse. Ce projet explore une voie pragmatique entre
les deux.&lt;/p&gt;
&lt;h2 id="approche"&gt;&lt;a href="#approche" class="header-anchor"&gt;&lt;/a&gt;Approche
&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 A["`Sources brutes de mission
immuables, hachées`"] --&gt; B["`Journal d'événements en ajout seul
source de vérité`"]
 B --&gt; C["`Base SQLite reconstructible
jetable`"]
 C --&gt; D[Extraction déterministe]
 C --&gt; E["`Extraction par LLM
simple force de proposition`"]
 D --&gt; F["`Nœuds et arêtes proposés
avec provenance`"]
 E --&gt; F
 F --&gt; G{"`Revue humaine
hors MCP`"}
 G --&gt;|validé| H[Graphe de connaissances]
 H --&gt; I[MCP : preuves]
 H --&gt; J[MCP : connaissances]
 H --&gt; K[MCP : ontologie]
 I --&gt; L[Assistant IA]
 J --&gt; L
 K --&gt; L&lt;/pre&gt;&lt;p&gt;Le choix de conception central consiste à scinder l&amp;rsquo;interface en &lt;strong&gt;trois serveurs MCP selon
le statut épistémique&lt;/strong&gt; : &lt;em&gt;preuves&lt;/em&gt; (observations attestées et sourcées), &lt;em&gt;connaissances&lt;/em&gt;
(généralisations) et &lt;em&gt;ontologie&lt;/em&gt; (le méta-modèle lui-même). Cette séparation empêche un
assistant de présenter une généralisation comme une observation.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 subgraph SCHEMA["SCHÉMA · nommage"]
 ON["`serveur ontologie
Comment le nomme-t-on ?`"]
 end
 subgraph PROVEN["PROUVÉ · observé"]
 EV["`serveur preuves
Qu'a-t-on capté, et où ?`"]
 end
 subgraph GENERAL["GÉNÉRALISÉ · conclu"]
 KN["`serveur connaissances
Qu'en conclut-on ?
propose, ne valide jamais`"]
 end
 ON -. "type" .-&gt; EV
 EV == "fonde chaque conclusion" ==&gt; KN
 EV --&gt; AI["`Assistant IA
réponses étiquetées par statut`"]
 KN --&gt; AI
 ON --&gt; AI&lt;/pre&gt;&lt;p&gt;Le graphe est unique ; seules les façades sont séparées. La frontière qui compte passe entre
preuves et connaissances : le serveur &lt;em&gt;preuves&lt;/em&gt; ne renvoie que ce qui a été observé, et où ;
le serveur &lt;em&gt;connaissances&lt;/em&gt; renvoie des conclusions qui doivent remonter jusqu&amp;rsquo;à ces preuves,
et aucun outil MCP ne peut marquer quoi que ce soit comme validé.&lt;/p&gt;
&lt;h2 id="méthodes"&gt;&lt;a href="#m%c3%a9thodes" class="header-anchor"&gt;&lt;/a&gt;Méthodes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Méta-modèle.&lt;/strong&gt; Un noyau fixe, complété de profils de mission et d&amp;rsquo;une ontologie
versionnée (v0). Chaque nœud porte une origine (structurelle, déterministe, extraite par
LLM) et un statut (proposé → validé).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Invariants (I1–I6).&lt;/strong&gt; La provenance est obligatoire sur chaque nœud et chaque arête
dérivés ; une recommandation doit pouvoir être rattachée, de proche en proche, à un constat
sourcé ; les citations extraites par LLM doivent être des sous-chaînes littérales de leur
fragment ; le statut « validé » exige une décision humaine enregistrée. Les sources brutes
sont immuables ; la base de données est jetable et reconstruite à partir du journal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Questions de compétence avant l&amp;rsquo;implémentation.&lt;/strong&gt; Un jeu v0 de 33 questions, typées
comme factuelles, agrégées, de traçabilité, de contradiction, temporelles, inter-missions
et &lt;strong&gt;négatives&lt;/strong&gt; (requêtes que le système doit refuser, par exemple une fuite entre
clients), dans un format exécutable avec réponses attendues et références.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocole d&amp;rsquo;évaluation.&lt;/strong&gt; Au moins 30 tâches en langage naturel, notées automatiquement
ou par un juge. Les seuils de passage ont été fixés en amont : exactitude ≥ 0,8, citations
valides ≥ 0,98, ancrage ≥ 0,95, fuite = 0, médiane ≤ 6 appels d&amp;rsquo;outils par tâche ; chaque
question soluble en ≤ 3 appels ; précision de l&amp;rsquo;extraction déterministe ≥ 0,95 par type ;
κ inter-annotateurs ≥ 0,7.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phases P0–P6 avec jalons humains.&lt;/strong&gt; L&amp;rsquo;implémentation est déléguée à une session d&amp;rsquo;agent
qui doit s&amp;rsquo;arrêter à chaque jalon et consigner les décisions en suspens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cartographie d&amp;rsquo;un logiciel en boîte noire.&lt;/strong&gt; La même méthode a été appliquée à un
logiciel commercial de gestion d&amp;rsquo;entreprise, sans lecture de son code source. La cible est
un triplet de vérités — utilisateur, logiciel et base de données — reliées par des arêtes
prouvées. Onze heuristiques (H1–H11) couvrent l&amp;rsquo;appariement de valeurs, la perturbation
inverse et directe, les champs calculés, la visibilité conditionnelle, les différences
entre scénarios, la fouille d&amp;rsquo;invariants, le fuzzing des saisies, les a priori sémantiques
(jamais considérés comme preuve), le passage de la documentation au test et du symptôme à
la règle. Entrées : l&amp;rsquo;arborescence des menus via AT-SPI, un relevé des écrans, le
profilage des colonnes et une typologie d&amp;rsquo;événements issue du journal d&amp;rsquo;audit de
l&amp;rsquo;application. Une hypothèse n&amp;rsquo;est acceptée qu&amp;rsquo;avec une contre-preuve indépendante ; les
cartographies produites par l&amp;rsquo;éditeur sont tenues en quarantaine et servent d&amp;rsquo;oracle de
notation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un extrait illustratif du graphe typé (libellés fictifs) : la préconisation n&amp;rsquo;est recevable
que parce que la chaîne qui descend jusqu&amp;rsquo;à un fragment littéral d&amp;rsquo;une source est complète.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 R["`Préconisation
point de saisie unique`"] -- répond à --&gt; C["`Constat
double saisie à la réception`"]
 O["`Observation
« le stock est ressaisi à la main »`"] -- atteste --&gt; C
 O -- extrait de --&gt; F["`Fragment
notes d'entretien, lignes 40–52`"]
 F -- cite --&gt; P["`Pièce source
hachée, immuable`"]
 C -- porte sur --&gt; A["`Activité
réception des marchandises`"]
 A -- utilise --&gt; S["`Écran
formulaire de réception`"]
 S -- module de --&gt; Y["`Système
logiciel de gestion`"]&lt;/pre&gt;&lt;h2 id="état-davancement--résultats"&gt;&lt;a href="#%c3%a9tat-davancement--r%c3%a9sultats" class="header-anchor"&gt;&lt;/a&gt;État d&amp;rsquo;avancement &amp;amp; résultats
&lt;/h2&gt;&lt;p&gt;Il s&amp;rsquo;agit &lt;strong&gt;principalement d&amp;rsquo;une conception partiellement implémentée&lt;/strong&gt;, et non d&amp;rsquo;un
système en service.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pilote (corpus d&amp;rsquo;observation, passe déterministe).&lt;/strong&gt; 6 195 fichiers (6,92 Go) acquis de
manière idempotente ; 13 272 nœuds et 6 022 arêtes extraits en 2,1 s pour un coût LLM nul ;
les six invariants au vert sur 57 969 vérifications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mesure sur jeu de référence.&lt;/strong&gt; 145 unités d&amp;rsquo;annotation et 100 paires de résolution
d&amp;rsquo;entités. L&amp;rsquo;annotation humaine était partielle et le second annotateur était un LLM.
Accord humain × LLM : κ = 0,72 (logiciel), 0,41 (écran), 0,31 (catégorie), 0,52 (limites
de segments). Précision de l&amp;rsquo;extracteur par rapport à la référence humaine : 0,74, 0,43,
0,04, 0,63. &lt;strong&gt;Jalon G2 (≥ 0,95) non franchi&lt;/strong&gt; ; le résultat sur la catégorie traduit un
désaccord de définition, et non une erreur de calcul.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cartographie du logiciel.&lt;/strong&gt; Schéma de 427 tables sans aucune clé étrangère, aucun
déclencheur ni aucune vue déclarés (toute la logique est applicative) ; 1 048 entrées de
menu (899 feuilles) cartographiées ; 154 des 899 écrans relevés (17 %) ; 2 845 hypothèses
de règles ramenées à 1 519 par un filtre LLM local, avec 1 erreur de décision sur un
échantillon de 50 éléments revu par l&amp;rsquo;agent superviseur. Un prototype MCP en lecture seule
existe ; &lt;strong&gt;aucune règle n&amp;rsquo;a encore été prouvée&lt;/strong&gt; dans le logiciel. Les travaux ont été
suspendus après une surcharge de la VM hôte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mesure sur jeu de référence face aux seuils fixés à l&amp;rsquo;avance : les barres sont les valeurs
mesurées par champ, la ligne orange est le seuil. Une seule barre le franchit.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;---
config:
 xyChart:
 width: 540
 height: 320
 themeVariables:
 xyChart:
 backgroundColor: "transparent"
 plotColorPalette: "#3F86B8, #C46A2B"
---
xychart-beta
 title "Accord humain × LLM, κ (seuil 0,7)"
 x-axis ["logiciel", "écran", "catégorie", "segments"]
 y-axis "κ" 0 --&gt; 1
 bar [0.72, 0.41, 0.31, 0.52]
 line [0.7, 0.7, 0.7, 0.7]&lt;/pre&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;---
config:
 xyChart:
 width: 540
 height: 320
 themeVariables:
 xyChart:
 backgroundColor: "transparent"
 plotColorPalette: "#3F86B8, #C46A2B"
---
xychart-beta
 title "Précision vs référence humaine (seuil 0,95)"
 x-axis ["logiciel", "écran", "catégorie", "segments"]
 y-axis "Précision" 0 --&gt; 1
 bar [0.74, 0.43, 0.04, 0.63]
 line [0.95, 0.95, 0.95, 0.95]&lt;/pre&gt;&lt;p&gt;La cartographie du logiciel, en entonnoir : l&amp;rsquo;arborescence des menus est entièrement
cartographiée, mais la couverture des écrans et la preuve restent loin derrière, et la
chaîne d&amp;rsquo;hypothèses n&amp;rsquo;a encore produit aucune règle prouvée.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;---
config:
 xyChart:
 width: 540
 height: 360
 themeVariables:
 xyChart:
 backgroundColor: "transparent"
 plotColorPalette: "#3F86B8"
---
xychart-beta
 title "Cartographie en boîte noire : de l'inventaire à la preuve"
 x-axis ["Entrées menu", "Feuilles", "Écrans", "Hypothèses", "Filtrées", "Prouvées"]
 y-axis "Nombre" 0 --&gt; 3000
 bar [1048, 899, 154, 2845, 1519, 0]&lt;/pre&gt;&lt;p&gt;Les serveurs MCP et l&amp;rsquo;évaluation de bout en bout (P4–P5) ne sont &lt;strong&gt;pas implémentés&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="limites--suite"&gt;&lt;a href="#limites--suite" class="header-anchor"&gt;&lt;/a&gt;Limites &amp;amp; suite
&lt;/h2&gt;&lt;p&gt;Les résultats du pilote sont inférieurs aux seuils et reposent sur une annotation humaine
partielle. Prochaines étapes : redéfinir l&amp;rsquo;étiquette de catégorie, constituer une référence
entièrement humaine, mesurer à nouveau G1/G2, puis construire les trois serveurs et mener
l&amp;rsquo;évaluation préenregistrée. Pour la cartographie du logiciel, les heuristiques de
perturbation en écriture attendent une autorisation écrite et une VM dédiée.&lt;/p&gt;
&lt;h2 id="stack-technique"&gt;&lt;a href="#stack-technique" class="header-anchor"&gt;&lt;/a&gt;Stack technique
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Python 3.11&lt;/code&gt; · &lt;code&gt;JSONL event log&lt;/code&gt; · &lt;code&gt;SQLite&lt;/code&gt; · &lt;code&gt;YAML ontology&lt;/code&gt; · &lt;code&gt;MCP&lt;/code&gt; · &lt;code&gt;AT-SPI&lt;/code&gt; · &lt;code&gt;Ollama&lt;/code&gt; · &lt;code&gt;pytest&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>