Aller au contenu principal

Forward deployed · note d'ingénierie

Brancher un modèle sur une base.
La 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 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.

19sources hétérogènes
143scripts de pipeline
24 840communes géocodables
3 222tests automatisés
12harnais d'évaluation
195incidents indexés
23tâches programmées
49migrations de schéma
1personne

Acquisition · le réel est hostile

19 sources. 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.

12 en chaîneseuilcorpus

Structuration · de la prose à un modèle interrogeable

Une annonce, c'est du texte. 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.

la page sourcele schémadate limiteduréerémunérationéquipementéligibilitésans extrait, champ nul

Ce qui périme

Un corpus juste hier est faux 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 é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.

source richece qu'on écritsource pauvrejamais deremplissage

L'ennemi · la panne qui ne se voit pas

Un pipeline qui tombe se répare. Un pipeline qui ment 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à.

on casse une ligne1 rouge · le verrou tienton casse une ligneaucun rouge · sonde aveugle

Mesurer avant de livrer

« Ça a l'air mieux » n'est pas un 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.

attenduavantaprèssous le seuil = rien ne part

Production · le service qui fait semblant

Le pire mode de panne n'est pas l'arrêt. C'est le service qui fait 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.

cachebudgetfusiblemodèlerequêterendu sans appelmode dégradé, jamais mis en cache

Interopérabilité · une seconde porte

Un connecteur n'a pas de 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.

le siteun assistantun seul compteurle corpus

Capitaliser · l'incident devient contrainte

195 pièges écrits. 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-midi.
Lui fabriquer un terrain fiable et performant, c'est le métier.

Ce produit est en production. Chaque garantie de cette page y est exercée à chaque déploiement.