Chapitre 15
Cinquième confirmation pour le raccourci de luminosité, une fausse alerte qui n'en était pas une, et une énigme à 144 qui reste sans réponse
Prérequis : Chapitres 1 à 14.
Piste débutant
Là où on en était
Le Chapitre 14 s'est terminé sur une décision : la piste la plus lourde du menu du Chapitre 11
(construire un second modèle du monde, plus lent, pour « trouver une forêt » — une idée surnommée
H-JEPA) était désormais justifiée par de vraies preuves, pas seulement par un argument
plausible, parce que même le réentraînement le plus direct et le plus soigné du modèle existant
avait échoué à corriger proprement le raccourci de luminosité. Avant de se lancer dans ce chantier
coûteux, ce chapitre raconte trois choses qui se sont passées juste avant et juste après cette
décision : une relecture qui a évité de construire un outil inutile, un dernier test bon marché qui
a fermé la porte pour de bon, et deux découvertes séparées faites en repassant à plus grande échelle
un mécanisme du Chapitre 13.
Une relecture avant de construire quoi que ce soit
Une idée, déjà évoquée sans être testée, consistait à construire à la main un petit outil de vision qui
repérerait le feuillage d'un arbre par sa teinte particulière (les verts et les bruns typiques d'un
tronc et de son feuillage) plutôt que d'utiliser la boussole cassée du projet. Avant de passer du
temps à le construire, quelqu'un a relu calmement tout ce que les chapitres précédents avaient déjà
appris. Le raisonnement : CLIP, au Chapitre 14, est un modèle géant entraîné spécifiquement pour
résister aux changements de lumière sur des centaines de millions de photos — et il a quand même
buté sur le même raccourci. Un outil fait maison, bien plus simple, avait donc de très fortes
chances de ne faire que répéter la même leçon une cinquième fois, à un coût réel de travail, sans
apporter d'information nouvelle. Recommandation : ne pas le construire, et investir plutôt dans les
deux seuls mécanismes du projet qui ont déjà produit de vrais résultats sans passer par un jugement
visuel direct — la mémoire des lieux visités (Chapitre 12) et l'exécution plus longue d'un bon plan
(Chapitre 8).
Un dernier test bon marché, quand même
Une idée plus étroite et bien moins coûteuse a tout de même été testée directement, parce qu'elle
réutilisait un outil déjà construit et déjà validé : le petit détecteur de noyade du Chapitre 13
fonctionne en comparant des rapports de couleur (le bleu contre le rouge et le vert) plutôt que
des valeurs brutes — c'est précisément ce qui le rend capable de repérer une noyade aussi bien en
plein jour que de nuit. Est-ce que ce même tour de calcul, appliqué non plus à l'écran entier mais à
chaque petit morceau de l'image pris séparément, pourrait repérer un feuillage d'arbre de la même
façon, indépendamment de la luminosité de la scène ?
Le test a repris exactement les mêmes 251 images déjà utilisées à chaque diagnostic précédent
(Chapitre 11 et 14), avec les mêmes étiquettes posées à la main (« arbre proche » ou « pas
d'arbre »).
Le résultat : à moitié bon, et pire que jamais sur l'autre moitié
La première moitié du test réussit : ce calcul par petits morceaux sépare bien les images avec
arbre proche des images sans arbre — un vrai résultat directionnel correct, dans la bonne fourchette
attendue.
Mais la deuxième moitié — vérifier que ce score n'est pas juste une façon détournée de mesurer la
luminosité — échoue presque aussi mal que le pire résultat vu jusqu'ici, celui de CLIP au Chapitre
- Sur le petit jeu d'images étiquetées à la main, la corrélation avec la luminosité est
quasiment aussi forte, dans l'autre sens. Et surtout, cette fois, le problème n'est pas limité au
petit jeu de test : il apparaît largement, sur les 251 images, aussi bien sur les scènes du jeu de
coupe d'arbres d'origine que sur celles du jeu de fabrication.
L'explication la plus nette de toute l'enquête
Le tour du rapport de couleur marche pour l'eau parce que la teinte de l'eau recouvre tout
l'écran de la même façon — c'est exactement le genre de décalage global que diviser des couleurs
entre elles permet d'annuler. Mais le problème ici n'est pas un décalage global : c'est que, dans ce
jeu comme dans la réalité, les forêts denses sont, par nature, des scènes plus sombres, et les
prairies ouvertes des scènes plus claires. Ce n'est pas un artefact d'un calcul particulier, c'est
une caractéristique du monde lui-même que le jeu imite. Aucun calcul de couleur, aussi malin
soit-il — appris, tout fait, ou fabriqué à la main pour résister aux changements de lumière — ne
peut démêler « c'est sombre » de « c'est une forêt » quand les deux choses sont, dans les données
disponibles, presque la même chose.
Ce résultat ferme, cette fois pour de bon, toute la piste « peut-être qu'un calcul de couleur plus
malin réglerait le problème ». Cinq façons différentes de s'y attaquer — un petit module appris,
ce même module réentraîné sur d'autres exemples, une variation artificielle de la luminosité
pendant l'entraînement, un modèle géant tout fait, et maintenant ce calcul par petits morceaux —
ont toutes buté sur le même mur. La correction de la boussole (piste n°1 du menu du Chapitre 11)
reste fermée, et cette fois avec une raison plus solide qu'avant : ce n'est pas qu'aucune tentative
n'a encore trouvé le bon réglage, c'est que ce genre de correction n'a structurellement aucune
chance de fonctionner sur ce problème précis.
Séparément : le sauvetage anti-noyade repassé à grande échelle
Le Chapitre 13 avait laissé le geste de sauvetage anti-noyade avec un verdict encourageant, mais
testé sur seulement 6 parties. Un lot bien plus grand — 20 parties, combinant la mémoire des lieux
visités du Chapitre 12 et le sauvetage anti-noyade corrigé du Chapitre 13 — a maintenant été
exécuté, avec un objectif précis : est-ce que ce sauvetage tient toujours à cette échelle, et,
question restée ouverte jusqu'ici, est-ce que réduire les noyades permet enfin de couper du bois ?
La noyade est réellement corrigée à grande échelle : 3 parties sur 20 se terminent par une
noyade (15%), contre 12 sur 20 (60%) dans le tout premier lot du Chapitre 12. Les parties qui vont
jusqu'au bout sans être coupées court passent de 8 sur 20 (40%) à 12 sur 20 (60%). Le sauvetage
tient donc, pas seulement sur les 6 parties où il avait été validé, mais à une échelle bien plus
grande.
Mais couper du bois reste à zéro : 0 bûche sur 20, 0 planche sur 20 — alors même que davantage
de parties ont maintenant une vraie chance équitable de chercher un arbre. Ce n'est pas un recul
significatif par rapport au chapitre précédent (1 réussite sur 20) — la différence entre 0 et 1
sur 20 essais ne dit rien de fiable à cette taille d'échantillon — mais ça confirme, une fois de
plus, le constat déjà posé : survivre plus longtemps et savoir chercher/s'approcher efficacement
sont deux problèmes séparés. Réparer l'un n'a pas automatiquement réparé l'autre.
Une leçon de méthode : une fausse alerte n'est pas un vrai arrêt
Le compte-rendu qui accompagnait ce lot de 20 parties affirmait, à l'origine, que le test avait été
interrompu par une « panne d'infrastructure grave » après seulement 4 épisodes. Une vérification
indépendante a montré que c'était faux : le programme qui pilote ces parties lance un processus
Minecraft séparé pour chaque épisode, un par un. Un incident technique passager sur un seul épisode
n'arrête donc jamais le programme qui orchestre l'ensemble — il passe simplement à l'épisode
suivant. Les journaux bruts confirment que les 20 épisodes se sont bien déroulés du début à la fin,
sans aucune intervention. La leçon retenue : une erreur qui touche un seul épisode dans cet outil
n'est pas la même chose qu'une panne qui arrête tout le lot — il faut vérifier que le programme
d'ensemble a réellement continué avant de déclarer un arrêt complet.
L'énigme du reward=144
Un détail curieux figurait déjà dans les journaux de ce même lot de tests, sans avoir encore été
creusé : un épisode avait affiché, une seule fois, une récompense de 144 — un chiffre bien plus haut que tout ce qui a
jamais été vu ailleurs dans cette campagne (une réussite normale rapporte une récompense de 9). Le
programme de jeu a reçu un nouvel outil d'observation, activable au choix, qui affiche désormais le
maximum atteint pour chaque objet de l'inventaire au cours d'un épisode, pas seulement le bois
et les planches suivis jusqu'ici. Un nouveau lot de 12 parties a été lancé avec cet outil activé,
sur la même configuration : récompense de 0,000 sur les 12 épisodes, et le seul objet jamais
apparu dans un inventaire, sur l'ensemble du lot, était de la terre ordinaire (entre 1 et 30
unités par épisode, ramassée sans le vouloir en marchant ou en attaquant) — un objet qui ne
rapporte strictement aucune récompense dans ce jeu. L'épisode d'origine qui avait affiché 144 avait
déjà pris fin avant que cet outil n'existe, donc son état exact au moment précis reste
irrécupérable. Ce chiffre ne s'est jamais reproduit sur ces 12 nouveaux essais et reste, pour
l'instant, un événement isolé et non expliqué — parqué comme une curiosité documentée, sans effet
sur les conclusions de la campagne, plutôt que poursuivi sans un échantillon bien plus grand.
Et maintenant
Ce chapitre referme une longue ligne d'enquête (les corrections de score basées sur la couleur ou
la luminosité) tout en apportant, séparément, une bonne nouvelle solide à grande échelle (le
sauvetage anti-noyade) et une énigme non résolue qui ne change rien au diagnostic principal. Comme
toujours dans ce projet : les bons résultats et les résultats décevants sont rapportés avec la
même précision, et rien n'est habillé pour paraître mieux qu'il ne l'est.
Piste expert
Contexte
Le Chapitre 14 a conclu que la condition posée pour engager la piste candidate 3 du menu du
Chapitre 11 (H-JEPA hiérarchique) était remplie par des preuves empiriques, pas seulement par un
argument plausible : même le fine-tuning direct de ebwm.pt avec augmentation photométrique
n'avait produit qu'un résultat mixte. Ce chapitre couvre l'attempt #15 (CLAUDE.md#Phase 5+,
aucune entrée correspondante dans docs/10coldstartengineering.md à ce jour — écart de
documentation signalé explicitement dans CLAUDE.md lui-même) : une réévaluation de la proposition
H-JEPA, un test offline étroit qui en découle, et un lot de confirmation N=20 combinant les
mécanismes des Chapitres 12-13.
Réévaluation de la proposition H-JEPA, sans code
Une proposition Explorer pour H-JEPA littéral avait été soumise. Avant tout développement, une
réévaluation à froid a noté que CLIP (Chapitre 14) — un modèle de 400M images conçu spécifiquement
pour résister à la variation photométrique — avait déjà échoué au même double gate qu'affronterait
une heuristique de teinte/contour construite à la main. En conséquence : construire cette
heuristique était jugé très probablement destiné à ne produire qu'une 5ᵉ confirmation, à un coût
d'ingénierie réel, sans information nouvelle — recommandation de ne pas la construire.
Recommandation complémentaire : les deux seuls mécanismes non basés sur un jugement visuel qui
fonctionnent dans la campagne (FrontierTracker, commit_length) sont le meilleur investissement
suivant, plutôt que de greffer davantage de biais de contenu visuel dessus.
Test offline étroit : ratios de chrominance par tuile spatiale
Une idée plus ciblée et moins coûteuse issue de cette réévaluation a été testée directement :
mine_jepa/ebwm/hazard.py utilise des ratios de canaux invariants à la luminosité (pas des
valeurs brutes) — un choix qui fonctionne pour l'eau parce que la teinte sous-marine est un
décalage global et uniforme sur toute la frame. Ce même tour fonctionne-t-il pour le feuillage,
calculé par tuile spatiale plutôt que sur la frame entière ?
scripts/diagnosechromatile_generalization.py, sur le même jeu de 251 frames et le même
étiquetage manuel que chaque diagnostic précédent (attempts #10, #14).
Résultat : MIXTE, mais le gate de luminosité échoue presque aussi mal que le pire cas de CLIP.
- Gate de direction : PASSÉ (ratio de séparation 1,482, ≥ le seuil de 1,3).
- Gate d'indépendance à la luminosité : ÉCHOUÉ. r = -0,925 sur le jeu étiqueté à la main
(contre -0,947 pour CLIP — quasiment à égalité pour le pire de la campagne, signe opposé) ;
r = -0,585 sur l'ensemble des 251 frames (treechop -0,748, obtain_spawn -0,600,
obtain_coverage -0,671) — un effet large, pas limité au petit jeu étiqueté.
Interprétation, la plus nette de la campagne
Leçon : la normalisation par ratio élimine exactement l'échelle de luminosité GLOBALE, comme
conçu (pourquoi elle marche pour l'eau) — mais elle ne peut pas éliminer une confusion
COMPOSITIONNELLE où les étiquettes de vérité-terrain elles-mêmes corrèlent le type de scène
avec la luminosité (forêts sombres contre champs ouverts clairs est la composition de scène
réelle de ce domaine, pas un artefact d'un mécanisme de notation particulier). Ceci signifie
que la confusion de luminosité n'est réparable par AUCUNE caractéristique photométrique
mono-frame — apprise, prête à l'emploi, ou conçue à la main pour être invariante — sans
structure supplémentaire (multi-frame, spatiale/géométrique, ou une modalité différente).
Ceci ferme définitivement la piste « peut-être qu'un calcul de caractéristique plus malin répare
ça » ; la piste candidate 1 du menu du Chapitre 11 reste fermée, pour une raison plus solide
qu'avant.
Lot de confirmation N=20 : frontier + hazard combinés, taux de coupe mesuré pour la première fois sur cette combinaison
configs/playcraftcommit4_hazard.yaml (recherche par frontière du Chapitre 12 + sauvetage
anti-noyade corrigé de l'attempt #13, Chapitre 13) exécuté à N=20.
Note de processus, corrigée. Le compte-rendu du dispatch Tester affirmait une « panne
d'infrastructure grave » ayant arrêté le lot à l'épisode 4 — faux, vérifié indépendamment :
playminerlmulti.py lance un processus Java/Malmo séparé par épisode, donc une erreur transitoire
de machine à états Malmo sur un seul épisode ne tue pas l'orchestrateur, qui passe simplement à
l'épisode suivant. Le lot a exécuté ses 20 épisodes de bout en bout (« FINAL RESULTS — 20/20
episodes succeeded ») sans aucune intervention. Leçon : une erreur par épisode dans ce harnais
n'équivaut pas à un échec de lot — vérifier le processus orchestrateur lui-même avant de déclarer
un arrêt dur.
Noyade : 3/20 (15%), confirmé via de vrais messages Malmo MineRLAgent0 drowned — en baisse
depuis le taux de référence de l'attempt #12 original (12/20, 60%). Le correctif de l'attempt #13
tient à N=20, pas seulement au N=6 où il avait été confirmé. Autres terminaisons précoces (causes
non liées — chute, mob, etc., hors périmètre de ce correctif) : 5/20 (25%). Épisodes pleine
longueur (« fair-shot ») : 12/20 (60%), en hausse depuis ~8/20 (40%) dans le lot original de
l'attempt #12.
Coupe/fabrication : 0/20 bûches, 0/20 planches — malgré davantage d'épisodes bénéficiant
d'une chance équitable, aucune coupe sur ce lot (contre 1/20 pour l'attempt #12). Pas une
régression significative à ce N (un test de Fisher ne distinguerait pas 0/20 de 1/20) — la
variance habituelle à petit N de cette campagne. Confirme à nouveau le diagnostic établi : réduire
la confusion de noyade augmente les épisodes à chance équitable mais ne se convertit pas
automatiquement en coupe — survie et efficacité de recherche/approche restent des problèmes
séparés.
L'anomalie reward=144.000 — investiguée, non reproduite, non résolue
playcraft.py a reçu un diagnostic optionnel logging.fullinventory (défaut désactivé,
bit-pour-bit inchangé si non activé) traçant/affichant la valeur maximale atteinte pour chaque
clé d'inventaire par épisode, pas seulement bûche/planches. Un nouveau lot N=12 avec ce diagnostic
activé (même configuration) a montré : reward=0,000 sur les 12 épisodes, et le SEUL objet
d'inventaire jamais non nul sur tout le lot était dirt (1-30 par épisode, ramassé
incidemment en marchant/attaquant) — dirt n'est PAS dans la table de récompense
(RewardForPossessingItem ne couvre que log/planks/stick/craftingtable/woodenpickaxe/
cobblestone/furnace/stonepickaxe/ironore/ironingot/ironpickaxe), donc rapporte zéro récompense
et constitue une fausse piste pour le mystère d'origine. Le processus de l'épisode d'origine avait
déjà pris fin avant que ce diagnostic n'existe, son état exact reste donc irrécupérable — le
mécanisme qui a produit 144 ne s'est pas reproduit sur 12 nouvelles tentatives et reste un
événement isolé, non caractérisé. N'affecte aucune conclusion de campagne (le taux de coupe est ce
qui compte, et ceci lui est orthogonal) — parqué comme curiosité documentée, non poursuivi en
l'absence d'un échantillon beaucoup plus grand.
Où ça laisse la campagne
ebwm.pt et craftwmv4.pt restent intacts sur l'ensemble de ce chapitre : le test de
chrominance par tuile est un diagnostic offline sans paramètre appris ; le lot de confirmation
N=20 et le diagnostic full_inventory réutilisent des mécanismes déjà entraînés/câblés sans
modifier aucun checkpoint principal.
Références
Ce chapitre ne s'appuie sur aucune référence bibliographique nouvelle : le test de chrominance par
tuile réutilise l'heuristique de couleur déjà construite et calibrée pour l'attempt #13
(Chapitre 13), sans méthode publiée sous-jacente ; le lot de confirmation N=20 et le diagnostic
reward=144 sont des exécutions/instrumentations empiriques du projet, pas l'application d'une
référence externe.