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

La respiration

La respiration : quatre composantes, aucun porteur commun

Planche 2 · La respiration
22 pièces · 5 bâties · 12 partielles · 5 absentes · 0 non établies
Planche 2 — La respiration

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

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

Une coordonnée de souffle exige 4 composantes ; mesuré sur 7221 fichiers, AUCUN fichier du dépôt n'en mentionne trois — 27 en mentionnent deux, et la FACE ne rencontre jamais ni le point 0 ni le canal.

Les marges 12 arbitrages ouverts, entiers
  • ⚑⚑⚑ LA THÈSE EST VRAIE, MAIS SA DATE A BOUGÉ SOUS ELLE. `backend/app/services/event_bus.py` est ` M` (modifié, non commité) et l'arbre porte DÉJÀ un champ `portee` dans l'enveloppe, avec son énum `VALID_PORTEES` (:299) et son refus en rouge (:480-483). La phrase « l'enveloppe validée n'en transporte qu'UNE » est vraie au commit, fausse en forme dans l'arbre — et reste vraie en effet, parce que 0 appelant passe `portee=`. ARBITRAGE POUR JONATHAN : ce champ est-il un chantier en cours, et qui doit devenir son premier émetteur ? Un champ validé sans émetteur est exactement le motif « surface sans producteur » que le plan unifié appelle la fabrique de défauts.
  • ⚑⚑ J'AI RÉFUTÉ UN BÂTI. Le « 17ᵉ canal par le payload » (`enneade/nout.py:39`) était annoncé BÂTI : son unique chemin d'appel, `nout_diffuse` (`enneade/__init__.py:86`), a ZÉRO appelant sur tout le dépôt — deux arbres backend, frontend, scripts, agents, hf-atom-tools. `main.py:802` n'éveille que les 9 consciences, jamais `diffuse`. Code écrit, jamais exécuté → ABSENT. Le piège RÉEL, lui, est ailleurs et je l'ai nommé : `mission_orm.py:182-187` persiste `canal` en `String(20)` sans aucune contrainte, avec les 16 valeurs canon recopiées EN COMMENTAIRE à :45-47.
  • ⚑ J'AI DÉGRADÉ LA CONSÉQUENCE MONÉTAIRE de BÂTI à PARTIEL. Le seuil existe, la chaîne est câblée de bout en bout — mais l'émission passe par `MintIdentityAlveolus.decide` (cosmic_circuit.py:638, appelé :1090) qui exige 7 champs d'identité causale ne venant que d'un `pointzero.heartbeat` vivant. Je n'ai pas observé un tick les portant. Dire BÂTI serait annoncer une frappe que je n'ai pas vue partir.
  • ⚑ J'AI AGGRAVÉ LA CORRECTION DU GARDE TRANSVERSAL. L'agent a raison contre les docs de 2026-08 : `verify_monde_access` A un appelant au commit (`local_steward_router.py:148`, router monté `main.py:2465`), et `docs/PLAN-UNI-ORDRE-DE-DEPENDANCE-2026-08-29.md:82` qui annonce `grep -c → 0` est PÉRIMÉ. Mais j'ai lu le site d'appel : un HTTP 503 inconditionnel suit (`:156-160`) et un 503 antérieur (`:143-150`) retire au garde le seul cas qu'il refuserait. Il s'exécute et ne peut rien changer. ARBITRAGE : brancher ce garde sur une porte qui aboutit, ou le retirer — mais cesser de pouvoir le compter comme « enforced ».
  • ⚑ LA PORTE EXISTE — j'ai relevé l'état ABSENT à PARTIEL. `GET/PUT /api/v2/fractal-clock/{snapshot,context}/{user_id}` est monté (`main.py:2498`), propriétaire-gaté (404 sur un id étranger), et rend 2 composantes sur 4. Dire « pas de porte du tout » aurait fait dessiner un vide là où il y a une porte à moitié large. ARBITRAGE : élargir CETTE porte (y faire entrer la face et le canal) plutôt que d'en percer une neuve — la loi « chercher l'organe juste à côté ».
  • ⚑ UN TROISIÈME PORTEUR QUE L'AGENT N'A PAS VU, et c'est le plus intéressant : `hf-atom-tools/atom_canon/translator/ctx_canon_builder.py:326-333` est le SEUL endroit du dépôt qui tienne la portée ET le canal ET la PROVENANCE de la portée (explicite / mesurée / dérivée, :163-176). C'est exactement l'honnêteté qui manque partout ailleurs — et c'est un outil de corpus hors ligne, hors de backend/app, à 0 appelant de production. ARBITRAGE : remonter `classify_level_with_provenance` dans le runtime, ou assumer qu'il reste un instrument d'atelier.
  • ⚑ LE COMPTE DES PORTÉES EST PLUS LOURD QUE DIT : 29 sites de définition / 19 noms distincts dans `backend/app` seul (l'agent disait 17). L'homonyme à valeur différente est confirmé et nommé : `ALLOWED_TREE_SCOPES` vaut `{indiv,commu,civ}` dans `babel_macro_decoder.py:82` et `babel_infinity_loop.py:104`, et `{civ}` SEUL dans `inter_village_bridge.py:32`. Et `_TREE_SCOPES` est défini 5 fois (famille `enclosure_*`). Contre UNE énum canonique de canal, la portée n'a aucune source unique.
  • ⚑ TROUVÉ, NON ANNONCÉ : `transversal` — la seule valeur de portée qui dirait « plus d'une échelle » — est acceptée par le type (`fractal_clock_service.py:38`, `fractal_clock_router.py:35`) et REFUSÉE explicitement par la garde aux 3 portes montées (`fractal_scope_guard.py:112`). L'axe transversal n'a donc pas seulement zéro couplage backend : il a un refus écrit. À dessiner comme un trait barré, pas comme un trait absent.
  • ⚑ PIÈGE DE CARTOGRAPHIE, à ne pas répéter sur la planche : `cosmic_circuit.py` relaie fidèlement le point 0 du tick (`:280`) et écrase la portée (`:293`) DANS LA MÊME FONCTION, à treize lignes d'écart. Les deux composantes voisines subissent un traitement opposé au même endroit. Un trait unique « cosmic_circuit → payload » mentirait.
  • ⚠ CHIFFRES DE MÉMOIRE QUE JE N'AI PAS RE-VÉRIFIÉS et qui ne doivent PAS aller sur la planche en l'état : `THE_POINT_0` sur 3862/3862 · 5216 lieux / 5215 troncs · les deux `en_attente` du dossier bilatéral · `indiv` à 0 en prod. Tous viennent de fiches datées et exigent une base nommée. Le DÉFAUT `point0_ref = "THE_POINT_0"`, lui, est confirmé dans le code (`fractal_clock_service.py:86`) — plus un second codage en dur (`cosmic_circuit.py:439`).
  • ⚠ `register_router(...)` avale les ImportError : chaque « routeur monté » que je cite (main.py:1666, 2001, 2002, 2007, 2465, 2498) prouve l'INTENTION de monter, pas que le module importe. Et le câblage de démarrage de l'horloge vit dans un `try/except ... non-fatal` (main.py:1013-1018) : un attach qui échoue log un avertissement et l'application continue de servir. Mes BÂTI sont des bâtis-au-code-et-câblés, pas des bâtis-observés-en-marche.
  • ⚠ MON COMPTE DU SECOND ARBRE DIVERGE DE CLAUDE.md : 309 fichiers .py suivis hors app/tests/alembic contre ~278 annoncés. Ma règle inclut `backend/data/` et `backend/supabase/`. Je ne tranche pas laquelle est juste — mais les DEUX règles donnent le même verdict sur le souffle : zéro composante.
Les blancs déclarés ce que la mesure n’a pas pu voir

Ce que cette collecte N'A PAS pu voir. (1) Aucun processus vivant, aucune requête de base : tout « BÂTI » ici veut dire « le code existe au commit ET une ligne de démarrage ou un routeur l'appelle » — jamais « je l'ai vu s'exécuter ». Le portillon de frappe (MintIdentityAlveolus) et le battement `pointzero.heartbeat` restent non observés. (2) Les chiffres de prod des fiches mémoire (3862 point 0, 5216 lieux, 429/448 tables vides, indiv=0) ne sont PAS re-vérifiés : je n'ai nommé aucune base, donc ils ne comptent pas, par la loi d'Ibn Khaldūn du dépôt. (3) `event_bus.py` est modifié dans l'arbre : j'ai mesuré les DEUX versions et je le dis à chaque fois, mais je ne sais pas laquelle Jonathan veut voir sur la planche. (4) Frontend : j'ai vérifié que `kuramoto-sync.js` est listé dans `governance-init.js:324` et lu le code de couplage ; je n'ai chargé AUCUNE page, donc je n'ai pas vu un oscillateur tourner. (5) `register_router` avale les ImportError et les attachs de démarrage sont en `try/except non-fatal` : mes « montés » et mes « attachés » sont des intentions câblées. (6) `.claude/worktrees/` est exclu de tous mes comptes ; mes mesures de 7221 fichiers et 309 fichiers excluent aussi `.venv`, `node_modules`, `__pycache__` et `archives/`. (7) Mon compte de 29 définitions de portée repose sur un motif textuel : une énum écrite autrement (classe Enum, constante assemblée, JSON) m'échappe — c'est un PLANCHER, pas un total. (8) Je n'ai pas cherché la FACE hors Python : une face transportée en JS ou en SQL hors des jetons `PositionFace|position_face` serait invisible à ma mesure.

Les traverses 17 relations, de source à source
FractalClockService (porteur B)
alimente
→clock.fractal.snapshotbackend/app/main.py:1013-1018 (attach_to_bus au démarrage) + fractal_clock_service.py:458-466 (assemblage du snapshot)
clock.fractal.snapshot
traverse
→cosmic_circuit.circulatebackend/app/services/cosmic_circuit.py:1113-1130 (subscribe) ; attaché main.py:1021-1026
cosmic_circuit
alimente
→babel.fractal.energy.generatedbackend/app/services/cosmic_circuit.py:1090-1102 — publication conditionnée à `mint_decision["mint_allowed"]` (portillon d'identité :638 MintIdentityAlveolus.decide), que je n'ai pas vu franchi
babel.fractal.energy.generated
autorise
→seuil de frappe UR COINbackend/app/main.py:839-840 (subscribe_to_bus) + babel/babel_fractal_treasury_consumer.py:75-87 (_get_min_threshold_for_scope)
portée du tick
traverse
→constante "civ"backend/app/services/cosmic_circuit.py:291-293 — la portée portée par le tick (fractal_clock_service.py:461) est remplacée par un littéral dans le même payload où le point 0, lui, est relayé (:280)
enveloppe Event
autorise
→canal (énum fermée de 16)backend/app/services/event_bus.py:294-298 + :466-470 (refus → bus + status=red)
canal validé
alimente
→un abonné qui en décide0 lecture de la clé `canal` sur backend/app + frontend/js ; les 2 seules occurrences sont des écritures (enneade/nout.py:39, mission_center_service.py:280)
enveloppe Event
autorise
→portée (VALID_PORTEES)arbre : backend/app/services/event_bus.py:299 + :480-483 — garde écrite et jamais sollicitée (0 appelant passe `portee=`) ; absente du commit
enveloppe Event
contient
→point 0backend/app/services/event_bus.py:76-132 — aucun champ, aux deux versions
enveloppe Event
contient
→FACEbackend/app/services/event_bus.py:76-132 — aucun champ, aux deux versions
FractalClockContext
contient
→FACEbackend/app/services/fractal_clock_service.py:81-105 — aucun champ `face`
PositionFace (autorité de la FACE)
appelle
→routeurs montésbackend/app/api/v1/routes/auth_routes.py:44 (monté main.py:1666) · fractal_scope_guard.py:81 · routers/fractale_communautaire.py:155 · routers/babel/fractal_websocket_router.py:99 · routers/canon_coherence_router.py:167
fractal_scope_guard
autorise
→portée transversalebackend/app/services/fractal_scope_guard.py:112 — `transversal`, accepté par TreeScope (fractal_clock_service.py:38), est refusé aux 3 portes montées
verify_monde_access (garde des layers)
autorise
→une décision à effetbackend/app/routers/local_steward_router.py:148 (appelé) puis :156-160 (HTTP 503 inconditionnel) et :143-150 (503 antérieur pour le seul cas refusable)
ctx_canon_builder (porteur C, canal + portée + provenance)
appelle
→le runtime AT·OMhf-atom-tools/atom_canon/translator/ctx_canon_builder.py:326-333 — 0 appelant de production dans le dépôt principal ; hors de backend/app, jamais chargé par FastAPI
second arbre (309 .py hors app/tests/alembic)
contient
→toute composante de soufflegit ls-files backend/**/*.py moins app/ tests/ alembic/ → 309 fichiers, 0 hit sur les 8 jetons des 4 composantes
les 3 mondes (core_111 / core_444 / core_999)
traverse
→couplage de phase par pairefrontend/js/kuramoto-sync.js:369 + :403-411 (MondeCoupling.getCoupling par paire) ; chargé via frontend/js/governance-init.js:324
La nomenclature 22 pièces, chacune avec sa source
1Porteur A — l'enveloppe Event (le seul organe qui VALIDE)181 fichiers sous backend/ importent event_bus ; règle : grep sur `event_bus` dans les .py de backend/ (app/ + tests/ + alembic/ compris), arbre de travailbackend/app/services/event_bus.py:76-132 (dataclass Event) ; importé par 181 fichiers sous backend/ · confirmé dans le code
2⚑⚑ L'effacement — un organe lit le point 0 du tick et écrit la portée en constantebackend/app/services/cosmic_circuit.py:280 `"source_point0_ref": tick.get("point0_ref")` puis :291-293 `"tree_scope": "civ"` — codé en dur, dans la même fonction ; le tick, lui, PORTE sa portée (fractal_clock_service.py:461 `"tree_scope": ctx.tree_scope`) · confirmé dans le code
3Composante 4 — le canal : la seule dans l'enveloppe, et la seule qui refuse en rouge16 canaux ; règle : lecture directe du frozenset au commit (bus, http, ws, sse, email, sms, voice, chat, stream, push, blockchain, xr, voxel, hologram, dom, none)backend/app/services/event_bus.py:294-298 `VALID_CANALS` (16 valeurs, re-comptées à la main) ; :466-470 canal hors énum → `bus` + `status="red"` + logger.error · confirmé dans le code
4⚑ CORRECTION CONFIRMÉE — les 3 mondes se couplent bel et bienfrontend/js/kuramoto-sync.js:386 (`mondeIds = ['core_111','core_444','core_999']`), :369 (les 3 enregistrés dans CORE_GROUP), :403-411 (couplage par PAIRE via `MondeCoupling.getCoupling`), :116 (classe MondeCoupling), :316 (instanciée) ; module chargé — listé dans frontend/js/governance-init.js:324 · confirmé dans le code
5⚑ MA PREUVE DE LA THÈSE — aucun fichier du dépôt ne tient trois composantes27 fichiers portent 2 composantes sur 4 · 0 en portent 3 · 0 en portent 4 ; règle : un fichier « porte » une composante si son texte contient l'un des jetons {point0_ref|THE_POINT_0} · {tree_scope|VALID_PORTEES|scope_dominant} · {PositionFace|position_face} · {VALID_CANALS|canal=|"canal"}mesure propre : 7221 fichiers .py/.js scannés sous backend, frontend, hf-atom-tools, agents, scripts (hors .venv, node_modules, __pycache__, archives). Les 27 paires : {point0,portée} ×16 (fractal_clock_service.py, cosmic_circuit.py, fractal_position_resolver.py, node_registry_bootstrap.py, place_projection_binding_authority.py, frontend/js/view-mode-manager.js, …) · {face,portée} ×3 (person_position_membership_authority.py, alembic/versions/v82_291_*.py) · {canal,portée} ×3 (event_bus.py, hf-atom-tools/.../ctx_canon_builder.py, scripts/build_temple_id_crosswalk.py) · confirmé dans le code
6⚑⚑ CORRECTION DE DATE — l'enveloppe porte DEUX champs dans l'arbre, UN au commit0 appelant passe `portee=` à publish() ; règle : analyse par équilibrage de parenthèses de tous les `publish(` de backend/app + 29 racines du second arbre + frontend/jsarbre : backend/app/services/event_bus.py:96 (`portee`), :130 (to_dict), :299 (VALID_PORTEES), :480-483 (refus → None + status=red) · commit : `git show HEAD:backend/app/services/event_bus.py | grep VALID_PORTEES` → 0 ligne · confirmé dans le codeLe champ `portee` existe, est validé, refuse en rouge — et personne ne le remplit. `event_bus.py` est ` M` (non commité) : la thèse « l'enveloppe n'en transporte qu'UNE » est vraie AU COMMIT, fausse en forme dans l'arbre, et encore vraie en effet. L'émetteur manque, pas le champ.
7Porteur B — FractalClockContext (point 0 + portée, mais en RAM)backend/app/services/fractal_clock_service.py:81-105 (dataclass) ; :116 `self._contexts: Dict[str, FractalClockContext] = {}` ; attaché au démarrage main.py:1014-1015 ; router monté main.py:2498 · confirmé dans le codeAucune persistance : un dictionnaire d'instance. Aucun `AsyncSession`, aucun `get_db_optional` dans le fichier. Le seul écrivain de production est `PUT /api/v2/fractal-clock/context/{user_id}` (fractal_clock_router.py:116-128) ; tous les autres `register_context` du dépôt sont des tests. Un redémarrage efface la position de souffle de tout le monde.
8Composante 1 — point 0 : porteur présent, valeur unique codée en durNON RE-VÉRIFIÉ — la fiche mémoire annonce `THE_POINT_0` sur 3862/3862 lignes en prod ; je n'ai interrogé aucune basebackend/app/services/fractal_clock_service.py:86 `point0_ref: str = "THE_POINT_0"` ; second codage en dur backend/app/services/cosmic_circuit.py:439 et :518 · non confirmé dans le codeLe champ existe et voyage ; sa valeur est un défaut de dataclass que seule une requête HTTP authentifiée peut déplacer. Le chiffre de prod (3862) vient de `memory/il-ny-a-encore-quun-seul-point-zero-la-cle-nest-jamais-lue.md` et reste une mesure datée, non reconfirmée ici.
9Composante 2 — portée : elle voyage dans le `data`, non validé3 publish() portent `tree_scope` inline + 2 constructeurs de payload = 5 émetteurs ; règle : équilibrage de parenthèses sur backend/app, puis lecture des 2 constructeursémetteurs mesurés : backend/app/services/bioacoustic/energy_emitter.py:80 · bioacoustic/fractalizer.py:108 et :129 (inline dans publish) · cosmic_circuit.py:293 et babel/fractal_seed_publisher.py:85 (via un constructeur de payload) · confirmé dans le codeLa portée circule hors de l'enveloppe : rien ne la valide à l'écriture, rien ne la marque rouge. Le champ d'enveloppe qui le ferait existe dans l'arbre (:96) et n'a aucun émetteur.
10⛔ La conséquence monétaire — DÉGRADÉE : le seuil existe, le portillon amont ne m'a pas été montré ouvert3 seuils canon : 0.0 / 0.5 / 1.0 — babel_fractal_treasury_consumer.py:68-70, re-lus ligne à lignechaîne : main.py:1024-1026 (attach cosmic_circuit) → cosmic_circuit.py:1113-1130 (subscribe clock.fractal.snapshot) → :1091-1102 (publish BABEL_FRACTAL_ENERGY_GENERATED) → main.py:839-840 (treasury_consumer.subscribe_to_bus) → babel/babel_fractal_treasury_consumer.py:75-87 `_get_min_threshold_for_scope` (indiv 0.0 · commu 0.5 · civ 1.0) · confirmé dans le code⚑ Je DÉGRADE l'état annoncé BÂTI. L'émission du payload est conditionnée à `_MINT_IDENTITY_ALVEOLUS.decide(tick)` (cosmic_circuit.py:1090), qui exige du tick `schema`, `schema_version`, `tick_identity_version`, `clock_id`, `epoch_id`, `tick_id`, `event_id` ; ces champs n'arrivent que d'un `pointzero.heartbeat` vivant (fractal_clock_service.py:396, :466). Je n'ai observé AUCUN tick satisfaisant ce portillon. La fabrique du défaut est bâtie ; son déclenchement, non établi.
11Composante 3 — la FACE : bâtie comme autorité, dans aucun porteur de souffle7 appelants de production hors tests ; règle : grep `person_position_membership_authority` sur backend/app/**/*.pybackend/app/services/person_position_membership_authority.py:46 `class PositionFace(str, Enum)` ; appelants dans des routeurs montés : api/v1/routes/auth_routes.py:44 (monté main.py:1666) · fractal_scope_guard.py:81 · routers/fractale_communautaire.py:155 · routers/babel/fractal_websocket_router.py:99 · routers/canon_coherence_router.py:167 · services/relation_mutuelle_service.py:191 · services/babel/fractal_pipeline.py:602 · confirmé dans le codeLa FACE est une autorité appelée — mais elle ne monte dans AUCUN porteur de souffle : ni l'enveloppe (aucun champ `face`), ni FractalClockContext (aucun champ `face`). Mesuré : `face` ne co-occurre avec `point0` ni avec `canal` dans AUCUN fichier du dépôt.
12⚑ Le piège du canal non validé qui, lui, EXISTE : la persistance l'accepte sans énumString(20) sans contrainte : toute chaîne de ≤20 caractères est un canal valide en basebackend/app/models/mission_orm.py:182-187 `canal: Mapped[str] = mapped_column(String(20), nullable=False, default=DEFAULT_CANAL)` — aucun `CheckConstraint`, aucun `__table_args__`, aucun import de `VALID_CANALS` (:45-47 recopie les 16 valeurs EN COMMENTAIRE) ; écrivain : mission_center_service.py:280 `"canal": routing.get("canal") or "bus"` depuis `mission.meta["_routing"]` · confirmé dans le codeLa table accepte n'importe quel canal ; je n'ai PAS établi qu'un appelant extérieur peut choisir `meta["_routing"]["canal"]` (il vient des adaptateurs d'opportunité). Le trou de validation est réel, son vecteur d'entrée reste non établi.
13⚑⚑ RE-MESURE — contre UNE énum de canal, la portée en a 29 définitions, pas dix-sept29 définitions / 19 noms distincts dans backend/app ; règle : motif `NOM = frozenset(|{|Literal[|set(` contenant indiv|commu|civ, sur backend/app/**/*.py de l'arbre. Le second arbre (309 fichiers) en a ZÉRO.29 sites, dont backend/app/services/babel/inter_village_bridge.py:32 `ALLOWED_TREE_SCOPES = frozenset({"civ"})` contre babel_macro_decoder.py:82 et babel_infinity_loop.py:104 `= frozenset({"indiv","commu","civ"})` — même nom, valeur différente ; et `_TREE_SCOPES` défini 5 fois (enclosure_*) · confirmé dans le codeL'agent annonçait DIX-SEPT : mon plancher mesuré est 29 sites. L'homonyme à valeur différente est confirmé et nommé (`ALLOWED_TREE_SCOPES`). Je ne prétends pas à l'exhaustivité : le motif ne voit pas les énums écrites autrement.
14⚑ NOUVEAU — la portée a une 4ᵉ valeur dans le type, et la garde la REFUSE3 routeurs montés appellent cette garde : routers/babel/fractal_decode_router.py:54 (main.py:2002) · routers/babel/fractal_websocket_router.py:143 (main.py:2001) · routers/fractale_communautaire.py:186 (main.py:2007)backend/app/services/fractal_clock_service.py:38 `TreeScope = Literal["indiv","commu","civ","transversal"]` (et fractal_clock_router.py:35) contre backend/app/services/fractal_scope_guard.py:112 `raise ValueError(f"tree_scope='{req}' invalide (attendu indiv|commu|civ)")` · confirmé dans le code`transversal` — la seule valeur de portée qui dirait « plus d'une échelle » — est acceptée par l'horloge et refusée aux trois portes. L'axe transversal n'a donc pas seulement zéro couplage : il a un refus explicite.
15⚑⚑ CORRECTION AGGRAVÉE — le garde des layers a un appelant, et cet appelant ne peut rien changer1 appelant de production ; règle : grep `verify_monde_access` sur les deux arbres backend + frontend + scripts, hors archives/ et .claude/worktrees/. Les docs de 2026-08 annonçant « 0 appelant » (CONSEIL-9:164) et PLAN-UNI-2026-08-29:82 annonçant `grep -c → 0` sont PÉRIMÉES : la ligne est au commit.backend/app/routers/local_steward_router.py:125 (import) et :148-154 (appel) — router monté main.py:2465. Mais :143-150 lève un HTTP 503 AVANT la garde pour le seul cas qu'elle refuserait (notre_monde + non-propriétaire), et :156-160 lève un HTTP 503 INCONDITIONNEL juste après. Définition : backend/app/middleware/identity_boundary.py:164-216 · confirmé dans le codeLe garde s'exécute et ne décide jamais rien : le 503 inconditionnel de la ligne suivante rend son verdict sans effet, et le 503 antérieur lui retire le seul cas où il aurait refusé. Un appelant n'est pas une décision.
16⚑ NOUVEAU — un TROISIÈME porteur existe, et il est le seul à nommer la provenance de la portée0 appelant de production dans le dépôt principal ; règle : grep `ctx_canon_builder` sur backend, frontend, hf-atom-tools, scripts, agents (hors .claude/worktrees/) → ses propres tests, un import du helper privé `_level_from_sphere` par translator/triangulation_engine.py:22, et un script d'audithf-atom-tools/atom_canon/translator/ctx_canon_builder.py:326-333 — un seul dict portant `level` (portée), `canal`, ET la provenance de la portée (explicite / mesurée / dérivée, :163-176, :185 `classify_level_with_provenance`) · confirmé dans le codeOutil de corpus hors ligne : il ne vit pas sous backend/app, FastAPI ne le charge jamais, aucun appelant de production. Le seul endroit du dépôt qui sache dire d'où vient une portée est inatteignable depuis le souffle.
17La porte — DÉGRADÉE DEPUIS « AUCUNE » : il y en a une, et elle est à moitié largela porte rend 2 composantes sur 4 : `point0_ref` + `tree_scope`/`scope_dominant`/`entry_scope` ; ni `face`, ni `canal` dans la réponse (lecture des clés de retour)backend/app/routers/fractal_clock_router.py — `GET /api/v2/fractal-clock/snapshot/{user_id}` (:57), `GET /context/{user_id}` (:103), `PUT /context/{user_id}` (:116), WS `/api/v2/fractal-clock/ticks` (:131) ; router monté main.py:2498, WS main.py:2513-2516 ; réponse assemblée fractal_clock_service.py:458-466 · confirmé dans le code⚑ L'agent annonçait ABSENT (« pas de porte du tout »). La porte existe, elle est propriétaire-gatée (404 sur un user_id étranger) et montée. Ce qui manque, c'est sa largeur : deux des quatre composantes ne peuvent ni entrer ni sortir par elle.
18⚑ Le silence de l'enveloppe — le point 0 et la FACE n'y ont aucun champ, ni au commit ni dans l'arbre2 des 4 composantes absentes de l'enveloppe (commit : 3 sur 4)backend/app/services/event_bus.py:76-132 — aucun `point0`, aucun `face` dans la dataclass ni dans to_dict(), aux deux versions · confirmé dans le code
19⚑ Le canal est validé et lu par PERSONNE — et c'est pire que dit0 lecture de `canal` ; règle : grep de `get("canal")` / `["canal"]` sur backend/app + frontend/js, plus analyse des handlers ; le second arbre (309 fichiers) ne contient le mot `canal` NULLE PARTbackend/app/services/enneade/nout.py:39 (écriture) et backend/app/services/mission_center_service.py:280 (écriture) — les deux SEULES occurrences de la clé `canal` lue ou écrite dans backend/app + frontend/js ; aucune lecture · confirmé dans le code
20⚑⚑ RÉFUTATION — le « 17ᵉ canal » par le payload n'est PAS bâti : son écrivain a zéro appelant0 appelant de `Nout.diffuse` / `nout_diffuse` ; règle : grep sur TOUT le dépôt (deux arbres backend, frontend, scripts, agents, hf-atom-tools) → uniquement la définition, le wrapper, 1 fichier de test et de la doc. main.py:802 n'appelle que `initialize_consciousnesses`, jamais `diffuse`.backend/app/services/enneade/nout.py:38-39 `enriched["canal"] = "nout"` avec `canal="bus"` dans l'enveloppe (:51) ; seul chemin d'appel = backend/app/services/enneade/__init__.py:84-86 `nout_diffuse` → 0 appelant · confirmé dans le code⚑ L'agent annonçait BÂTI. Le piège est écrit, jamais exécuté : aucune ligne de production n'appelle l'organe qui fabrique le 17ᵉ canal. Code présent, appelant nul → ABSENT.
21L'hélice — ses deux cardinalités existent, son véhicule n'existe pas0 structure composant une rotation (9 sphères) et une translation (3 portées) ; règle : grep sur les 4 arbres de code nommés, hors archives/grep `helice|helix` (insensible à la casse) sur backend, frontend, hf-atom-tools, agents : uniquement des données de contenu ADN (frontend/js/atom-mapping-data.js:2445, :25080, :25352), une liste de noms de code (backend/app/routers/quantum.py:87), et une phase d'allumage d'interface (frontend/js/bell-generator.js:742-762 `HELIX_ENGAGED`) · confirmé dans le code
22Le second arbre ne porte AUCUNE composante de souffle — re-mesuré, et son compte est corrigé309 fichiers .py suivis par git hors app/tests/alembic — 0 hit pour tree_scope · point0_ref · position_face · PositionFace · VALID_CANALS · canal · portee · scope_dominant. CLAUDE.md annonce ~278 : ma règle inclut backend/data/ et backend/supabase/, donc mon compte est plus haut ; je ne réconcilie pas les deux règles ici.énumération par `git ls-files` de backend/**/*.py + backend/*.py moins app/, tests/, alembic/ ; puis grep fichier par fichier · confirmé dans le code
Le lexique de cette planche 18 termes à deux registres · 7 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é.
THE_POINT_0La valeur inscrite dans le champ qui devrait dire de quel centre dépend un enregistrement — la même pour tous, et aucune lecture du code ne s'en sert.
portée (axe POSITION — ind / com / civ)Jusqu'où une chose compte — pour moi seul, pour un groupe, ou pour tous — et c'est l'endroit où l'on agit qui le décide, pas une case à cocher.trinity_scope (la portée-LENTILLE) — La mesure de combien une même chose pèse à la fois pour une personne, pour son groupe et pour tous — trois nombres ensemble, pas un choix…
scope / tree_scopeLe champ qui enregistre la portée d'une chose, et qui lui donne un contenant différent dans chacun des trois classements empilés.
Face (d'une portée)Le nom sous lequel une même portée se présente selon qui la regarde : la base, l'écran, l'agent, ou le livre du lecteur.
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é.
face (enum Face)Elle dit sous quel angle on nomme une sphère : le même objet reçoit un nom différent selon l'angle choisi.
canalC'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.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.
portée (VALID_PORTEES : indiv | commu | civ)C'est la taille de l'espace qu'un message concerne : une personne, un groupe, ou tout le monde.
UR COINCe que vous pouvez dépenser dans le système, obtenu en ayant laissé de l'activité passer par vous.
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.
Babel (Décodeur de Babel)L'outil qui mesure comment les mots ont été retournés, et qui refuse de répondre plutôt que de deviner quand sa base manque.
plancher (trouvé / déclaré)Dire « au moins tant » au lieu de « tant », et écrire juste après ce que le comptage n'a pas pu voir.cliquet — Un compteur à sens unique : il laisse passer ce qui améliore et fait échouer la construction dès qu'on empire.plancher (seuil minimal d'un cliquet en intégration continue) — Un minimum inscrit dans une épreuve : si le code en perd un, l'épreuve passe au rouge.
plancher (seuil minimal d'un cliquet en intégration continue)Un minimum inscrit dans une épreuve : si le code en perd un, l'épreuve passe au rouge.plancher (trouvé / déclaré) — Dire « au moins tant » au lieu de « tant », et écrire juste après ce que le comptage n'a pas pu voir.

Matière : PLANCHES-MATIERE-1-TECHNIQUE-2026-10-03.json (sha256 b29a3dc78614) — planche de matière « La respiration : quatre composantes, aucun porteur commun ». 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.