La mémoire vivante — le womb : la matrice a ses deux rives, et aucun premier mouvement
ouvrir la planche en plein écran → · 14 pièces · 12 traverses · 7 marges
Le womb est bâti aux deux bouts — une rive durable qui refuse honnêtement d'écrire et une dent taillée pour lire le cheminement sans en faire une autorité — mais aucune porte vivante ne touche cette dent, aucun geste ne déclenche la gestation, et le seul client qui enverrait la trace prend un refus 503 pour un succès.
ce que la figure ancre
La figure de l'utérus n'est décorative qu'en surface ; à trois endroits précis elle fait un travail qu'aucune autre métaphore ne ferait, et c'est là qu'il faut la juger. (1) ELLE DONNE UN SIGNE À LA DIRECTION DE LECTURE. Un classeur n'a pas de dedans : il a des cases équivalentes. Le womb, lui, pose S0 intérieur fertile = +1.0 et S9 membrane lisible = −1.0 sur un axe nommé « observer_observed » (polarity.py:129-149). C'est ce signe qui permet de traiter ind / com / civ non comme trois magasins juxtaposés mais comme TROIS PROFONDEURS D'UNE SEULE MEMBRANE — et donc d'expliquer pourquoi « civ » est le plus large accès et non le plus haut privilège (filter_scopes rend toujours `civ`, membrane_service.py:458). La figure produit une conséquence vérifiable, pas une ambiance. (2) ELLE IMPOSE QUE LA PROFONDEUR SOIT DU TEMPS, PAS DU VOLUME. `aderive_womb_depth` compte des couples DISTINCTS (event_type, jour) : cent événements du même type dans la même minute valent un. Cette règle est INDÉDUCTIBLE d'une métaphore de rangement — un tiroir ne gestationne pas — et elle ferme la porte au gonflage par émission. C'est le meilleur argument pour la figure dans tout le dossier. (3) ELLE SE FAIT ARITHMÉTIQUE DANS LA LOI MONOTONE : niveau = la plus longue suite CONTINUE depuis l'étape 0 (womb-intercross.js:38-44), donc un acquis ne recule jamais et aucun coin ne se tourne. La gestation traduite en calcul. EN REVANCHE, la figure échoue à deux endroits. Les neuf traditions (law12:74-84) n'apprennent rien à qui ne connaît pas déjà le système : c'est une liste de légitimité, lue par aucun code — elle rassure l'auteur, elle n'instruit pas le lecteur. Et le vocabulaire du placenta, du seuil de viabilité, du fruit qu'on ne cueille pas vert (livre-du-proprietaire.html:780-784) décrit magnifiquement un mécanisme dont le déclencheur n'existe pas : la figure est plus avancée que la chose. Enfin, la figure porte son propre danger, et le dépôt a dû l'écrire quatre fois dans un seul fichier : parce qu'une matrice qui « porte » et « met au monde » ressemble à une instance qui ACCORDE, il a fallu interdire explicitement que le womb accorde un rôle, une appartenance ou un droit (membrane_service.py:477-480, :533-538, :550-552, :556-558). Une parabole qui oblige à poser une interdiction quadruple est une parabole qui travaille — et qui coûte.
la même figure, ailleurs
C'est, à l'échelle d'un organe, la figure déjà vue à l'échelle de l'architecture entière : LE COFFRE ET LE COUVERCLE, où l'émission se fait ENTRE les deux (fiche l-emission-se-fait-entre-les-deux-coffre-et-couvercle). Ici le coffre est la rive durable (`womb_events`, fail-close), le couvercle est la membrane qui refuse une profondeur déclarée — et c'est exactement l'ENTRE-DEUX qui manque. Le womb redit aussi, en plus petit, le défaut de signature du dépôt : la chaîne étoile→pétale→module (4 modules qui respirent, 0 entrée de chargement), les checkpoints d'approbation qui ne quittent jamais le navigateur, le registre d'organes nourri à vide, les 429 tables vides sur 448. Toujours le même dessin : deux extrémités soignées, bâties, testées, commentées — et pas de premier mouvement entre elles. La grande architecture explique la plus petite, et réciproquement : qui a compris pourquoi `aauthorize` n'a aucun appelant a compris pourquoi 429 tables sont vides. Troisième récurrence, plus fine : l'OIGNON RELATIF. Les trois échelles du womb (soi / cercle / civilisation) ne sont pas trois mémoires mais une seule lue à trois profondeurs — même mécanisme que les portes et fenêtres à quatre échelles, et le livre lui-même l'avoue à sa manière (livre-du-proprietaire.html, note : seule l'échelle de soi est éprouvée). Le womb est donc la mémoire au format oignon, avec le même trou que partout : la membrane est dessinée, le passage à travers n'est jamais franchi par personne.
Ce qui tient après tout doute : la rive existe comme contrat (models/womb.py:16-43, migration v82_054 dans la chaîne, deux imports qui l'enregistrent) ; la bouche est montée et atteignable (main.py:2531, trois endpoints) ; le refus d'écrire sans base est réel et dit sa raison (womb.py:108-114, :139-143) ; la règle de profondeur est nommée avec son unité de normalisation — un point = un couple distinct (event_type, jour), donc du temps traversé et non du volume (membrane_service.py:493-527) ; la loi monotone est bâtie ET lue (womb-intercross.js:38-55 → womb-progression.js:87,97, les deux chargés) ; la frontière mue↔signature est gardée par un test qui lit la source (womb-progression-semantic-boundary.test.js:23-32) ; l'oubli supprime au lieu d'archiver (memory-womb.js:708,718). Et ce qui ne tient pas : entre la rive et la membrane, il n'existe aucun mouvement — `completeStage`, `addProgress`, `conceive`, `enterDormancy`, `checkGermination`, `syncToBackend`, `aauthorize`, `aderive_womb_depth`, `from_womb` : neuf organes, zéro appelant de production entre eux. La matrice a son dedans, son dehors, sa loi et son refus. Elle n'a pas de premier geste.
| frontend/js/womb-progression.js:134 (atomPost /api/v1/womb/events) le seul producteur câblé sur la bouche serveur — module chargé, route montée | → | backend/app/routers/womb.py:150 (POST /events)governance-init.js:265 charge le module ; main.py:2531 monte le routeur ; mais completeStage (:108), qui seul appelle syncBackend, n'a aucun appelant | |
| frontend/js/loteria-engine.js:192 (publie loteria.pattern.completed) l'arête que le contrat annonce et que le code ne pose pas — aucun .on( dans womb-progression.js | → | frontend/js/womb-progression.js:230 (events_in déclaré)loteria-bridge.js:68 capte le topic, re-publie 3 topics, ne touche jamais ATOMWombProgression | |
| frontend/js/womb-core.js:1006 (WombRoots.syncToBackend) le contrat de lot existe des deux côtés (cac637190) et rien ne l'emprunte : zéro appelant de syncToBackend, pas même interne | → | backend/app/routers/womb.py:160 (POST /events/batch)git grep syncToBackend sur frontend/ hors tests : aucune occurrence dans womb-core.js hors la définition | |
| frontend/js/womb-core.js:1032 (chunk.forEach e.synced = true) le client prend le refus pour un succès — atomPost rend la réponse sans lever (frontend/config.js:306) et le statut n'est jamais lu | → | backend/app/routers/womb.py:109-114 (503 fail-close)le docstring du routeur (:100-103) affirme l'inverse, en citant womb-core.js:1027-1029 | |
| backend/app/routers/womb.py (INSERT :119-128) écriture et lecture de la même rive, avec la règle de normalisation nommée (1 point = 1 couple distinct event_type×jour) | → | backend/app/services/membrane_service.py:493 (aderive_womb_depth, SELECT)les deux existent et visent womb_events ; aucune des deux extrémités n'est jamais sollicitée en production | |
| backend/app/services/membrane_service.py:529 (aauthorize) les portes vivantes appellent la variante SYNCHRONE authorize_axes et ne passent jamais womb_depth : la dent asynchrone n'est jamais engrenée | → | backend/app/services/knowledge_gate/porte.py:206 · routers/coquille_router.py:119 · services/bureau_service.py:146 · services/community_trunk_service.py:295git grep aauthorize sur backend/ (deux arbres) : appelants = tests seulement | |
| frontend/js/womb-intercross.js:38-55 (la loi monotone) la loi est lue par l'organe qui compte les étapes — l'un des rares joints womb réellement fermé | → | frontend/js/womb-progression.js:87,97 (level, canOpen)les deux modules sont dans les deux tableaux de governance-init (262/265 et 1106/1109) | |
| frontend/js/womb-intercross.js:38-55 (la loi) l'enforcement lit la loi mais n'est jamais chargé — 0 occurrence dans governance-init | → | frontend/js/womb-enforcement.js:43,55comptage sur git show HEAD:frontend/js/governance-init.js | |
| frontend/js/memory-manager.js:514 (consommateur mem-deep) le déclencheur de l'oubli — présent, mais sur la seule branche BioTickMaster | → | frontend/js/memory-womb.js:686 (activeForgetting)memory-manager.js:481 garde la branche ; la branche de repli :536-541 n'appelle que cleanup() | |
| hf-atom-tools/atom_canon/laws/law12_womb_perspective.py:25-27 (WombPole) la bipolarité devient un axe signé avec refus explicite — le joint canon est fermé | → | hf-atom-tools/atom_canon/primitives/polarity.py:129-149 (from_womb)laws/__init__.py:65 importe law12 ; polarity.py lève ValueError hors des deux pôles | |
| hf-atom-tools/atom_canon/primitives/polarity.py:129 (from_womb) aucun flux ne consomme l'axe signé — seuls les tests du paquet canon l'appellent | → | backend/ et frontend/git grep from_womb : hf-atom-tools/atom_canon/tests/test_polarity_primitive.py:55-57 uniquement | |
| backend/app/models/womb.py:16 le modèle est dans le metadata d'alembic ET dans le paquet models — le contrat de table est réellement enregistré | → | backend/alembic/env.py:22 et backend/app/models/__init__.py:49deux imports explicites mesurés au commit |
| 1 | Les 9 traditions — la figure universelle9 — CONFIRMÉ par comptage des clés : vedique Hiranyagarbha · tantrique Yoni · egyptien Nout · chretien Theotokos · kabbale Shekhinah · gnostique Sophia · bouddhiste Tathagatagarbha · taoiste Xuan Pin · quantique vide_QEDhf-atom-tools/atom_canon/laws/law12_womb_perspective.py:74-84 ; importé par hf-atom-tools/atom_canon/laws/__init__.py:65 · confirmé dans le codeChargé (le paquet laws l'importe), mais lu par rien : aucun appelant de WOMB_TRADITIONS_S2 hors du fichier et des docs. C'est une liste de légitimité, pas un organe. Le livre (livre-du-proprietaire.html:835-839) le dit lui-même : « on garde la figure ; on laisse la métaphysique ». | |
| 2 | La rive durable — la table womb_eventsChaînon alembic CONFIRMÉ : v82_055_agent_mirror_world_contract.py porte down_revision = "v82_054_womb_events_contract" — la révision est dans la chaîne, en amont de la tête prod annoncée v82_260_atom_positionsbackend/app/models/womb.py:16-43 (5 colonnes + Index ix_womb_events_user_recorded_at) ; importé par backend/app/models/__init__.py:49 ET backend/alembic/env.py:22 ; DDL backend/alembic/versions/v82_054_womb_events_contract.py:22-48 · confirmé dans le codeContrat bâti ; existence en base NON VÉRIFIÉE depuis ici (lecture seule, aucune base interrogée — donc je ne la nomme pas, et elle ne compte pas). Deux documents du dépôt affirment le contraire : frontend/etat-technique.html:978 et :1008 annoncent « womb_events N'EXISTE PAS dans la base prod » — mesure antérieure au fail-close du 2026-08-21, et la même ligne décrit un womb.py de « 109 lignes monté à main.py:2016 » alors qu'il en fait 226 et est monté à :2531. Document périmé, pas contre-preuve. | |
| 3 | Le routeur /api/v1/womb — la bouche serveur3 endpoints — POST /events (:150), POST /events/batch (:160), GET /status (:178). Préfixe vide dans main.py, donc le prefix du routeur s'applique : /api/v1/womb. Atteignable.backend/app/main.py:2531 register_router("app.routers.womb", "", ["Womb"], "womb") ; prefix propre déclaré backend/app/routers/womb.py:41 · confirmé dans le code | |
| 4 | La consolidation vivante — les 3 profondeurs de souvenir6 consommateurs bio-tick enregistrés (memory-manager.js:481-531) : mem-hot-cleanup 10t ≈ 4,3 s · mem-consolidate 50t ≈ 21,6 s · mem-archive 100t ≈ 43,2 s · mem-pulse 257t ≈ 111 s · mem-deep 1000t ≈ 7,2 min · mem-cloud 2500t ≈ 18 min — CONFIRMÉ par lecturefrontend/js/governance-init.js:307-312 charge memory-hot.js · memory-warm.js · memory-cold.js · memory-stigmergic.js · memory-womb.js · memory-manager.js ; frontend/js/memory-manager.js:294-296 instancie les trois paliers ; :323 appelle _startCleanupInterval ; auto-init DOMContentLoaded :1266-1272 · confirmé dans le code | |
| 5 | La loi monotone — womb-intercross4 wombs W0→W3, niveau 9 = né, 0 saut possible — CONFIRMÉ. Le gating est aussi recodé en repli dans womb-progression.js:102-104 si la loi est absente.frontend/js/womb-intercross.js:38-44 (level = plus longue suite CONTINUE depuis l'étape 0) et :49-55 (canOpen : W_n n'ouvre que si W_{n-1} ≥ 9) ; chargé par frontend/js/governance-init.js:262 et :1106 ; LU par frontend/js/womb-progression.js:87 et :97, lui-même chargé :265 et :1109 · confirmé dans le code | |
| 6 | La frontière sémantique de la naissance — une mue n'est pas une signature1 garde, 1 test qui l'épingle par lecture du fichier source — CONFIRMÉfrontend/js/womb-progression.js:120-123 : à niveau 9 le module publie `womb.mue` puis son `birth_topic`, et jamais `covenant.soul.minted` ; tenu par frontend/js/__tests__/unit/womb-progression-semantic-boundary.test.js:23-32 (assert topics.not.toContain('covenant.soul.minted')). Module chargé governance-init:265 et :1109. · confirmé dans le code | |
| 7 | L'empreinte du womb dans le dépôt18 fichiers nommés womb (re-mesuré, hors archives/ leaves/ memory/ scripts/ recovery-artifacts/). Côté frontend : 10 modules + 1 test ; 8 des 10 sont chargés par governance-init (womb-intercross:262 · womb-civilisationnel:263 · womb-cheminements:264 · womb-progression:265 · womb-core:266 · womb-tutor:268 · memory-womb:311 · gestation-womb:840), 2 ne le sont pas (womb-enforcement, womb-auto-evaluation). Côté backend : models/womb.py, routers/womb.py, 1 migration, 2 tests. Côté canon : law12 + son test.git ls-files sur backend/ + frontend/ + hf-atom-tools/ · confirmé dans le code | |
| 8 | La bipolarité S0⇄S9 branchée sur un axe signé2 pôles, 1 axe signé, 1 refus explicite — CONFIRMÉ par lecture du codelaw12_womb_perspective.py:25-27 (WombPole INTERIOR_FERTILE="S0" / MEMBRANE_LISIBLE="S9") + hf-atom-tools/atom_canon/primitives/polarity.py:129-149 (Polarity.from_womb → valence +1.0 / -1.0, axis="observer_observed", ValueError sur tout autre pôle) · confirmé dans le codeAucun appelant de production. `from_womb` n'est appelé que par hf-atom-tools/atom_canon/tests/test_polarity_primitive.py:55-57 ; `WombTopology` par personne. `atom_canon` EST importable depuis le backend (backend/app/main.py l'importe), donc la loi est atteignable en principe — elle n'est atteinte par aucun flux. | |
| 9 | Le fail-close d'écriture — honnête au serveur, perdant au client2 portes de refus, toutes deux verbatim avec leur raison — CONFIRMÉbackend/app/routers/womb.py:108-114 (db None → 503 « événement NON enregistré ») et :130-143 (échec base → rollback + 503 avec le type et le message de l'exception) · confirmé dans le code⚑ LA JUSTIFICATION DU REFUS EST FAUSSE DANS SON PROPRE DOCSTRING. womb.py:100-103 affirme : « le client est bâti pour ce refus : frontend/js/womb-core.js:1027-1029 ne marque `synced` qu'après un envoi réussi ». Mesuré : `atomPost` REND la réponse et ne lève pas sur un 5xx (frontend/config.js:306 `return response;` — seuls AbortError et les erreurs réseau lèvent, :307-317). womb-core.js:1021-1032 fait `await atomPost(...)` puis, SANS regarder `response.ok` ni le statut, `chunk.forEach(function (e) { e.synced = true; })` — un 503 est donc enregistré comme un envoi réussi et les événements sont jetés. Le serveur refuse honnêtement ; le client se confirme à lui-même. Second maillon : le repli mémoire `_womb_events` (womb.py:47) n'est plus écrit par AUCUN chemin — la branche dégradée de GET /status (:215-226) rend donc toujours une liste vide, structurellement. | |
| 10 | L'oubli actif — la mémoire supprime, elle n'archive pasSeuil 0.108 et fenêtre 7 jours — CONFIRMÉS dans le code. Déclencheur : 1 seul, et conditionnel.frontend/js/memory-womb.js:681-726 (activeForgetting : warm score < 0.108 → mgr.warm.delete :708 ; cold jamais rappelé en 7 jours → mgr.cold.delete :718) ; déclenché par frontend/js/memory-manager.js:514 dans le consommateur mem-deep · confirmé dans le codeLe déclencheur n'existe QUE sur la branche BioTickMaster (memory-manager.js:481 `if (bioTick && typeof bioTick.register === 'function')`). La branche de repli (:536-541) n'installe qu'un setInterval 5 min appelant `cleanup()`, qui n'appelle PAS `activeForgetting`. Or `memory-manager.js` est chargé au rang 312 de governance-init et `bio-tick-master.js` au rang 335 : je n'ai pas pu établir lequel gagne à l'exécution (aucun navigateur, lecture seule). Si l'auto-init DOMContentLoaded précède bio-tick-master, l'oubli ne tourne jamais. NON ÉTABLI : l'ordre réel. Ce qui manque pour trancher : un chargement observé. | |
| 11 | LE WOMB N'EST PAS UNE AUTORITÉ — la règle en code« Quatre fois en code » = NON CONFIRMÉ comme annoncé. Mesuré : la règle est énoncée dans UN SEUL fichier, à 3 points de texte + 1 geste structurel. Hors membrane_service.py, la formule « jamais une autorité » n'apparaît qu'en 2 endroits sans rapport (services/pay/money_adapter_registry.py:114, frontend/js/projection-field-observation-bridge.js:23). Zéro occurrence dans routers/womb.py, zéro dans la chaîne frontend.backend/app/services/membrane_service.py:477-480 (commentaire de bloc « la dent ») · :533-538 (docstring d'aauthorize : « womb_depth n'existe pas dans la signature ») · :550-552 (« une lentille de présentation, jamais une autorité d'opération ») · :556-558 (womb_depth=0 et required=1 forcés sur toute écriture) · confirmé dans le codeLe refus structurel est réel et testé : `aauthorize` n'accepte ni `requester_merit` ni `engagement_level` (TypeError), tenu par backend/tests/unit/test_membrane_womb_dent.py:87-94. Mais la règle garde une porte que personne n'ouvre — voir la pièce suivante. | |
| 12 | LE PREMIER MOUVEMENT — le producteur est câblé, son déclencheur est absent« Six entrées de la gestation » = NON ÉTABLI, et faux tel quel. Mesuré : 3 topics de gestation côté womb-core (womb.gestation.created · womb.dormancy.enter · womb.dormancy.germinate — les 3 mêmes en events_in et events_out, womb-core.js:1141-1143) + 1 chemin direct côté womb-progression. Soit 4 entrées, pas 6.frontend/js/womb-progression.js:129-137 (syncBackend → atomPost('/api/v1/womb/events', {event_type:'gestation.stage', …}), appelé par completeStage :124) ; frontend/js/womb-core.js:290, :469, :537 (les 3 publications womb.*) et :1006 (WombRoots.syncToBackend, seul envoyeur vers /events/batch) · confirmé dans le code⚑ C'EST ICI QUE LA PLANCHE SE JOUE, et la thèse initiale se corrige : un producteur EST câblé sur la route (womb-progression.js:134), dans un module CHARGÉ. Ce qui manque n'est pas la bouche, c'est le geste. (a) `completeStage` (:108) et `addProgress` n'ont AUCUN appelant hors du fichier (mesuré hors tests) ; womb-progression.js ne porte AUCUN `.on(` ni `subscribe(` alors que son MALLEABILITY_CONTRACT déclare events_in ['loteria.pattern.completed'] (:230) — l'abonnement déclaré n'existe pas en code. Le topic EST émis (frontend/js/loteria-engine.js:192) et capté par frontend/js/loteria-bridge.js:68, qui re-publie trois topics et ne touche jamais ATOMWombProgression. (b) Côté womb-core : `conceive()` n'a aucun appelant — frontend/js/loteria-cheminement.js:20 l'écrit déjà noir sur blanc (« `conceive()` n'est appelé PAR PERSONNE ») ; `enterDormancy` et `checkGermination` non plus. Et `WombRoots.syncToBackend()` n'a AUCUN appelant du tout, pas même dans womb-core.js. `ATOMWombRoots.start()` est bien appelé (governance-init:1827) : il s'abonne à 3 topics que personne n'émet et remplit une file que personne ne vide. | |
| 13 | L'enforcement de la loi monotone0 occurrence de « womb-enforcement » et 0 de « womb-auto-evaluation » dans frontend/js/governance-init.js au commit (mesuré par comptage) — les 2 modules ne sont donc PAS chargésfrontend/js/womb-enforcement.js:43 et :55 lisent global.ATOMWombIntercross ; frontend/js/womb-auto-evaluation.js:92 déclare emits ['womb-enforcement'] · confirmé dans le codeSon propre en-tête l'annonçait : womb-intercross.js:16-17 « il fournit la LOI ; le câblage d'enforcement viendra séparément ». Il n'est pas venu. 2 des 10 modules womb du dépôt sont hors des deux tableaux de governance-init. | |
| 14 | Le seul lecteur de la rive n'a aucun appelantAppelants mesurés dans le dépôt (git grep, deux arbres sous backend/) : TESTS SEULEMENT — backend/tests/unit/test_membrane_womb_dent.py:62-139 et backend/tests/unit/test_membrane_axes_separation.py:127. ZÉRO appelant de production.backend/app/services/membrane_service.py:493-527 (aderive_womb_depth : COUNT(DISTINCT (event_type, DATE(recorded_at))) sur womb_events) et :529-591 (aauthorize) · confirmé dans le codeLes 7 appelants vivants de la membrane passent tous par la variante SYNCHRONE `authorize_axes`, qui prend `womb_depth` en PARAMÈTRE — et aucun ne le passe : backend/app/services/knowledge_gate/porte.py:206, backend/app/routers/coquille_router.py:119, backend/app/services/bureau_service.py:146, backend/app/services/community_trunk_service.py:295, plus les renvois de core/conduit_membranes.py:26 et relation_mutuelle_service.py:143. La dent est taillée ; la roue ne la touche pas. |
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 « La mémoire vivante — le womb : la matrice a ses deux rives, et aucun premier mouvement ». 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.