Les planches d’ancrage · série II · feuille 17 / 19

Les moteurs : AT·OM GO

LES MOTEURS : AT·OM GO — le règlement complet d'un jeu que personne ne peut jouer

Planche 17 · Les moteurs : AT·OM GO
17 pièces · 4 bâties · 9 partielles · 4 absentes · 0 non établies
Planche 17 — Les moteurs : AT·OM GO

ouvrir la planche en plein écran → · 17 pièces · 12 traverses · 7 marges

La thèse une ligne, écrite dans la matière

AT·OM GO est le seul moteur d'AT·OM qui demande au monde réel de bouger, et le chemin entre « une mission existe » et « une mission est faite » y est coupé en QUATRE endroits indépendants dont chacun suffit à tout arrêter — la position jamais relevée n'est que le premier.

ce que la figure ancre
La parabole est le jeu géolocalisé — « des points d'intérêt apparaissent autour de vous quand vous marchez ». Et c'est une VRAIE fonction, pas une image : elle ancre une décomposition en quatre gestes qui est exacte et qui apprend quelque chose à qui ne connaît pas le système. DISTRIBUER (un travail apparaît là où il est), EXÉCUTER (il ne compte que prouvé sur place), DIRIGER (le système oriente vers l'endroit où la présence pèse le plus), PROGRESSER (ce qui est fait ouvre ce qui est permis). Ces quatre gestes sont le squelette de tout appareil de répartition du travail, et le jeu les rend lisibles en une phrase là où un cahier des charges en prendrait dix pages. Les quatre rayons concentriques — cinquante mètres pour agir, cinq cents pour être prévenu, cinq kilomètres pour découvrir, vingt-cinq pour voir sa région — sont de la même nature : une algèbre spatiale de la présence, pas une décoration. Mais la figure ancre AUSSI le défaut, et c'est là qu'elle devient instructive malgré elle. Un jeu suppose un joueur qui tient un appareil, et cet appareil dit où il est : c'est l'axiome muet du genre. AT·OM a bâti le règlement avec une rigueur rare — vingt-huit actions, dix grades, une porte de difficulté, une preuve par type — et n'a jamais écrit la ligne qui demande au téléphone où il se trouve. La figure a donc mieux tenu que le code : elle a fait écrire le règlement ENTIER, puis elle a laissé croire que le joueur allait de soi. Quand une parabole est bonne, elle produit de la structure juste. Quand elle est bonne et non interrogée, elle produit aussi ses angles morts à l'échelle : ici, quatre serrures fermées exactement au seul endroit où le monde réel était censé entrer.

la même figure, ailleurs
C'est la MÊME figure que le point zéro du covenant, une échelle plus bas — et le même défaut, au même joint. La doctrine dit : un point zéro se DÉCOUVRE, il ne s'attribue jamais ; et tout se déduit de lui. Le Terrain Point Zéro est cette figure appliquée à un champ : on mesure un lieu réel sur douze dimensions, et de ce centre on déduit tout le reste — les projets, l'équipe métier par métier, le budget, le calendrier, les risques, les phases, les tâches. « Chaque terrain impose ses propres mathématiques » est mot pour mot la loi du point zéro, transposée d'une personne à une parcelle. Et la fracture se répète à l'identique. En haut : un seul point 0 pour tout le système, `THE_POINT_0` sur 3862 nœuds sur 3862, parce que la clé n'est jamais lue. En bas : un seul moteur de terrain, et la coordonnée du terrain n'arrive jamais à la base — parce que `_syncToBackend` lit `assessment.gps_lat` pendant que l'écran envoie `gps:{lat,lng}`. Deux noms pour la même chose, aux deux bouts d'un même geste, et la position tombe dans l'intervalle. Même motif encore, une marche plus bas : le corps du joueur. `_startTracking` existe, complet, correct — et personne ne l'appelle. Trois échelles, un seul geste manquant, toujours le même : NOMMER où l'on est. La grande architecture explique la plus petite, et ici elle explique aussi la panne : AT·OM coordonne le joint entre l'intérieur et l'extérieur, c'est sa fonction ; et c'est précisément à ce joint, à chaque échelle où je l'ai mesuré, que le fil est coupé. Une dernière récurrence, plus petite mais de la même famille — celle du gabarit menteur : le registre des moteurs porte dix-neuf fiches et son en-tête annonce dix-huit ; la MeshMap pose vingt-cinq abonnements et son journal annonce vingt ; le gabarit ORCHESTRATOR_GUIDE exige quatre cardinaux et ces quatre modules n'en déclarent que trois. Un compte qui se trompe sur lui-même ne produit pas des erreurs : il produit, à l'échelle, des contrefaçons que personne ne recompte.

Les marges 7 arbitrages ouverts, entiers
  • ⚑ La thèse de l'agent est fausse dans sa CHARNIÈRE, pas dans son constat. Elle dit « cette UNIQUE absence coupe d'un coup ses TROIS conduits ». Mesuré : la position ne coupe qu'UN des trois conduits (le pont des 16 événements, atom-go-engine.js:1623). Le deuxième (control.need.posted → generateFromNeeds) est coupé par deux absences de chargement qui n'ont rien à voir avec la position — ATOMControlPoints et business-operations.js. Le troisième (architect-mode.js → addTasks) est coupé parce que le module n'est chargé par personne. Et un QUATRIÈME défaut, que l'agent n'a pas vu, suffirait à lui seul : le scanner lit `.items` sur une Response brute. Quatre causes indépendantes, pas une. La différence n'est pas cosmétique : réparer la position ne rallumerait qu'un quart de l'appareil, et c'est exactement le genre d'espoir qu'une planche ne doit pas donner.
  • ⚑ Un BATI annoncé que j'ai dû renverser en ABSENT : « Le registre des moteurs — 19 fiches en 8 castes » tient (je l'ai recompté : 19, pas les 18 de son propre en-tête), mais l'agent n'a pas listé le mode Architecte dans ses BATI — et c'est heureux, car il est ABSENT. En revanche il a annoncé BATI « La porte de difficulté » : la porte existe, elle vit dans une fonction dont la moitié est du code mort référençant une variable jamais déclarée, et aucun appelant ne la franchit. Dégradée en PARTIEL.
  • NON ÉTABLI — la base de production. Je n'ai rien interrogé (mandat lecture seule, et la loi de la base : une mesure qui ne NOMME pas sa base ne compte pas). Donc : l'existence et le contenu de la table `sovereignty_terrains` dans `atom_db` sur 138.197.132.63 restent NON ÉTABLIS. La migration qui la crée, je ne l'ai pas cherchée. Ce qui est établi est seulement que le routeur est monté et que son INSERT est écrit.
  • NON ÉTABLI — l'application des deux garde-fous du corps. J'ai mesuré leur PRÉSENCE comme texte (83 / 40 / 37) et constaté que scripts/ contient des audits bio nommés (audit_bio_db_contract_round335.py, audit_bio_stats_topic_constants_round571.py). Je ne les ai pas lus et je n'ai pas vérifié si l'un d'eux tourne en CI. Donc : « garde-fou » reste pour moi une DOCTRINE ÉCRITE, pas une garde mesurée. Et je ne l'étiquette pas « verte » : je n'ai lancé aucune garde.
  • NON ÉTABLI — le périmètre de « zéro appelant ». Tous mes `git grep` portent sur HEAD, dans frontend/, backend/ et agents/. Je n'ai pas fouillé rosetta-core/, transit/, archives/, hf-atom-tools/, ni les 278 fichiers .py du second arbre sous backend/ hors app/. Pour un moteur frontend, le risque est faible mais il n'est pas nul, et la règle dit de nommer les arbres fouillés.
  • Le compte du livre « une soixantaine, peut-être près de quatre-vingts » pour la famille corps vivant : ma mesure donne 83 par UNE marque de texte et 40 par une AUTRE. La famille n'a pas de rôle canonique nommé quelque part ; les deux chiffres sont justes sous leur règle et aucun n'est « le » nombre. Je donne 83 en disant sa règle.
  • Je n'ai pas mesuré le rendu : ni l'écran Point Zéro ni la MeshMap n'ont été ouverts. Je dis qu'une chaîne de code existe et qu'un bouton y mène ; je ne dis pas qu'elle s'affiche sans erreur.
Les blancs déclarés ce que la mesure n’a pas pu voir

Voici ce qu'un lecteur peut tenir pour acquis après cette planche. Trois pièces sont VRAIMENT bâties et je les ai suivies d'un bout à l'autre : le calculateur Point Zéro à douze dimensions (déterministe, appelé, affiché), le registre des dix-neuf moteurs en huit castes (allumé au chargement, dix-neuf garde-fous surveillés), et la MeshMap en lecture seule (deux mille cinquante et une lignes sans une seule écriture — la vérification la plus propre de toute la planche). Une quatrième tient par la négative : le moteur de réinvestissement, délibérément non chargé, avec sa raison écrite à la ligne 80 de governance-init.js. Tout le reste d'AT·OM GO est un règlement complet sans joueur. Le catalogue des vingt-huit actions, les dix grades, les quatre rayons de perception, les six phases du pipeline : tout cela est écrit, et rien ne l'appelle. Les trois portes par lesquelles une mission pourrait entrer dans le moteur sont fermées chacune pour une raison différente, et la quatrième — le scanner — est fermée par une ligne qui lit un champ inexistant sur une réponse HTTP. La position du corps n'est que la première des quatre serrures. Deux choses dites par le livre sont fausses dans le sens qui flatte, et je les corrige : l'écran Point Zéro n'est pas le seul écran grand public (meshmap.html en est un second, mille neuf cent trente-six lignes, liée depuis dix pages), et le scanner ne « retombe » sur rien si le serveur se taît — le repli local annoncé n'existe pas dans le code. Une troisième est fausse dans l'autre sens, et c'est le livre qu'il faut corriger, pas le code : la conversion d'un UR pour dix points d'expérience a été RETIRÉE exprès, et remplacée par une simple reconnaissance locale. Le code s'est fait plus honnête que son propre livre. Enfin, deux défauts dorment, armés mais non tirés, parce que personne n'appelle leur fonction : sans position, la preuve de terrain n'est pas refusée mais sautée, et un refus du serveur sur la fiche terrain se déclare succès. Le jour où quelqu'un branchera un écran sur ce moteur, ces deux-là tireront.

Les traverses 12 relations, de source à source
navigator.geolocation
relevé de la position du corps — la seule chose que le moteur attend du monde
→ATOMGO (_currentPosition)`_startTracking` est défini à frontend/js/atom-go-engine.js:375 et exporté `GO.startTracking` à :1023. git grep 'startTracking' HEAD -- frontend backend agents → trois lignes seulement : la définition, l'export, et frontend/js/__tests__/unit/atom-go-engine.test.js:112. Aucun appelant de production. `_currentPosition` (:373) reste donc `null` pour toute la durée de vie de la page.
16 événements de modules
le conduit que la position coupe RÉELLEMENT — et le seul des trois
→missions AT·OM GOMODULE_EVENT_MAP : frontend/js/atom-go-engine.js:1590-1618, 16 entrées (construction×2, employment×2, communaute×2, formation, durabilite×2, communication, entreprise×2, sovereignty×2, monEquipe, personnel). `_setupUniversalBridge` (:1620) abonne les 16 ; la PREMIÈRE ligne du gestionnaire, :1623, est `if (!_currentPosition) return;`. Les 16 abonnements sont donc réellement posés et tous les 16 retournent immédiatement, toujours.
control.need.posted
deuxième conduit — coupé DEUX FOIS, et par rien qui touche à la position
→GO.generateFromNeeds()L'abonnement existe (atom-go-engine.js:1674) et `generateFromNeeds` (:1098) n'est PAS gardé par la position. Mais sa première ligne est `if (typeof ATOMControlPoints === 'undefined') return {generated:0, tasks:[]}` — et `control-points.js` n'est chargé par aucune page HTML ni par aucun tableau de governance-init.js (seule occurrence : TIER3_PATTERNS:1399). De plus l'unique publieur du sujet, business-operations.js:597, n'est lui non plus chargé nulle part (seule occurrence : TIER3_PATTERNS:1399). Ni l'émetteur ni la dépendance n'existent au runtime.
architect-mode.js
troisième conduit, et le seul producteur externe de missions — coupé par le chargement, pas par la position
→ATOMGO.addTasks()architect-mode.js:406 porte l'unique `ATOMGO.addTasks` du dépôt. Le fichier n'apparaît dans governance-init.js qu'à la ligne 1411, dans TIER3_PATTERNS, et dans aucun fichier HTML.
TIER3_PATTERNS
⚑ le piège qui fait croire qu'un module est chargé — il ne CLASSE que ce qui est déjà chargé
→le chargement d'un modulefrontend/js/governance-init.js:1433 `matchesTier()` et la boucle :1439-1444 : les trois tableaux TIER1/TIER3_PATTERNS ne font que RÉPARTIR `allScripts` en trois vagues. Un module absent de `allScripts` et présent dans TIER3_PATTERNS n'est jamais chargé. C'est le cas de control-points, business-operations, architect-mode, terrain-point-zero hors institutions et atom-go-engine hors institutions.
frontend/institutions.html
la seule chaîne complète de la section : un bouton, cinq étapes, un calcul, un écran de résultat
→window.ATOMPointZero.evaluate()institutions.html:878 → :1858 → :1928 → :2089 → :2116 ; module chargé deux fois (institutions.html:25 et governance-init.js:93)
ATOMPointZero
l'envoi de la fiche terrain au serveur
→POST /api/v2/sovereignty-ops/terrains`_syncToBackend` : frontend/js/terrain-point-zero.js:790, appelé en fire-and-forget à :862. DEUX défauts. (1) Les lignes 797-798 lisent `assessment.gps_lat` et `assessment.gps_lng` ; l'écran, lui, construit `gps: {lat, lng}` (institutions.html:2095-2098). Le serveur reçoit donc TOUJOURS gps_lat=null, gps_lng=null — alors qu'il sait les recevoir (sovereignty_ops.py:84) et les ranger (:383). La position du terrain n'atteint jamais la base, même tapée à la main. (2) `atomPost` rend la Response sans vérifier `response.ok` (frontend/config.js:299-304) : un 500, un 401 ou un 422 traverse le `try` sans lever, et le module publie `pointzero.backend.synced` en écrivant « Synced to backend » dans la console. Un refus du serveur se déclare succès.
POST /api/v2/sovereignty-ops/terrains
la persistance du terrain — repli en mémoire sur une route qui ENGAGE
→table sovereignty_terrainsbackend/app/routers/sovereignty_ops.py:338-401 : `_terrains.append(terrain)` est inconditionnel (:365), l'INSERT vit dans un try/except qui journalise « DB terrain insert failed, using in-memory » et poursuit (:390-392), et la route rend 201 Created dans les deux cas. Le routeur EST monté : backend/app/main.py:2272 `register_router("app.routers.sovereignty_ops", …)`. Un registre de terrains est de ce qui engage : il devrait échouer franchement, pas rendre 201 sur une ligne qui meurt au redémarrage.
_submitVerification
⚑ sans position, la preuve GPS n'est pas REFUSÉE — elle est SAUTÉE
→la preuve de terrainfrontend/js/atom-go-engine.js:637 : `if (task.verification.indexOf('gps') >= 0 && _currentPosition)`. La condition `&& _currentPosition` fait que, position absente, le bloc entier est ignoré, aucun `check` n'est poussé, et `verification.valid` reste `true` depuis :634. Les photos sont explicitement non bloquantes (:659). Donc : une tâche exigeant « être sur place + une photo » se valide sans l'un ni l'autre. La fonction n'a toutefois aucun appelant — le défaut est armé, pas tiré.
_submitVerification
la seule chaîne de progression du moteur
→_addXP → grade → go.task.completedfrontend/js/atom-go-engine.js:692 (_addXP), :337-365 (montée de grade, go.level.up), :738-739 (go.task.completed + task.completed). Les publieurs existent et atom-meshmap.js:323 écoute bien `go.task.completed`. Mais la chaîne part de `_submitVerification`, dont aucun appelant n'existe : le câble est posé des deux bouts et aucun courant n'y passe.
EngineRegistry.activateAll()
l'allumage groupé au chargement, avec ses 19 garde-fous surveillés
→les 19 moteursfrontend/js/engine-registry.js:754 (activateAll), :1028 (invoqué à la fin du module), :761 (publie engine.registry.all_activated) ; 19 `sentinels` et 19 `risk_guard` dans ENGINES ; chargé à governance-init.js:962 (FULL). Le commentaire :950-953 mesure même l'effet : « 40 publications d'un coup sur 3 topics », avec trois modules qui les attendaient.
atom-meshmap.js
lecture seule — vérifié par l'absence, pas par la promesse
→les données du systèmeDans les 2051 lignes de frontend/js/atom-meshmap.js : 0 `setItem`, 0 `atomPost`, 0 `fetch(`, 0 `publish(`. Les seuls contacts avec le bus sont les 25 `_busSub` (:279-323 et :341-359). La carte ne peut pas modifier ce qu'elle montre.
La nomenclature 17 pièces, chacune avec sa source
1Terrain Point Zéro — les 12 dimensions12 — CONFIRMÉ par comptage des clés de DIMENSIONSfrontend/js/terrain-point-zero.js:62 et suivantes (surface, etat_sol, acces_eau, acces_energie, statut_legal, zonage, population_proximite, communaute_existante, batiments, acces_route, potentiel_alimentaire, potentiel_energetique) ; 1004 lignes ; singleton window.ATOMPointZero à :968 ; 5 couleurs de zone à :384-388 (GREEN≥75, GOLD≥55, GREY≥35, RED≥15, sinon BLACK) · confirmé dans le codeRien sur le calcul lui-même : il est déterministe, appelé, et son résultat s'affiche. Deux réserves de bordure : `MALLEABILITY_CONTRACT.widgets = {}` (:971) — le module n'offre aucun widget au système malléable ; et le formulaire transmet un 13ᵉ champ `cout_acces` (institutions.html:2110) qui ne correspond à aucune dimension et est silencieusement ignoré.
2Le registre des moteurs — 19 fiches en 8 castes19 — CONFIRMÉ (grep -c "caste: '" = 19) ; 8 castes distinctes ; 19 risk_guard, un par fichefrontend/js/engine-registry.js (1032 lignes) ; castes : temps, synchronisation, champ, amplification, pont, synthese, archivage, circulation ; `EngineRegistry.activateAll()` auto-invoqué à :1028 ; chargé à governance-init.js:962, dans le tableau FULL seulement (écart assumé et motivé à :957-961) · confirmé dans le codeAucun — la pièce tient. Mais son propre en-tête se contredit : engine-registry.js:4 annonce « 18 engines » pendant que son énumération juste en dessous (:6-13) nomme bien 19 moteurs, et le commentaire de chargement governance-init.js:962 répète « 18 moteurs ». Le LIVRE a raison (dix-neuf) ; c'est le CODE qui se compte mal. Et la règle « 1 moteur, 1 rôle, 1 sortie, 2 sentinelles max » est bien inscrite (:16) ET outillée : 19 `sentinels` et 19 `risk_guard`, plus l'assertion engine-registry.js:1017.
3Le moteur qu'on refuse délibérément d'allumerreinvestment-engine.js, 979 lignes au commitfrontend/js/reinvestment-engine.js ; l'exclusion et SA RAISON écrites à frontend/js/governance-init.js:80-84 (« it turns local revenue/asset estimates into automatic allocations. Allocation requires a durable source, a confirmed decision and a treasury receipt; it cannot be a browser flywheel ») ; chargé par aucune page HTML · confirmé dans le codeAucun. C'est la seule pièce de toute la planche où la chose promise et la chose faite coïncident exactement — parce que la chose promise est un REFUS, et qu'un refus, lui, n'a pas besoin d'un appelant pour tenir.
4La MeshMap (la carte vivante)2051 lignes · 28 types de nœuds · 19 types de liens · 3 royaumes + 6 alias · 25 abonnements au busfrontend/js/atom-meshmap.js : NODE_TYPES :109-146 (28), EDGE_TYPES :148-169 (19 — dont « Assigné à », « Situé à », « Dirigé par », « Propriété de », « Membre »), PRESETS :1531 (mon_monde, notre_monde, le_monde) + alias :1792-1797, abonnements :279-323 (7) et :341-359 (18 reloadTopics) ; chargée par frontend/meshmap.html:15 et frontend/design-center.html · confirmé dans le code« Elle montre, elle ne touche pas » est CONFIRMÉ PAR L'ABSENCE, et c'est la vérification la plus propre de la planche : dans 2051 lignes, zéro `setItem`, zéro `atomPost`, zéro `fetch(`, zéro `publish(`. Elle ne fait que s'abonner. Deux inexactitudes mineures : son propre journal annonce « 20 MessageBus events wired » (:369) alors que 25 sont posés ; et elle écoute `ur.transaction.completed` (:357), un sujet qu'aucun module d'AT·OM GO ne publie plus depuis le retrait de la conversion XP→UR.
5AT·OM GO — l'appareil (le moteur, ce qui tourne)1787 lignes au commitfrontend/js/atom-go-engine.js (git show HEAD) ; chargé par governance-init.js:93 (SPHERE_MODULE_MAP['institutions'] UNIQUEMENT) et par frontend/meshmap.html:40 · confirmé dans le codeIl n'existe AUCUNE surface d'exécution. `git grep ATOMGO.` hors du module et hors tests ne rend que trois choses : `getPlayer()` (agent-forum.js:407, architect-mode.js:551, atom-meshmap.js:529), `TASK_TYPES[...]` pour une icône (architect-mode.js:388-391) et `addTasks()` (architect-mode.js:406). `acceptTask`, `startTask`, `submitVerification`, `getDirections`, `scan`, `getAvailableForMe` : ZÉRO appelant dans tout le dépôt. Périmètre fouillé : frontend/ + backend/ + agents/ au commit.
6Le catalogue des types d'action28 types déclarés, pas « une vingtaine » : 16 géo/hybrides + 12 à distancefrontend/js/atom-go-engine.js:52-226 (16 clés) + Object.assign(TASK_TYPES, {...}) à la ligne 1297 (12 clés : design, write, translate, code, analyze, plan, mentor, review, teach, account, research, moderate) · confirmé dans le codeLes 12 types « à distance » — ceux que le livre vend comme « quelqu'un à Paris peut aider une ferme au Québec » — n'apparaissent dans les `perks` d'AUCUN grade (LEVELS, :232-243). Or `_acceptTask` (:588) refuse tout type absent des perks. Conséquence mesurée : un joueur des grades 1 à 7 ne peut accepter aucune des 12 missions à distance. Elles ne s'ouvrent qu'au grade 8 ('all_tasks') ou 10 ('all') — 4 000 XP minimum, par un compteur d'XP lui-même inatteignable.
7Les dix grades10 — CONFIRMÉ (Observateur → Souverain, 0 à 10 000 XP)frontend/js/atom-go-engine.js:232-243 · confirmé dans le codeL'unique écrivain d'XP est `_addXP` (:337), appelé seulement par `_submitVerification` (:692) — qui n'a aucun appelant. Le grade est une échelle complète dont le premier barreau n'est relié à rien : il ne peut pas monter.
8La porte de difficulté (ne jamais mettre un débutant sur une tâche d'expert)DIFFICULTY_MIN_LEVEL = {easy:1, medium:3, hard:6, expert:10}frontend/js/atom-go-engine.js:1312-1341 (TASK_DIFFICULTY, 28 entrées) et :1341 (le seuil) · confirmé dans le codeDEUX défauts dans la même fonction. (1) `GO.getAvailableForMe` (:1352) fait `return tasks.filter(...).map(...).sort(...)` à la ligne 1367 — tout ce qui suit, lignes 1419 à 1448, est du CODE MORT qui référence une variable `filtered` jamais déclarée. La forme de retour documentée `{geo, remote, hybrid, all}` n'est donc JAMAIS produite : la fonction rend un tableau nu, et un consommateur qui lit `.geo` obtient `undefined`. Le filtrage par monde et par « mes projets » (opts.monde, opts.myProjects) est entièrement dans ce code mort. (2) Les compétences ne filtrent RIEN : `skill_match` n'alimente que le tri et le drapeau `recommended` (:1410, :1416). Le livre dit « le moteur croise le grade, les compétences et une difficulté » — il croise le grade et la difficulté ; les compétences ne refusent jamais.
9L'écran Point Zéroassistant à 5 étapes (Identification · Physique · Legal · Humain & Infra · Potentiel)frontend/institutions.html:878 (le bouton) → :1858 (l'aiguillage) → :1928 renderPointZeroForm → :1945 _renderP0Step → :2089 submitPointZero → :2116 window.ATOMPointZero.evaluate() ; le module est chargé DEUX fois sur cette page : <script defer> à institutions.html:25 et via governance-init.js:93 · confirmé dans le code« Le seul écran grand public de toute la section » est FAUX : frontend/meshmap.html fait 1936 lignes, charge atom-meshmap.js (:15) et atom-go-engine.js (:40), et est liée depuis au moins 10 pages (agents, communaute, communication, creation, cuisine, dashboard, desktop, durabilite, entreprise…). Il y en a DEUX. Et le défaut propre de cet écran : la latitude et la longitude sont TAPÉES À LA MAIN (`_p0Input('p0Lat', …)`, :1968-1969) avec `parseFloat(...) || 0` à :2098 — un champ vide produit le point 0°,0°, au large du golfe de Guinée. Aucun écran d'AT·OM GO ne demande jamais la position de l'appareil.
10Le pipeline des six phases6 phases, dont 2 conditionnelles (securisation si le titre est fragile, depollution si le sol est contaminé)frontend/js/terrain-point-zero.js:586-642 (les 6 blocs), :659-733 (les listes de tâches par phase) · confirmé dans le codeLe livre promet « quand toutes les tâches d'une phase sont faites, la phase est marquée terminée et le pourcentage avance ». Le mécanisme existe — `updateTask` (:902, qui ferme la phase et publie pointzero.phase.completed) et `getProgress` (:944). `git grep` au commit : ZÉRO appelant pour l'un comme pour l'autre, dans tout frontend/. Le plan se génère une fois et ne bouge plus jamais. Le chantier ne se raconte pas : il est écrit d'avance et figé.
11Les moteurs « corps vivant »83 fichiers portent la marque — pas « une soixantaine » ; 82 des 83 sont dans governance-initgit grep -li 'aucun conseil medical' HEAD -- frontend/js → 83 ; confrontés aux tableaux de frontend/js/governance-init.js → 82 présents. Échantillon lu : frontend/js/cardiac-pacemaker-engine.js:1-20 · confirmé dans le codeUn orphelin nommé : `frontend/js/enteric-immune-guard.js` (387 lignes) n'est chargé par AUCUNE page HTML et ne figure dans AUCUN tableau de governance-init.js — il n'apparaît que dans TIER3_PATTERNS, qui ne charge rien (voir les relations). frontend/etat-technique.html:792 le compte déjà parmi « environ 4600 lignes qui ne sont appelées par rien ». Sur le cœur, la promesse du livre est exacte : cardiac-pacemaker-engine.js ne fabrique pas d'horloge, il s'abonne à `bio.tick.heartbeat` (:283) et n'éjecte jamais plus que le retour veineux (Frank-Starling, :1-16) — avec une seule nuance que le livre omet : un `setInterval` de secours existe bel et bien (:206-207, ESCAPE_INTERVAL_MS = 4320 ms) si le pouls canonique se tait.
12Les deux garde-fous du corps, inscrits dans les fichiers83 portent le premier · 40 portent le second · 37 portent LES DEUXgit grep -li au commit sur frontend/js : « aucun conseil medical » = 83 ; « aucune persistance backend » = 40 ; intersection = 37 · confirmé dans le codeLe second garde-fou manque à 43 des 83 fichiers de la famille — la phrase « deux garde-fous inscrits dans le code lui-même » décrit 37 fichiers sur 83, pas la famille. Et le mot « garde-fou » flatte : ce sont des DOCSTRINGS, pas des gardes. Je n'ai trouvé aucun script d'audit nommé qui les fasse tenir (recherche par nom dans scripts/ : audit_bio_db_contract_round335.py et audit_bio_stats_topic_constants_round571.py existent, mais je ne les ai pas lus — voir les marges). Une phrase dans un commentaire ne refuse rien.
13Le classement et les repères d'effort100 entrées max, en localStoragefrontend/js/atom-go-engine.js:816-849 (`_getLeaderboard`, localStorage.setItem à :846) ; `_savePlayer` :331-335 — localStorage seul, aucun atomPost · confirmé dans le codeLe livre l'avoue (« tenu pour l'instant sur l'appareil ») mais pas jusqu'au bout : c'est un classement d'UN SEUL joueur, celui de ce navigateur, qui se compare à lui-même. Et le seul envoi serveur d'une tâche finie (`_syncTaskCompletion`, :948) écrit dans `/api/v2/sovereignty-ops/investigations` : une mission de terrain accomplie est enregistrée au serveur comme une ENQUÊTE, avec son XP glissé dans le champ description. Il n'existe aucune table de missions, aucune table d'XP, aucune table de grades.
14Le mode Architecte et le sceau de l'Architectefrontend/js/architect-mode.js — chargé par 0 page, présent dans 0 tableau de chargementgit grep 'architect-mode' sur frontend/js/governance-init.js → une seule occurrence, ligne 1411, à l'intérieur de TIER3_PATTERNS ; git grep -ln 'architect-mode.js' -- 'frontend/*.html' → aucun résultat · confirmé dans le codeC'est la coupure la plus lourde, et l'agent ne l'a pas vue. architect-mode.js:406 porte le SEUL `ATOMGO.addTasks(goTasks)` du dépôt : c'est l'unique producteur de missions venu de l'extérieur du moteur. Le module n'étant chargé nulle part, aucune mission n'entre jamais dans AT·OM GO par cette porte. Le mode Architecte entier — les 8 modèles de mission, le score de viabilité en cinq lettres, le cycle de vie brouillon→soumise→approuvée→financée→active, la publication automatique des phases en tâches, le vote de la communauté — est du code que le navigateur ne reçoit jamais.
15La récompense en UR (un UR pour dix points d'expérience)0 — la conversion a été retirée du codefrontend/js/atom-go-engine.js:705-721 : le commentaire dit que convertir l'XP en UR dans ce navigateur « previously fed the local reinvestment ledger and published two monetary-looking events without an attested act » ; ce qui est publié aujourd'hui est `go.task.participation.recognized` avec `recognition: 'local_xp_only'`. Aucune occurrence d'un taux 1 UR / 10 XP dans le fichier. · confirmé dans le codeLe livre est PÉRIMÉ sur ce point, et dans le sens qui flatte : il annonce encore « l'expérience gagnée est convertie en monnaie UR » et nuance seulement que « ce n'est pas un versement bancaire ». La vérité du code est plus honnête que le livre — la conversion a été SUPPRIMÉE exprès. C'est une correction à porter au livre, pas au code.
16Le balayage — le scanner de cinq kilomètresles 4 rayons existent (50 m · 500 m · 5 km · 25 km) ; le scanner ne peut rien découvrirDETECTION_RADIUS : frontend/js/atom-go-engine.js:43-48 (CONFIRMÉ, 4 valeurs). `_scanArea` : :856-908 · confirmé dans le codeDEUX défauts, indépendants de la position. (1) La ligne 868 fait `var res = await atomFetch(...)` puis la ligne 869 lit `res.items`. Or `atomFetch` rend la RÉPONSE BRUTE (frontend/config.js:238 — `return response`) ; `.items` d'une Response vaut toujours `undefined`. `discoveries` reste `[]` même avec un serveur sain, un terrain à 300 m et une position parfaite. La fonction jumelle qui existe — `atomFetchJson` (config.js:321) — n'est pas appelée. (2) Le livre promet qu'il « retombe sur des données déjà présentes sur l'appareil si le serveur est absent ». Il n'y a AUCUN repli local : le `catch` (:871) écrit « using local data » dans la console et ne charge rien. C'est un avertissement qui décrit un repli qui n'existe pas.
17Keli, le quatrième cardinal0 occurrence dans les 4 fichiers de la sectiongrep -c 'keli' au commit : atom-go-engine.js = 0, terrain-point-zero.js = 0, atom-meshmap.js = 0, engine-registry.js = 0. terrain-point-zero.js:982-986 ne porte que aria_role, nova_role, orion_role. · confirmé dans le codeLes quatre moteurs de cette section sont parmi les 1114 modules mesurés qui portent une quaternité cardinale à trois pôles. C'est l'arrière convenu (aucun rattrapage de masse) ; je le nomme ici seulement parce que cette planche décrit des moteurs, et qu'un moteur sans Keli n'a pas de validation canon 999 Hz.
Le lexique de cette planche 13 termes à deux registres · 6 avec un jumeau

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.

point 0Le repère depuis lequel tout est compté pour un sujet : le système le cherche, et quand il ne le trouve pas il écrit qu'il ne l'a pas trouvé.
mode (fenêtre / porte)La distinction entre regarder depuis chez soi et passer de l'autre côté : passer demande une permission et laisse une trace, regarder ne change rien.
agent (type de nœud)Le genre de place qu'occupe un agent qui agit au nom de quelqu'un, avec l'endroit auquel il est rattaché.
communaute (type de nœud)Le genre de place qu'occupe un groupe, entre les personnes et le centre de tous.
Creation (sacred_name de S7)registre spirituelC'est le nom de registre sacré que porte la sphère de la formation.Création (S4) — C'est le sujet de ce qu'on fabrique soi-même.
bus (valeur de canal)C'est la valeur qui dit : ce message ne sort pas de la machine, il passe d'un module à l'autre dans le même programme.bus (l'organe de distribution) — C'est la pièce de code qui reçoit un message et le remet à tous ceux qui s'y sont abonnés.
bus (l'organe de distribution)C'est la pièce de code qui reçoit un message et le remet à tous ceux qui s'y sont abonnés.canal — C'est par quel moyen un message voyage : le réseau interne, le web, le courriel, le SMS, l'écran, et onze autres.bus (valeur de canal) — C'est la valeur qui dit : ce message ne sort pas de la machine, il passe d'un module à l'autre dans le même programme.
sceau (sceau serveur AIP, Ed25519)Une marque que seul le serveur peut apposer et que n'importe qui peut verifier, parce que la moitie qui verifie est publique et la moitie qui signe ne quitte jamais le serveur.covenant — L'entente qu'une personne accepte en entrant, qui fixe ce que le systeme peut faire avec elle et sert de reference a tous les accords qui…seal_hash (covenant legacy) — Une empreinte rangee a cote d'une acceptation, qui permet plus tard de dire : oui, cette personne a bien accepte ce texte-la, dans cette…
porteUn passage qu'on traverse vraiment : il faut une permission pour le franchir, et il laisse une trace de ce qui est passe.porte (Porte de la Connaissance, knowledge_gate/porte.py) — Elle decide combien d'un document on montre a quelqu'un — de rien du tout jusqu'au texte complet — en six crans, et par defaut elle ne…
porte (Porte de la Connaissance, knowledge_gate/porte.py)Elle decide combien d'un document on montre a quelqu'un — de rien du tout jusqu'au texte complet — en six crans, et par defaut elle ne montre rien.porte — Un passage qu'on traverse vraiment : il faut une permission pour le franchir, et il laisse une trace de ce qui est passe.fenetre — Une vue sur ce qui se passe ailleurs : on voit, on ne prend rien, et rien ne change de main.
gardeUn controle pose sur le chemin d'une action, qui la laisse passer ou la refuse.
KeliLe quatrieme interlocuteur : celui qui tient le cote intime et verifie qu'une decision respecte les regles du projet avant qu'elle passe.
Hz / fréquence (famille Solfeggio)registre spirituelUne courte liste de nombres admis : un nombre qui n'y figure pas est refusé comme hors famille.

Matière : PLANCHES-MATIERE-4-OUBLIEES-2026-10-03.json (sha256 7a2a3299f5ed) — planche de matière « LES MOTEURS : AT·OM GO — le règlement complet d'un jeu que personne ne peut jouer ». 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.