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

Le système politique

LE SYSTÈME POLITIQUE — ce qui est bâti, ce qui est clos, et où l'autorité a vraiment émigré (contre-mesure au commit 8addf1c94, 2026-10-03)

Planche 13 · Le système politique
23 pièces · 10 bâties · 11 partielles · 2 absentes · 0 non établies
Planche 13 — Le système politique

ouvrir la planche en plein écran → · 23 pièces · 18 traverses · 16 marges

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

Les formes politiques sont montées mais leurs ÉTATS sont bâtis durablement ; le vote, le covenant et la justice tiennent leurs objets en MÉMOIRE DE PROCESSUS — et l'autorité qui engage réellement a émigré du côté économique : la seule porte d'entente multilatérale fail-close du dépôt est `POST /api/v2/contracts` dans l'Exchange Center, tandis que l'échelle d'engagement garde 7 services en RAM et 1 porte volontairement close, et que le second output économique — la forge alchimique — est scellé par une table d'ACL VIDE, par dessin.

Les marges 16 arbitrages ouverts, entiers
  • ⚑ LE RENVERSEMENT DE LA PLANCHE, et il donne raison à Jonathan : la seule porte d'entente multilatérale fail-close et persistée du dépôt — POST /api/v2/contracts → contract_engine, 422/503 discipline_flag=fail_close — est servie par exchange_center_router.py:643, monté main.py:2443, c'est-à-dire par l'ÉCONOMIE. Aucun des sept routeurs politiques ne la sert. covenant.py y renvoie ses appelants par un 503 nommé (« legacy_covenant_multilateral_retired_use_contract_engine »). Ce n'est pas que le politique soit bâti en amont de sa chaîne d'autorité : c'est que sa chaîne d'autorité a DÉMÉNAGÉ du côté de l'output économique.
  • ⚑ LE DÉFAUT LE PLUS GRAVE, non annoncé par la planche : _circles / _proposals / _votes sont trois List[dict] de module (governance.py:259-261) et cast_ballot / create_vote / close_vote n'écrivent JAMAIS en base. Un bulletin passe sept gardes cryptographiques sérieuses, puis atterrit dans la RAM d'un worker. En prod à quatre workers, deux appels du même électeur peuvent tomber sur deux urnes différentes. La loi du dépôt (« ce qui ENGAGE — monnaie, VOTE, appartenance — est en base, ou l'opération échoue ») est violée au cœur exact du vote. C'est le chemin qui aurait dû recevoir l'option C avant world_canon.
  • ⚑ CASCADE MESURÉE, et c'est le piège le plus silencieux : _authorize_circle_finalization rend `None ⇒ return` pour une proposition sans cercle (governance.py:349-351). Comme _circles est en RAM, un redémarrage vide la liste, _circle_of_proposal rend None pour TOUTE proposition, et la garde du facilitateur cesse de garder — tout vote devient clôturable par n'importe quel appelant authentifié. La garde est juste ; son substrat ne tient pas. (C'est le mécanisme nº3 déjà payé : memory/garde-par-visibilite-ensevelie-sous-le-tas.md.)
  • ⚑ L'ÉCHELLE D'ENGAGEMENT GARDE UNE PORTE FERMÉE À SON SOMMET. project_fund est la seule porte des huit qui déplacerait de l'argent ; elle exige GARDIEN (niveau 4) à economy_engine.py:922 — et lève 503 inconditionnellement à la ligne suivante utile (l.927). Le code écrit pourquoi, l.917-919 : le service « n'appends an approved allocation to a process-local list » et ne débite rien. Donc l'affirmation « l'échelle gouverne l'ÉCONOMIE » doit se lire : elle garde 7 services en RAM et 1 coffre vide.
  • ⚑ L'INVENTAIRE DE L'ÉCHELLE ÉTAIT INCOMPLET : 16 sites Depends, pas 10. Six sites omis — health_center_router 207/316/349 (soignant) et sentinel 156/266/309 (sentinelle, dont un gardien). « C'est son seul usage complet » tombe deux fois.
  • ⚑ LA CITATION-THÈSE VIENT D'UN REFUS, PAS D'UNE LOI. « actor_zone_mandate_treasury_receipt_required » a UN seul site : integration.py:90, dans _participatory_budget_not_active, et il éteint POST /budget, /budget/{id}/vote, /budget/{id}/finalize et /seed par des `raise` placés AVANT tout code utile (l.672, 752, 790, 874 ; le reste est du code mort, déjà inventorié docs/inventaires/tri-get-db-optional-2026-09-25.jsonl:1122-1131). La phrase de la planche est belle et sa pièce est l'inverse : c'est le VOTE BUDGÉTAIRE PARTICIPATIF qui est éteint, honnêtement.
  • ⚑ AUCUN ORGANE POLITIQUE N'EST EXIGÉ AU LANCEMENT. required_launch_routers (main.py:2971-2984) nomme 13 routers — auth, threads, notifications, profile, world_canon, mission_center, inscriptions, team_collab, community ×2, communications_hub, direct_messages, onboarding. Pas governance, pas covenant, pas justice, pas legal_system, pas government, pas citizen_registry. Le système peut se déclarer « prêt au lancement fondateur » avec toute la couche politique morte. Seul checkpoints est protégé — par core=True, qui est plus fort que la liste.
  • ⚠ « MONTÉ » N'EST PAS « ATTEIGNABLE », et je ne peux pas certifier le second. register_router avale l'ImportError pour tout router non-core (main.py:1649-1657) ; les sept routeurs politiques sont tous non-core. En lecture seule je n'ai pas exécuté d'import : l'atteignabilité des 7 est NON ÉTABLIE. La mesure qui la donnerait : REGISTER_ROUTER_STRICT=1 au démarrage, ou GET /health qui expose _registered_broken.
  • ⚠ LA LOI DU JOUR CONTREDIT government.py. 8addf1c94 déclare les PersistentDict « descriptive caches, never ownership evidence » (world_canon.py:5-7). Or government.py tient ses cinq registres réglementaires dans des PersistentDict (l.248-253) et pose six 503 fail-close pour protéger... ces caches. Et PersistentDict n'écrit pas à la mutation — « deliberately does not write through on every mutation », flush périodique 56 s par défaut (persistent_store.py:9-11, 46-48). Les mêmes caches portent citizen_registry (l.159-161) et le covenant (via _covenant_db_guard, covenant.py:36-42). Décision qui attend Jonathan : les 20 autres chemins du motif, que le commit nomme lui-même NON ÉTABLIS.
  • ⚠ LE REFUS DU JOUR EST MUET POUR L'APPELANT. CODES_5XX_PUBLIABLES contient exactement UN code, privacy_violation_registry_closed (refus_publics.py:88-92). Les trois nouveaux codes world_canon n'y sont pas : l'appelant reçoit {"status":"internal_error"} et ne distingue pas « la base est indisponible » d'un plantage. L'arbitrage attend Jonathan, et le commit le dit.
  • ⚑ LE SECOND OUTPUT ÉCONOMIQUE EST SCELLÉ PAR DESSIN, DES DEUX CÔTÉS. bus_acl.py:86 porte `"forge.product.distributed": frozenset()` dans EXACT_TOPIC_SOURCES, table « TOUJOURS fail-close » — donc bloquée même en mode observe, contrairement aux préfixes privilégiés. Et event_bus.py:155-157 : TOPICS_QUI_FRAPPENT = frozenset(EXACT_TOPIC_SOURCES), « Aucune porte REST ne les accepte. Jamais. » Le producteur frontend EXISTE et EST CHARGÉ (forge-alchemy.js:913, governance-init.js:372-373) ; il n'a simplement aucun chemin légal vers le mint. Trois autres sujets sont dans le même état : forge.pierre.philosophale, babel.temple.energy.generated, mission.rewarded.
  • ⚠ ASYMÉTRIE DE RÉGIME DANS L'ACL, à trancher : governance.vote*, governance.decision, justice.*, treasury.*, constitution.* sont « privilégiés par préfixe » — et en mode observe, qui est le DÉFAUT (BUS_ACL_ENFORCE absent), une émission de source inconnue est AUTORISÉE et seulement journalisée (bus_acl.py:198-224). Les sujets de pouvoir sont donc forgeables par défaut, là où les sujets de frappe ne le sont jamais. Le code l'assume (« fail-safe par défaut, enforce par interrupteur ») mais la conséquence politique n'est pas écrite.
  • ⚑ legal_system : IL FAUT EXÉCUTER UNE DÉCISION AVANT DE POUVOIR FAIRE APPEL. STAGES place APPEL à l'index 8, DECISION à 6, EXECUTION à 7 ; update_case refuse tout saut de plus d'un cran (l.661-662). L'escalier est complet dans sa LISTE et brisé dans sa RÈGLE. Décision qui attend Jonathan : APPEL est-il une neuvième marche, ou une branche depuis DECISION ?
  • ⚑ legal_system, second défaut : repli silencieux sur un geste qui engage. _get_owned_case_db_first rattrape toute panne base en logger.warning(« using in-memory fallback ») et rend from_db=False ; _save_case_after_mutation retombe alors sur _remember_case (RAM). Un avancement d'étape judiciaire peut rendre 200 sans avoir rien écrit. C'est exactement « le repli silencieux qui ressemble à un succès » que CLAUDE.md interdit.
  • ⚠ governance_v2 n'est pas un organe : 118 lignes, /sync et /status, un dump JSONB de l'état envoyé par le frontend (governance_v2.py:68-118). Il DIT son repli (source:"memory"), ce que governance.py ne fait pas — mais il ne décide rien. Le compter dans « les six organes du politique » fabrique un organe de rien.
  • ✓ CE QUI TIENT, et qu'il faut dessiner d'un trait plein : la garde du pacte au démarrage (verify_covenant_document, main.py:571, fail-close AVANT la base) · checkpoints core=True · la règle nº1 avec ses deux appelants runtime réels · l'échelle à 4 niveaux · les 7 gardes du bulletin ancrées au registre durable · la clôture qui refuse avant toute mutation · la garde du facilitateur dans sa forme · les 10 portes économiques closes avec leur condition de réouverture écrite · l'ACL du bus appelée aux DEUX portes · contract_engine via l'Exchange Center. Dix pièces vraiment bâties — et l'une d'elles n'est pas politique.
Les blancs déclarés ce que la mesure n’a pas pu voir

Cette collecte est une lecture statique du commit 8addf1c94 (git show HEAD:…), machine Windows, sans aucune exécution. ⛔ CE QU'ELLE N'A PAS PU VOIR : (1) L'ATTEIGNABILITÉ RÉELLE des sept routeurs politiques — register_router avale l'ImportError pour les non-core, et je n'ai lancé aucun import ni aucune sonde /health : « monté » est mesuré, « atteignable » est NON ÉTABLI pour les sept. (2) AUCUNE PREUVE POSTGRESQL — je n'ai interrogé aucune base ; les 448 tables, l'état de world_blueprints, de governance_v2_sync et des tables contract_engine restent non vérifiés (et le commit lui-même déclare « aucune preuve PostgreSQL reelle »). (3) AUCUNE MESURE EN PRODUCTION — la divergence multi-workers sur _votes, _conflicts, _covenants et les PersistentDict est déduite du code, jamais observée ; elle reste NON ÉTABLIE, exactement comme le commit le dit pour world_canon. (4) AUCUN BANC LANCÉ — je ne colle aucune sortie de test ; je ne qualifie donc AUCUNE garde de « verte ». (5) PÉRIMÈTRE DES GREPS, nommé : backend/app/ ET le second arbre hors app/ pour les appelants de contract_engine, validate_against_foundation, check_publish et covenant_id ; pour les sites require_engagement j'ai balayé backend/ entier hors tests. Je n'ai PAS balayé transit/, archives/, ni AT-OM-999-DEPLOY-ZAMA-ALLELUYA/. (6) LE FRONTEND N'EST VÉRIFIÉ QUE SUR LE CHARGEMENT (présence dans les tableaux de governance-init.js) pour forge-alchemy.js, forge-energy-bridge.js, vote-engine.js et governance-ballot-signer.js — leur comportement runtime, et notamment si un bulletin signé localement atteint /votes/{id}/cast, n'est pas mesuré. (7) L'ÉTAT DES SIX AUTRES ENDPOINTS du covenant (emergency, child, legacy, forget, bigbang, bigbang/history) n'a pas été lu ligne à ligne : seules les quatre portes closes et l'absence d'écriture base sont mesurées. (8) LE TRI ENGAGE/LIT de citizen_registry n'a pas été fait endpoint par endpoint.

ne pas dessiner

  • ⛔ NE PAS dessiner « les six organes du politique sont montés » d'un trait plein : sept register_router existent, zéro core, zéro dans la liste de lancement, et register_router AVALE l'ImportError. Dessiner le montage en trait pointillé avec la mention « tentative, non certifiée atteignable ».
  • ⛔ NE PAS dessiner le BULLETIN et son URNE du même trait. La preuve Ed25519 est ancrée en base durable (plein) ; le bulletin prouvé atterrit dans _votes, liste de module (pointillé, mention RAM). C'est le contraste central de la planche.
  • ⛔ NE PAS dessiner « l'échelle gouverne l'ÉCONOMIE, c'est son seul usage complet ». Trois faux dans une phrase : 16 sites et non 10, quatre routeurs et non un, et 7 des 8 sites économiques gardent de la RAM tandis que le huitième garde une porte close.
  • ⛔ NE PAS dessiner « actor_zone_mandate_treasury_receipt_required » comme une loi du système. C'est la raison d'UN refus (integration.py:90) qui éteint le budget participatif. La citer comme loi inverse le sens de la pièce.
  • ⛔ NE PAS dessiner « L'autorité se confirme EN BASE » comme une propriété du système politique. C'est un précédent sur world_canon, un routeur d'environnement, et l'auteur du commit déclare lui-même les ~20 autres chemins NON ÉTABLIS — dont le vote, le covenant et la justice.
  • ⛔ NE PAS dessiner le covenant comme un organe bâti. Quatre de ses dix portes sont closes par 503, zéro écriture base, et covenant_id n'est lu par aucune frontière opérationnelle : trois fichiers en tout dans backend/app/.
  • ⛔ NE PAS dessiner « la grande respiration est ASYMÉTRIQUE » comme un arbitrage de code. ZÉRO occurrence de la figure dans backend/ au commit (grep respiration/grande_respiration → 0). C'est une thèse doctrinale (memory/covenant-tripartite-et-grande-respiration.md, 2026-08-31) non retrouvée en code aujourd'hui — NON ÉTABLI, à ne pas mettre dans une planche qui se dit générée depuis les valeurs réelles.
  • ⛔ NE PAS dessiner l'escalier judiciaire comme neuf marches franchissables. APPEL n'est pas atteignable depuis DECISION : la règle du +1 impose EXECUTION entre les deux.
  • ⛔ NE PAS dessiner la forge comme une boucle économique qui tourne. Le producteur est chargé, le consommateur est abonné, et l'ACL n'autorise PERSONNE : frozenset() vide, fail-close absolu, plus aucune porte REST. Dessiner la coupure, pas le flux.
  • ⛔ NE PAS placer contract_engine du côté politique. Son unique porte HTTP est dans exchange_center_router.py — c'est le côté ÉCONOMIQUE. Déplacer ce nœud est la correction la plus importante de la planche.
Les traverses 18 relations, de source à source
engagement.py (échelle 4 niveaux)
gouverne
→economy_engine (8 sites)backend/app/routers/economy_engine.py:30,624,638,661,899,908,922,943,956 — 7 des 8 gardent des services en RAM, 1 garde une porte close l.927
engagement.py
gouverne
→governance.py (2 sites : créer un cercle, créer une proposition)backend/app/routers/governance.py:59,665,924
engagement.py
gouverne
→health_center_router + sentinel (6 sites omis par la planche)health_center_router.py:34,207,316,349 ; sentinel.py:27,156,266,309
engagement.py
gouverne
→POST /votes/{id}/cast (le bulletin)backend/app/routers/governance.py:1117-1124 — aucune dépendance d'engagement, seul get_current_user_id ; create_vote l.1069 n'en a pas non plus
POST /votes/{id}/cast
traverse
→registre durable des clés citoyennes (base)governance.py:1164-1192 → aip_key_registry.resolve_citizen_public_key(db,…) ; 503 KEY_REGISTRY_UNAVAILABLE, 409 VOTER_KEY_NOT_ENROLLED
POST /votes/{id}/cast
produit
→_votes (liste de module, RAM)governance.py:259-261, 1102, 1272 — bulletin prouvé Ed25519 puis append en mémoire ; 0 écriture base
_circles (RAM)
autorise
→_authorize_circle_finalization (garde du facilitateur)governance.py:259, 328-355 — circle None ⇒ return (tout appelant authentifié) ; un vidage de la liste neutralise la garde
covenant.py (4 portes closes)
autorise
→contract_enginecovenant.py:53-70, 223, 234, 283, 302, 322 — le refus désigne contract_engine comme autorité multilatérale
contract_engine
produit
→POST /api/v2/contracts (Exchange Center)backend/app/routers/exchange_center_router.py:643-669 ; 422 parties invalides, 503 fail_close si persistance impossible ; monté main.py:2443
covenant_id
gouverne
→les frontières opérationnelles (passeport, appartenance, position, environnement)git grep covenant_id HEAD -- backend/app/{routers,services,core} → 3 fichiers seulement : covenant.py, services/auth/auth_service.py, services/covenant_persistence.py
verify_covenant_document()
autorise
→démarrage de l'applicationbackend/app/main.py:568-571 — fail-close avant la base ; RuntimeError si SHA-256 du pacte divergent
checkpoints (core=True)
gouverne
→toute opération exigeant un arrêt humain (423)main.py:1685 core=True ; main.py:1520-1526 gestionnaire 423 « R&D Rule #1: Human Sovereignty » ; >25 levées 423 dans routers et core
foundation.py (8 principes)
gouverne
→master_mind + nova_pipelinebackend/app/services/master_mind.py:476 ; backend/app/services/nova_pipeline.py:990 — borne : message[:200]
bus_acl.check_publish
gouverne
→bus in-process + pont HTTPbackend/app/services/event_bus.py:510-513 ; backend/app/routers/event_bus.py:25,367
forge-alchemy.js (producteur frontend, chargé)
alimente
→forge_energy_consumer (mint UR COIN)frontend/js/forge-alchemy.js:913 + governance-init.js:372-373 ; coupé par bus_acl.py:86 (frozenset vide) et event_bus.py:155-157 (« Aucune porte REST ne les accepte. Jamais. »)
legal_system DECISION (étape 7)
autorise
→legal_system APPEL (étape 9)backend/app/routers/legal_system.py:119-122 + 659-662 — new_idx > current_idx+1 ⇒ 400 ; l'appel n'est atteignable qu'après EXECUTION
_launch_readiness_snapshot (13 routers exigés)
gouverne
→les 7 routeurs politiquesbackend/app/main.py:2971-2984 — aucun organe politique dans required_launch_routers
register_router (non-core)
autorise
→atteignabilité réelle d'un routeur politiquebackend/app/main.py:1643-1663 — ImportError journalisée au niveau error puis AVALÉE, sauf REGISTER_ROUTER_STRICT=1
La nomenclature 23 pièces, chacune avec sa source
1L'échelle d'engagement — 4 niveaux, fail-close, lue du JWT signéEngagementLevel IntEnum 1→4 (OBSERVATEUR·PARTICIPANT·CONTRIBUTEUR·GARDIEN) · 19 rôles mappés · 401 sans token, 403 si niveau insuffisantbackend/app/core/engagement.py:41-120 (classe 41-47, _ROLE_TO_LEVEL 51-74, require_engagement 91-116) · confirmé dans le codeRien à dégrader sur la garde elle-même : elle CONSTATE (level_of, jamais de décret), l'Observateur sans rôle n'est jamais une erreur, et le refus ne classe pas la personne. C'est la pièce la plus honnête de la planche.
2Les portes économiques CLOSES, et leurs raisons écrites10 levées 503 inconditionnelles mesurées : economy_engine 6 (727,796,927 funding + 1137,1190,1243 marchand) + integration 4 (budget create/vote/finalize + seed)backend/app/routers/economy_engine.py:47-52,125-133,727,796,927,1137,1190,1243 ; backend/app/routers/integration.py:74-91,672,752,790,874 · confirmé dans le codeRien ne manque — c'est un refus honnête, et c'est la pièce la mieux bâtie du lot. Chaque refus NOMME sa condition de réouverture : « attested_source_debit_and_atomic_treasury_allocation_required », « durable_enterprise_identity_ownership_and_registration_receipt_required », « durable_owner_bound_request_and_treasury_decision_receipt_required », « actor_zone_mandate_treasury_receipt_required ».
3Le BULLETIN — la preuve Ed25519 est sérieuse ET ancrée en base durable7 gardes en série : signature présente · signer_id == voter_id · fraîcheur (max 10 min, tolérance futur 2 min) · clé résolue du registre DURABLE (503 si registre indisponible, 409 si non enrôlé) · clé autorisée MAINTENANT · clé autorisée À LA DATE DE SIGNATURE · validité cryptographiquebackend/app/routers/governance.py:1143-1251 ; registre : backend/app/services/aip_key_registry.py:577-604 (is_citizen_key_authorized, aucune trappe) + resolve_citizen_public_key (lecture db, aip_key_registry.py:308) ; constantes _BALLOT_SIGNATURE_MAX_AGE/_FUTURE_SKEW governance.py:~360 · confirmé dans le codeEt la trappe de transition AIP (`AIP_ALLOW_UNREGISTERED_KEYS=1`, aip_key_registry.py:68,545-552) — qui accepterait une signature SANS ancrage de confiance — est explicitement neutralisée pour les bulletins : is_citizen_key_authorized n'en hérite pas (docstring l.584-586 : « Aucune trappe de transition n'existe ici »). La crypto du bulletin est la meilleure pièce du système politique.
4Qui clôt un vote — le facilitateur, et la dégradation est écrite6 points d'appel de la même garde (governance.py:790, 837, 906, 1041, 1373) · 3 issues : non-membre→403, facilitateur présent et ce n'est pas vous→403, cercle SANS facilitateur→tout membre peut (anti-blocage)backend/app/routers/governance.py:334-355 (_authorize_circle_finalization) ; appels l.790,837,906,1041,1373 · confirmé dans le codeLa forme est bâtie et la dégradation est NOMMÉE dans la docstring (« consent degradation, avoids deadlock »), ce qui est exactement la discipline demandée. Son substrat, lui, est la liste RAM de la pièce précédente — voir marges.
5La clôture exige que CHAQUE bulletin soit re-vérifié — et refuse AVANT toute mutation1 appel : _require_all_ballots_verified(vote) avant _recalculate_results ; refus 409 « chaque bulletin doit porter une signature Ed25519 valide et ancrée au registre, et le décompte doit en dériver »backend/app/routers/governance.py:1379-1381 (ordre commenté : « AVANT toute mutation du vote ou de la proposition : un refus laisse l'ensemble ouvert et intact ») ; message 409 l.~650-655 · confirmé dans le code
6⚑⚑ CE QUI ENGAGE VRAIMENT — contract_engine, et sa seule porte est DANS L'ÉCONOMIE4 routes · 1 seul routeur porteur : exchange_center_router (monté main.py:2443) · 2 refus typés : 422 ContractPartyValidationError, 503 ContractPersistenceError avec discipline_flag="fail_close" · service + modèle + migration existantsbackend/app/routers/exchange_center_router.py:643-695 (POST /api/v2/contracts l.643, GET /mine l.672, /stats l.679, /{cid} l.684) ; backend/app/services/contract_engine.py ; backend/app/models/contract_engine_contract.py ; backend/alembic/versions/v82_215_contract_engine_contract.py ; montage backend/app/main.py:2443 · confirmé dans le codeRien à dégrader — et c'est le renversement de la planche. La seule entente multilatérale fail-close et persistée du dépôt n'est servie par AUCUN des sept routeurs politiques : elle est servie par l'EXCHANGE CENTER. Jonathan a raison dans sa formulation : l'économie est directement reliée à l'output du système, et c'est littéralement vrai ici — l'autorité qui lie des parties a émigré vers la porte commerciale.
7CE QUI DÉCIDE AUJOURD'HUI — le point d'arrêt humain, et il est le seul organe core=Truecore=True (le serveur REFUSE de démarrer si ce router casse) · 2 refus 503 fail-close : checkpoint_storage_unavailable l.40, checkpoint_persistence_failed l.514backend/app/main.py:1685 (register_router … core=True) ; backend/app/routers/checkpoints.py:40,514 ; main.py:1645-1648 (core → RuntimeError) · confirmé dans le code
8La règle nº1 — souveraineté humaine, 423, et elle est APPELÉE (pas seulement déclarée)gestionnaire 423 enregistré · 8 principes gelés · 2 appelants runtime de validate_against_foundation hors tests · >25 levées 423 réparties dans routers et corebackend/app/main.py:1520-1526 (@app.exception_handler(423), "rule": "R&D Rule #1: Human Sovereignty") ; backend/app/core/foundation.py:31-39 (CORE_PRINCIPLES), 41-63 (AUTHORITY_MODEL) ; appelants : backend/app/services/master_mind.py:476 et backend/app/services/nova_pipeline.py:990 · confirmé dans le codeLa seule limite, déjà consignée au dépôt : master_mind n'inspecte que `result.message[:200]` — ce qui se dit au caractère 201 n'est pas regardé (docs/CHAINE-ASSEMBLAGE-CHENU-V2-2026-08-14.md:29657). Pièce bâtie, borne nommée.
9La garde du pacte au démarrage — le serveur refuse de booter si les mots du covenant ont bougé1 appel, AVANT la base et tout autre organe · 2 RuntimeError : document absent/illisible, SHA-256 divergentbackend/app/main.py:568-571 (lifespan → verify_covenant_document()) ; backend/app/schemas/auth_schemas.py (verify_covenant_document, comparaison expected_sha256 vs covenant_document_sha256) · confirmé dans le code
10⚑ L'ACL DU BUS — la garde la plus dure du système, et elle CLÔT la forge alchimique2 points d'appel (bus in-process ET pont HTTP) · 25 préfixes privilégiés · 7 sujets à autorité exacte, TOUJOURS fail-close · dont 4 à table VIDE : forge.product.distributed, forge.pierre.philosophale, babel.temple.energy.generated, mission.rewardedbackend/app/core/bus_acl.py:78-86 (EXACT_TOPIC_SOURCES), 165-198 (check_publish) ; appelants : backend/app/services/event_bus.py:510-513 et backend/app/routers/event_bus.py:25,367 ; TOPICS_QUI_FRAPPENT = frozenset(EXACT_TOPIC_SOURCES), event_bus.py:155-157 « Aucune porte REST ne les accepte. Jamais. » · confirmé dans le codeRien ne manque à la garde. Ce qui manque est DERRIÈRE elle, et le code le dit : « Une table vide signifie honnêtement qu'aucun producteur backend autorisé n'existe encore » (bus_acl.py:76-77). Le second output économique que Jonathan nomme — la forge alchimique → UR COIN — est donc scellé des DEUX côtés : zéro producteur backend autorisé, et zéro porte REST pour le frontend. Noter la différence de régime : un sujet de la table exacte est bloqué même en mode observe ; un sujet seulement privilégié par préfixe (governance.vote*, justice.*, treasury.*) passe en mode observe, qui est le DÉFAUT (BUS_ACL_ENFORCE absent).
11Les SIX routeurs politiques sont « montés » — mais aucun n'est core, et aucun n'est exigé au lancement7 register_router mesurés (government 1709 · governance 1741 · justice 1774 · citizen_registry 2206 · legal_system 2276 · covenant 2424 · governance_v2 2448) ; core=True : 0 sur 7 ; présents dans required_launch_routers : 0 sur 13backend/app/main.py:1709,1741,1774,2206,2276,2424,2448 ; main.py:1637-1663 (register_router) ; main.py:2971-2984 (required_launch_routers) · confirmé dans le coderegister_router avale l'ImportError pour tout router non-core (main.py:1649-1657 : logger.error + continue, sauf si REGISTER_ROUTER_STRICT=1). Un appel register_router n'atteste donc PAS l'atteignabilité : il atteste une TENTATIVE. Et la sonde de lancement fondateur (_launch_readiness_snapshot) exige 13 routers dont world_canon, mission_center, inscriptions — et PAS UN SEUL organe politique : le système peut se déclarer prêt au lancement avec toute la couche politique morte. Je n'ai pas exécuté d'import (lecture seule) : « atteignable » reste NON_ÉTABLI pour les 7.
12L'échelle NE gouverne PAS « seulement » l'économie — 16 sites, 4 routeurs16 sites Depends mesurés : economy_engine 8 (624,638,661,899,908,922,943,956) · health_center_router 3 (207,316,349) · sentinel 3 (156,266,309) · governance 2 (665,924)git grep require_participant|require_contributeur|require_gardien HEAD -- backend/ ; economy_engine.py:30,624-956 ; health_center_router.py:34,207,316,349 ; sentinel.py:27,156,266,309 ; governance.py:59,665,924 · confirmé dans le codeLa planche annonce « 8 sites économie, 2 sites vote » — les deux chiffres sont JUSTES et l'inventaire est FAUX : il omet 6 sites (3 soins, 3 sentinelle). « C'est son seul usage complet » est donc réfuté deux fois : ce n'est pas le seul, et il n'est pas complet (voir pièce suivante).
13⚑ Les 8 sites économiques gardent 7 services en MÉMOIRE DE PROCESSUS et 1 porte volontairement CLOSE7 sites sur 8 délèguent à get_lnis()/get_project_generator(), dicts de processus ; 1 sur 8 (project_fund, require_gardien l.922) lève un 503 inconditionnel l.927backend/app/routers/economy_engine.py:920-931 ; backend/app/services/lnis_service.py:337-344 (_territories/_needs/_solutions: Dict) ; backend/app/services/project_generator.py:443-446 (_projects/_by_territory/_by_need/_by_status: Dict) · confirmé dans le codeLe code écrit lui-même pourquoi, à economy_engine.py:917-919 : « ProjectGeneratorService only appends an approved allocation to a process-local list. It neither debits a source nor records an atomic Treasury/outbox receipt, so it must not announce a funded project. » Donc le GARDIEN — le niveau 4, le sommet de l'échelle — garde la seule porte qui bougerait de l'argent, et cette porte est fermée par dessin. Les 7 autres approuvent, démarrent et jalonnent des projets qui disparaissent au redémarrage. L'échelle est bâtie ; ce qu'elle gouverne ne l'est pas.
14⚠ La citation-thèse de la planche vient d'un REFUS, pas d'une loi — et elle ferme un budget participatif1 seul site dans tout le dépôt : integration.py:90. Les 4 endpoints qui la portent (POST /budget, /budget/{id}/vote, /budget/{id}/finalize, /seed) lèvent 503 avant toute ligne utilebackend/app/routers/integration.py:76-91 (_participatory_budget_not_active) ; raises inconditionnels l.672, 752, 790, 874 ; code mort derrière : _budgets.append l.694, vote l.769, upsert l.776/800, seed l.876-936 (documenté docs/inventaires/tri-get-db-optional-2026-09-25.jsonl:1122-1131) · confirmé dans le code« actor_zone_mandate_treasury_receipt_required » n'est pas une loi générale du politique : c'est la raison inscrite dans UN refus, qui éteint le VOTE BUDGÉTAIRE PARTICIPATIF. La planche s'en sert pour dire « le code écrit lui-même pourquoi le politique est bâti en amont de sa chaîne » — la phrase est juste, mais la pièce est l'inverse d'un organe politique bâti : c'est un organe politique ÉTEINT, honnêtement.
15⚑ MAIS le bulletin prouvé atterrit dans une LISTE EN MÉMOIRE — le vote ne survit pas à un redémarrage_circles / _proposals / _votes = 3 List[dict] de module, governance.py:259-261. 0 écriture base dans cast_ballot, create_vote et close_vote (dernier await db.execute du fichier : l.968, dans la zone cercles)backend/app/routers/governance.py:259-261 ; _votes.append(vote) l.1102 ; vote["ballots"].append(ballot_record) l.1272 ; _find_vote l.325-326 ; cast_ballot l.1117-1124 (db servant UNIQUEMENT à résoudre la clé, l.1170-1178) · confirmé dans le codeLa loi du dépôt (CLAUDE.md, « ce qui ENGAGE — monnaie, VOTE, appartenance, consentement — est en base, ou l'opération échoue ») est violée au cœur du vote. Conséquence en cascade mesurée : `_authorize_circle_finalization` rend `None`→`return` quand la proposition n'a pas de cercle (governance.py:349-351) ; un redémarrage vide `_circles`, donc `_circle_of_proposal` rend None pour tout, donc **tout vote redevient clôturable par n'importe quel appelant authentifié**. La garde du facilitateur tient à la survie d'une liste RAM.
16« government » n'est pas un organe politique — c'est la conformité réglementaire, et elle est fail-close sur un registre NON canonique0 await db.execute · 5 PersistentDict (compliance_items, clinical_trials, adverse_events, documents, checkpoints) · 6 levées 503 nommées quand la persistance manquebackend/app/routers/government.py:33,248-253 ; refus l.860,873,880,891,918,929 (government_trial_persistence_unavailable, government_audit_persistence_unavailable, government_checkpoint_persistence_unavailable) · confirmé dans le codeContradiction interne au commit du jour : government.py est fail-close — mais ce qu'il protège est un PersistentDict, c'est-à-dire précisément le registre que 8addf1c94 vient de déclarer NON CANONIQUE (« The periodic KV stores are descriptive caches, never ownership evidence », world_canon.py:5-7). Et PersistentDict n'écrit pas à la mutation : « It deliberately does not write through on every mutation » (backend/app/core/persistent_store.py:9-11), flush périodique de 56 s par défaut. Un refus honnête posté devant une preuve que le dépôt vient de récuser.
17legal_system — 9 étapes, machine à états monotone réellement appliquée9 étapes (SIGNALEMENT·QUALIFICATION·JURIDICTION·INSTRUCTION·MEDIATION·AUDIENCE·DECISION·EXECUTION·APPEL) · 2 refus 400 : régression interdite, saut interdit (new_idx > current_idx+1)backend/app/routers/legal_system.py:119-122 (STAGES) ; update_case l.654-662 ; persistance l./_get_owned_case_db_first + _save_case_after_mutation · confirmé dans le codeDEUX défauts. (1) L'escalier n'est PAS « entier » : APPEL est l'index 8, DECISION l'index 6 — la règle du +1 rend l'appel inatteignable depuis la décision. **Il faut EXÉCUTER la décision avant de pouvoir faire appel.** (2) Repli silencieux : _get_owned_case_db_first rattrape toute exception base en `logger.warning("…using in-memory fallback")` et rend from_db=False ; _save_case_after_mutation retombe alors sur _remember_case (RAM) — un avancement d'étape judiciaire peut être confirmé 200 sans jamais être écrit. C'est le « repli silencieux qui ressemble à un succès » que CLAUDE.md interdit.
18« L'autorité se confirme EN BASE » — loi posée le jour même, sur UN routeur, et MUETTE pour l'appelant1 routeur traité (world_canon, monté main.py:2494) · 3 nouveaux codes de refus · 0 des 3 inscrits dans CODES_5XX_PUBLIABLES (qui contient exactement 1 code) · ~20 autres chemins du même motif déclarés NON ÉTABLIS par l'auteur du commitcommit 8addf1c94, backend/app/routers/world_canon.py:228-300 (_assert_owned_world_access, _load_world_db, _require_world_write_db, _memory_read_provenance, _cached_world_is_descriptive_for) ; backend/app/core/refus_publics.py:88-92 (CODES_5XX_PUBLIABLES = {"privacy_violation_registry_closed"}) ; message du commit : « reste NON ETABLI depuis le §2 : les 20 autres chemins du meme motif » · confirmé dans le codeDEUX maillons. (1) Ce n'est pas une loi du système politique, c'est un PRÉCÉDENT sur un routeur d'environnement, et l'auteur le dit lui-même. Les chemins politiques — vote, covenant, justice — sont précisément ceux qui ne l'ont pas encore reçue. (2) Les trois codes restent ASSAINIS par la frontière HTTP globale : l'appelant reçoit `{"status":"internal_error"}` et ne peut pas distinguer « la base est indisponible » d'un plantage. Le refus est honnête dans le journal, muet à l'écran, en attente de la décision de Jonathan sur CODES_5XX_PUBLIABLES.
19La forge alchimique — consommateur branché, producteur inatteignable, boucle ouverte par écritconsommateur abonné au démarrage · producteur frontend chargé (forge-alchemy.js dans le tableau de governance-init.js) · 0 producteur autorisé par l'ACL · boucle déclarée OUVERTE dans le journal de démarragebackend/app/main.py:907-922 (« Le producteur frontend et forge.cycle.completed restent non branchés : boucle ouverte » l.909 ; log « producteur frontend non relié, boucle UR COIN ouverte » l.917-919) ; producteur : frontend/js/forge-alchemy.js:913 (_pub) ; chargement : frontend/js/governance-init.js:372-373 ; blocage : backend/app/core/bus_acl.py:86 · confirmé dans le codeLe maillon manquant est EXACTEMENT nommé par l'ACL : un producteur backend autorisé, c'est-à-dire une chaîne de reçus durables qui justifie une frappe. Tant qu'elle n'existe pas, la forge produit de l'énergie que personne n'a le droit de convertir en UR COIN. C'est cohérent avec le θ=0 déjà consigné (memory/economie-hedera-nft-armure-coupee-au-premier-maillon.md) — à re-mesurer séparément, non vérifié par moi aujourd'hui.
20justice.py — la forme d'un organe, zéro persistance586 lignes · 1 store de module (_conflicts: List[dict], l.118) · 0 await db.execute · monté main.py:1774 (prefix "" , /api/v1/justice intégré)backend/app/routers/justice.py:118 ; backend/app/main.py:1773-1774 · confirmé dans le codeAucune écriture base dans tout le fichier. Un conflit déclaré, instruit et résolu disparaît au redémarrage du worker — et la prod tourne à 4 workers (memory/production-quatre-workers-gardes-en-memoire.md), donc deux appels consécutifs du même usager peuvent tomber sur deux listes différentes. Non re-mesuré en prod aujourd'hui : la divergence multi-workers reste NON ÉTABLIE, comme le dit le commit du jour pour world_canon.
21citizen_registry — le seul organe politique qui touche réellement la base5 await db.execute · 3 PersistentDict en repli (citizen_registry, civil_events, user_citizen_map) · 1 refus 503 (l.925) · monté main.py:2206backend/app/routers/citizen_registry.py:8,31,159-161,925 ; backend/app/main.py:2206 · confirmé dans le codeL'appartenance ENGAGE (loi CLAUDE.md), et le repli PersistentDict est encore là à côté des 5 lectures/écritures base. Je n'ai pas trié endpoint par endpoint lesquels engagent et lesquels lisent : ce tri est le travail exact que le commit du jour a fait pour world_canon et qu'il déclare restant pour « les 20 autres chemins ».
22governance_v2 n'est pas un organe politique — c'est un vidoir d'état frontend118 lignes · 2 endpoints (/sync, /status) · 0 décision · repli mémoire déclaré (source:"memory")backend/app/routers/governance_v2.py:1-118 ; table governance_v2_sync : backend/alembic/versions/v82_065_resource_sync_contract.py:27 + backend/app/models/resource_sync.py:102 · confirmé dans le codeIl recopie circles/proposals/votes envoyés PAR le frontend dans une colonne JSONB par user_id, en upsert. Il ne décide rien, ne vérifie rien, n'ouvre ni ne clôt rien. Le compter parmi « les six organes du politique » gonfle l'inventaire d'un septième de rien. Son seul mérite : il DIT son repli (source:"memory"), ce que governance.py ne fait pas.
23⚑ Le COVENANT — 4 de ses 10 portes sont CLOSES, et sa table multilatérale est ailleurs0 await db.execute dans covenant.py · 3 stores de module (_covenants, _amendments, _bigbang_log) · 4 endpoints clos par 503 (create l.223, get l.283, list l.302, amend l.322) sur 10 · covenant_id consulté par 3 fichiers seulement dans tout backend/app/backend/app/routers/covenant.py:60-70 (_legacy_covenant_not_active), 146-150, 209-322 ; consommateurs de covenant_id : covenant.py, backend/app/services/auth/auth_service.py, backend/app/services/covenant_persistence.py · confirmé dans le codeLe refus nomme son remplaçant : « legacy_covenant_multilateral_retired_use_contract_engine », raison « durable_parties_representative_authority_decision_receipt_and_contract_engine_required », et le corps rend `{"autorite_multilaterale": "contract_engine"}` (l.234). Donc l'entente à plusieurs souverains a quitté l'organe politique. Et covenant_id n'est lu par AUCUNE frontière opérationnelle — ni passeport, ni appartenance, ni position, ni environnement runtime : le covenant est écrit à l'inscription et jamais consulté ensuite (concorde avec la fiche memory/covenant-tripartite-et-grande-respiration.md du 2026-09-01, re-vérifié par moi au commit).
Le lexique de cette planche 26 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.

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.
branche (BRANCHES)C'est la position des huit sujets qui produisent du contenu : S1 à S8, pas une de plus ni une de moins.
status (green / yellow / red)C'est la note de confiance mise sur l'étiquetage d'un message : vert, le classement est bon ; rouge, il a échoué.
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.
discipline_flagC'est une marque posée sur chaque message pour dire : ce contenu est soumis à la règle qui interdit d'affirmer plus que ce qui a été mesuré.
UR COINCe que vous pouvez dépenser dans le système, obtenu en ayant laissé de l'activité passer par vous.
θ (theta)Un nombre entre 0 et 1, obtenu en comparant l'activité du dernier jour à sa moyenne de la semaine, qui multiplie tout montant que le système s'apprête à émettre.THETA_STRUCTURE — Un seuil fixe de 0,30 dans le lecteur de sons vivants : en dessous, le signal est jugé trop désordonné pour valoir quoi que ce soit.
la forgeL'atelier qui reprend les restes d'un travail — chaleur perdue, erreurs, résidus — et les repasse par sept étapes pour en tirer quelque chose d'utilisable.DocumentForgeRuntime — Un générateur d'aperçus de documents de conformité à partir de modèles : il affiche le texte rempli, il ne signe rien et n'enregistre rien.forge — L'atelier qui capte : c'est son volume des dernières vingt-quatre heures qui autorise, ou non, le système à émettre de la monnaie.
mériteLe fait de comprendre vraiment par quoi une chose arrive — ce qui ne s'imite pas, parce qu'imiter la compréhension c'est ne pas l'avoir.
Treasury (le trésor)Le service unique qui crée et retire la monnaie, tient le portefeuille de chacun, répartit les budgets et fixe les plafonds quotidiens.
output du système (les sorties)Les endroits où l'on dépense à l'intérieur du système — caisse, échange, marchand, place de marché — ce qui fait que l'argent dépensé y revient.OR-PLATINE (OR-Platinum) — L'étiquette définitive posée sur un élément dont la qualité a été mesurée au-dessus de 0,75 et dont l'origine est prouvée : une fois…
covenantL'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 viennent apres.
contract_engineLe module qui tient les accords entre plusieurs parties : ce qui est du, quand, combien, l'argent retenu jusqu'a livraison, et quoi faire en cas de desaccord.
consentementDire oui, ici, ce n'est pas cocher une case : c'est aller au bout de la suite d'etapes d'entree, et le systeme garde une empreinte qui prouve que cette personne a accepte ce texte-la, dans cette version-la.
fail-closeQuand l'outil ne peut pas faire le travail pour de vrai, il refuse et dit pourquoi, au lieu de repondre « c'est fait ».
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.
engagement (niveaux d'engagement citoyen)Quatre paliers de responsabilite choisis librement : plus on en prend, plus on peut poser de gestes qui touchent le collectif.
ce qui ENGAGE (regle fail-close)La liste courte des choses qui creent un droit ou une obligation — argent, vote, appartenance, accord, marque d'authenticite, transmission — et qui n'ont pas le droit de reussir sans etre ecrites pour de bon.
ACL du busUn filtre sur les messages internes : ceux qui peuvent bouger de l'argent, un vote ou la securite ne sont acceptes que d'un emetteur reconnu.
templeUne fiche de site ancien, mesurée puis rangée avec son rôle : il produit, il stocke, ou il transmet.
forgeL'atelier qui capte : c'est son volume des dernières vingt-quatre heures qui autorise, ou non, le système à émettre de la monnaie.
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.
ACTIF / PONT / PARTIEL_ENERGIE / LATENT / VIDECinq étiquettes qui disent, pour un site, ce qui est présent de chaque côté et à quel point les deux s'accordent.

Matière : PLANCHES-MATIERE-2-INSTITUTIONNEL-2026-10-03.json (sha256 5cc49a404485) — planche de matière « LE SYSTÈME POLITIQUE — ce qui est bâti, ce qui est clos, et où l'autorité a vraiment émigré (contre-mesure au commit 8addf1c94, 2026-10-03) ». 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.