<!doctype html>
<html lang="fr">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
    <link rel="icon" type="image/x-icon" href="/favicon.ico" />
    <meta name="theme-color" content="#f8f3ea" />
    <title>Sonam Crumière, ontologies et systèmes d'agents</title>
    <meta name="description" content="Ontology is everything. Tout ce qu'on empile par-dessus hérite du modèle en dessous. Sonam Crumière construit ces modèles en Python, sur des corpus réels. Formé à 42 Lyon, contributeur technique d'une recherche doctorale chez Schneider Electric, fondateur de Peakn8." />
    <link rel="canonical" href="https://sonam.me/" />
    <link rel="alternate" hreflang="fr" href="https://sonam.me/" />
    <link rel="alternate" hreflang="en" href="https://sonam.me/en/" />
    <link rel="alternate" hreflang="x-default" href="https://sonam.me/" />

    <meta property="og:type" content="profile" />
    <meta property="og:locale" content="fr_FR" />
    <meta property="og:url" content="https://sonam.me/" />
    <meta property="og:title" content="Sonam Crumière, ontologies et systèmes d'agents" />
    <meta property="og:description" content="Tout ce qu'on empile par-dessus hérite du modèle en dessous. Un agent ne dépassera jamais ce qu'il sait des choses dont il parle." />
    <meta property="og:image" content="https://sonam.me/og.png" />
    <meta property="og:image:width" content="1200" />
    <meta property="og:image:height" content="630" />
    <meta property="og:image:alt" content="Sonam Crumière, ontologies et systèmes d'agents" />
    <meta property="og:site_name" content="Sonam Crumière" />
    <meta property="profile:first_name" content="Sonam" />
    <meta property="profile:last_name" content="Crumière" />

    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:site" content="@sonam_crm" />
    <meta name="twitter:creator" content="@sonam_crm" />
    <meta name="twitter:title" content="Sonam Crumière, ontologies et systèmes d'agents" />
    <meta name="twitter:description" content="Tout ce qu'on empile par-dessus hérite du modèle en dessous. Un agent ne dépassera jamais ce qu'il sait des choses dont il parle." />
    <meta name="twitter:image" content="https://sonam.me/og.png" />

    <script type="application/ld+json">
    {
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "WebSite",
      "@id": "https://sonam.me/#website",
      "url": "https://sonam.me/",
      "name": "Sonam Crumière",
      "inLanguage": "fr",
      "publisher": {
        "@id": "https://sonam.me/#person"
      }
    },
    {
      "@type": "ProfilePage",
      "@id": "https://sonam.me/#profilepage",
      "url": "https://sonam.me/",
      "name": "Sonam Crumière, ontologies et systèmes d'agents",
      "inLanguage": "fr",
      "isPartOf": {
        "@id": "https://sonam.me/#website"
      },
      "mainEntity": {
        "@id": "https://sonam.me/#person"
      },
      "about": {
        "@id": "https://sonam.me/#person"
      }
    },
    {
      "@type": "Person",
      "@id": "https://sonam.me/#person",
      "name": "Sonam Crumière",
      "url": "https://sonam.me/",
      "jobTitle": "Fondateur de Peakn8, concepteur d'ontologies et de systèmes d'agents",
      "description": "Entrepreneur et fondateur de Peakn8. Construit des ontologies et des systèmes d'agents en Python, basé près de Grenoble.",
      "address": {
        "@type": "PostalAddress",
        "addressLocality": "Grenoble",
        "addressRegion": "Isère",
        "addressCountry": "FR"
      },
      "alumniOf": {
        "@type": "CollegeOrUniversity",
        "name": "42 Lyon Auvergne-Rhône-Alpes",
        "url": "https://42lyon.fr"
      },
      "worksFor": {
        "@id": "https://peakn8.com/#organization"
      },
      "image": "https://sonam.me/og.png",
      "knowsAbout": [
        "ontologies",
        "knowledge systems",
        "knowledge modelling",
        "AI agents",
        "retrieval augmented generation",
        "semantic analysis",
        "process mapping",
        "Python",
        "C/C++",
        "TypeScript"
      ],
      "sameAs": [
        "https://www.linkedin.com/in/sonam-crm/",
        "https://github.com/scrumier",
        "https://x.com/sonam_crm",
        "https://peakn8.com"
      ]
    },
    {
      "@type": "Organization",
      "@id": "https://peakn8.com/#organization",
      "name": "Peakn8",
      "url": "https://peakn8.com",
      "description": "Peakn8 construit sur mesure la structure qui rend le savoir d'une entreprise atteignable et utilisable au quotidien, puis l'accompagne dans la durée.",
      "founder": {
        "@id": "https://sonam.me/#person"
      }
    }
  ]
}
    </script>
    <style>#root>[data-seo-prerender]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}</style>
    <noscript><style>
    html,body{overflow:auto !important;height:auto !important}
    #root>[data-seo-prerender]{position:static;width:min(calc(100% - 2.5rem),72ch);height:auto;padding:48px 0 80px;margin:0 auto;overflow:visible;clip:auto;white-space:normal;display:block;color:var(--ink);font-size:1.0625rem;line-height:1.62}
    #root>[data-seo-prerender] header{padding:0 0 2rem;margin:0 0 3rem;border-bottom:1px solid var(--rule)}
    #root>[data-seo-prerender] h1{max-width:20ch;font-size:clamp(2rem,6vw,3.4rem);line-height:1.08;letter-spacing:-.018em;color:var(--ink);margin:.5em 0 .45em;font-weight:400}
    #root>[data-seo-prerender] section{padding:2.5rem 0;border-top:1px solid var(--rule)}
    #root>[data-seo-prerender] article{padding:1.5rem 0;border-top:1px dotted var(--rule)}
    #root>[data-seo-prerender] h2{font-family:var(--mono);font-size:.7rem;letter-spacing:.13em;text-transform:uppercase;color:var(--muted);margin:0 0 1.3rem;font-weight:400}
    #root>[data-seo-prerender] h3{max-width:28ch;font-size:1.3rem;line-height:1.2;color:var(--ink);margin:0 0 .6rem;font-weight:600}
    #root>[data-seo-prerender] h4{font-family:var(--mono);font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin:1.6rem 0 .6rem;font-weight:400}
    #root>[data-seo-prerender] header>p:first-child{font-family:var(--mono);text-transform:uppercase;letter-spacing:.12em;font-size:.7rem;color:var(--muted);margin:0}
    #root>[data-seo-prerender] em{color:var(--peak);font-style:italic}
    #root>[data-seo-prerender] .lang-switch{margin:0 0 2em;font-family:var(--mono);font-size:.7rem;letter-spacing:.1em;text-transform:uppercase}
    #root>[data-seo-prerender] ul{padding:0;margin:1rem 0;list-style:none}
    #root>[data-seo-prerender] li{padding:.55rem 0;border-bottom:1px solid var(--rule)}
    #root>[data-seo-prerender] a{color:var(--peak);text-underline-offset:.22em}
    </style></noscript>

    <!-- Le raccord vers peakn8.com dure 380 ms. La mise en relation avec
         l'autre origine en prend 90 à elle seule, autant la faire maintenant.
         Précharger le document est impossible entre deux sites différents :
         le cache est partitionné, il ne serait pas réutilisé. -->
    <link rel="preconnect" href="https://peakn8.com" />
    <link rel="dns-prefetch" href="https://peakn8.com" />

    <style>
      /* Moitié d'arrivée du raccord depuis peakn8.com. Le fond est déjà celui
         de la page, seul le contenu se révèle. */
      html.warp-in #root { opacity: 0; translate: 0 16px }
      html.warp-in.warp-in-go #root {
        opacity: 1;
        translate: 0 0;
        transition: opacity 480ms ease-out 80ms, translate 560ms cubic-bezier(.2,.7,.3,1) 80ms;
      }
    </style>
    <script>
      (function () {
        try {
          var params = new URLSearchParams(location.search)
          if (params.get('from') !== 'peakn8') return
          params.delete('from')
          var rest = params.toString()
          history.replaceState(null, '', location.pathname + (rest ? '?' + rest : '') + location.hash)
          if (matchMedia('(prefers-reduced-motion: reduce)').matches) return
          var root = document.documentElement
          root.classList.add('warp-in')
          requestAnimationFrame(function () {
            requestAnimationFrame(function () { root.classList.add('warp-in-go') })
          })
          // Filet : un onglet en arrière-plan ne joue aucune image, et une page
          // qui reste vide coûte infiniment plus cher qu'un effet raté.
          setTimeout(function () { root.classList.remove('warp-in', 'warp-in-go') }, 1800)
        } catch (e) {}
      })()
    </script>

    <script>window.CC_VERSION="2.1.309"</script>
    <script defer src="https://analytics.peakn8.com/script.js" data-website-id="37f10f8c-d55c-4192-a919-17e37f133ebe"></script>
    <script type="module" crossorigin src="/assets/index-V1b2QS2s.js"></script>
    <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-CbXtAM7H.js">
    <link rel="modulepreload" crossorigin href="/assets/framer-motion-BmB1xtKk.js">
    <link rel="modulepreload" crossorigin href="/assets/react-vendor-d6WFsRXS.js">
    <link rel="stylesheet" crossorigin href="/assets/index-CPGAvmQt.css">
  </head>
  <body>
    <div id="root"><div data-seo-prerender>
<p class="lang-switch"><a href="/en/">English version</a></p>
<header>
<p>Sonam Crumière</p>
<h1>Ontology is everything.</h1>
<p>Tout ce qu'on empile par-dessus hérite du modèle en dessous. Un agent ne dépassera jamais ce qu'il sait des choses dont il parle. Je construis ces modèles en Python, sur des corpus qui existent vraiment, et j'en récupère la moitié chez des gens plutôt que dans des fichiers.</p>
</header>
<section aria-label="La position">
<h2>La position : Pourquoi je le pense</h2>
<p>Trois choses que j'ai vues de près, et qui m'ont amené là.</p>
<ul><li><strong>Le modèle décide de ce que le moteur peut répondre</strong> : Une recherche bien réglée retrouve les bons extraits. Elle bute ailleurs. Deux documents désignent le même dispositif sous deux noms, et rien ne le lui dit. Ils se contredisent, et elle ignore lequel fait autorité. Améliorer le classement ne touche jamais à ces questions, parce qu'elles se règlent au niveau du modèle.</li><li><strong>La moitié du modèle vit dans des têtes</strong> : Chez Schneider, les données de formation étaient tenues par des personnes dont les règles n'apparaissaient dans aucun fichier. Aucune extraction ne va les chercher là. Je suis allé les voir. On a refait la structure ensemble, et c'est cette semaine-là qui a décidé de ce que je veux faire.</li><li><strong>Un modèle que personne ne relit meurt en un an</strong> : Il reste juste le jour où on l'écrit. Le métier bouge, lui pas. Le vrai danger arrive plus tard, quand plus personne ne se souvient qu'il est faux. Ce qui le tient en vie, c'est d'être sous les gestes de tous les jours, avec la règle suivie affichée sous chaque action et un moyen de dire qu'elle est fausse.</li></ul>
</section>
<section aria-label="Les pièces">
<h2>Les pièces : Ce qui étaye la position</h2>
<p>Rangées de la plus proche de la thèse à la plus lointaine, et non par ordre chronologique. Chacune dit ce qu'elle établit, et si son code est lisible.</p>
<article>
<h3>01. Le modèle que je fais tourner sur mon propre travail (fermé, dépôt privé)</h3>
<p>Dépôt de connaissance et programme d'agents, en service quotidien</p>
<p><em>Ce système montre que je tiens un modèle vivant depuis des mois et que je peux défendre chacun de ses choix.</em></p>
<p>Un dépôt en Markdown qui prend tout ce que je lis et tout ce que je décide, avec le programme qui donne aux agents leurs règles, leurs outils et leur contexte. C'est la pièce où l'on voit le raisonnement, donc c'est celle que je détaille.</p>
<ul><li><strong>Le rangement se fait par situation</strong> : Une page ne porte pas de tags. Elle porte des déclencheurs : les phrases dans lesquelles je formulerais le besoin de l'ouvrir. La recherche compare la demande à chacun d'eux séparément, donc une page se trouve aussi bien par son sujet que par le moment où elle sert.</li><li><strong>Une donnée vit à un seul endroit</strong> : Aucune page ne recopie une information qui peut changer. Elle pointe vers celle où cette information vit. C'est la règle la plus chère à tenir de tout le dépôt, et sans elle deux pages finissent par se contredire pendant des mois sans que personne le remarque.</li><li><strong>Rien ne fait autorité avant relecture</strong> : Ce qu'un agent vient d'écrire est marqué, et la recherche le refuse tant que je ne l'ai pas lu. Un modèle qui se nourrit de sa propre production dérive vite.</li></ul>


</article><article>
<h3>02. Une recherche doctorale sur des politiques publiques (fermé, recherche en cours)</h3>
<p>Contributeur technique, Schneider Electric, 2026</p>
<p><em>Ce projet montre que la même opération tient sur un corpus réel, en entreprise, avec des personnes dont ce n'est pas le métier.</em></p>
<p>J'ai construit l'outil qui lit un fonds de documents sur les politiques publiques, l'éducation et la formation. Il en rapproche les constats et rattache chacun au passage exact dont il sort. Il a bien tourné. Le vrai sujet est apparu après, du côté des données de formation, tenues par des personnes dont les règles n'existaient dans aucun fichier. Sans ces règles, les rapprochements ne voulaient rien dire. Je suis allé les voir et on a refait la structure ensemble.</p>


<p>Le code n'est pas public, la recherche n'est pas publiée. Aucun corpus, aucun résultat, aucune capture.</p>
</article><article>
<h3>03. Peakn8 (fermé, dépôt privé)</h3>
<p>Fondateur, depuis 2025</p>
<p><em>Peakn8 montre que j'ai transformé le même travail de modélisation en une offre qu'une entreprise peut acheter, avec un périmètre, une méthode et une limite annoncée.</em></p>
<p>J'ai construit Peakn8 autour d'un seul constat : une entreprise détient déjà les réponses dont elle a besoin, réparties entre des fichiers, des conversations et les personnes qui s'en souviennent. Le travail consiste à rendre ce savoir explicite, atteignable et utilisable dans les outils que les équipes ouvrent déjà, puis à le maintenir vivant pendant que l'entreprise change. Chaque système est construit pour une entreprise, avec ses équipes, et l'accompagnement qui suit appartient à la mission plutôt qu'à une option. Chaque exemple publié dit ce que le travail ne fait pas, et c'est cette partie-là qui décide si un périmètre vaut d'être pris.</p>


<p>Entreprise immatriculée en décembre 2025. Aucune mission livrée à ce jour.</p>
</article><article>
<h3>04. Cinq outils publics, et là où ils s'arrêtent (ouvert, github.com/scrumier)</h3>
<p>Projets personnels, Python, 2026</p>
<p><em>Ces outils montrent où s'arrête ce qu'on obtient sans modèle. C'est utile, et ça plafonne vite.</em></p>
<p>Chacun fait bien une chose, sur des documents réels. Aucun ne sait de quoi il parle. Je les montre pour ça : ils tracent le plafond que la modélisation sert à franchir.</p>
<ul><li><strong>pdf-rag</strong> : Question en langage courant sur un fonds de PDF internes, réponse rendue avec le document et le passage dont elle sort. Testé sur 98 documents.</li><li><strong>invoice-processor</strong> : Une facture fournisseur déposée dans un dossier, la ligne de CSV s'écrit toute seule. Vision LLM, aucun gabarit par fournisseur.</li><li><strong>contract-analyzer</strong> : Extrait dates, montants, pénalités et conditions de résiliation d'un contrat fournisseur, et signale les clauses à regarder.</li><li><strong>expense-analyzer</strong> : Signale les dépenses suspectes d'un CSV et explique pourquoi. Règles métier, Isolation Forest, explication en langage courant.</li><li><strong>formation-builder</strong> : Transforme un PDF de procédure technique en module de formation structuré : étapes guidées et points de sécurité.</li></ul>
<p>Le plafond est le même partout. Ils retrouvent, ils extraient, ils classent. Aucun ne sait que deux documents parlent de la même chose, ni lequel croire quand ils divergent, ni à qui demander quand les deux se taisent.</p>

</article>
</section>
<section aria-label="Le socle">
<h2>Le socle : 42 Lyon, avant tout ça</h2>
<p>Pas de cours, pas de professeurs. On rend des projets, et les autres les cassent. Tronc commun terminé, fin de cursus en novembre 2028. C'est là que j'ai pris l'habitude d'aller regarder sous ce qu'un programme annonce de lui-même.</p>
<h3>ft_transcendence</h3>
<p>Un monde 3D semi-ouvert dans le navigateur, avec Pong, Tetris et Pacman jouables dedans. JavaScript sans framework, Three.js, Django, Docker. Projet d'équipe à trois.</p>
<h4>Le reste, en C et en C++</h4>
<ul><li><strong>Minishell</strong> : Un shell Unix, pipes, redirections et variables d'environnement</li><li><strong>cub3d</strong> : Un moteur de rendu par lancer de rayons</li><li><strong>ft_irc</strong> : Un serveur IRC et son bot</li><li><strong>inception</strong> : Une infrastructure web conteneurisée</li><li><strong>Philosophers</strong> : Concurrence et famine, en threads et en processus</li><li><strong>cpp-Module</strong> : Neuf modules de C++, du plus simple aux templates</li></ul>
<h4>La branche sécurité</h4>
<p>Rainfall, Snow Crash et Override : rétro-ingénierie, exploitation de binaires, débordements de tampon et escalade de privilèges. C'est ce qui m'a appris à ne pas croire ce qu'un programme annonce de lui-même.</p>
<h4>Deux choses hors sujet que j'aime bien</h4>
<ul><li><strong>cold-wallet</strong> : Un portefeuille froid écrit en Rust, pensé pour une machine hors ligne.</li><li><strong>claude-stats</strong> : Agrège ma consommation de tokens Claude sur toutes mes machines, locales et distantes.</li></ul>
</section>
<section aria-label="Contact">
<h2>Contact : Parlons de n'importe quoi</h2>
<p>Je construis Peakn8, l'entreprise que j'ai fondée pour rendre le savoir d'une organisation atteignable et utilisable dans ses outils quotidiens.</p>
<p>Si le savoir de votre entreprise est éparpillé entre des fichiers, des conversations et quelques personnes, le détail de l'offre est de l'autre côté.</p>
<ul>
<li><a href="https://peakn8.com" rel="me">peakn8.com</a></li>
<li><a href="https://github.com/scrumier" rel="me">GitHub</a></li>
<li><a href="https://www.linkedin.com/in/sonam-crm/" rel="me">LinkedIn</a></li>
<li><a href="https://x.com/sonam_crm" rel="me">X</a></li>
<li><a href="/cdn-cgi/l/email-protection#9dfff2f3f7f2e8efddeef2f3fcf0b3f0f8"><span class="__cf_email__" data-cfemail="fc9e93929693898ebc8f93929d91d29199">[email&#160;protected]</span></a></li>
</ul>
</section>
</div></div>
  <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a4ef31c67c6a6a4d',t:'MTc5Mjc0MjI4Mw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>
