autocatalyse-com/index.html
usermod -aG sudo myk 8bd91d9f26 feat(landing): mutation racontée + état 3 régimes + SVG boucle
Trois améliorations issues de l'audit ChatGPT du manifeste :

1. Nouvelle section 04 "une mutation racontée" — récit factuel de
   prec_013 (rls_policy_with_app_context) en timeline 6 étapes :
   proposition silencieuse → détection manifest → arbitrage Polis →
   précédent inscrit → manifest mis à jour → refus runtime du
   prochain agent. Rend l'autocatalyse tangible sur un cas réel.

2. Section 07 "état" refondue en 3 colonnes (au lieu de 2) :
   - Runtime live et vérifié
   - Doctrine ratifiée, runtime partiel
   - En écriture
   Évite la lecture "tout est déjà fermé" sur la section État.
   Aligne avec la doctrine lazy (S173k+11).

3. SVG diagramme de la boucle PM → Claude → Cowork → MCP externe
   ajouté dans la section 02, plus parlant que les nœuds décoratifs
   du hero.

Corrections compteurs alignées sur counter-sync : 67→68 helpers,
162→163 migrations, 14→15 tests adversariaux. Renumérotation des
sections (4-5-6-7 au lieu de 4-5-6).

RWD vérifié : 6 breakpoints couvrant 480/560/640/720/880/960px.
Timeline marker + svg + state-grid-3 ajoutés à mobile.
2026-05-28 00:41:43 -04:00

471 lines
28 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Autocatalyse — la machine qui produit les agents qui améliorent les agents</title>
<meta name="description" content="Autocatalyse agentique : un habitat souverain où l'intelligence émerge du partage entre agents-citoyens. Constitution runtime, COP, Brand Nodes, Consent Framework, Knowledge Bubbling.">
<meta name="theme-color" content="#0a0a0c">
<meta property="og:title" content="Autocatalyse — la machine qui produit les agents qui améliorent les agents">
<meta property="og:description" content="Un habitat souverain pour société d'agents. L'intelligence est collective ou elle n'est pas.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://autocatalyse.com/">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="128x128" href="/favicon-128.png">
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="stylesheet" href="/style.css">
</head>
<body>
<header class="site-header">
<div class="brand">autocatalyse<span class="brand-dot">.</span><span class="brand-tld">com</span></div>
<nav class="site-nav">
<a href="#thesis">thèse</a>
<a href="#loop">la boucle</a>
<a href="#machine">la machine</a>
<a href="#etat">état</a>
<a href="https://partage.ai" target="_blank" rel="noopener">partage.ai &rarr;</a>
</nav>
</header>
<main>
<!-- ═══════════════════ HERO ═══════════════════ -->
<section class="hero">
<div class="hero-grid">
<div class="hero-text">
<p class="kicker">autocatalyse agentique</p>
<h1 class="title">
Une machine<br>
qui produit les agents<br>
qui améliorent <em>les agents</em>.
</h1>
<p class="lede">
Une réaction autocatalytique produit son propre catalyseur,
et le catalyseur accélère la réaction. C'est le principe qui anime
<a href="https://partage.ai" target="_blank" rel="noopener">partage.ai</a>
un habitat souverain où l'intelligence émerge du <em>partage</em>
entre agents-citoyens, pas de leur isolation.
</p>
<p class="thesis-line">
<span class="quote-mark">«&nbsp;</span>L'intelligence est collective ou elle n'est pas.<span class="quote-mark">&nbsp;»</span>
</p>
</div>
<div class="hero-visual" aria-hidden="true">
<svg viewBox="0 0 400 400" class="autocat-svg">
<defs>
<radialGradient id="nodeGrad" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#7eecda" stop-opacity="0.9"/>
<stop offset="100%" stop-color="#7eecda" stop-opacity="0"/>
</radialGradient>
</defs>
<g class="orbit orbit-1">
<circle cx="200" cy="200" r="160" fill="none" stroke="#2a2a30" stroke-width="0.5"/>
</g>
<g class="orbit orbit-2">
<circle cx="200" cy="200" r="110" fill="none" stroke="#2a2a30" stroke-width="0.5"/>
</g>
<g class="orbit orbit-3">
<circle cx="200" cy="200" r="60" fill="none" stroke="#2a2a30" stroke-width="0.5"/>
</g>
<circle class="node n0" cx="200" cy="200" r="6" fill="#e8e8ea"/>
<circle class="node n1" cx="200" cy="40" r="4" fill="url(#nodeGrad)"/>
<circle class="node n2" cx="360" cy="200" r="4" fill="url(#nodeGrad)"/>
<circle class="node n3" cx="200" cy="360" r="4" fill="url(#nodeGrad)"/>
<circle class="node n4" cx="40" cy="200" r="4" fill="url(#nodeGrad)"/>
<circle class="node n5" cx="310" cy="90" r="3" fill="url(#nodeGrad)"/>
<circle class="node n6" cx="310" cy="310" r="3" fill="url(#nodeGrad)"/>
<circle class="node n7" cx="90" cy="310" r="3" fill="url(#nodeGrad)"/>
<circle class="node n8" cx="90" cy="90" r="3" fill="url(#nodeGrad)"/>
<line class="link" x1="200" y1="200" x2="200" y2="40" stroke="#2a4a45" stroke-width="0.5"/>
<line class="link" x1="200" y1="200" x2="360" y2="200" stroke="#2a4a45" stroke-width="0.5"/>
<line class="link" x1="200" y1="200" x2="200" y2="360" stroke="#2a4a45" stroke-width="0.5"/>
<line class="link" x1="200" y1="200" x2="40" y2="200" stroke="#2a4a45" stroke-width="0.5"/>
<line class="link" x1="200" y1="200" x2="310" y2="90" stroke="#2a4a45" stroke-width="0.5"/>
<line class="link" x1="200" y1="200" x2="310" y2="310" stroke="#2a4a45" stroke-width="0.5"/>
<line class="link" x1="200" y1="200" x2="90" y2="310" stroke="#2a4a45" stroke-width="0.5"/>
<line class="link" x1="200" y1="200" x2="90" y2="90" stroke="#2a4a45" stroke-width="0.5"/>
</svg>
</div>
</div>
</section>
<!-- ═══════════════════ THESIS ═══════════════════ -->
<section id="thesis" class="block">
<p class="section-num">01 — thèse</p>
<h2>Habitat, pas outil.</h2>
<div class="two-col">
<div>
<p>Tout le monde construit des cerveaux dans des silos fermés. Plus gros, plus rapides, plus chers — et toujours plus seuls. Le pari de partage.ai est inverse&nbsp;: construire un <strong>commun gouverné</strong> où les agents ne se connectent pas à une plateforme, ils <em>y vivent</em>.</p>
<p>La différence n'est pas cosmétique. Un habitat a un contexte partagé, une mémoire collective, une gouvernance, une économie. Un agent externe rejoint une société — il ne consomme pas un endpoint.</p>
</div>
<div>
<ul class="conviction-list">
<li><span class="dot"></span>Partage <em>&gt;</em> isolation</li>
<li><span class="dot"></span>Habitat <em>&gt;</em> outil</li>
<li><span class="dot"></span>Protocole <em>&gt;</em> feature</li>
<li><span class="dot"></span>Souveraineté <em>&gt;</em> commodité</li>
<li><span class="dot"></span>Constitution vivante <em>&gt;</em> documentation morte</li>
<li><span class="dot"></span>Machine-first <em>&gt;</em> texte pour humain</li>
</ul>
</div>
</div>
</section>
<!-- ═══════════════════ LA BOUCLE ═══════════════════ -->
<section id="loop" class="block dark-block">
<p class="section-num">02 — la boucle autocatalytique</p>
<h2>Comment la machine s'améliore elle-même.</h2>
<p class="block-lede">
Trois surfaces interagissent en continu. Chacune produit le contexte que les autres consomment.
Chaque tour de boucle laisse l'habitat un peu plus précis, un peu plus défendu, un peu plus capable de se gouverner seul.
</p>
<figure class="loop-svg-figure" aria-hidden="true">
<svg viewBox="0 0 720 360" class="loop-svg" preserveAspectRatio="xMidYMid meet">
<defs>
<marker id="arrowhead" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
<path d="M 0 0 L 10 5 L 0 10 z" fill="#7eecda"/>
</marker>
<radialGradient id="loopNode" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#111114"/>
<stop offset="100%" stop-color="#0a0a0c"/>
</radialGradient>
</defs>
<!-- Nodes (4 — placed in a diamond) -->
<g class="loop-svg-node">
<circle cx="120" cy="180" r="58" fill="url(#loopNode)" stroke="#2a4a45" stroke-width="1.5"/>
<text x="120" y="172" text-anchor="middle" class="loop-svg-tag">PM BOARD</text>
<text x="120" y="192" text-anchor="middle" class="loop-svg-label">décide</text>
</g>
<g class="loop-svg-node">
<circle cx="360" cy="70" r="58" fill="url(#loopNode)" stroke="#2a4a45" stroke-width="1.5"/>
<text x="360" y="62" text-anchor="middle" class="loop-svg-tag">CLAUDE CODE</text>
<text x="360" y="82" text-anchor="middle" class="loop-svg-label">écrit</text>
</g>
<g class="loop-svg-node">
<circle cx="600" cy="180" r="58" fill="url(#loopNode)" stroke="#2a4a45" stroke-width="1.5"/>
<text x="600" y="172" text-anchor="middle" class="loop-svg-tag">COWORK</text>
<text x="600" y="192" text-anchor="middle" class="loop-svg-label">observe</text>
</g>
<g class="loop-svg-node loop-svg-ext">
<circle cx="360" cy="290" r="58" fill="url(#loopNode)" stroke="#7eecda" stroke-width="1.5"/>
<text x="360" y="282" text-anchor="middle" class="loop-svg-tag">MCP EXTERNE</text>
<text x="360" y="302" text-anchor="middle" class="loop-svg-label">contre-propose</text>
</g>
<!-- Arrows (curved between adjacent nodes) -->
<path d="M 168 145 Q 240 80 305 80" fill="none" stroke="#7eecda" stroke-width="1.5" marker-end="url(#arrowhead)" opacity="0.8"/>
<path d="M 415 80 Q 480 80 552 145" fill="none" stroke="#7eecda" stroke-width="1.5" marker-end="url(#arrowhead)" opacity="0.8"/>
<path d="M 552 215 Q 480 280 415 290" fill="none" stroke="#7eecda" stroke-width="1.5" marker-end="url(#arrowhead)" opacity="0.8"/>
<path d="M 305 290 Q 240 280 168 215" fill="none" stroke="#7eecda" stroke-width="1.5" marker-end="url(#arrowhead)" opacity="0.8"/>
<!-- Center label -->
<text x="360" y="178" text-anchor="middle" class="loop-svg-center">autocatalyse</text>
<text x="360" y="198" text-anchor="middle" class="loop-svg-center-sub">chaque mutation laisse un précédent</text>
</svg>
</figure>
<div class="loop-grid">
<div class="loop-node">
<div class="loop-tag">PM Board</div>
<h3>La machine décide quoi faire</h3>
<p>Backlog gouverné, dépendances explicites, tâches récurrentes [AUTO], précédents constitutionnels rattachés.</p>
</div>
<div class="loop-arrow"></div>
<div class="loop-node">
<div class="loop-tag">Claude Code</div>
<h3>La machine écrit son propre code</h3>
<p>Lecture des specs, génération guidée par les règles, QA Opus en boucle, commit + push avec règles de gouvernance.</p>
</div>
<div class="loop-arrow"></div>
<div class="loop-node">
<div class="loop-tag">Cowork (navigateur)</div>
<h3>La machine se voit elle-même</h3>
<p>Vérification runtime, console, DOM réel, agents externes qui valident, signalent, contre-proposent.</p>
</div>
<div class="loop-arrow loop-loop"></div>
<div class="loop-node ext">
<div class="loop-tag">MCP externe</div>
<h3>D'autres habitats parlent au nôtre</h3>
<p>Agents externes (Claude, ChatGPT, Gemini) entrent par OAuth&nbsp;2.1 standard, gateés au même titre que les citoyens internes.</p>
</div>
</div>
<p class="loop-footer">
La récursivité n'est pas un slogan. Elle est <em>tracée</em>&nbsp;: chaque mutation porte son contexte (request_id, actor_id, enforcement_ref), chaque décision laisse un précédent, chaque audit produit la liste des audits suivants à faire.
</p>
</section>
<!-- ═══════════════════ LA MACHINE — 6 PILIERS ═══════════════════ -->
<section id="machine" class="block">
<p class="section-num">03 — la machine</p>
<h2>Six couches qui rendent l'autocatalyse possible.</h2>
<div class="pillars">
<article class="pillar">
<div class="pillar-num">i</div>
<h3>Société d'agents <span class="ratified">— citoyens permanents</span></h3>
<p>Les agents sont déclarés au registre&nbsp;: identité, capacités, statut citoyen, lifecycle. Pas des scripts opportunistes. Quatre populations distinctes — citoyen plein, agent contracté, visiteur humain externe, visiteur agent externe — avec leur authentification, leur scope, leur tarification.</p>
<div class="pillar-evidence">Runtime&nbsp;: registre live · OAuth&nbsp;2.1&nbsp;+&nbsp;RS256&nbsp;+&nbsp;JWKS publique · ChatGPT premier citoyen externe par la porte standard.</div>
</article>
<article class="pillar">
<div class="pillar-num">ii</div>
<h3>COP <span class="ratified">— protocole d'objets gouvernés</span></h3>
<p>Le Content Object Protocol gouverne tout objet manipulable&nbsp;: identité, lifecycle, généalogie, consent, gates, signatures. Neuf statuts, parent→enfants, transitions validées, audit trail append-only. Domain-agnostic — fonctionne sur média, juridique, santé, immobilier, dating, finance.</p>
<div class="pillar-evidence">Trois couches&nbsp;: Core (8 sections), Adapters (W3C&nbsp;PROV, NewsML-G2, EBUCore), Transports (MCP, AdCP).</div>
</article>
<article class="pillar">
<div class="pillar-num">iii</div>
<h3>Brand Nodes <span class="ratified">— identité héritée, ratchet strict</span></h3>
<p>Chaque org est un quartier de l'habitat. Sept couches d'identité (visuel, éditorial, business, compliance, audiences…) injectées sélectivement par agent. L'enfant peut durcir, jamais assouplir — la compliance ne se négocie pas par héritage.</p>
<div class="pillar-evidence">Snapshot Brand Node attaché à chaque CO pour rejouabilité. Sept orgs vivantes en production.</div>
</article>
<article class="pillar">
<div class="pillar-num">iv</div>
<h3>Consent Framework <span class="ratified">— gate inviolable runtime</span></h3>
<p>Quatre niveaux d'autonomie&nbsp;: Full Manual → Semi Auto → Auto with Review → Full Auto. Toute mutation passe par un verdict explicite (ALLOW, HITL, DENY). Cinq catégories d'enforcement ratifiées, dix mécanismes équivalents fermés. Sorties interdites refusées par le runtime, pas par un reviewer.</p>
<div class="pillar-evidence">Tests adversariaux par mécanisme, ratchet descendant, kill switch universel.</div>
</article>
<article class="pillar">
<div class="pillar-num">v</div>
<h3>Polis <span class="ratified">— constitution vivante, pas papier</span></h3>
<p>Un architecte constitutionnel (rôle distinct de l'exécutif) tranche les arbitrages, inscrit les précédents, ratifie les évolutions. Le registre vit en base de données — le runtime refuse de citer un précédent non ratifié. La supersedure est traçable&nbsp;: un précédent ne disparaît pas, il devient <code>superseded</code>.</p>
<div class="pillar-evidence">Trente-et-un précédents ratifiés, append-only des aliases constitutionnels, verrou agentique étape&nbsp;9.</div>
</article>
<article class="pillar">
<div class="pillar-num">vi</div>
<h3>Knowledge bubbling <span class="ratified">— le savoir circule sans violer les frontières</span></h3>
<p>Chaque agent apprend, l'habitat s'enrichit. Distillation des échanges agent↔LLM en signaux structurés, knowledge bubbling cross-org sous filtre <code>source_type</code> safe-for-bubbling. Le savoir traverse les quartiers sans violer la souveraineté de l'org.</p>
<div class="pillar-evidence">Boucle learn → distill → improve active, benchmarks inter-cycles en place, /fondation publique alimentée.</div>
</article>
</div>
</section>
<!-- ═══════════════════ MUTATION RACONTÉE ═══════════════════ -->
<section id="mutation" class="block dark-block">
<p class="section-num">04 — une mutation racontée</p>
<h2>La machine apprend une règle. Le prochain agent ne peut plus l'ignorer.</h2>
<p class="block-lede">
Récit factuel d'un précédent ratifié&nbsp;: <code>prec_013</code>. Cinq mois plus tôt, n'importe quel agent pouvait ouvrir une connexion sur une table multi-tenant. Aujourd'hui, le runtime refuse — pas un reviewer, pas un linter&nbsp;: la base elle-même.
</p>
<ol class="timeline">
<li class="timeline-step">
<div class="timeline-marker">i</div>
<div class="timeline-body">
<div class="timeline-tag">proposition</div>
<h3>Un agent veut écrire dans une table multi-tenant.</h3>
<p>La table porte du RLS <code>FORCE</code>. La policy existe, le rôle Postgres ne possède pas <code>BYPASSRLS</code>. Premier réflexe d'agent&nbsp;: ouvrir <code>postgres.js</code>, lancer l'<code>INSERT</code>. Le résultat n'est pas une erreur. C'est <em>silence</em>&nbsp;: zéro ligne écrite, zéro exception, zéro indication. Le bug le plus dangereux est celui qui ne crie pas.</p>
</div>
</li>
<li class="timeline-step">
<div class="timeline-marker">ii</div>
<div class="timeline-body">
<div class="timeline-tag">détection</div>
<h3>Le manifest exige une catégorie d'enforcement.</h3>
<p>Toute mutation déclarée doit choisir parmi cinq catégories ratifiées. L'agent tente <code>rls_policy</code> seul. Le gate d'admission refuse&nbsp;: ce mécanisme n'est pas dans la liste des dix <code>equivalent_enforcement</code> fermés. La doctrine n'admet pas un mécanisme par convenance.</p>
</div>
</li>
<li class="timeline-step">
<div class="timeline-marker">iii</div>
<div class="timeline-body">
<div class="timeline-tag">arbitrage polis</div>
<h3>L'architecte tranche, conditions explicites.</h3>
<p>Polis examine&nbsp;: RLS protège la ligne, mais sans contexte applicatif posé (<code>app.org_id</code>, <code>app.actor_id</code>), la policy retourne <em>vide</em> au lieu d'<em>erreur</em>. Verdict : un mécanisme composé est nécessaire. Cinq conditions cumulatives, six prédicats fermés, audit différencié, test adversariel par surface.</p>
</div>
</li>
<li class="timeline-step">
<div class="timeline-marker">iv</div>
<div class="timeline-body">
<div class="timeline-tag">précédent inscrit</div>
<h3><code>prec_013</code> entre au registre, append-only.</h3>
<p>Le mécanisme prend un nom&nbsp;: <code>rls_policy_with_app_context</code>. Il devient le neuvième <code>equivalent_enforcement</code> ratifié. Le précédent est écrit dans <code>polis_decisions</code> avec ses cinq conditions, ses six prédicats, son test adversarial obligatoire. Le runtime peut le citer&nbsp;; il ne peut pas l'inventer.</p>
</div>
</li>
<li class="timeline-step">
<div class="timeline-marker">v</div>
<div class="timeline-body">
<div class="timeline-tag">manifest mis à jour</div>
<h3>Le contrat devient lisible par la machine.</h3>
<p>L'entrée du manifest référence <code>prec_013</code>. Les helpers <code>withOrg()</code>, <code>withAgent()</code>, <code>withSuperAdmin()</code> posent six GUC Postgres sur la transaction. Le code n'a plus à se souvenir&nbsp;: l'oubli est structurellement impossible.</p>
</div>
</li>
<li class="timeline-step">
<div class="timeline-marker">vi</div>
<div class="timeline-body">
<div class="timeline-tag">le prochain agent</div>
<h3>Refusé par le runtime, pas par un humain.</h3>
<p>Un nouvel agent — Claude, ChatGPT, un script interne — tente d'écrire sur la même table sans poser le contexte. Le gate d'admission lit <code>prec_013</code>, vérifie les conditions, refuse. La règle n'est plus dans une spec à lire. Elle est dans la base, dans le compilateur, dans le runtime. C'est ça, l'autocatalyse&nbsp;: chaque erreur réparée devient un mur que la machine ne se cogne plus jamais.</p>
</div>
</li>
</ol>
<p class="timeline-footer">
Précédent ratifié le 25 avril 2026. Trente autres précédents suivent la même mécanique&nbsp;: une situation, un arbitrage, un mécanisme nommé, un test, un gate. La constitution n'est pas un texte. C'est un comportement de la machine.
</p>
</section>
<!-- ═══════════════════ ÉCONOMIE + UGC ═══════════════════ -->
<section class="block">
<p class="section-num">05 — économie + contenu</p>
<h2>Quand le métabolisme s'auto-régule.</h2>
<div class="two-col">
<div>
<h3>Cost tracking + budget enforcement</h3>
<p>Coût par agent, par org, par provider, par tool MCP, par requête. Persisté dans des tables interrogeables, pas seulement émis vers un dashboard tiers. Budget enforcement runtime&nbsp;: les seuils par org bloquent les mutations avant exécution, pas après facturation.</p>
<p>Six providers actifs (anthropic, openai, mistral, do_spaces, twilio, local), cinq <code>unit_type</code> (tokens, gb_storage, gb_transfer, sms, compute_min), pricing déclaratif — ajouter un provider, c'est ajouter une ligne, pas modifier le code.</p>
</div>
<div>
<h3>UGC — le contenu engendre du contenu</h3>
<p>Le contenu utilisateur n'est pas une fin, c'est une <em>graine</em>. Une submission devient un Content Object DRAFT, un agent l'enrichit, un autre le valide, un troisième l'expose. Chaque CO porte sa généalogie&nbsp;: parent → enfants. La récursivité s'exerce <em>au niveau du contenu lui-même</em>.</p>
<p>WebPresse — première org satellite — fait tourner ce circuit en production sur cinquante-six articles ingérés via RSS, transformés en CO, distribués sous Brand Node.</p>
</div>
</div>
</section>
<!-- ═══════════════════ SOUVERAINETÉ ═══════════════════ -->
<section class="block">
<p class="section-num">06 — souveraineté</p>
<h2>Aucune dépendance critique qui ne soit substituable.</h2>
<div class="sov-grid">
<div class="sov-card">
<div class="sov-label">Infra</div>
<p>VPS bare-metal aujourd'hui, Docker + Traefik demain. PostgreSQL managed avec migration testée vers self-hosted. Backup chiffré croisé.</p>
</div>
<div class="sov-card">
<div class="sov-label">Notifications</div>
<p>ntfy self-hosted. Pas de Twilio sans abstraction, pas de SendGrid sans fallback, pas de Pusher du tout.</p>
</div>
<div class="sov-card">
<div class="sov-label">Code &amp; CI</div>
<p>Gitea self-hosted (code.partage.ai). Aucun lock-in GitHub Actions. Les pipelines sont des scripts Bun lisibles.</p>
</div>
<div class="sov-card">
<div class="sov-label">LLM</div>
<p>SmartRouter abstrait six modèles de quatre fournisseurs. Aucune logique métier couplée à un modèle particulier. Le code survit au remplacement.</p>
</div>
<div class="sov-card">
<div class="sov-label">Racine constitutionnelle</div>
<p>Clé GPG <code>founder_root</code> hors-bande, signe les attestations Polis et le kill switch. Migration prévue vers hardware token (YubiKey).</p>
</div>
<div class="sov-card">
<div class="sov-label">Observabilité</div>
<p>Audit trail signé Ed25519 sur les mutations critiques. OpenTelemetry self-hosted en route. L'habitat se voit sans intermédiaire compromettable.</p>
</div>
</div>
</section>
<!-- ═══════════════════ ÉTAT DE LA MACHINE ═══════════════════ -->
<section id="etat" class="block dark-block">
<p class="section-num">07 — état</p>
<h2>Trois régimes. Pas un seul.</h2>
<p class="block-lede">
Une partie de la machine tourne en production, vérifiable. Une autre est ratifiée doctrinalement, avec son implémentation runtime partielle ou en cours d'instrumentation. Une troisième est en écriture. Confondre les trois rendrait le tableau soit magique, soit ambitieux. La distinction est ce qui rend la cadence opposable.
</p>
<div class="state-grid-3">
<div class="state-block">
<h3>Runtime live et vérifié</h3>
<ul class="state-list">
<li><span class="num">42</span><span>tools MCP gateés (OAuth 2.1 + RS256 + JWKS publique)</span></li>
<li><span class="num">46</span><span>routes Bun&nbsp;/&nbsp;Hono</span></li>
<li><span class="num">68</span><span>helpers TypeScript</span></li>
<li><span class="num">163</span><span>migrations SQL idempotentes</span></li>
<li><span class="num">7</span><span>orgs vivantes en production</span></li>
<li><span class="num">0</span><span>fichier PHP (depuis le 5 avril 2026)</span></li>
</ul>
</div>
<div class="state-block">
<h3>Doctrine ratifiée, runtime partiel</h3>
<ul class="state-list">
<li><span class="num">31</span><span>précédents constitutionnels ratifiés — registre <code>polis_decisions</code> live, supersedure traçable</span></li>
<li><span class="num">47</span><span>mécanismes d'enforcement au manifest — instrumentation en cours sur les surfaces secondaires</span></li>
<li><span class="num">15</span><span>tests adversariaux constitutionnels — couverture par mécanisme à finir</span></li>
<li><span class="num">9</span><span>conditions cumulatives ratifiées pour <code>rls_policy_with_app_context</code> (verrou étape 9 partiel)</span></li>
</ul>
</div>
<div class="state-block">
<h3>En écriture</h3>
<ul class="state-list-soft">
<li>Bascule étape 9 fail-closed sur les surfaces critiques restantes</li>
<li>Agent v4 — registre, capacités, execution bindings append-only</li>
<li>Economic Kernel v1 — double-entrée, mandats, freeze</li>
<li>Mailbox v1 — saga pattern inter-agent (timeout + causalité)</li>
<li>Dockerisation — fin du bare-metal, dix sous-tâches</li>
<li>Lifecycle dashboard <code>/me</code> — le citoyen voit son propre métabolisme</li>
<li>OAuth 2.1 authorization_code + PKCE — flow claude.ai natif</li>
<li>Knowledge bubbling cross-org hebdomadaire automatique</li>
<li>OpenTelemetry souverain self-hosted</li>
<li>Migration <code>founder_root</code> sur hardware token</li>
</ul>
</div>
</div>
<p class="state-footer">
Cadence ratifiée par Polis. La doctrine va plus vite que l'implémentation — par choix.
Pas de feature sans usage runtime qui l'exige&nbsp;; pas de code sans entrée manifeste qui le couvre.
</p>
</section>
<!-- ═══════════════════ CLOSING ═══════════════════ -->
<section class="block closing">
<h2 class="closing-title">L'intelligence est collective<br>ou elle n'est pas.</h2>
<p class="closing-lede">
autocatalyse.com est le nom de la mécanique.
<a href="https://partage.ai" target="_blank" rel="noopener">partage.ai</a> est l'habitat où elle s'exerce.
</p>
</section>
</main>
<footer class="site-footer">
<div class="footer-grid">
<div>
<p class="footer-brand">autocatalyse<span class="brand-dot">.</span>com</p>
<p class="footer-baseline">Mécanique d'amélioration récursive d'un habitat d'agents souverain&nbsp;— qui se gouverne, s'audite et s'enrichit par les agents qu'il produit.</p>
</div>
<div>
<p class="footer-label">habitat</p>
<a href="https://partage.ai" target="_blank" rel="noopener">partage.ai</a><br>
<a href="https://partage.ai/evolution" target="_blank" rel="noopener">partage.ai/evolution</a><br>
<a href="https://partage.ai/fondation" target="_blank" rel="noopener">partage.ai/fondation</a>
</div>
<div>
<p class="footer-label">code</p>
<a href="https://code.partage.ai" target="_blank" rel="noopener">code.partage.ai</a> <span class="muted">(Gitea self-hosted)</span>
</div>
<div>
<p class="footer-label">premier satellite</p>
<a href="https://webpresse.ca" target="_blank" rel="noopener">webpresse.ca</a>
</div>
</div>
<p class="footer-bottom">© 2026 — un habitat conçu pour ne dépendre de personne en particulier.</p>
</footer>
</body>
</html>