Forward deployed · note d'ingénierie
Brancher un modèle sur une base.
La supervision humaine reste irremplacableLa supervision humaine reste irremplacableLa supervision humaine reste irremplacable
Penser et mettre en oeuvre tous les sous-systèmes nécessaires pour produire la qualité réelle
Ce que ça pèse
Tout ce qui suit est tenu par une seule personneune seule personneune seule personne.
Un moteur qui lit une démarche artistique en prose et rend des résidences pertinentes. Sous le moteur : une chaîne de collecte autonome, une ontologie du domaine, un système de quotas, des paiements, un espace personnel, un back-office de curation, un export RGPD.
Pas d'équipe data, pas d'astreinte, pas de fournisseur de données. Cette contrainte a dicté l'architecture entière : ce qui ne se vérifie pas tout seul n'existe pas.
Acquisition · le réel est hostile
19 sources. Aucun schéma commun.Aucun schéma commun.Aucun schéma commun.
Des listes HTML qui changent de balisage sans prévenir. Des PDF, dont certains scannés. Des annonces qui ne vivent que dans l'image d'un post Instagram, passées à l'OCR slide par slide. Un annuaire public derrière un WAF, franchi par un navigateur headless en sidecar. L'une des sources expose bien une API : elle rend des descriptions tronquées, points de suspension compris.
Un lieu qui expose plusieurs programmes est déplié en autant de fiches, pas en une. Chaque requête sortante est épinglée sur l'IP déjà validée : résoudre le DNS pour contrôler puis laisser le client HTTP re-résoudre ne garde rien, car entre les deux un rebinding répond public au contrôle et privé à la connexion. Crawl-delay respecté, déduplication sur le couple nom et ville, code postal strippé des deux côtés sinon la même adresse entre deux fois.
Onboarder une source, c'est une entrée dans un registre unique dont les quatre passes dérivent. Avant, c'étaient trois listes tenues à la main, déjà divergentes : 16, 13 et 10 entrées pour le même corpus.
Structuration · de la prose à un modèle interrogeable
Une annonce, c'est du texte. Un corpus, c'est un schéma.Un corpus, c'est un schéma.Un corpus, c'est un schéma.
Huit catégories d'entrée, sept familles de pratique, un vocabulaire de disciplines fermé, 24 840 communes indexées. Chaque annonce est réduite à ce schéma, champ par champ, avec l'extrait qui l'a produit. Sans extrait, pas de champ.
Ce qui entre dans le vecteur de recherche est choisi, pas subi : cinq champs. Les critères de sélection y entrent, mais seulement ceux qui portent sur une personne. Jamais la liste des pièces à fournir, qui polluerait chaque recherche du même vocabulaire administratif.
Trois notions d'argent cohabitent sans se confondre : ce que le lieu verse, ce que coûte le dossier, ce que coûte la participation. Les écraser en un champ « prix » aurait été plus simple, et faux.
Ce qui périme
Un corpus juste hier est faux aujourd'huifaux aujourd'huifaux aujourd'hui.
Six étapes s'enchaînent chaque week-end sans personne : douze sources parcourues, annonces qualifiées, descriptions réécrites, lieux géocodés, vecteurs recalculés. Vingt-trois tâches programmées entretiennent le reste, chacune enregistrant son issue en base. Une source qui tombe fait virer le run au rouge, avec son nom et l'étape fautive.
Une deadline n'est jamais recopiée : elle est recomparée au calendrier, et seule une date de confiance fait dire « ouvert ». Ce qu'un humain corrige à la main est verrouillé champ par champ, sinon l'ingestion l'écraserait le dimanche suivant. Une description réécrite porte un marqueur ; sans lui, sa propre source l'effacerait chaque semaine.
L'expiration éteint, elle ne rallume jamais. Rallumer sur une date d'événement mal lue promettrait un appel qui n'existe plus.
Viabilité · fail-closed par défaut
Le pipeline a le droit de ne rien écrirene rien écrirene rien écrire.
Chaque écriture est conditionnée au niveau de confiance rendu par le modèle. Confiance basse : la fiche est sautée entière. Champ à risque sans extrait à l'appui : le champ est annulé, pas deviné. Un champ vide n'est pas un échec du pipeline, c'est une réponse.
Deux refus argumentés sur la même fiche et elle est oubliée pour de bon, sous une pierre tombale que l'insertion hebdomadaire respecte, sinon la source la ressusciterait chaque dimanche. Une erreur transitoire, elle, ne compte pas : un fetch raté se rejoue au run suivant. Verdict et panne sont deux choses distinctes, et la distinction est écrite, pas déduite d'un code d'erreur.
Un lieu déclaré inexistant est supprimé, sauf quand le motif porte sur sa localisation. Là, c'est notre métadonnée qui est fausse, pas le lieu. Une résidence de Martinique enregistrée en Pays de la Loire a failli disparaître pour cette raison.
L'ennemi · la panne qui ne se voit pas
Un pipeline qui tombe se répare. Un pipeline qui mentmentment se propage.
Un alias de modèle a changé de comportement sans changer de nom. Des clés racine ont cessé d'être émises, la confiance a été lue « basse » par défaut, et 100 % des fiches ont été sautées, sans une seule erreur, sans un seul log rouge. Depuis, le contrat de sortie est un schéma JSON strict côté modèle, revalidé à l'arrivée.
Même classe partout. Une source morte laissait le run au vert tant qu'une des douze passait. Un test peut passer alors qu'il ne regarde plus rien : on casse volontairement le code qu'il garde, et s'il ne rougit pas, c'est lui qu'on réécrit. Une sonde peut conclure « rien trouvé » parce que son motif ne correspond plus : chaque sonde porte un contrôle positif, elle doit d'abord prouver qu'elle sait voir.
Trois de mes propres sondes ont menti dans le sens du vert. Une sonde qui se trompe se trompe presque toujours dans ce sens-là.
Mesurer avant de livrer
« Ça a l'air mieux » n'est pas un résultatun résultatun résultat.
Douze harnais encadrent la pertinence. Des jeux de cas au résultat écrit d'avance, qui appellent le vrai modèle, pas une imitation. Un rejeu qui compare deux versions du score sur le corpus réel. Une attribution d'impact réglage par réglage, en en désactivant un seul à la fois, sur les données de production.
Les assertions portent sur une propriété, jamais sur un nom de fiche. Un cas a rougi sur un classement pourtant juste, simplement parce que le meilleur résultat du corpus portait un titre en anglais.
Aucun réglage de pertinence n'est parti sur une intuition.
Production · le service qui fait semblant
Le pire mode de panne n'est pas l'arrêt. C'est le service qui fait semblantfait semblantfait semblant.
Quatre couches bornent le coût : un cache segmenté, un budget de jetons décompté par identité, un fusible qui s'ouvre au-delà d'un seuil horaire et bascule sur un mode sans modèle. Quand ce mode s'active, la réponse annonce qu'elle est dégradée, et n'est pas mise en cache : mémorisée vingt-quatre heures, elle continuerait d'annoncer une panne terminée.
Le déploiement se termine par un contrôle qui peut le refuser : une vingtaine de vérifications côté serveur, une dizaine dans un vrai navigateur, dont le nombre de fiches servies à un anonyme et la fraîcheur des vecteurs. Un point de santé répond 200 pendant que la recherche est morte : il est interdit comme validation finale.
Interopérabilité · une seconde porte
Un connecteur n'a pas de compteur à lui.compteur à lui.compteur à lui.
Le corpus est ouvert aux assistants IA des artistes par un serveur MCP. L'autorisation passe par OAuth : enregistrement dynamique du client, PKCE exigé, et un consentement forcé par une porte posée devant le fournisseur d'identité.
Trois outils, branchés sur les mêmes fonctions que le site : la recherche, la fiche, le listing. Mêmes pools de comptage, même budget, même quota : une fiche lue depuis un assistant compte comme une fiche lue sur le site. Aucune prose générée : l'assistant reçoit des données filtrées par une liste blanche de clés, et c'est lui qui écrit.
Un serveur MCP pour les utilisateurs avancés, mais aussi comme démonstration technique par anticipation. Ce genre d'usage deviendra probablement courant dans les mois et années qui viennent.
Capitaliser · l'incident devient contrainte
195 pièges écrits. La plupart sont devenus du code.La plupart sont devenus du code.La plupart sont devenus du code.
Chaque incident est consigné : ce qui a cassé, pourquoi, et la règle qui l'empêche de revenir. Indexés en une ligne, le détail chargé seulement quand on touche au sous-système concerné. 700 lignes d'index permanent, 2 500 lignes de détail à la demande : le contexte est une ressource comptée.
Une règle qui reste écrite est une règle qu'on oubliera, donc la plupart deviennent exécutables : un test, un contrôle de déploiement, un type qui refuse de compiler. Une action tarifée sans prix affiché ne compile plus. Une route qui accepte un identifiant du client doit figurer à l'inventaire ou porter une exemption motivée, et cet inventaire est reconstruit depuis les métadonnées du framework, jamais tenu à la main.
Le système ne devient pas robuste parce qu'il a moins de bugs. Il le devient parce que chaque bug a laissé une contrainte derrière lui.
195 pièges documentés · écrits après coup, jamais avant
En une phrase
Brancher un modèle IA, c'est une après-midic'est une après-midic'est une après-midi.
Lui fabriquer un terrain fiable et performant, c'est le métierc'est le métierc'est le métier.
Ce produit est en production. Chaque garantie de cette page y est exercée à chaque déploiement.