diff --git a/CHANGELOG.md b/CHANGELOG.md
index c404be4..41baccb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,63 @@
# CHANGELOG — Set-OPS
+## 2026-09-20 (10) — Un vide doit avoir la forme de ce qu'il remplace
+
+**83 preuves, `make test` à 0 échec, 7 tests de rendu.** La console de
+`console.genese.internal` — celle du runner de SITE-Chezlepro — ne montrait rien. Elle a
+douze machines.
+
+### `charger()` levait, et la page mourait avant de dessiner
+
+`inventaire_api` sert `serveurs` en **liste** ; `inventaire_api_du_site` le servait en
+**table**. Les deux sont « vides », et la page ne les lit pas pareil :
+`(data.serveurs || []).map(...)` trouve `{}` — *truthy*, sans `.map` — et `charger()`
+lève. Toute la console d'un site s'arrêtait là, avant la première vue, et le message
+accusait une méthode manquante plutôt qu'une forme qui ment.
+
+Un vide doit avoir la **forme** de ce qu'il remplace. Sinon ce n'est pas un vide, c'est un
+autre objet qui se fait passer pour lui — et le malentendu ne se voit qu'au moment où
+quelqu'un appelle une méthode dessus.
+
+Un test compare désormais les deux charges **type par type** pour les clés qu'elles
+partagent, avec deux écarts admis et motivés. Il ne demande pas les mêmes valeurs — un
+site n'a pas de plan de locataire — seulement les mêmes formes.
+
+### Et la vue regardait au mauvais endroit
+
+Le registre vide était **voulu** : « on ne fabrique pas un faux plan de tenant pour
+remplir l'écran ». C'est juste — un site déclare ses machines dans son propre plan, avec
+`ip`, `vmid` et `noeud` **écrits**, là où un locataire les dérive de son seed ; il est le
+terrain, il n'a rien dont les faire descendre.
+
+Mais la vue d'accueil tirait de ce registre vide le message d'un locataire sans serveurs —
+« + Serveur », `make serveurs-bootstrap` — et les douze machines, servies dans `hotes`,
+n'étaient dessinées nulle part. Une console de site montre maintenant **ses** machines :
+mêmes tuiles que les serveurs d'un locataire, en lecture seule, avec leur adresse, leur
+VMID, leurs rôles et leur point de vie ; le panneau droit dit ce que cette console peut —
+matérialiser le terrain, n'entrer chez aucun locataire — et renvoie aux Assistants.
+
+**C'est le défaut du 2026-09-16 par une autre porte.** La première fois, l'inventaire était
+vide et la page dessinait ce vide comme un plan vide. Cette fois l'inventaire est **plein**
+et c'est la vue qui regarde ailleurs. Le premier correctif a donné à la console de quoi
+répondre ; il ne lui a pas appris où regarder.
+
+### Ce qui a trouvé le défaut
+
+Pas une lecture : **le banc**. `test_rendu_gui.py` dessine les vues sous `node` dans un
+DOM simulé. En lui donnant pour la première fois la charge d'une console de SITE, il a
+levé `(data.serveurs || []).map is not a function` — c'est-à-dire la cause réelle, sous
+le symptôme que je m'apprêtais à corriger. Sans lui, j'aurais livré une vue juste par
+dessus un `charger()` qui lève, et la console serait restée vide.
+
+### Ce qui a été vérifié
+
+`node --check` sur le bloc `", html, re.S)
assert blocs, "aucun bloc