| CLI | Binaire | Rôle |
| **`ebin-cli`** | `130-ebin/04-app/src/bin/ebin-cli.rs` | **OFFICIEL** pour l'artefact `.ebin` composite (08-ebin) : CRUD strates + seal/unseal + `--layout`. LA définition canonique s'opère ICI. |
| **`middledao`** | binaire runtime de la forge `1000-dev-evo` (evoBin MOE) | runtime de la couche source (guardian, nash, opcodes, grilles MOE). Toujours réel — voir sections ci-dessous. |
middledao # Démarrer le daemon (guardian)
middledao status # Vérifier si actif → ✅ ou ⚪
middledao stop # Arrêter (SIGTERM → SIGKILL)
# Guardian
middledao status # Vérifier si actif → ✅ ou ⚪
# CRUD — lecture
middledao crud ls # Lire les missions (grille par défaut)
middledao crud ls path/to/grid.mdao # Lire les missions (grille spécifique)
# CRUD — align (lecture+écriture, non destructif)
middledao crud align path/to/file.mdao # Aligner un fichier sur 128B
# Inspect — visualiser arène
middledao inspect path/to/file.mdao
Sortie inspect :
📋 guardian.grid.mdao — 1024 slots (131072B)
│ 128 │ NOP │ 0x1000000000000001 │ REQUESTED │ v=0
│ 256 │ ADD │ 0x1000000000000002 │ IDLE │ v=1 │ 30
📊 2/1024 slots actifs
# NASH — observation
middledao nash ps # Voir processus
middledao nash logs # Voir logs
middledao nash inspect myapp # Inspecter grille
# Guardian
middledao stop # Arrêter (SIGTERM → SIGKILL)
# CRUD — écriture / suppression
middledao crud add NOP # Ajouter mission (grille par défaut)
middledao crud add ADD 100 200
middledao crud add TETRA 100 200 300 400
middledao crud add TSC
middledao crud add LINK 0x0003 100 200 300 400
middledao crud add --seg10 0x1000000000000001 NOP
middledao crud add path/to/grid.mdao ADD 10 20 # Ajouter sur grille spécifique
middledao crud rm 0x1000000000000001 # Supprimer par spatial_id (hex)
middledao crud chain path/to/grid.mdao "texte" # Chaîner des chambres
middledao crud reset path/to/grid.mdao 0 # Reset un slot
# NASH — exécution / cycle de vie
middledao nash exec myapp # Exécuter
middledao nash add myapp kvdb # Créer app depuis template
middledao nash up # Démarrer guardian (launchctl/systemd)
middledao nash down # Arrêter guardian
NOP, ADD, SUB, MUL, AND, OR, XOR, SHL, SHR, ROTL, ROTR, MASK, SELECT, TETRA, EQ, LT, REBASE, LINK, TSC, ITER, GLITCH, MUTATE, CRUD_ADD, GATEWAY, NASH
**La spec suit le composant, jamais l'inverse.** Un composant auto-porteur = un dossier qui contient son code, SA spec `.ebin-api` et SA config (format eBin). L'app hôte ne possède rien : elle scanne, valide et sert.
✅ FÉDÉRÉ ❌ CENTRALISÉ
components/<nom>/ 40-specs/
├── <nom>.rs (code ≤300l) ├── <nom>.ebin-api ← serveur
├── <nom>.ebin-api (SA spec) └── ... central
├── config (SA config, format eBin)
**Conséquences** : ① Déplaçable (migre avec sa spec/config, rien à réécrire) ② L'app ne change jamais (ajouter = déposer le dossier + 1 ligne dans la strate app) ③ Le groupe aussi est fédéré.
**Le contrat hôte (validate, pas own)** : au boot, charger chaque spec → REJET du démarrage si invalide (log `SPEC REJETÉE`, pattern spec-loader midpress) ; routing `/api/<comp>/<endpoint>` dérivé des specs ; découverte `GET /api` (arbre), `GET /api/<comp>` (spec) ; pas de copie des specs côté moteur.
**Répartition code ↔ données (3 règles)** : ① données d'abord (le param existe-t-il dans la config du composant ? effet immédiat, 0 build) ② sinon la spec (étendre, déclaratif, semver) ③ moteur en dernier recours (capacité manquante seulement, extension servant de futures données).
**eBin-cli-crud et le miniCli par composant (vision user 09-23)** : un composant (ex. sidebar midPress) porte son propre miniCli et se modifie par commande `ebin-cli-crud` ultra-simplement — le composant est manipulable sans toucher à son code. Le moteur générique vit dans la famille ebin (ce skill + ebin-crud) ; les spécialisations par app vivent dans leurs skills (midPress : `mdao-api-maker`, instance coldInference : `coldinference-serve-api`).
ebin-cli create-container <art.ebin> # conteneur 08-ebin (header EBIN)
ebin-cli create <pool.ebin> # pool headerless (rétrocompatible)
ebin-cli add <p> <id> "<texte>" # id hex 0x.. ou décimal
ebin-cli set <p> <id> "<texte>" # modifie SANS recompiler (définition canonique)
ebin-cli rm <p> <id>
ebin-cli ls <p> [--layout midpress] # lecture sémantique via descripteur
ebin-cli get <p> <id> [--layout midpress]
ebin-cli seal <src> <dst> # Zstd seul ; + EBIN_SEAL_KEY (hex 64 env) = ChaCha20-Poly1305
ebin-cli unseal <src> <dst> # auto-détection flags ; chiffré exige EBIN_SEAL_KEY
ebin-cli migrate <file> <old> <new> # déplacer un id (SEGx : nouvel_id = old<<6 si migration legacy) ; journal audit PAR LE MOTEUR
- Tout release eBin suit le CONTRAT : tag annoté = build = push AU MÊME commit (tag sans artefact = chaîne morte, leçon 404) + `05-addins/crateServer/releases.toml` versionné (tag/forge_sha/targets) + sha relu au disque avant tout dépôt réseau (leçon anti-self-report).
- Branche de release = `cratesgit` (bare forge `130-ebin.git`, main = production, HEAD bare doit suivre). Double-arch : `darwin-arm64` (Mac) + `linux-x86_64` (S2 natif, jamais QEMU) — URL `https://crate.middledao.com/crates/ebin-cli/<forge_sha>/<target>/binary`.
- Publication crate cargo : index sparse `crate.middledao.com` (fichier PAR PAQUET, chemin 2+2 lettres `ap/ic/apicrud`, `eb/in/ebin`), cksum = sha256 du `.crate` relu ×2, consommateur = dep hybride `apicrud = { version = "0.1.0", registry = "middledao", path = "../../120-api-crud" }` + config source locale `04-app/.cargo/config.toml` (`[source.middledao]`, JAMAIS replace-with global). Preuve du 11:45 : cargo fetch + build réels d'un consommateur jetable — cksums vérifiés PAR CARGO.
Pièges enregistrés : load mmap REFUSE un conteneur scellé (déchiffrer = réécrire clair, jamais pendant mmap) ; sans clé, `unseal` refuse honnêtement (règle 14 — pas de secret deviné) ; nonce 12b dans header reserved[32..44], flags à 12..16 (COMPRESSED=0x1, ENCRYPTED=0x2) ; descripteur de layout : `StrateLayout::from_name` refuse tout nom inconnu (presets `ebin` content@40 / `midpress` content@48) — la sémantique est DÉCLARÉE, jamais déduite ni convertie.
| Commande | Type MCP | Validation |
| `middledao status` | tool read-only | aucune |
| `middledao crud ls` | tool read-only | aucune |
| `middledao crud align` | tool read-only | aucune (non destructif) |
| `middledao inspect` | tool read-only | aucune |
| `middledao nash ps` | tool read-only | aucune |
| `middledao nash logs` | tool read-only | aucune |
| `middledao nash inspect` | tool read-only | aucune |
| `middledao stop` | tool mutateur | confirmation requise |
| `middledao crud add` | tool mutateur | confirmation requise |
| `middledao crud rm` | tool mutateur | confirmation requise |
| `middledao crud reset` | tool mutateur | confirmation requise |
| `middledao crud chain` | tool mutateur | confirmation requise |
| `middledao nash exec` | tool mutateur | confirmation requise |
| `middledao nash add` | tool mutateur | confirmation requise |
| `middledao nash up` | tool mutateur | confirmation requise |
| `middledao nash down` | tool mutateur | confirmation requise |
| opcodes (liste) | resource | lecture seule |