<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>References on Ocarina — précis</title>
    <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/series/references/</link>
    <description>Recent content in References on Ocarina — précis</description>
    <generator>Hugo</generator>
    <language>fr-FR</language>
    <lastBuildDate>Thu, 04 Jun 2026 21:25:43 +0200</lastBuildDate>
    <atom:link href="https://mojo-molotov.github.io/from-ocarina-to-igor/fr/series/references/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>99.01 — Glossaire</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/99-references/01-glossary/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/99-references/01-glossary/</guid>
      <description>&lt;h1 id=&#34;9901glossaire&#34;&gt;99.01 — Glossaire&lt;a class=&#34;anchor&#34; href=&#34;#9901glossaire&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;Terminologie utilisée dans l&amp;rsquo;écosystème Ocarina. Sources d&amp;rsquo;origine entre parenthèses.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;railway-oriented-programming-rop&#34;&gt;Railway Oriented Programming (ROP)&lt;a class=&#34;anchor&#34; href=&#34;#railway-oriented-programming-rop&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;ROP&lt;/strong&gt; (Wlaschin, F#)&lt;/td&gt;&#xA;          &lt;td&gt;Pattern fonctionnel : succès et échec sont deux &lt;em&gt;rails&lt;/em&gt; parallèles ; un échec bascule le calcul sur le rail d&amp;rsquo;échec, où il reste (court-circuit).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Result[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Union discriminée &lt;code&gt;Ok[T] | Fail&lt;/code&gt;. Erreur portée comme &lt;strong&gt;valeur&lt;/strong&gt;, pas comme exception levée.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Ok[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Wrapper de succès, &lt;code&gt;value: T&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Fail&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Wrapper d&amp;rsquo;échec, &lt;code&gt;error: Exception&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;is_ok&lt;/code&gt;, &lt;code&gt;is_fail&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;TypeGuard&lt;/code&gt; qui narrowent un &lt;code&gt;Result[T]&lt;/code&gt; vers &lt;code&gt;Ok[T]&lt;/code&gt; ou &lt;code&gt;Fail&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Action[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Thunk[Result[T]]&lt;/code&gt; — fonction sans argument qui rend un &lt;code&gt;Result[T]&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ActionStart[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;État initial du builder d&amp;rsquo;action ROP. Attend &lt;code&gt;.failure(...)&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ActionFailure[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Après &lt;code&gt;.failure(...)&lt;/code&gt;. Attend &lt;code&gt;.success(...)&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ActionSuccess[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Après &lt;code&gt;.success(...)&lt;/code&gt;. Attend &lt;code&gt;.execute()&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ActionChain[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Après &lt;code&gt;.execute()&lt;/code&gt;. Porte &lt;code&gt;has_failed: bool&lt;/code&gt; et &lt;code&gt;result: Result[T]&lt;/code&gt;. Permet &lt;code&gt;.then(...)&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;NeutralActionStart[T]&lt;/code&gt;, &lt;code&gt;NeutralActionFailure[T]&lt;/code&gt;, &lt;code&gt;NeutralActionSuccess[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;États &lt;em&gt;inertes&lt;/em&gt; du rail d&amp;rsquo;échec. Bouchonnent en ne faisant plus rien.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ChainRunner[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Encapsulation paresseuse d&amp;rsquo;un &lt;code&gt;ActionChain&lt;/code&gt;. Exécutée par &lt;code&gt;.run()&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;drive_page&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Alias sémantique opinionated pour &lt;code&gt;chain_actions&lt;/code&gt;. « &lt;em&gt;Prendre le contrôle d&amp;rsquo;une page&lt;/em&gt; ».&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;match_page&lt;/code&gt; / &lt;code&gt;when&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Branchement conditionnel. First-match wins.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;create_act&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Primitive de bas niveau pour créer &lt;code&gt;act&lt;/code&gt; (&lt;em&gt;pas de test&lt;/em&gt;). Wrappée par le projet utilisateur.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;act&lt;/code&gt;&lt;/strong&gt; (côté projet)&lt;/td&gt;&#xA;          &lt;td&gt;Wrapper utilisateur de &lt;code&gt;create_act&lt;/code&gt; avec hook &lt;code&gt;on_failure&lt;/code&gt; spécifique au projet. Permet de représenter un &lt;em&gt;pas de test&lt;/em&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;istqb-vocabulaire-professionnels-du-test&#34;&gt;ISTQB / vocabulaire professionnels du test&lt;a class=&#34;anchor&#34; href=&#34;#istqb-vocabulaire-professionnels-du-test&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;ISTQB&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;International Software Testing Qualifications Board. Organisme professionnel du test logiciel.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Test cycle&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Niveau le plus haut. Une exécution complète.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Test campaign&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Niveau sous le cycle. Non défini directement dans l&amp;rsquo;ISTQB mais reconnu dans le vocabulaire des testeurs de métier.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Test suite&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Niveau sous la campagne. Une collection de tests &lt;em&gt;exécutables&lt;/em&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Test case&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Un cas de test. Unité atomique.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Test step&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Un pas de test. Action atomique dans un test case.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Smoke test&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Vérification minimale qui prouve que le système est &lt;em&gt;en marche&lt;/em&gt;. Si échec, le reste est inutile.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Setup / Teardown&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Pré-condition / post-condition d&amp;rsquo;un test.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;ocarina-orchestration&#34;&gt;Ocarina (orchestration)&lt;a class=&#34;anchor&#34; href=&#34;#ocarina-orchestration&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Test[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Test ISTQB. Métadonnées + scenario factory + fragments + skip.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;TestSuite[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Suite ISTQB. Parallélisation (&lt;em&gt;thread pool&lt;/em&gt;), saturation, filtrage IDs, retries.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;TestCampaign[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Campagne. Séquence de suites avec config workers partagée.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;TestCycle[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Cycle ISTQB. Smoke (avec modes &lt;code&gt;fail-fast&lt;/code&gt; vs &lt;code&gt;wait-for-all&lt;/code&gt;) + main.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;TestExecutor[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Exécute une seule tentative d&amp;rsquo;un test. Stateless.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;TestFlow[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Boucle de rejeu (1+max_retries) avec backoff linéaire.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;TestRunner[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Sortie de &lt;code&gt;Test.spawn(driver, logger)&lt;/code&gt;. Agrégateur de chain_runners + setup + teardown + watchers.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Scenario[Driver]&lt;/code&gt;&lt;/strong&gt; (frozen dataclass)&lt;/td&gt;&#xA;          &lt;td&gt;Encapsule &lt;code&gt;test_chain&lt;/code&gt;, &lt;code&gt;setup&lt;/code&gt;, &lt;code&gt;teardown&lt;/code&gt;, &lt;code&gt;watchers&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;TestChain&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Sequence[ChainRunner[Any]]&lt;/code&gt;. La séquence à exécuter pour appliquer le test.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Watcher[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Daemon thread&lt;/em&gt; pour observer quelque chose en plus sur un test. Callback périodique.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Saturation&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Mécanisme de clonage aléatoire de tests pour atteindre &lt;code&gt;max_workers&lt;/code&gt;. Copies nommées &lt;code&gt;[COPY N] &amp;lt;name&amp;gt;&lt;/code&gt; (ou &lt;code&gt;[+N]&lt;/code&gt; selon convention).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Transient errors&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Tuple d&amp;rsquo;exceptions qui déclenchent un rejeu.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;max_retries_per_test&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Nombre de rejeux. Par défaut, 8 (« &lt;em&gt;9 vies comme un chat&lt;/em&gt; 🐱 »).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;autoscreen_on_fail&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Capture automatique de captures d&amp;rsquo;écran lors d&amp;rsquo;un pas de test en échec.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;ocarina-dsl-invariants&#34;&gt;Ocarina (DSL invariants)&lt;a class=&#34;anchor&#34; href=&#34;#ocarina-dsl-invariants&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;validate(value, name=&amp;quot;...&amp;quot;)&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Entry-point du DSL d&amp;rsquo;invariants.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ValidationStartBlock[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;État initial. Attend &lt;code&gt;.assert_that(...)&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ValidationAssertBlock[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Après &lt;code&gt;.assert_that(...)&lt;/code&gt;. Accepte &lt;code&gt;.assert_that&lt;/code&gt;, &lt;code&gt;.otherwise&lt;/code&gt;, &lt;code&gt;.then&lt;/code&gt;, &lt;code&gt;.execute&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;.assert_that(predicate)&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Ajoute un AND logique.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;.otherwise(predicate)&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Ajoute un OR logique. Combine via &lt;code&gt;_any_of&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;.then(new_value)&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Change la valeur en cours dans la chaîne. Conserve les erreurs accumulées.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;.execute()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Exécute la chaîne, retourne un &lt;code&gt;_ValidationResult&lt;/code&gt; (inerte tant qu&amp;rsquo;on n&amp;rsquo;appelle pas &lt;code&gt;.raise_if_invalid()&lt;/code&gt;).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;chain_validations(*)&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Merge plusieurs &lt;code&gt;ValidationAssertBlock&lt;/code&gt; en un seul.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;InvariantViolationError&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Exception levée par les prédicats.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;AggregateInvariantViolationError&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Agrégation de plusieurs &lt;code&gt;InvariantViolationError&lt;/code&gt;. Levée par &lt;code&gt;.raise_if_invalid()&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;DuplicatesError&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Sous-classe d&amp;rsquo;&lt;code&gt;InvariantViolationError&lt;/code&gt; levée par &lt;code&gt;has_unique_elements&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;BusinessInvariantValidator.create&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Factory pour invariants métier.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;FrameworkInvariantValidator.create&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Factory pour invariants framework.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;ocarina-infra--ports&#34;&gt;Ocarina (infra + ports)&lt;a class=&#34;anchor&#34; href=&#34;#ocarina-infra--ports&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;POMBase&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;ABC framework-agnostic. Méthodes &lt;code&gt;verify&lt;/code&gt; + &lt;code&gt;get_current_title&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;SeleniumTitleMixin&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Mixin Selenium-specific. Implémente &lt;code&gt;get_current_title&lt;/code&gt; et type &lt;code&gt;_driver: WebDriver&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;WebDriversPool[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Pool thread-safe de drivers. Sémaphore + Queue (&lt;em&gt;la QUEUE putain !&lt;/em&gt;) + warmup avec watchdog.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;WarmupTimeoutError&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Levée par &lt;code&gt;pool.warmup()&lt;/code&gt; quand ça coince.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;DriverBuilder[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Builder qui gère le profile tmp dir et produit &lt;code&gt;(driver, dispose)&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;BuiltWebDriver[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;tuple[Driver, Effect]&lt;/code&gt; — driver + dispose.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Screenshotter[TDriver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Utilitaire de capture thread-safe. Burst mode, healthcheck.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ScreenshotterConfig[TDriver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Config (frozen dataclass) : output_dir, file_ext, health_check, save_full_page, etc.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ActCounter&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Interface. Compte les &lt;code&gt;act&lt;/code&gt; appelés par tentative.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ThreadsBasedActCounter&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Implémentation thread-local d&amp;rsquo;&lt;code&gt;ActCounter&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ILogger&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Port (ABC) de logging. Méthodes : &lt;code&gt;debug&lt;/code&gt;, &lt;code&gt;info&lt;/code&gt;, &lt;code&gt;warning&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt;, &lt;code&gt;critical&lt;/code&gt;, &lt;code&gt;success&lt;/code&gt;, &lt;code&gt;test_name&lt;/code&gt;, &lt;code&gt;exception&lt;/code&gt;, &lt;code&gt;raw&lt;/code&gt;, &lt;code&gt;set_prefix&lt;/code&gt;, &lt;code&gt;set_domain_taxonomy&lt;/code&gt;, &lt;code&gt;cleanup&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;ITakeScreenshot[Driver]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Protocol &lt;code&gt;(driver, logger, category) -&amp;gt; None&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;PrintLogger&lt;/code&gt; / &lt;code&gt;FileLogger&lt;/code&gt; / &lt;code&gt;PrintAndFileLogger&lt;/code&gt; / &lt;code&gt;MutedLogger&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;4 implémentations canoniques d&amp;rsquo;&lt;code&gt;ILogger&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;driver_healthcheck(driver)&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Ping &lt;code&gt;driver.title&lt;/code&gt; ; lève &lt;code&gt;DriverDiedError&lt;/code&gt; si LE DRIVER EST DEAD.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;DriverDiedError&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Exception levée par &lt;code&gt;driver_healthcheck&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;PageVerificationError&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Exception levée par &lt;code&gt;POM.verify&lt;/code&gt; quand la page n&amp;rsquo;est pas la bonne.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;NoMatchingBranchError&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Exception levée par &lt;code&gt;match_page&lt;/code&gt; quand aucun &lt;code&gt;when&lt;/code&gt; ne match.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;ocarina-opinionated&#34;&gt;Ocarina (opinionated)&lt;a class=&#34;anchor&#34; href=&#34;#ocarina-opinionated&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;CliBuilder&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Builder déclaratif au-dessus d&amp;rsquo;argparse. Agrégation des erreurs.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;CliArg&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Déclaration d&amp;rsquo;un argument CLI.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;CliStore[TKeys]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Store write-once des valeurs CLI parsées. &lt;code&gt;TKeys: Literal[...]&lt;/code&gt; pour autocomplétion.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;_CliField[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Field write-once avec validator.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;phantom_validate&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;No-op validator pour les fields qui n&amp;rsquo;ont pas besoin de validation supplémentaire.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;CliStoreSingleton&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Singleton autour de &lt;code&gt;CliStore&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;create_selenium_auto_cli_store()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Factory qui dispatch par OS.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;bootstrap(test_cycle, run_plugins, post_exec)&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Point d&amp;rsquo;entrée canonique.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;run_plugins(*plugins, exceptions_logger)&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Exécute les plugins en parallèle si N&amp;gt;1.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;pretty_print_results&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Plugin d&amp;rsquo;affichage des résultats dans le terminal (ANSI).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;generate_docx_proof&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Plugin de créations de preuves de test au format DOCX.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;generate_json_results&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Plugin qui retranscrit les mêmes résultats que &lt;code&gt;pretty_print_results&lt;/code&gt;, mais au format JSON.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;timing&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Context manager qui mesure la durée.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;programmation-fonctionnelle&#34;&gt;Programmation fonctionnelle&lt;a class=&#34;anchor&#34; href=&#34;#programmation-fonctionnelle&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Effect&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Callable[[], None]&lt;/code&gt; — fonction sans argument ni retour, déférée.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Thunk[T]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Callable[[], T]&lt;/code&gt; — fonction sans argument, déférée.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Closure&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Fonction qui capture un environnement.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Fold&lt;/code&gt; / &lt;code&gt;reduce&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Réduction d&amp;rsquo;une séquence à une seule valeur (&lt;em&gt;catamorphisme&lt;/em&gt;).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;TypeGuard&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;PEP 647 — annotation qui &lt;em&gt;narrow&lt;/em&gt; un type côté &lt;em&gt;type checker&lt;/em&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Discriminated union&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Union de types disjoints, discriminée par un test (typiquement &lt;code&gt;isinstance&lt;/code&gt;).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Sealed union&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Discriminated union dont tous les variants sont &lt;code&gt;@final&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;@final&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;PEP 591 — annonce qu&amp;rsquo;une classe ne peut pas être sous-classée (pas de covariance infinie).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Self&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;PEP 673 — type de retour qui réfère à la classe instanciée (pas la classe déclarée).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;Protocol&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;PEP 544 — type structurel ; tout objet avec la bonne shape est utilisable.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;PEP 695&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Generics syntax &lt;code&gt;class Foo[T]:&lt;/code&gt; (Python 3.12+).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;vocabulaire-de-lauteur&#34;&gt;Vocabulaire de l&amp;rsquo;auteur&lt;a class=&#34;anchor&#34; href=&#34;#vocabulaire-de-lauteur&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Sens&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Slipologue&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Néologisme. Celui qui prétend « &lt;em&gt;tout savoir&lt;/em&gt; » sans pratique. Pollue les discussions techniques avec des &lt;em&gt;vues de l&amp;rsquo;esprit&lt;/em&gt;. Nous casse les couilles à utiliser ChatGPT ou Wikipédia pour toujours avoir réponse à tout en faisant comme s&amp;rsquo;il parlait d&amp;rsquo;un sujet qu&amp;rsquo;il maîtrise alors que non.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Vues de l&amp;rsquo;esprit&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Concept imaginaire ; vision théorique inapplicable.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Boîte blanche&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Code auditable, lisible, sans logique cachée. Opposé à &lt;em&gt;boîte noire&lt;/em&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Donnée brute&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Code source, fichiers, formats simples.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Astrologie de la programmation&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Patterns ésotériques sans bénéfice mesurable.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;In the Lulzboat, salute, bitch, and show some respect.&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Citation de &lt;strong&gt;YTCracker — &lt;code&gt;#antisec&lt;/code&gt;&lt;/strong&gt; (2011), hymne officiel de &lt;em&gt;l&amp;rsquo;Operation AntiSec&lt;/em&gt;. Voir &lt;a href=&#34;https://mojo-molotov.github.io/from-ocarina-to-igor/fr/12-manifesto-deciphered/01-sourced-citations/&#34;&gt;&lt;code&gt;../12-manifesto-deciphered/01-sourced-citations.md&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Putains de skids, putains de normies&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Marqueur identitaire IRC / EFnet.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;scène-hacker-chapitre-12&#34;&gt;Scène hacker (chapitre 12)&lt;a class=&#34;anchor&#34; href=&#34;#sc%c3%a8ne-hacker-chapitre-12&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;AntiSec movement (1999)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Mouvement opposé à l&amp;rsquo;industrie de la cybersécurité et à la &lt;em&gt;full disclosure&lt;/em&gt;. Refus de publier exploits / vulnérabilités. Cibles : SecurityFocus, Packet Storm, mailing list Bugtraq, etc.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Operation AntiSec (2011)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Résurrection du mouvement par LulzSec + Anonymous. 50 jours de hacks (mai-juin 2011).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;LulzSec&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Groupe d&amp;rsquo;hackers actif mai-juin 2011. &lt;em&gt;Splinter&lt;/em&gt; d&amp;rsquo;Anonymous. Manifeste « &lt;em&gt;we do it for the lulz&lt;/em&gt; ». Arrestations en 2012.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;The Lulzboat&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Métaphore identitaire de LulzSec. ASCII art de bateau pirate signant leurs communiqués.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Sabu&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Hector Monsegur, leader LulzSec, soulevé par le FBI en juin 2011.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Topiary&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Jake Davis, spokesperson LulzSec.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;YTCracker&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Bryce Case Jr. (né 1982). Rappeur &lt;em&gt;nerdcore&lt;/em&gt;, ancien black hat (NASA Goddard 1999), fondateur de &lt;em&gt;Digital Gangster&lt;/em&gt; (forum, 2005).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Nerdcore&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Sous-genre du hip-hop dont les paroles sont &lt;em&gt;réellement&lt;/em&gt; pour les nerds (code, hacking, sci-fi, math). Inventé par MC Frontalot (2000).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Digital Gangster&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Forum hacker fondé par YTCracker en 2005 (&lt;code&gt;digitalgangster.com&lt;/code&gt;). 36 000 membres au pic. Source de plusieurs hacks emblématiques (Paris Hilton, Miley Cyrus, Twitter Obama, etc.).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;NerdRap Entertainment System&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Album fondateur de YTCracker (2005). Beats sur OSTs NES, lyrics Nerdcore.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Darknet Diaries&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Podcast de &lt;strong&gt;Jack Rhysider&lt;/strong&gt; sur l&amp;rsquo;histoire de la cybersécurité. &lt;strong&gt;L&amp;rsquo;épisode 78 (&lt;em&gt;Nerdcore&lt;/em&gt;)&lt;/strong&gt; est consacré à YTCracker. Transcript : &lt;a href=&#34;https://darknetdiaries.com/transcript/78/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://darknetdiaries.com/transcript/78/&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Zone-H&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Archive publique des defaces de sites web (fondée 2 mars 2002 par Roberto Preatoni / Sys64738, basée en Estonie). Tableau d&amp;rsquo;affichage de la scène grey hat 2002-2015.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;IRC&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Internet Relay Chat&lt;/em&gt; (1988). Protocole de chat textuel multi-utilisateurs en client/serveur. Médium social central des hackers 1993-2012.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;EFnet&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Eris-Free Network&lt;/em&gt;. Réseau IRC historique (1990). Centre de la scène &lt;em&gt;warez&lt;/em&gt;, &lt;em&gt;0day&lt;/em&gt;, &lt;em&gt;phreakers&lt;/em&gt; 1996-2008.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Channel&lt;/strong&gt; (&lt;code&gt;#name&lt;/code&gt;)&lt;/td&gt;&#xA;          &lt;td&gt;Salon IRC.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;skid&lt;/code&gt; / &lt;em&gt;script kiddie&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Hacker qui exécute des scripts qu&amp;rsquo;il ne comprend pas. Insulte.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;normie&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Utilisateur lambda, non-initié. Insulte.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;lamer&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Variante BBS-era de &lt;em&gt;skid&lt;/em&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;gr33tz&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Greetings&lt;/em&gt;, liste du crew, en bas d&amp;rsquo;un deface.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;zine&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;E-zine&lt;/em&gt;, magazine &lt;em&gt;underground&lt;/em&gt; souvent ASCII.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;VX Underground (VXUG)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Repository public de samples de malware (fondé ~2019 par smelly_vx). Sysadmin originel : &lt;strong&gt;Yung Innanet / kayos&lt;/strong&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Yung Innanet / kayos&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Sysadmin originel de VX Underground et musicien. Décédé le 18 octobre 2025. Le Holy Book cite &lt;strong&gt;directement&lt;/strong&gt; les paroles de son morceau &lt;strong&gt;&lt;code&gt;true colors&lt;/code&gt;&lt;/strong&gt; (&lt;a href=&#34;https://soundcloud.com/queed-inc/true-colors&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SoundCloud&lt;/a&gt;), signé « &lt;em&gt;(btw: RIP, DG descendant…)&lt;/em&gt; ».&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;YogyaCarderLink (YCL)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Collectif d&amp;rsquo;hackers indonésiens (Yogyakarta), début 2000s. Deux mantras récurrents sur leurs defaces : « &lt;em&gt;We Can Do All What You Can&amp;rsquo;t Do.&lt;/em&gt; » et &lt;strong&gt;&lt;code&gt;Don&#39;t fuck with us.&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Honker (红客)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Red hacker&lt;/em&gt; chinois. Hacker patriote, motivé idéologiquement. Apparu après les émeutes Indonésie 1998.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Vilains but not Monsters&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Distinction morale au cœur de la scène hackers : un &lt;em&gt;Vilain&lt;/em&gt; confronte le pouvoir, un &lt;em&gt;Monster&lt;/em&gt; persécute des faibles. Les véritables passionnés détestent les &lt;em&gt;monsters&lt;/em&gt; (qui sont souvent d&amp;rsquo;anciens harcelés reproduisant le mal subi).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;DEF CON&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Conférence hacker annuelle à présent à Las Vegas (autrefois au &lt;em&gt;Caesars Forum&lt;/em&gt;).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;BOFH (Bastard Operator From Hell)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Série de fiction par &lt;strong&gt;Simon Travaglia&lt;/strong&gt; (Nouvelle-Zélande), publiée sur Usenet dans les années 90 puis sur &lt;em&gt;The Register&lt;/em&gt;. Archétype du sysadmin qui méprise ses utilisateurs. Source du vocabulaire &lt;em&gt;PEBKAC&lt;/em&gt;, &lt;em&gt;RTFM&lt;/em&gt;, &lt;em&gt;ID-10-T error&lt;/em&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Usenet&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Système distribué de &lt;em&gt;newsgroups&lt;/em&gt;. Médium fondateur de la culture hacker.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Shodan&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Moteur de recherche pour &lt;em&gt;devices&lt;/em&gt; connectés à internet (caméras IP, ICS, IoT, serveurs ouverts). Fondé par &lt;strong&gt;John Matherly&lt;/strong&gt;. &lt;a href=&#34;https://shodan.io&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;shodan.io&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;ViolVocal&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Communauté francophone (mi-2000s) de &lt;em&gt;prank callers&lt;/em&gt; / harceleurs téléphoniques organisés sur forum + serveur Mumble/TeamSpeak. Pratique du SIP spoofing, &lt;em&gt;streams&lt;/em&gt; publics des appels, doxing, usurpations d&amp;rsquo;agents de police pour consulter des TAJ sans habilitation, etc. Fermé après poursuites. Cas francophone de la cruauté &lt;em&gt;underground&lt;/em&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;4chan / /b/&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Imageboard fondé par moot (Christopher Poole) en 2003. /b/ = board sans règles, sans archive, anonymat total. Matrice d&amp;rsquo;Anonymous (2006-2008) et de la culture meme moderne. Communauté orchestrant régulièrement du harcèlement, ayant particulièrement dégradé la santé de Terry A. Davis.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Anonymous&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Entité collective émergée de 4chan /b/ vers 2006-2008. Op Chanology (Scientologie 2008), Op Tunisia (2011), Op Sony (2011). Coordination IRC.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Doxing&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Publication d&amp;rsquo;informations personnelles d&amp;rsquo;une cible dans le but de lui nuire.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Swatting&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Faux appel d&amp;rsquo;urgence (souvent SIP-spoofed) déclarant un crime grave à l&amp;rsquo;adresse de la victime, déclenchant l&amp;rsquo;envoi du SWAT. Cas mortels documentés.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;OSINT&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Open Source Intelligence&lt;/em&gt;. Collecte d&amp;rsquo;informations à partir de sources publiques.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;OPSEC&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Operations Security&lt;/em&gt;. Maintien rigoureux de l&amp;rsquo;anonymat opérationnel sur la durée.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Honeypot&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Faux serveur / faux compte / faux leak appâtant les attaquants pour les détecter. Outil défensif de la scène.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Snitch / Fed&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Poucave&lt;/em&gt; / &lt;em&gt;agent fédéral undercover&lt;/em&gt;. Détection prioritaire dans toute communauté &lt;em&gt;underground&lt;/em&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Prompt injection&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Insertion de contenu malveillant dans le contexte d&amp;rsquo;un LLM pour détourner son comportement. OWASP LLM01:2025. Premier rang du Top 10 LLM.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Protocole standard Anthropic (2024) pour exposer &lt;em&gt;tools&lt;/em&gt; et &lt;em&gt;resources&lt;/em&gt; à un LLM. Chaque MCP server tiers ajoute une surface d&amp;rsquo;attaque.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Hard-won rules&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Conventions internes à un projet documentées dans &lt;code&gt;CLAUDE.md&lt;/code&gt; après leçons coûteuses. Évite aux LLMs de répéter les erreurs déjà rencontrées.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;idéologie-ocarina&#34;&gt;Idéologie Ocarina&lt;a class=&#34;anchor&#34; href=&#34;#id%c3%a9ologie-ocarina&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Vilain (au sens hacker)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Identité revendiquée du hacker souverain qui agit hors institutions, par opposition aux conventions et au &lt;em&gt;branding corporate&lt;/em&gt;. Le Vilain confronte le pouvoir mais respecte les plus faibles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Monster (au sens hacker)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Celui qui exploite techniquement sa compétence pour persécuter des personnes vulnérables (harceleur, doxeur, etc.). &lt;em&gt;Ennemi&lt;/em&gt; structurel de la vraie scène hackerss.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Culture du tooling&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Conviction que les bons outils techniques (Nmap, Wireshark, Metasploit, Burp, sqlmap, &lt;em&gt;et al.&lt;/em&gt;) bien écrits par des petites équipes valent mille présentations marketing.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Tribal loyalty (scène hackers)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Loyauté absolue intra-communauté + méfiance extrême envers l&amp;rsquo;extérieur. Tests d&amp;rsquo;admission longs, &lt;em&gt;vouching&lt;/em&gt; par membres établis, excommunication brutale en cas de trahison.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Eyes everywhere&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Hyper-vigilance opérationnelle apprise dans le contexte &lt;em&gt;underground&lt;/em&gt; (admin IRC légalement responsable des actions de ses canaux).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;industrie-contre-modèles&#34;&gt;Industrie / contre-modèles&lt;a class=&#34;anchor&#34; href=&#34;#industrie-contre-mod%c3%a8les&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Infopreneur&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Entrepreneur dont le produit est de l&amp;rsquo;information vendue : formations, e-books, masterminds. Modèle américain (Dan Kennedy, Russell Brunson), importé en France via Tugan Bara.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Copywriting&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Art d&amp;rsquo;écrire des &lt;em&gt;textes de vente&lt;/em&gt; persuasifs. Cœur de métier infopreneur. Largement automatisable par IA depuis 2023.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Funnel&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Tunnel de vente&lt;/em&gt; : contenu gratuit → produit front-end (97€) → produit phare (997-4997€) → coaching premium.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Marketing Underground&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Programme phare de Tugan Bara (2018-2023). Posture « &lt;em&gt;bad guy&lt;/em&gt; » assumée.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Tugan Bara / Arnaud Labossière&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Archétype français du modèle infopreneur 2018-2024. HEC dropout. Vendu Tugan.ai en 2024. Finalement le seul infopreneur qui a vraiment expliqué la profession à toute une communauté de la scène francophone.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;MRR&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Monthly Recurring Revenue&lt;/em&gt;. Somme mensuelle facturée aux clients sous abonnement. Indicateur SaaS central.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;ARR&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Annual Recurring Revenue&lt;/em&gt;. Somme annuelle récoltée par la vente d&amp;rsquo;un SaaS.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;ia-ml-rl&#34;&gt;IA, ML, RL&lt;a class=&#34;anchor&#34; href=&#34;#ia-ml-rl&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Terme&lt;/th&gt;&#xA;          &lt;th&gt;Définition&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;LLM&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;Large Language Model&lt;/em&gt;. Modèle Transformer pré-entraîné sur un large corpus. Claude, GPT, Gemini, Llama, Mistral.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Transformer&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Architecture introduite par &lt;em&gt;Attention Is All You Need&lt;/em&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Foundation model&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Modèle pré-entraîné réutilisé pour de multiples tâches via &lt;em&gt;fine-tuning&lt;/em&gt; ou &lt;em&gt;prompting&lt;/em&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;RL (Reinforcement Learning)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Apprentissage par interaction avec un environnement, guidée par un &lt;em&gt;signal de reward&lt;/em&gt;. Sutton &amp;amp; Barto 1998.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Constitutional AI (CAI)&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Méthode d&amp;rsquo;alignement Anthropic (Bai et al., 2022). Le modèle critique et révise ses propres réponses selon une &lt;em&gt;constitution&lt;/em&gt; écrite.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Probe&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Primitive d&amp;rsquo;apprentissage empirique pour l&amp;rsquo;IA.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;llms.txt, llms-full.txt&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Standard Jeremy Howard (fast.ai), 2024. Index Markdown court (&lt;code&gt;llms.txt&lt;/code&gt;) + doc full concaténée (&lt;code&gt;llms-full.txt&lt;/code&gt;) pour ingestion par agent.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;SKILL.md&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Permet à un agent IA de plugger une compétence projet.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Donne ensemble de règles à Claude Code.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;</description>
    </item>
    <item>
      <title>99.02 — Index des fichiers cités</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/99-references/02-file-index/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/99-references/02-file-index/</guid>
      <description>&lt;h1 id=&#34;9902index-des-fichiers-cités&#34;&gt;99.02 — Index des fichiers cités&lt;a class=&#34;anchor&#34; href=&#34;#9902index-des-fichiers-cit%c3%a9s&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;Par dépôt, les fichiers source explicitement cités dans le précis. URLs GitHub directs.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;mojo-molotovocarinaframework&#34;&gt;&lt;code&gt;mojo-molotov/ocarina&lt;/code&gt; — Framework&lt;a class=&#34;anchor&#34; href=&#34;#mojo-molotovocarinaframework&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;racine&#34;&gt;Racine&lt;a class=&#34;anchor&#34; href=&#34;#racine&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/pyproject.toml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/Makefile&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;Makefile&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/mypy.ini&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;mypy.ini&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/.pre-commit-config.yaml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/allurerc.mjs&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;allurerc.mjs&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/README.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinarailway&#34;&gt;&lt;code&gt;src/ocarina/railway/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinarailway&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/railway/result.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;result.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinacustom_types&#34;&gt;&lt;code&gt;src/ocarina/custom_types/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinacustom_types&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_types/effect.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;effect.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_types/thunk.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;thunk.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_types/tpom.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;tpom.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_types/scenario.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;scenario.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_types/test_components.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;test_components.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_types/test_runner.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;test_runner.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_types/oc_test_layers.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;oc_test_layers.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinacustom_errorstest_framework&#34;&gt;&lt;code&gt;src/ocarina/custom_errors/test_framework/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinacustom_errorstest_framework&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_errors/test_framework/no_matching_branch.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;no_matching_branch.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_errors/test_framework/driver_died.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;driver_died.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_errors/test_framework/pages.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;pages.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinacustom_invariantstesting&#34;&gt;&lt;code&gt;src/ocarina/custom_invariants/testing/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinacustom_invariantstesting&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_invariants/testing/workers.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;workers.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_invariants/testing/oc_test_runners_ids.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;oc_test_runners_ids.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_invariants/testing/oc_test_runners_names.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;oc_test_runners_names.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_invariants/testing/oc_test_suites_names.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;oc_test_suites_names.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_invariants/testing/oc_test_campaigns_names.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;oc_test_campaigns_names.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/custom_invariants/testing/oc_test_cycles_names.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;oc_test_cycles_names.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinadslinvariants&#34;&gt;&lt;code&gt;src/ocarina/dsl/invariants/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinadslinvariants&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/invariants/validate.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;validate.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/invariants/assertions.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;assertions.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/invariants/errors.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;errors.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/invariants/internals/validation_chain.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;internals/validation_chain.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinadsltesting&#34;&gt;&lt;code&gt;src/ocarina/dsl/testing/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinadsltesting&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing/oc_test.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;oc_test.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing/oc_test_suite.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;oc_test_suite.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing/oc_test_campaign.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;oc_test_campaign.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing/oc_test_cycle.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;oc_test_cycle.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing/watcher.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;watcher.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing/filter_tests_by_ids.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;filter_tests_by_ids.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing/internals/test_executor.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;internals/test_executor.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing/internals/test_flow.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;internals/test_flow.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing/selenium/create_test.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;selenium/create_test.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing/selenium/create_watcher.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;selenium/create_watcher.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinadsltesting_with_railway&#34;&gt;&lt;code&gt;src/ocarina/dsl/testing_with_railway/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinadsltesting_with_railway&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing_with_railway/chain_actions.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;chain_actions.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing_with_railway/match_page.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;match_page.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing_with_railway/internals/action_chain.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;internals/action_chain.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/dsl/testing_with_railway/constructors/create_act.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;constructors/create_act.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinaaggregates&#34;&gt;&lt;code&gt;src/ocarina/aggregates/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinaaggregates&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/aggregates/tests_layers.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;tests_layers.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinainfra&#34;&gt;&lt;code&gt;src/ocarina/infra/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinainfra&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/infra/drivers_pool.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;drivers_pool.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/infra/driver_builder.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;driver_builder.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/infra/screenshotter.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;screenshotter.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/infra/act_counter.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;act_counter.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/infra/selenium/create_driver.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;selenium/create_driver.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/infra/selenium/create_drivers_pool.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;selenium/create_drivers_pool.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/infra/selenium/create_screenshotter.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;selenium/create_screenshotter.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/infra/selenium/driver_healthcheck.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;selenium/driver_healthcheck.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/infra/selenium/mixins.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;selenium/mixins.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinaports&#34;&gt;&lt;code&gt;src/ocarina/ports/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinaports&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/ports/ilogger.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;ilogger.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/ports/itake_screenshot.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;itake_screenshot.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinapom&#34;&gt;&lt;code&gt;src/ocarina/pom/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinapom&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/pom/base.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;base.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;srcocarinaopinionated&#34;&gt;&lt;code&gt;src/ocarina/opinionated/&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#srcocarinaopinionated&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/infra/act_counter.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;infra/act_counter.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/cli/builder.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;cli/builder.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/cli/store.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;cli/store.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/cli/phantoms.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;cli/phantoms.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/cli/selenium/create_cli_store.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;cli/selenium/create_cli_store.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/dsl/drive_page.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;dsl/drive_page.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/launcher/bootstrap.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;launcher/bootstrap.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/loggers/print_logger.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;loggers/print_logger.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/loggers/file_logger.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;loggers/file_logger.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/loggers/utils/format_metadata_str.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;loggers/utils/format_metadata_str.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/plugins/reports/pretty_print_results.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;plugins/reports/pretty_print_results.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/plugins/reports/results_to_json.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;plugins/reports/results_to_json.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/plugins/reports/docx_tests_proofs.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;plugins/reports/docx_tests_proofs.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/src/ocarina/opinionated/plugins/reports/timing.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;plugins/reports/timing.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;tests&#34;&gt;Tests&lt;a class=&#34;anchor&#34; href=&#34;#tests&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/tests/cram/cli_help.t&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;tests/cram/cli_help.t&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/tests/cram/cli_happy_path.t&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;tests/cram/cli_happy_path.t&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;(autres &lt;code&gt;.t&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/tests/scenarios/conftest.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;tests/scenarios/conftest.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/tests/scenarios/test_railway_and_action_chain.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;tests/scenarios/test_railway_and_action_chain.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;(autres &lt;code&gt;test_*.py&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/tests/dsl/invariants/test_types.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;tests/dsl/invariants/test_types.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/tests/dsl/testing_with_railway/test_types.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;tests/dsl/testing_with_railway/test_types.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;workflows&#34;&gt;Workflows&lt;a class=&#34;anchor&#34; href=&#34;#workflows&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/.github/workflows/main_ci.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/workflows/main_ci.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/.github/workflows/dev_ci.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/workflows/dev_ci.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/.github/workflows/unstable_python_full_build.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/workflows/unstable_python_full_build.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina/blob/main/.github/actions/allure-history/action.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/actions/allure-history/action.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mojo-molotovocarina-example&#34;&gt;&lt;code&gt;mojo-molotov/ocarina-example&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mojo-molotovocarina-example&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;code&#34;&gt;Code&lt;a class=&#34;anchor&#34; href=&#34;#code&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/main.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/main.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/tests/cycles/e2e.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/tests/cycles/e2e.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/tests/scenarios/dashboard/access/happy_paths.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/tests/scenarios/dashboard/access/happy_paths.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/lib/ext/ocarina/adapters/agnostic/act.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/lib/ext/ocarina/adapters/agnostic/act.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/lib/ext/ocarina/adapters/agnostic/env_getters.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/lib/ext/ocarina/adapters/agnostic/env_getters.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/lib/ext/selenium/humanize/proxy.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/lib/ext/selenium/humanize/proxy.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/lib/ext/selenium/watchers/catch_me_if_you_can_watcher.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/lib/ext/selenium/watchers/catch_me_if_you_can_watcher.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/lib/ext/redis/client.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/lib/ext/redis/client.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/caches/l1.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/caches/l1.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/caches/reserve_free_cache_key.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/caches/reserve_free_cache_key.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/src/api/retrieve_dashboard_otp_code.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/api/retrieve_dashboard_otp_code.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;workflows-1&#34;&gt;Workflows&lt;a class=&#34;anchor&#34; href=&#34;#workflows-1&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/.github/workflows/main_ci.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/workflows/main_ci.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/.github/workflows/dev_ci.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/workflows/dev_ci.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-example/blob/main/.github/workflows/e2e.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/workflows/e2e.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mojo-molotovocarina-with-ai-example&#34;&gt;&lt;code&gt;mojo-molotov/ocarina-with-ai-example&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mojo-molotovocarina-with-ai-example&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;docs&#34;&gt;Docs&lt;a class=&#34;anchor&#34; href=&#34;#docs&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/README.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/CLAUDE.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/CURA_FRD.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;CURA_FRD.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/CURA_TEST_STRATEGY.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;CURA_TEST_STRATEGY.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/IDENTIFIED_GAPS.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;IDENTIFIED_GAPS.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;code-1&#34;&gt;Code&lt;a class=&#34;anchor&#34; href=&#34;#code-1&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/src/main.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/main.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/src/tests/cycles/e2e.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/tests/cycles/e2e.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/src/tests/scenarios/_fragments/auth.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/tests/scenarios/_fragments/auth.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/src/tests/scenarios/appointment/past_date_booking.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/tests/scenarios/appointment/past_date_booking.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/src/lib/ext/ocarina/adapters/selenium/test_suite.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/lib/ext/ocarina/adapters/selenium/test_suite.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/src/lib/ext/ocarina/adapters/selenium/create_drivers_pool.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/lib/ext/ocarina/adapters/selenium/create_drivers_pool.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/src/lib/ext/ocarina/adapters/selenium/browser_navigation.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/lib/ext/ocarina/adapters/selenium/browser_navigation.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;workflows-2&#34;&gt;Workflows&lt;a class=&#34;anchor&#34; href=&#34;#workflows-2&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/.github/workflows/ai_proof_ci.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/workflows/ai_proof_ci.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/ocarina-with-ai-example/blob/main/.github/workflows/ai_proof_e2e.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/workflows/ai_proof_e2e.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mojo-molotovigoristan&#34;&gt;&lt;code&gt;mojo-molotov/igoristan&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mojo-molotovigoristan&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;code-2&#34;&gt;Code&lt;a class=&#34;anchor&#34; href=&#34;#code-2&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/src/config/routes.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/config/routes.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/src/config/brand.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/config/brand.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/src/hooks/useAuth.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/hooks/useAuth.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/src/components/LoginForm.tsx&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/components/LoginForm.tsx&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/src/pages/index/&amp;#43;Page.tsx&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/pages/index/+Page.tsx&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/src/pages/corsicamon/&amp;#43;Page.tsx&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/pages/corsicamon/+Page.tsx&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/src/pages/donkey-sausage-eater-detector/&amp;#43;Page.tsx&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/pages/donkey-sausage-eater-detector/+Page.tsx&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/src/pages/dashboard/&amp;#43;Page.tsx&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;src/pages/dashboard/+Page.tsx&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/vite.config.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;vite.config.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/package.json&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/eslint.config.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;eslint.config.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;workflows-3&#34;&gt;Workflows&lt;a class=&#34;anchor&#34; href=&#34;#workflows-3&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/.github/workflows/ci-pr.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/workflows/ci-pr.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/igoristan/blob/main/.github/workflows/deploy.yml&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mojo-molotovtests-workers&#34;&gt;&lt;code&gt;mojo-molotov/tests-workers&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mojo-molotovtests-workers&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;code-3&#34;&gt;Code&lt;a class=&#34;anchor&#34; href=&#34;#code-3&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/tests-workers/blob/main/api/otp.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;api/otp.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/tests-workers/blob/main/api/otp-history.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;api/otp-history.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/tests-workers/blob/main/api/corsicadex.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;api/corsicadex.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/tests-workers/blob/main/lib/redis.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;lib/redis.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/tests-workers/blob/main/lib/isAuthorized.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;lib/isAuthorized.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/tests-workers/blob/main/consts/corsicadexData.ts&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;consts/corsicadexData.ts&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/tests-workers/blob/main/package.json&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/tests-workers/blob/main/vercel.json&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;vercel.json&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mojo-molotov/tests-workers/blob/main/README.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;(Pas de workflow GitHub Actions.)&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
