Les centres et leur collaboration — dix-sept ateliers sur la même rue, jamais deux portes ouvertes à la fois
ouvrir la planche en plein écran → · 17 pièces · 10 traverses · 6 marges
Les centres sont bâtis et montés, et les rues existent — ce qui n'existe pas, c'est la simultanéité : aucune des 188 pages du dépôt ne charge deux modules de centre ensemble, le bus frontend n'a aucun transport hors-page, donc les 8 arêtes centre↔centre écrites des deux côtés du bus ne peuvent jamais se déclencher ; côté serveur la collaboration passe bien par appel direct, mais par TROIS organes tireurs (Mission Center, Environment Hub, Labor Center), pas un seul — et le TRONC de la couche, le registre des centres, n'existe nulle part.
ce que la figure ancre
La parabole sève / bourgeons / tronc est une VRAIE fonction, pas une image — elle a été tranchée par Jonathan le 2026-08-22 et elle prédit juste. Elle dit : le Communication Center (S0) est la sève, le Mission Center les bourgeons, et le registre des centres le tronc. Mesure : les bourgeons circulent (mission_center tire 8 centres par appel direct et les sert à la personne) ; la sève ne circule pas (communication-center.js n'est chargé que sur sa propre page, et sa seule arête émise vers un autre centre atterrit sur recycling-center.js, jamais chargé) ; et le tronc est littéralement absent du code. La figure gagne son droit d'ancrage parce qu'elle a désigné le trou AVANT qu'on le mesure. ⛔ En revanche la sous-figure « quinze ateliers, aucune rue » n'apprend rien et induit en erreur : les rues sont bâties. La figure juste est « quinze ateliers sur la même rue, jamais deux portes ouvertes à la fois » — ce qui manque n'est pas la voie, c'est la SIMULTANÉITÉ : un bus sans transport hors-page plus des modules à portée de page produisent une ville où chaque atelier est joignable et où aucun ne peut parler à son voisin.
la même figure, ailleurs
C'est exactement, à l'échelle de la couche des centres, la figure déjà payée le 2026-10-01 sur `chaine-etoile-petale-module-batie-et-jamais-chargee` : une chaîne de bus complète des DEUX côtés — émetteur réel, abonné réel, topics qui se correspondent — dont les deux bouts ne partagent jamais un runtime. Là c'étaient 4 modules sans entrée de chargement ; ici ce sont 8 arêtes dont l'abonné est soit jamais chargé (recycling-center), soit sur une autre page (disaster, energy, comms-hub, design-bridge). Même motif encore dans `garde-par-visibilite-ensevelie-sous-le-tas` et dans la loi du gabarit à trois cardinaux : le gabarit `cross_module` se LIT comme un câblage, donc il fabrique en série des arêtes déclarées et non branchées — 4 pour la seule agriculture. La grande architecture explique la petite : ce que le dépôt sait faire, c'est écrire les deux moitiés d'un joint ; ce qu'il n'a pas de mécanisme pour garantir, c'est qu'elles soient vivantes au même instant.
Ce qui tient après la réfutation : les 17 centres existent et sont enregistrés ; leurs 15 portes à l'écran existent ; les rues de navigation existent (y compris 4 liens centre→centre depuis agriculture-center) ; la « lecture honnête » existe, est câblée sur 7 hubs et ARRIVE à l'écran avec son aveu initial « Sync en attente » ; la collaboration serveur par appel direct est réelle et atteignable. Ce qui tombe : « un seul organe » (il y en a trois), « 6 arêtes » (11 sous une règle honnête), « seulement elle » (5 autres lectures honnêtes), « 7 arêtes frontend câblées des deux côtés » (8 en source, ZÉRO vivantes), « aucune rue » (les rues sont là). Ce qui reste vide, et c'est le vrai trou : le TRONC — le registre des centres — n'existe nulle part, et c'est lui qui explique pourquoi six recensements de centres ont rendu six chiffres différents.
| mission_center_service appel direct, import paresseux dans 16 adaptateurs d'opportunité ; atteignable par Depends(get_mission_center_service) sur mission_center.py:274+ | → | 8 centres (creation_hub, health, legal, construction_agents, education, labor, government, dev)backend/app/services/mission_center_service.py:810-865, :863-871 ; backend/app/routers/mission_center.py:274, 307, 560, 599, 643, 697 ; main.py:2193 | |
| environment_hub_service appel direct (get_departments / get_department / get_stats) servi par GET /api/v2/environment-hub/departments | → | energy_center_service + recycling_center_servicebackend/app/services/environment_hub_service.py:484-487, 560-576, 687-701 ; backend/app/routers/environment_hub_router.py:107-108, 115-116 ; main.py:2310 | |
| labor_center_service pont d'escalade par appel direct — par le REPLI, la cible primaire verticals.legal_system étant absente du dépôt | → | legal_center_servicebackend/app/services/labor_center_service.py:896-905 ; backend/app/routers/labor_center_router.py:171 | |
| 7 routeurs de hub lecture honnête gouvernée (GET /governed-handoff) — surface de lecture partagée, pas une arête de collaboration | → | transversal_hub_surfaces_servicecreation_hub_router.py:229, environment_hub_router.py:98, exchange_center_router.py:379, hr_hub_router.py:29, personal_hub_router.py:21, real_estate_hub_router.py:21, transport_hub_router.py:21 | |
| creation_hub (backend) fetch + rendu de 6 tuiles, badge initial « Sync en attente » | → | creation-hub.html (panneau de lecture honnête)frontend/creation-hub.html:209-225, :540 ; frontend/js/creation-hub-module.js:71-95, :393 | |
| defense-center.js bus — defense.incident.logged, émis et écouté, mais les deux modules ne partagent aucune page et le bus n'a aucun transport hors-page | → | disaster-center.jsfrontend/js/defense-center.js:583 ; frontend/js/disaster-center.js (_busSub) ; frontend/js/message-bus.js (0 BroadcastChannel/localStorage/WebSocket) | |
| energy-center.js · transport-center.js · communication-center.js bus — 3 arêtes écrites des deux côtés dont l'abonné n'a ni page ni entrée de chargement | → | recycling-center.jsenergy-center.js:510, transport-center.js:504, communication-center.js:597 ; recycling-center.js référencé seulement par frontend/js/catalogue-modules.json ; frontend/archives/orphan-pages/recycling-center.html | |
| agriculture-center.js (cross_module) déclaration d'arête dans l'ORCHESTRATOR_GUIDE, sans abonnement correspondant | → | transport-center · science-centerfrontend/js/agriculture-center.js:774-793 ; 1 seul _busSub dans le fichier (bio.tick.heartbeat) | |
| les 17 centres inexistant — aucun fichier, aucune constante | → | un registre des centres (le TRONC)git ls-files backend/app | grep -iE 'centers_regist|center_regist|centers_atlas' → vide ; memory/mission-center-central-seve-des-centres.md | |
| pages de sphère (durabilite, institutions, formation, entreprise, creation, communication, dashboard) hyperlien de navigation — la rue existe, et agriculture-center en porte 4 vers d'autres centres | → | les 15 pages de centrefrontend/durabilite.html:269 ; institutions.html:609-612 ; formation.html:564-565 ; entreprise.html:379 ; creation.html:188,193 ; communication.html:383 ; dashboard.html:953 ; agriculture-center.html:677-680 |
| 1 | La règle de comptage — déclarée, et ce qu'elle laisse dehors16 `*_center_router.py` (hors `_archive/`) + `mission_center.py` = 17 routeurs de centre ; + 7 `*_hub_router.py` = 24 ; les 24 sont cités par `register_router` dans main.pygit ls-files backend/app/routers ; backend/app/main.py:2193, 2310, 2311, 2313, 2384, 2418, 2419, 2422, 2425, 2430, 2431, 2433, 2438, 2439, 2443, 2449, 2451, 2455, 2462, 2463, 2479, 2484, 2523, 2524 · confirmé dans le code | |
| 2 | Les 15 portes à l'écran — chacune charge son propre module15/15 pages existent et incluent leur module ; 4 d'entre elles (dev, education, government, labor) partagent une coquille unique, `frontend/js/center-summary-page.js`frontend/{agriculture,energy,transport,health,education,science,design,dev,labor,government,legal,mission,communication,defense,disaster}-center.html — balises <script> relevées à HEAD · confirmé dans le code | |
| 3 | « Au démarrage, le panneau annonce lui-même ce qui n'est pas synchronisé » — exact, et vérifiable6 tuiles + 1 badge, valeur initiale « Sync en attente » en dur dans le HTMLfrontend/creation-hub.html:209-225 (badge #creation-governed-badge « Sync en attente », tuiles Tier/Hub ID/Routes/Surfaces/Membranes/Dernière sync) ; :540 appelle `CreationGovernedBridge.syncFromBackend()` ; frontend/js/creation-hub-module.js:71-95 et :393 ; la page charge bien creation-hub-module.js · confirmé dans le code | |
| 4 | Les rues EXISTENT — « aucune rue » est faux au niveau de la porteles 15 pages de centre ont au moins 1 lien entrant ; agriculture-center porte à elle seule 4 liens centre→centrefrontend/durabilite.html:269 → energy-center ; frontend/institutions.html:609-612 → legal, government, defense, disaster ; frontend/formation.html:564-565 → education, science ; frontend/entreprise.html:379 → labor ; frontend/creation.html:188,193 → dev, design ; frontend/dashboard.html:953 → mission ; frontend/communication.html:383 → communication ; frontend/agriculture-center.html:677-680 et 698-701 → science, legal, health, transport · confirmé dans le code | |
| 5 | Les 15 centres sectoriels nommés par le Livre — 14 ont leur propre routeur, Design n'en a aucun15 nommés au Livre ; 14 routeurs de centre propres ; Design = 0 routeurfrontend/livre-du-proprietaire.html:511-518 (les 15 : Agriculture · Énergie · Transport · Santé · Éducation · Science · Design · Dev · Travail · Gouvernement · Légal · Mission · Communication · Défense · Catastrophes) ; backend/app/services/transversal_hub_surfaces_service.py:106-110 · confirmé dans le code`design_center_router.py` n'existe pas. La vérité de Design est servie par `creation_hub_router` : transversal_hub_surfaces_service.py:106-110 l'écrit noir sur blanc — « Design Center remains a downstream visible membrane of creation truth instead of becoming its source owner ». Le Livre nomme donc un centre qui n'a pas d'organe propre, sans le dire. | |
| 6 | Trois centres montés que le Livre ne nomme pas — et un seizième sans porte17 routeurs − 14 des quinze = 3 hors liste : construction, exchange, recyclingbackend/app/main.py:2479 ; git grep -l recycling-center.js HEAD -- frontend → frontend/js/catalogue-modules.json seul · confirmé dans le code`recycling_center_router` est monté (main.py:2479) et `recycling_center_service` est appelé par environment_hub, mais sa page est ARCHIVÉE (`frontend/archives/orphan-pages/recycling-center.html`) et `frontend/js/recycling-center.js` n'est référencé que par `frontend/js/catalogue-modules.json` : 0 page, 0 entrée dans governance-init.js → le module n'est JAMAIS chargé. Un centre avec un moteur et aucune porte. | |
| 7 | Le « 6 arêtes centre→centre par appel direct » — undercompte : la mesure donne 116 n'est reproductible que sous une règle étroite : les 6 `origin="*_center.*"` du tableau d'adaptateurs. La mesure honnête des paires appelant→appelé inter-secteurs donne 11.backend/app/services/mission_center_service.py:816-818 et 826-865 (16 adaptateurs, origines listées), :647-665 (_collect_commissions → creation_hub), :666-706 (_collect_experts → health + legal + construction) ; services/mission_adapters/{education,labor,government,dev}_adapter.py:59,61,110,48,49,113 ; services/environment_hub_service.py:484-487, 560-576, 687-701 ; services/labor_center_service.py:883-905 · confirmé dans le codeLe 6 rate `creation_hub.mixed`, les 3 sources de `experts.aggregate` (health + legal + construction), les 2 d'`environment_hub` et le pont labor→legal. Détail : mission_center tire 8 centres distincts (creation_hub, health, legal, construction_agents, education, labor, government, dev) ; environment_hub tire energy + recycling ; labor tire legal. | |
| 8 | Le pont labor→legal vise d'abord une cible qui n'existe pas dans le dépôt`backend/verticals/` = 5 fichiers suivis par git, et sur le disque : README.md + _archived/ seulementbackend/app/services/labor_center_service.py:896-905 ; git ls-files backend/verticals (5) ; ls backend/verticals/ → README.md, _archived · confirmé dans le code`from verticals.legal_system import handle_case` (labor_center_service.py:900) échoue TOUJOURS ici : le second arbre annoncé est absent du dépôt comme du disque. Le pont fonctionne — par son repli (`app.services.legal_center_service`). Le commentaire du code appelle encore `verticals.legal_system` « Primary target ». Le geste est juste, l'explication est fausse. | |
| 9 | transversal_hub_surfaces_service — 7 surfaces câblées, mais pas « seulement elle »665 lignes, 7 surfaces (creation, exchange, environment, hr, transport, personal, real_estate), appelées par 7 routeurs tous montés ; MAIS 12 routeurs exposent un `governed-handoff`backend/app/services/transversal_hub_surfaces_service.py:32,122,225,339,401,483,588,664 ; appelants : creation_hub_router.py:229, environment_hub_router.py:98, exchange_center_router.py:379, hr_hub_router.py:29, personal_hub_router.py:21, real_estate_hub_router.py:21, transport_hub_router.py:21 ; git grep -ln governed-handoff HEAD -- backend/app/routers → 12 · confirmé dans le code5 lectures honnêtes vivent hors de ce service : `bureau_relay.py`, `communication_center_router.py`, `communications_hub_router.py`, `dimensional.py`, `xr.py`. Le « et seulement elle » est faux : la lecture honnête est une PRATIQUE répandue, pas un organe unique. | |
| 10 | « UN seul organe, le Mission Center » — faux : il y en a TROIS3 organes tireurs mesurés, pas 1backend/app/services/environment_hub_service.py:484-487 ; backend/app/routers/environment_hub_router.py:107-108 ; backend/app/services/labor_center_service.py:883-905 ; backend/app/routers/labor_center_router.py:171 · confirmé dans le code`environment_hub_service.list_center_departments()` appelle directement `EnergyCenterService` et `RecyclingCenterService` et sert `GET /api/v2/environment-hub/departments` (environment_hub_router.py:107-108, monté main.py:2310). `labor_center_service.escalate_to_legal()` appelle `LegalCenterService.classify_to_branch` et sert `POST` via labor_center_router.py:171 (monté main.py:2462). Deux arêtes centre→centre vivantes qui ne traversent PAS le Mission Center. | |
| 11 | Les « 7 arêtes frontend câblées des DEUX côtés » — 8 en source, ZÉRO qui peut se déclencher8 paires émetteur→abonné en source ; 0 vivante sur 188 pagesfrontend/js/message-bus.js (0 occurrence de BroadcastChannel|localStorage|WebSocket) ; émetteurs : defense-center.js:583, energy-center.js:510, transport-center.js:504, communication-center.js:597 ; abonnés : disaster-center.js, recycling-center.js, energy-center.js:715, comms-hub-module.js, design-center-governed-bridge.js ; balayage 188 pages → 0 page avec >1 module de centre · confirmé dans le codeLa CO-RÉSIDENCE. `frontend/js/message-bus.js` (1480 lignes) ne contient aucun `BroadcastChannel`, aucun `localStorage`, aucun `WebSocket` (grep -c = 0) : le bus est strictement intra-page. Et aucune des 188 pages HTML suivies par git ne charge deux modules de centre ensemble (mesuré par balayage des <script> à HEAD). Les 8 paires : communication-center→recycling-center · creation-hub-module→design-center-governed-bridge · defense-center→disaster-center · energy-center→recycling-center · geo-hub-module→comms-hub-module (×2, geofence entered/exited) · transport-center→energy-center · transport-center→recycling-center. Trois d'entre elles arrivent sur recycling-center.js, qui n'est jamais chargé du tout. | |
| 12 | Sept abonnements de centre sans AUCUN émetteur dans tout le frontend7 topics centre-namespacés écoutés, 0 publieur (10 orphelins si on compte les non-centre)frontend/js/disaster-center.js (_busSub) ; frontend/js/recycling-center.js (_busSub) ; frontend/js/defense-center.js:780 ; git grep -n 'institutions.policy.updated' HEAD -- frontend → 4 lignes, aucune publication · confirmé dans le codeAucun producteur. disaster-center écoute `communication.alert.broadcast`, `energy.grid.failure`, `health.outbreak.detected`, `transport.incident.reported` (et son propre `disaster.cross_center`) ; recycling-center écoute `agriculture.compost.demand`, `institutions.REP.update` ; defense-center écoute `institutions.policy.updated`. Pour chacun, `git grep` sur tout `frontend/` ne trouve que l'abonné lui-même — et, pour les deux derniers, une simple DÉCLARATION dans un bloc `cross_module`. | |
| 13 | Les blocs `cross_module` de l'ORCHESTRATOR_GUIDE sont des déclarations, pas des câblagesagriculture-center déclare 4 voisins (durabilite, transport-center, entreprise, science-center) et a 1 seul abonnement réel : `bio.tick.heartbeat`frontend/js/agriculture-center.js:774-793 (cross_module), :858 (events_in déclare `durabilite.metric.updated`), seul `_busSub('bio.tick.heartbeat')` présent ; energy-center.js:769 déclare `institutions.policy.updated` sans l'émettre · confirmé dans le codeL'abonnement. `agriculture-center.js:774-793` annonce des arêtes vers transport-center (`transport.route.optimized`) et science-center (`science.project.created`) ; le module ne s'abonne à aucun des deux. Le contrat se lit comme un câblage et n'en est pas un — c'est le même vecteur que le gabarit à trois cardinaux : un gabarit obligatoire fabrique en masse ce qu'il décrit mal. | |
| 14 | Le TRONC de la couche des centres — le registre — n'existe nulle part0 fichier `centers_registry` / `center_registry` / `centers_atlas` dans backend/app ; 0 occurrence de `CENTERS_REGISTRY`git ls-files backend/app | grep -iE 'centers_regist|center_regist|centers_atlas' → vide ; git grep -ln CENTERS_REGISTRY HEAD → vide ; memory/mission-center-central-seve-des-centres.md · confirmé dans le codeTout. La figure tranchée par Jonathan le 2026-08-22 dit : SÈVE = Communication Center (S0), BOURGEONS = Mission Center, TRONC = le registre des centres, « à écrire ». Il est toujours à écrire. C'est pour ça que chaque recensement de centres repart de zéro et qu'aucune mesure ne se recoupe (6 · 7/552 · 15 · 17 · ~20 · 22). | |
| 15 | `frontend/etat-technique.html` contredit le code sur trois points — un instrument périméla ligne 238 annonce « Côté serveur ABSENT : energy, defense, science, disaster, agriculture, design → 0 fichier dans backend/app/routers/ » : 5 des 6 en ont un, montéfrontend/etat-technique.html:236, 237, 238, 272 ; contre-mesure : backend/app/main.py:2193, 2384, 2430, 2433, 2439, 2484 · confirmé dans le codeLa date. Ses numéros de ligne main.py (1916, 1923, 1934, 1947, 1698) sont tous périmés (les vrais : 2431, 2438, 2449, 2462, 2193) ; sa ligne 272 déclare mission-center et les 4 Tier-2 « orphelines de navigation : aucun lien nulle part » alors que dashboard.html:953, formation.html:564, institutions.html:610, entreprise.html:379 et creation.html:188 y mènent. Seul Design reste réellement sans routeur. Un tableau d'état qui a cessé de garder. | |
| 16 | Le bus du serveur ne porte aucune arête centre↔centre1 seul service de centre importe `event_bus` sur 47 fichiers `*_center_service` / `*_hub_service` balayés — et il ne fait que publierbackend/app/services/mission_center_service.py:22, 389-401 ; balayage des 47 `*_center_service.py` / `*_hub_service.py` : 1 seul match sur `event_bus|publish_event|get_event_bus` · confirmé dans le codeL'abonné. `mission_center_service.py:22` importe `event_bus` et publie en :392-400 (après commit durable, échec toléré). Aucun autre service de centre ne touche au bus, ni en publication ni en abonnement. Côté serveur comme côté navigateur, la collaboration entre centres est 100 % appel direct. | |
| 17 | « Monté dans main.py » n'est pas « atteignable » — register_router avale l'ImportErrorles 24 routeurs sont enregistrés avec `core` à sa valeur par défaut (False)backend/app/main.py:1637-1663 · confirmé dans le codeLa preuve de boot. `register_router` attrape `ImportError` et toute `Exception`, journalise et CONTINUE si `core=False` et si `REGISTER_ROUTER_STRICT` n'est pas posé. Un centre peut donc être « monté » dans le texte de main.py et mort au runtime. La seule preuve serait le registre `_registered_broken` d'une instance en marche — hors périmètre lecture seule. |
On ne remplace pas le nom canon, on le double : le terme reste l’autorité, la glose est une poignée. Le lexique entier est sur sa propre page.
Matière : PLANCHES-MATIERE-4-OUBLIEES-2026-10-03.json (sha256 7a2a3299f5ed) — planche de matière « Les centres et leur collaboration — dix-sept ateliers sur la même rue, jamais deux portes ouvertes à la fois ». Générée par scripts/generer-planches-ancrage.py ; la version « avant » (avant le passage du sceptique) que la matière conserve n’est pas dessinée — c’est la version dégradée au doute qui l’est, et les marges portent les dégradations.