Cette page a besoin de son serveur local. Ouverte directement depuis le disque, le navigateur bloque ses modules et ses données : rien ne répondra. Dans le dossier du projet : npm run servir, puis http://127.0.0.1:4317.

Deuxième tour · MénageSimple

Un message arrive.
Il est lu, qualifié, routé.

L'agent classe et justifie ; le dispatcheur valide. Aucun modèle ne choisit qui remplace qui : cette décision est du code, elle se calcule, donc elle se teste et se rejoue sans coût.

Chiffre en l'air, par mois
— CHF

Intervenantes au planning
—

Synthétiques, graine — · aucune donnée réelle

Banc d'essai
167 tests

16 mutations jouées, 4 survivantes, 4 correctifs

Ce que la cliente voit

Capture de leur page d'accueil relevée le 05/11/2026, posée telle quelle. Le widget reprend leur bleu #0095CD et leurs pilules à 50 px de rayon — assombri à #0077A4 là où il porte du texte blanc, sinon il ne donne que 3,4:1. Aucune requête ne sort de cette page — pas une police, pas un CDN.

13 messages enregistrés

Leurs réponses sont figées : on peut cliquer mille fois, rien ne bouge et aucun appel n'est émis. Les quatre en rouge sont les cas qui mordent. Les plus parlants sont aussi dans le widget, au-dessus du champ de saisie : rien à faire défiler pour essayer. Tapez aussi vos propres questions — « quels services proposez-vous ? », « combien ça coûte ? », « vous venez à Lausanne ? », « et si quelque chose casse ? ». L'agent répond à partir de quinze faits relevés sur leur site public, chacun avec sa source, et répond « je ne sais pas » quand aucun ne correspond.

Ce que le bureau voit

Ce que l'IA a fait, ce que j'ai vérifié

Écrit avec un modèle

Le gros du code et des commentaires, en dialogue. Les premières versions du barème et du score. Les treize brouillons que le filtre intercepte, rédigés à la main d'après ce qu'un modèle non encadré écrit — un prix ferme, une confirmation.

Décidé à la main

Le périmètre — deux routes traitées, deux reconnues et refusées. La frontière : le modèle lit, il ne décide jamais. Les trois hypothèses chiffrées, et le choix de les nommer plutôt que de les lisser. Ce qui n'est pas fait, et pourquoi.

Repris parce que c'était faux

Le modèle proposait un garde-fou qui ne s'appliquait qu'à un incident classé : sur un message non classé, la promesse passait. Il tutoyait une cliente parce que \b mord à l'intérieur de « coûte ». Il résolvait « demain » en date sans jamais s'en servir pour router le créneau : l'écran annonçait vendredi et routait un mardi.

Comment je l'ai su

Le brouillon du modèle annonçait 274 CHF ; le barème, à partir des mêmes 30 m², en donne 247,05. Un écart de 27 francs sur un prix dit « ferme » à une cliente — et la raison même pour laquelle le prix ne sort jamais du modèle. Seize mutations jouées ensuite contre mon propre code : quatre ont survécu au banc, chacune a fait corriger quelque chose. Et treize défauts trouvés à l'écran, pas au banc : un banc vert ne dit rien de ce qu'une personne voit. Tous listés dans le README.md.

Ce que je n'ai pas pu vérifier

Le modèle est figé en rejeu : l'énoncé interdit les services payants, et une démonstration qui rappelle une API ne se rejoue pas à l'identique. Les treize extractions sont donc écrites à la main — elles disent ce que le modèle doit rendre, pas ce qu'il a rendu, et chaque message l'affiche en toutes lettres au-dessus de son extraction. C'est la première chose à faire ensuite : node scripts/enregistrer.mjs passe les treize contre le vrai modèle une seule fois et réécrit la provenance, --verifier compare sans rien écrire. ANTHROPIC_API_KEY=… npm run servir rebranche le mode direct, plafonné à vingt appels.