00.01 — Cartographie de l’écosystème#

L’écosystème Ocarina est constitué de six dépôts publics sur le compte GitHub mojo-molotov. Ils s’organisent en cinq rôles distincts qui se composent :

RôleDépôtForme
FrameworkocarinaBibliothèque Python publiée sur PyPI
Application sous test (SUT) publiqueigoristanSPA React + Vike déployée sur GitHub Pages
Backend de coordinationtests-workersAPI Vercel Edge + Upstash Redis
Suite d’exemplesocarina-example (canonique), ocarina-with-ai-example (IA)Projets Python e2e tournés vers l’Igoristan / CURA
Documentation publiqueocarina-holy-bookSite VitePress FR + EN, PDF, skills IA

Schéma d’ensemble (big picture)#

┌─────────────────────────────────────────────────────────────────────────────────┐
│                              OCARINA (BIG PICTURE)                              │
└─────────────────────────────────────────────────────────────────────────────────┘

   ┌──────────────────────────────┐         ┌──────────────────────────────────┐
   │  [PACKAGE]  ocarina          │ ──────► │  [PACKAGE]  ocarina-example      │
   │  Framework Python 3.14+      │   pip   │  Suite e2e contre l'Igoristan    │
   │  ROP / DSL / orchestration   │ install │  (Selenium + Firefox + Redis)    │
   └──────────────────────────────┘         └──────────────────────────────────┘
            │  │                                       │  ▲   │
            │  │                                       │  │  utilise
            │  │ pip install ocarina                   │  │  IGOR_API_KEY
            │  ▼                                       ▼  │   │
            │  ┌────────────────────────────────────┐  pilote │
            │  │ [PACKAGE]  ocarina-with-ai-example │  ┌──────┴──────────────────┐
            │  │ Suite e2e CURA Healthcare          │  │ [WEBSITE]  igoristan    │
            │  │ Claude Code, 99% machine           │  │ React 19 + Vike         │
            │  └────────────────────────────────────┘  │ GitHub Pages            │
            │              │                           └──────┬──────────────────┘
            │              │ pilote                           │ fetch OTP
            │              ▼                                  ▼
            │   ┌──────────────────────────────┐    ┌──────────────────────────────┐
            │   │ [WEBSITE]  CURA Healthcare   │    │ [BACKEND]  tests-workers     │
            │   │ Heroku, PHP open source      │    │ Vercel Edge Functions        │
            │   └──────────────────────────────┘    │ + Upstash Redis              │
            │                                       │ /api/otp, /otp-history,      │
            │                                       │ /api/corsicadex              │
            │                                       └──────────────────────────────┘
            │                                                 ▲
            │                                                 │ x-api-key
            │                                                 │ (IGOR_API_KEY ≡ API_SECRET)
            │                                                 │
            ▼
   ┌──────────────────────────────┐
   │  [DOCS]  ocarina-holy-book   │
   │  VitePress FR + EN + RU      │
   │  Skills IA, PDF, llms.txt    │
   │  GitHub Pages                │
   └──────────────────────────────┘
  1. ocarina → suites d’exemples : dépendance Python classique (pip install ocarina).
  2. Suites d’exemples → SUT (Igoristan / CURA) : pilotage navigateur via Selenium.
  3. Suite Igoristan ↔ tests-workers : appels HTTP (OTP, Corsicadex) ; le secret partagé IGOR_API_KEY (côté client) ≡ API_SECRET (côté serveur).

Responsabilités#

RôleContratBesoin
FrameworkDonner le DSL, l’orchestration, la pool de drivers, les reportersDoit être petit, auditable, sans dépendances cachées
SUT publicOffrir un terrain de jeu volontairement chaotique (random errors, OTP, formulaires capricieux)Hébergé en permanence sur GitHub Pages, sans backend lourd
Backend de coordinationCoordonner les workers sur l’OTP, fournir des données pour les tests parallèlesStateless côté code, l’état vit dans Redis (Upstash)
ExemplesDémontrer comment on utilise réellement Ocarina, à la fois sans IA (canonique) et avec IA (CURA)Doivent être publics, exécutables, complets, suivis en CI
DocumentationTransmettre le pourquoi, le comment, et l’usage IADoit exister en EN + FR + RU (tradition corso-russe), exposer des fichiers adaptés aux LLMs comme llms.txt, générer des PDF

Trois licences#

LicenceDépôts concernésPourquoi
MITocarina, ocarina-example, ocarina-with-ai-example, ocarina-holy-bookTout ce qui est code Python ou doc, transmissible « tel quel », souverain — voir ../11-independence/.
ISCtests-workersChoix par défaut du scaffold Vercel Edge, conservé.
(aucune licence)igoristanApplication démo publique, hébergée par l’auteur (à considérer comme WTFPL).

Points de friction volontaires entre dépôts#

Le design est volontairement asymétrique sur certains axes ; ces frictions sont des outils de test :

  • L’Igoristan a un useAuth faux : Math.random() < 0.9 peut faire échouer le login même avec le bon mot de passe, ce qui force la stratégie de rejeu côté Ocarina. Voir ../05-igoristan/03-use-auth.md
  • tests-workers ampute volontairement les millisecondes du timestamp OTP (.000Z) pour forcer la coordination avec du delta timing. Voir ../06-tests-workers/07-otp-coordination-flow.md
  • CURA Healthcare contient des gaps connus documentés dans IDENTIFIED_GAPS.md : les tests qui leur sont associés sont intentionnellement en échec dans cette version de la suite IA. Voir ../08-ai-example/05-security-gaps.md
  • Le compteur Math.random() < 0.3 côté donkey-sausage-eater-detector exerce match_page (branchement sur états aléatoires). Voir ../05-igoristan/02-routes.md
  • La page random-error de l’Igoristan exerce les transient_errors (retry d’Ocarina) en levant des erreurs aléatoires. La chaotic form balance des erreurs au hasard sans impacter directement les tests, pour exercer les watchers. Des temps de chargement aléatoires permettent enfin de vérifier les flots de test face aux race conditions.

Ces frictions volontaires sont la raison d’être du SUT : un site qui marche tout le temps ne sert à rien pour démontrer un framework de test résilient.