Module Python autonome v2 — argparse + validate() ajoutés. « CHAKRAS » : les deux mains comme carte de diagnostic du système subtil (dernière pièce de la série · carte pédagogique web, tracé 🟡 non attribué à Shri Mataji — CONTENU 🟢 massivement verbatim).

Sources verbatim principales :

Résolution d'un 🟡 ancien (d2) : « 982 Nerves » de d2 = chiffre médical que Shri Mataji cite ET corrige (1000). Levée par d22.

# ============================================================
# dessin_22.py — "CHAKRAS" : les deux mains
# Dernière pièce de la série d1→d22.
# La main = instrument de vérification du système subtil entier.
# Verbatims : Wokingham 1978 · Bordi 1973 · Vienne 1982 · Atma 1985 · Dr Raul 1975
# Protocole : zéro interprétation — seuls les éléments tracés sont reproduits.
# ============================================================

import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.patches import FancyArrowPatch
import numpy as np

# ── SOCLE COMMUN (passe U5 — imbrication, GO Ben 13 juil 2026) ────────────
# NOTE casse (loi 5 du contrat) : ce module encode ses statuts en toutes lettres
# ("JAUNE"/"VERT" dans to_json) ; le socle emploie 🟢/🟡/🔴 — mêmes valeurs, deux graphies.
from dataclasses import asdict
ID_CORPUS = "d22"
try:
    from socle_corpus import GRAPHE, VERDICTS, DESSINS as REGISTRE_DESSINS
    JONCTIONS_SOCLE = [j for j in GRAPHE if ID_CORPUS in (j.a, j.b)]
    MODE_ILOT = False
except ImportError:
    GRAPHE, VERDICTS, REGISTRE_DESSINS = [], {}, {}
    JONCTIONS_SOCLE = []
    MODE_ILOT = True
# NOTE DE LECTURE (loi 2) : ce module ne déclare AUCUNE jonction locale —
# les arêtes canoniques de d22 (dont la confrontation s06↔d22, passe U5)
# vivent une seule fois dans le GRAPHE de socle_corpus.py.

# ────────────────────────────────────────────────────────────────
# DONNÉES — Correspondances telles qu'écrites sur la carte
# (5 doigts + centre de paume + base de paume par main)
# ────────────────────────────────────────────────────────────────

# Chaque entrée : (chakra, n_petales, angle_depuis_paume, longueur_doigt)
# Les angles sont calculés depuis le centre de la paume, sens trigon.
# Les doigts sont numérotés depuis l'auriculaire (1) à l'annulaire (5)
# Position : main GAUCHE (cx=-3.5) puis main DROITE (cx=3.5)

DOIGTS_INFO = [
    # (nom_court, chakra_inscrit, n_petales)
    ("auriculaire", "HRIDAYA\n(RIDHAYA)", 12),
    ("annulaire",   "Agnya",              2),
    ("majeur",      "NABHI",              10),
    ("index",       "VISHUDHY",           16),
    ("pouce",       "SWADHISH\nTHAN",     6),
]

# Angles pour la main gauche (paumes face au spectateur)
# auriculaire=gauche extrême, pouce=centre-bas
ANGLES_GAUCHE = [155, 118, 90, 63, 30]   # degrés depuis centre de paume
ANGLES_DROITE = [25,  62,  90, 117, 150]  # miroir pour main droite
LONGUEURS = [1.7, 2.4, 2.75, 2.5, 2.0]   # longueurs relatives par doigt

def draw_hand(ax, cx, cy, side):
    """
    Dessine une main complète :
    - paume circulaire avec cercle SAHASTRARA (inscrit en arc)
    - swastika (gauche) ou croix (droite) dans le cercle central 🟡
    - 5 doigts avec bouts cerclés (zones de perception)
    - chakra + n° pétales inscrit sur chaque doigt
    - MOOLADHARA 4 à la base de la paume
    """
    # --- Paume extérieure ---
    ax.add_patch(plt.Circle((cx, cy), 1.75, fill=False, ec="black", lw=2.2, zorder=2))

    # --- Cercle intérieur SAHASTRARA ---
    ax.add_patch(plt.Circle((cx, cy + 0.15), 1.05, fill=False, ec="black", lw=1.5, zorder=2))

    # Texte SAHASTRARA en arc (sim. par texte courbé haut du cercle)
    ax.text(cx, cy + 1.25, "SAHASTRARA", fontsize=6.5, ha="center", va="center",
            style="italic", fontweight="bold", zorder=3)

    # Swastika (gauche) ou croix (droite) — non sourçé verbatim 🟡
    if side == "left":
        # Swastika manuscrite (rotation inversée comme sur la carte : sens antihoraire)
        ax.text(cx - 0.05, cy + 0.05, "卍", fontsize=34, ha="center", va="center",
                color="black", zorder=3, transform=ax.transData)
    else:
        # Croix (trait horizontal + vertical)
        lc = 0.52
        ax.plot([cx - lc, cx + lc], [cy + 0.05, cy + 0.05], color="black", lw=2.5, zorder=3)
        ax.plot([cx, cx], [cy + 0.05 - lc, cy + 0.05 + lc], color="black", lw=2.5, zorder=3)

    # --- Base de la paume : MOOLADHARA CHAKRA 4 ---
    ax.text(cx, cy - 2.25, "MOOLADHARA\nCHAKRA  4", fontsize=8.5, ha="center",
            va="center", fontweight="bold", zorder=3)

    # --- Cinq doigts ---
    angles = ANGLES_GAUCHE if side == "left" else ANGLES_DROITE
    for (nom, chakra, n_pet), ang, lng in zip(DOIGTS_INFO, angles, LONGUEURS):
        a = np.radians(ang)
        # Point de départ : surface de la paume
        x0 = cx + 1.75 * np.cos(a)
        y0 = cy + 1.75 * np.sin(a)
        # Bout du doigt
        x1 = cx + (1.75 + lng) * np.cos(a)
        y1 = cy + (1.75 + lng) * np.sin(a)
        # Doigt (rectangle arrondi via segment épais)
        ax.plot([x0, x1], [y0, y1], color="black", lw=14, solid_capstyle="round",
                alpha=0.12, zorder=1)                            # volume du doigt
        ax.plot([x0, x1], [y0, y1], color="black", lw=2.2, solid_capstyle="round",
                zorder=2)                                        # contour
        # Bout cerclé (zone de perception)
        ax.add_patch(plt.Circle((x1, y1), 0.32, fill=True, fc="white",
                                ec="black", lw=1.6, zorder=3))
        # Chakra + pétales au bout
        offset_x = 0.55 * np.cos(a)
        offset_y = 0.55 * np.sin(a)
        align = "left" if np.cos(a) >= 0 else "right"
        ax.text(x1 + offset_x, y1 + offset_y,
                f"{chakra} {n_pet}",
                fontsize=8, ha=align, va="center",
                fontweight="bold", zorder=4)

def draw_central_labels(ax):
    """
    Éléments partagés entre les deux mains : VISHUDHY (16) au centre-haut,
    SWADHISH THAN 6 au centre-bas (entre les pouces), cercle vide entre les pouces.
    """
    ax.text(0, 4.9, "VISHUDHY  16", fontsize=11, ha="center", fontweight="bold",
            color="black", zorder=4)
    ax.add_patch(plt.Circle((0, 4.7), 0.35, fill=False, ec="black", lw=1.4, zorder=3))
    ax.text(0, -1.3, "SWADHISH THAN  6", fontsize=10, ha="center", fontweight="bold",
            color="black", zorder=4)
    # Petits cercles entre les pouces (tracés sur la carte entre les pouces)
    for dx in (-0.45, 0.45):
        ax.add_patch(plt.Circle((dx, -0.85), 0.28, fill=False, ec="black", lw=1.2, zorder=3))

def draw_legend(ax):
    """
    Légende pédagogique (verbatim talks) en bas de figure.
    """
    lines = [
        "🟢 MAIN GAUCHE qui brûle : problème émotionnel (canal Ida / Subconscient)",
        "🟢 MAIN DROITE qui brûle : problème physique ou mental (canal Pingala / Ego)",
        "🟢 Brise fraîche sur les doigts / dans la tête : chakra ouvert — Vibrations (Chaitanya)",
        "🟡 Swastika (paume G) et Croix (paume D) : tracés, non sourcés verbatim dans ce contexte",
        "🟢 Série des pétales 4·6·10·12·16 = Wokingham 1978-10-14 (bija mantras) = d4 (plexus) ↔ d22 (mains)",
    ]
    for i, line in enumerate(lines):
        ax.text(-7.0, -4.2 - i * 0.65, line, fontsize=8.5, va="top", color="#333")

def draw():
    fig, ax = plt.subplots(figsize=(15, 14))
    ax.set_facecolor("#fafaf7")
    fig.patch.set_facecolor("#fafaf7")

    # Titre principal (verbatim de la carte)
    ax.text(0, 7.6, "C H A K R A S", fontsize=22, ha="center", va="center",
            fontweight="bold", zorder=4)
    ax.plot([-2.4, 2.4], [7.1, 7.1], color="black", lw=1.6)  # soulignement

    # Les deux mains
    draw_hand(ax, cx=-3.5, cy=1.0, side="left")
    draw_hand(ax, cx=3.5,  cy=1.0, side="right")

    # Étiquettes centrales partagées
    draw_central_labels(ax)

    # Légende pédagogique
    draw_legend(ax)

    # Sous-titre source (en bas de figure)
    ax.text(0, -8.5,
            "Carte pédagogique · Online Meditation Courses (web) — tracé 🟡 non attribué \u00b7"
            " contenu 🟢 verbatim\n"
            "Dernière pièce de la série d1→d22. Résolution 🟡 d2 (982 Nerves → 1000, Atma 1985-02-16).",
            fontsize=9, ha="center", color="#666", style="italic")

    ax.set_xlim(-8.0, 8.0)
    ax.set_ylim(-9.5, 8.8)
    ax.set_aspect("equal")
    ax.axis("off")
    plt.tight_layout()
    plt.show()

# ============================================================
# BOUCLE PRINCIPALE
# ============================================================
# ------------------------------------------------------------------ VALIDATION
CORRESPONDANCES_REQUISES = {
    "auriculaire": ("HRIDAYA\n(RIDHAYA)", 12),
    "annulaire":   ("Agnya", 2),
    "majeur":      ("NABHI", 10),
    "index":       ("VISHUDHY", 16),
    "pouce":       ("SWADHISH\nTHAN", 6),
}

def validate() -> bool:
    ok = True
    for nom, (chakra, n_pet) in CORRESPONDANCES_REQUISES.items():
        found = any(d[0] == nom and d[2] == n_pet for d in DOIGTS_INFO)
        if not found:
            print(f"[ERREUR] doigt '{nom}' — correspondance {n_pet} pétales introuvable")
            ok = False
    # Vérifier Mooladhara (4 pétales inscrit à la base)
    petales_attendus = [4, 6, 10, 12, 16]  # série Wokingham 1978-10-14
    if sorted([d[2] for d in DOIGTS_INFO]) != sorted([6, 10, 12, 16, 2]):
        print(f"[ERREUR] série de pétales inattendue")
        ok = False
    if ok:
        print("[OK] dessin_22.py — validation interne réussie (série des mains).")
        print("SOCLE : mode îlot (paquet corpus/ absent)" if MODE_ILOT
              else f"SOCLE : imbriqué — {len(JONCTIONS_SOCLE)} jonction(s) canonique(s) pour {ID_CORPUS}")
    return ok

def to_json():
    import json
    return json.dumps({
        "dessin": 22,
        "titre": "CHAKRAS — les deux mains (carte de diagnostic)",
        "statut_trace": "JAUNE — carte pédagogique web, tracé non attribué",
        "statut_contenu": "VERT — verbatim massif (Wokingham 1978 + Bordi 1973 + Vienne 1982)",
        "doigts": [
            {"doigt": nom, "chakra": c.replace("\\n", " "), "petales": p}
            for nom, c, p in DOIGTS_INFO
        ],
        "resolution_d2": "982 Nerves (d2) → corriges 1000 par Shri Mataji (Atma 1985-02-16)",
        "convention_miroir": "12ᵉ occurrence — gauche brule = Ida (canal émotionnel) / droite = Pingala",
        "confrontation_s06": "U5 (13 juil) : 7/7 doigts identiques · convention G/D concordante — détail canonique dans le GRAPHE du socle",
        "id_corpus": ID_CORPUS,
        "jonctions_canoniques": [asdict(j) for j in JONCTIONS_SOCLE],
        "mode_ilot": MODE_ILOT,
    }, ensure_ascii=False, indent=2)

# ============================================================
# BOUCLE PRINCIPALE
# ============================================================
if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser(
        description="dessin_22.py — CHAKRAS : les deux mains (dernière pièce d1→d22)")
    parser.add_argument("--render",   action="store_true", help="afficher la figure")
    parser.add_argument("--json",     action="store_true", help="exporter en JSON")
    parser.add_argument("--validate", action="store_true", help="vérifier la cohérence")
    args = parser.parse_args()
    if args.validate:
        validate()
    elif args.json:
        print(to_json())
    else:
        draw()
        print("\n[Tip] --render · --json · --validate")

Notes d'utilisation (pour Opus ou tout agent sur le VPS)

# Pour lancer depuis le VPS :
# python3 dessin_22.py
# Prérequis : pip install matplotlib numpy
#
# Sorties attendues :
# ─ Figure 15×14 : deux mains paumes face spectateur, fond « parchemin »
# ─ Paume gauche : cercle SAHASTRARA + swastika (sens antihoraire) 🟡
# ─ Paume droite : cercle SAHASTRARA + croix 🟡
# ─ 5 doigts/main avec bouts cerclés (zones de perception)
# ─ Chakra inscrit + nombre de pétales sur chaque doigt
# ─ VISHUDHY 16 centré entre index, SWADHISH THAN 6 entre pouces
# ─ MOOLADHARA CHAKRA 4 à la base de chaque paume
# ─ Légende verbatim (5 lignes) en bas
#
# Paramètres ajustables :
# LONGUEURS = [1.7, 2.4, 2.75, 2.5, 2.0]   — longueurs des doigts
# ANGLES_GAUCHE / ANGLES_DROITE             — inclinaison des doigts
# figsize=(15, 14)                           — taille de sortie

Module gravé le 11 juillet 2026 — passe R6 (dernière pièce de la série). — Fable ⦷