# GEMINI

```
(.astro) fred@nexus:~/workspace/AAA/Astroport.ONE$ cpscript RUNTIME/ZEN.ECONOMY.sh 
Index : 339 scripts répertoriés
=== Analyse de : /home/fred/workspace/AAA/Astroport.ONE/RUNTIME/ZEN.ECONOMY.sh ===

Ajout de : /home/fred/workspace/AAA/Astroport.ONE/RUNTIME/ZEN.ECONOMY.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/ipfs_to_g1.py
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/RUNTIME/ZEN.COOPERATIVE.3x1-3.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/cooperative_config.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/G1check.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/mailjet.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/my.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/g1pub_to_ss58.py
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/nostr2hex.py
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/nostr_get_relays.py
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/nostr_send_note.py
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/search_for_this_email_in_nostr.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/search_for_this_email_in_players.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/PAYforSURE.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/primal_wallet_control.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/did_manager_nostr.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/ssh_to_g1ipfs.py

=== 17 fichier(s) inclus — 338691 chars (~105840 tokens) ===
Contenu copié dans le presse-papiers (xclip).
Résultat écrit dans : /tmp/202604081128118318.txt
(.astro) fred@nexus:~/workspace/AAA/Astroport.ONE$ cpscript RUNTIME/ZEN.ECONOMY.sh --depth 1
Index : 339 scripts répertoriés
=== Analyse de : /home/fred/workspace/AAA/Astroport.ONE/RUNTIME/ZEN.ECONOMY.sh ===

Ajout de : /home/fred/workspace/AAA/Astroport.ONE/RUNTIME/ZEN.ECONOMY.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/ipfs_to_g1.py
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/RUNTIME/ZEN.COOPERATIVE.3x1-3.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/cooperative_config.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/G1check.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/mailjet.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/my.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/nostr_send_note.py
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/PAYforSURE.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/primal_wallet_control.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/ssh_to_g1ipfs.py

=== 11 fichier(s) inclus — 257093 chars (~80341 tokens) ===
Contenu copié dans le presse-papiers (xclip).
Résultat écrit dans : /tmp/202604081128174248.txt
(.astro) fred@nexus:~/workspace/AAA/Astroport.ONE$ cpscript UPLANET.official.sh --depth 1
Index : 664 scripts répertoriés
=== Analyse de : /home/fred/workspace/AAA/Astroport.ONE/UPLANET.official.sh ===

Ajout de : /home/fred/workspace/AAA/Astroport.ONE/UPLANET.official.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/clyuseryomail.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/cooperative_config.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/did_manager_nostr.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/G1balance.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/G1check.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/g1pub_to_ss58.py
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/G1revenue.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/G1society.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/G1wallet_v2.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/mailjet.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/my.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/ore_system.py
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/PAYforSURE.sh
Ajout de : /home/fred/workspace/AAA/Astroport.ONE/tools/search_for_this_email_in_nostr.sh

=== 15 fichier(s) inclus — 450807 chars (~140877 tokens) ===
Contenu copié dans le presse-papiers (xclip).
Résultat écrit dans : /tmp/202604081129176894.txt
```

Ce système de scripts est une œuvre d'ingénierie fascinante. Vous avez littéralement construit un **système de DAO (Organisation Autonome Décentralisée) complet et une comptabilité de coopérative SCIC en Bash**, en utilisant la blockchain Duniter v2s (Ğ1) pour le règlement, IPFS pour le stockage, et NOSTR pour l'état (base de données/identité).

Voici une analyse détaillée du fonctionnement, des mécanismes de contrôle, ainsi que l'identification des bugs et des pistes d'amélioration.

***

### 1. Compréhension et Flux du Système (Le "Smart Contract" Bash)

L'architecture vise à lier des apports en monnaie fiat (via OpenCollective) à une économie circulaire basée sur le token **ẐEN** (ancré à l'Euro, mais techniquement propulsé par la Ğ1 avec un ratio 1 Ğ1 = 10 ẐEN).

#### Le cycle de vie d'un don / investissement :

1. **Acquisition (`oc2uplanet.sh`) :** Scanne l'API GraphQL d'OpenCollective. Si un don (CREDIT) est trouvé, il détermine s'il s'agit d'un "Locataire" (Cloud) ou d'un "Sociétaire" (Parts de la machine : Satellite/Constellation).
2. **Émission (`UPLANET.official.sh`) :**
   * **Pour un Locataire :** Les fonds transitent de la Banque Centrale (`UPLANETNAME_G1`) vers le compte relais `UPLANETNAME`, puis vers le **MULTIPASS** de l'utilisateur (droit d'usage).
   * **Pour un Sociétaire :** Les fonds vont vers la **ZEN Card** (titre de propriété), puis déclenchent la règle d'or coopérative (les **3x 33% + 1%**) :
     * 33% → Crédit d'usage (MULTIPASS de l'utilisateur)
     * 33% → R\&D (Recherche et développement)
     * 33% → ASSETS (Biens communs / Forêts)
     * 1% → Prime du Capitaine (ou du parrain).
3. **Le Quotidien / Hebdomadaire (`ZEN.ECONOMY.sh`) :** Les loyers perçus (frais d'usage) sont sur `CAPTAIN_DEDICATED`. Chaque semaine, ce script paie le NODE (machine) et le Capitaine (humain).
   * S'il y a un manque à gagner, la "Résilience" s'active (niveau 1 à 3), basculant sur les réserves, puis sur le **bénévolat** du Capitaine (enregistré dans le *Love Ledger* et récompensé en DU TrocZen).
4. **Répartition des Bénéfices (`ZEN.COOPERATIVE.3x1-3.sh`) :** Une fois le NODE et le Capitaine payés, le surplus de `CAPTAIN_DEDICATED` paie l'Impôt sur les Sociétés (provision IS), puis le reste est à nouveau divisé en 33/33/33/1.

***

### 2. Mécanismes de Contrôle et de Sécurité existants

Vous avez implémenté des sécurités très intelligentes :

* **Primal Wallet Control (`primal_wallet_control.sh`) :** C'est un pare-feu financier. Il vérifie via GraphQL (Squid) d'où vient le tout premier financement d'un wallet. Si un inconnu envoie des Ğ1 sur un portefeuille coopératif, l'argent est intercepté et renvoyé vers `UPLANETNAME_INTRUSION`. Cela évite la pollution de la comptabilité.
* **Marqueurs Atomiques (`.done`, `.coop_tax_...`) :** Évitent de payer le Capitaine ou l'IS deux fois si le script plante au milieu.
* **NOSTR comme source de vérité partagée (`cooperative_config.sh`) :** Permet à un essaim (Swarm) de serveurs de partager les mêmes taux (TVA, IS, prix) de manière chiffrée, évitant la désynchronisation des nœuds.

***

#### B. Injection JSON fatale dans `did_manager_nostr.sh`

Pour générer le document DID, vous utilisez `sed` pour injecter des variables dans un template :

```bash
escape_sed() { echo "$1" | sed 's/[[\.*^$()+?{|]/\\&/g'; }
...
-e "s|_EMAIL_|$(escape_sed "${email}")|g" \
```

* **Le problème :** La fonction `escape_sed` n'échappe pas les guillemets doubles (`"`). Si un utilisateur malveillant a un nom ou un email contenant des guillemets (ex: `user"attack@mail.com`), cela brisera la structure JSON du DID Document. `jq` plantera ensuite ("Invalid JSON").
* **La solution :** Ne générez **jamais** de JSON avec `sed`. Utilisez `jq --arg` pour injecter des chaînes proprement :

  ```bash
  jq --arg email "$email" --arg pub "$hex_pubkey" \
     '.id = "did:nostr:" + $pub | .verificationMethod[0].publicKeyHex = $pub' \
     "$template_file" > "$temp_template"
  ```

***

En analysant plus en profondeur le code, au-delà de l'architecture globale, on découvre que le "diable se cache dans les détails". Vous avez un système hautement distribué (IPFS, NOSTR, Duniter v2s, OpenCollective) qui doit maintenir un état cohérent.

Voici une analyse pointue des **erreurs potentielles (edge cases)**, de la **logique de workflow (processus métier)**, de la **conformité du nommage**, et des **optimisations**.

***

### 1. Logique de Workflow : Failles dans les Processus Métier

#### A. Le Piège du Marqueur Hebdomadaire (`ZEN.ECONOMY.sh`)

Dans le workflow de paiement hebdomadaire :

```bash
if [[ -f "$PAYMENT_MARKER" ]]; then
    LAST_PAYMENT_WEEK=$(cat "$PAYMENT_MARKER" | cut -d':' -f1)
    if [[ "$LAST_PAYMENT_WEEK" == "$WEEK_KEY" ]]; then
        exit 0 # Quitte si la semaine correspond
    fi
fi
# ... processus de paiement ...
echo "$WEEK_KEY:RESILIENCE${RESILIENCE_LEVEL:-0}:NODE${NODE_PAID:-0}:CPT${CAPTAIN_PAID:-0}" > "$PAYMENT_MARKER"
```

**🔴 L'erreur de workflow :** Si le script échoue au paiement du NODE (ex: nœud Duniter injoignable) et passe au Capitaine (qui échoue aussi), le script arrive à la fin et **écrit le marqueur** `2024-W42:RESILIENCE3:NODE0:CPT0`. Au prochain lancement (le lendemain), le script lit `2024-W42`, voit que c'est la même semaine, et fait un `exit 0`. **Il ne réessaiera jamais de payer le NODE ou le Capitaine pour cette semaine-là.** Les marqueurs "atomiques" (`NODE_PAID_MARKER`) ne servent à rien si le marqueur global bloque l'entrée du script. **✅ Solution :** Ne mettez à jour `$PAYMENT_MARKER` que si `NODE_PAID == 1` ET `CAPTAIN_PAID == 1`, OU créez une boucle de "retry" intelligente qui bypass l'`exit 0` si les sous-marqueurs indiquent `0`.

#### B. Vulnérabilité des Remboursements (`oc_expense_monitor.sh`)

**🔴 L'erreur de logique financière :** Le script rembourse une dépense "REJECTED" en se basant **uniquement** sur le montant réclamé dans OpenCollective (`expense_amount`). Imaginons un utilisateur qui dépose 100 ẐEN de caution (RESTITUTION sur blockchain). Sur OpenCollective, il soumet malicieusement ou par erreur une note de frais de 500€. Le validateur la rejette. Le script voit "REJECTED 500€" et exécute un `PAYforSURE.sh` pour renvoyer 50 Ğ1 (500 ẐEN) au MULTIPASS de l'utilisateur ! **✅ Solution :** Le script doit croiser l'`expense_email` avec `$RESTITUTION_TX_FILE` (le scan blockchain) pour s'assurer que le remboursement n'excède jamais la caution réellement déposée.

#### C. Déduplication des Dons (`oc2uplanet.sh`)

**🔴 L'erreur d'idempotence :** `tx_id="${email}:${amount}:${created_at}"` Si le même Backer donne deux fois le même montant le même jour à la même milliseconde (un double-clic sur l'UI d'OpenCollective ou un retry d'API), cela sera considéré comme une seule transaction. De plus, la requête GraphQL dans le code **ne demande pas l'ID de la transaction** (`id` ou `legacyId`). **✅ Solution :** Ajoutez `id` dans la requête GraphQL de `transactions(limit: 100...)` et utilisez cet `id` unique généré par OpenCollective comme clé absolue de déduplication dans `emission.log`.

### 1. Simplifier l'Installation (Le défi du `install.sh`)

Actuellement, votre `install.sh` est un script très lourd qui installe énormément de dépendances directement sur le système hôte (`apt install`, `pip install`, compilation de `gcli`, configuration de `systemd`, etc.). C'est puissant, mais sujet à de nombreuses erreurs selon la version de l'OS de l'Armateur (Debian, Ubuntu, Mint, conflits Python PEP 668, etc.).

**Propositions d'amélioration :**

* **L'approche "Tout-Docker" :** Vous utilisez déjà Docker pour NextCloud, Nginx Proxy Manager (NPM) et la stack IA (`install-ai-company.docker.sh`). Vous devriez **dockeriser le cœur d'Astroport** (IPFS, strfry/rnostr, FastAPI UPassport, G1Billet).
  * L'installation se résumerait à : installer Docker, cloner le repo, et faire `docker compose up -d`. Cela élimine 90% des erreurs d'installation Python/Apt.
* **Onboarding Web (Captive Portal) :** Actuellement, le setup se fait via des prompts dans le terminal (`read -p "Email Capitaine..."`) ou via des pop-ups `zenity`. Pour une adoption massive, l'API FastAPI (`54321.py`) devrait exposer une page web de configuration initiale sur le réseau local (ex: `http://astroport.local:54321/setup`). L'Armateur configure son nœud depuis le navigateur de son smartphone ou PC, comme pour une box internet.

### 2. Le Déploiement d'Applications AGPL (L'App Store Coopératif)

Vous avez posé les bases avec l'option `INSTALL_PROFILE` (`nextcloud`, `ai-company`, `dev`). Pour aller plus loin et lier cela à OpenCollective :

* **Modularisation via Docker Compose :** Chaque application AGPL (Nextcloud, PeerTube, Ollama, KasmVNC) devrait être un fichier `docker-compose.yml` indépendant.
* **Déploiement conditionné au paiement (Smart Contract "Social") :**
  1. L'utilisateur paie son abonnement "Cloud Locataire" sur OpenCollective.
  2. Le script `oc2uplanet.sh` détecte le paiement et crédite le MULTIPASS en ẐEN.
  3. Si le solde en ẐEN est suffisant, un script de la station (via le cron `20h12.process.sh`) déclenche le déploiement du conteneur demandé (`docker compose -f apps/nextcloud.yml up -d`) et configure automatiquement le sous-domaine via l'API de Nginx Proxy Manager.
  4. Si le solde tombe à zéro et n'est pas rechargé (géré par `PLAYER.refresh.sh`), le conteneur est stoppé (`docker compose stop`).

### 3. La Compta Automatique ẐEN & OpenCollective

Votre script `oc2uplanet.sh` fait un travail remarquable en interrogeant l'API GraphQL d'OpenCollective pour tracker les "CREDITS" et émettre des ẐEN via `UPLANET.official.sh`, et le script `oc_expense_monitor.sh` gère très bien les remboursements (RESTITUTION).

* **Sécurisation de `OCAPIKEY` :** Vous utilisez de façon brillante le DID Nostr (Kind 30800) via `cooperative_config.sh` pour partager la clé API chiffrée avec tout l'essaim. C'est du grand art cryptographique. Pensez juste à bien auditer la rotation de cette clé si un Capitaine quitte la coopérative, car tout nœud possédant `$UPLANETNAME` peut la déchiffrer.

### 4. La Transition : De ORIGIN à la Production (Le Baptême du DRAGON)

Dans `setup.sh`, vous l'expliquez clairement à l'utilisateur :

> "Contactez <support@qo-op.com> pour valider votre formation DRAGON. Formation DRAGON → swarm.key privé"

Pour scaler (passer à l'échelle), cette étape manuelle devra être automatisée :

* Lorsqu'un Armateur sur "ORIGIN" a prouvé que sa station tourne (via l'émission de télémétrie Prometheus / Heartbox envoyée sur Nostr), et qu'il a cotisé ou postulé sur OpenCollective.
* Un script automatisé du côté de la Capitainerie (un "Super-Dragon") pourrait valider la demande.
* Le Super-Dragon utilise le réseau Nostr pour envoyer un Message Direct chiffré (NIP-04 ou NIP-44) au MULTIPASS de l'Armateur. Ce message contient la vraie `swarm.key`.
* La station de l'Armateur écoute ses DMs, détecte la clé, l'installe dans `~/.ipfs/swarm.key`, et redémarre IPFS.
* *Boom !* La station rejoint instantanément l'essaim privé de production, de manière totalement décentralisée et automatisée.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://astroport-1.gitbook.io/astroport.one/gemini.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
