<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Skills on Ocarina — précis</title>
    <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/series/skills/</link>
    <description>Recent content in Skills on Ocarina — précis</description>
    <generator>Hugo</generator>
    <language>fr-FR</language>
    <lastBuildDate>Tue, 02 Jun 2026 15:45:15 +0200</lastBuildDate>
    <atom:link href="https://mojo-molotov.github.io/from-ocarina-to-igor/fr/series/skills/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>09.03.01 — Skills Review</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/01-review/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/01-review/</guid>
      <description>&lt;h1 id=&#34;090301skills-review&#34;&gt;09.03.01 — Skills Review&lt;a class=&#34;anchor&#34; href=&#34;#090301skills-review&#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;Lectures &lt;strong&gt;statiques&lt;/strong&gt;, remontent des constats. Une grande famille. Permet à l&amp;rsquo;IA d&amp;rsquo;effectuer de la &lt;em&gt;revue&lt;/em&gt; sur son projet de manière systématique.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;listing-potentiellement-non-exhaustif&#34;&gt;Listing (potentiellement non exhaustif)&lt;a class=&#34;anchor&#34; href=&#34;#listing-potentiellement-non-exhaustif&#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;Skill&lt;/th&gt;&#xA;          &lt;th&gt;Cible&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-spec-gaps&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Questions de clarification sur les SFD&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-watcher-misuse&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Vérifie le principe « &lt;em&gt;négatif uniquement&lt;/em&gt; » de &lt;code&gt;watcher.report(...)&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-compartmentalisation-leaks&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Détecte URLs, sélecteurs, nombres magiques aux mauvais endroits&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-dead-code&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Détecte connecteurs / POMs / scénarios / suites / fragments / constantes non utilisés&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-report&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Classifie chaque FAIL / SKIP d&amp;rsquo;une exécution&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-type-ignore&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Audite les &lt;code&gt;# type: ignore&lt;/code&gt; (sont-ils justifiés ?)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-match-candidates&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Identifie les endroits où un &lt;code&gt;match&lt;/code&gt; (Python, &lt;em&gt;pattern matching&lt;/em&gt;) pourrait être utilisé plutôt que des &lt;code&gt;if&lt;/code&gt; &lt;code&gt;elif&lt;/code&gt; &lt;code&gt;elif&lt;/code&gt; &lt;code&gt;if&lt;/code&gt; &lt;code&gt;if&lt;/code&gt; &lt;code&gt;elif&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-unverified-transitions&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Vérifie qu&amp;rsquo;à chaque &lt;em&gt;transition de page&lt;/em&gt;, il y a un &lt;code&gt;verify&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-submit-dispatchers&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Audite les méthodes de confirmation de saisie (clic vs touche entrée&amp;hellip;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-comment-drift&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Détecte les commentaires qui sont désynchronisés avec le code&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-suite-stability&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Évalue la stabilité d&amp;rsquo;une suite (proportion de retries, transient_errors hits)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-intent-collisions&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Détecte les tests qui s&amp;rsquo;écrasent mutuellement (intentions contradictoires) et demande/propose des clarifications&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-watcher-emissions&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Audite les émissions de watchers (volume, déduplication, pertinence)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;review-hierarchy-naming&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Audite le nommage de la hiérarchie (&lt;code&gt;TestCycle&lt;/code&gt; / &lt;code&gt;TestCampaign&lt;/code&gt; / &lt;code&gt;TestSuite&lt;/code&gt; / &lt;code&gt;Test&lt;/code&gt;) pour repérer l&amp;rsquo;antipattern où un enfant reprend le nom du parent&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;review-dead-code&#34;&gt;&lt;code&gt;review-dead-code&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#review-dead-code&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : base de tests&#xA;output : liste des éléments non utilisés (connectors / POMs / scénarios / fragments / constantes)&#xA;         + recommandation par élément :&#xA;            - supprimer&#xA;            - mettre en incubateur (&amp;lt;racine-source&amp;gt;/incubator/, arbre de dépendances préservé)&#xA;            - conserver (justifier)&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;review-report&#34;&gt;&lt;code&gt;review-report&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#review-report&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : une exécution récente (logs + reports)&#xA;output : classification de chaque test :&#xA;            - PASS                  (rien à faire)&#xA;            - SKIP                  (pourquoi ?)&#xA;            - intentional gap FAIL  (G-DATA-*, G-SEC-*, ...)&#xA;            - cross-browser FAIL    (B-BROWSER-*)&#xA;            - transient FAIL        (A-ENV-*)&#xA;            - régression            ⚠️ ALERTE&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;review-watcher-misuse&#34;&gt;&lt;code&gt;review-watcher-misuse&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#review-watcher-misuse&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : tous les watcher.report(...)&#xA;output : liste des reports qui semblent positifs (« success », « completed », « ok », ...)&#xA;         → recommandation : supprimer ou reformuler en négatif&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;review-comment-drift&#34;&gt;&lt;code&gt;review-comment-drift&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#review-comment-drift&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : tous les commentaires du code&#xA;output : liste des commentaires qui semblent ne plus correspondre au code adjacent&#xA;         (typique : commentaire mentionne foo, code mentionne bar)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Aide à éliminer les commentaires obsolètes.&lt;br&gt;&#xA;« &lt;em&gt;Teach the pattern, not the symptom&lt;/em&gt; ».&lt;/p&gt;</description>
    </item>
    <item>
      <title>09.03.02 — Skills Analyse</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/02-analyse/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/02-analyse/</guid>
      <description>&lt;h1 id=&#34;090302skills-analyse&#34;&gt;09.03.02 — Skills Analyse&lt;a class=&#34;anchor&#34; href=&#34;#090302skills-analyse&#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;Analyses &lt;strong&gt;dynamiques&lt;/strong&gt; : utilisent les logs / les rapports d&amp;rsquo;une exécution récente pour diagnostiquer un échec. Deux skills de diagnostic de cause racine ouvrent la famille — &lt;code&gt;diagnose-root-cause&lt;/code&gt; pour un rouge déterministe, &lt;code&gt;diagnose-flake-root-cause&lt;/code&gt; pour un échec intermittent — et aiguillent vers les expériences contrôlées &lt;code&gt;analyse-*&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;listing-potentiellement-non-exhaustif&#34;&gt;Listing (potentiellement non exhaustif)&lt;a class=&#34;anchor&#34; href=&#34;#listing-potentiellement-non-exhaustif&#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;Skill&lt;/th&gt;&#xA;          &lt;th&gt;Cible&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;diagnose-root-cause&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Analyse de cause racine d&amp;rsquo;un rouge &lt;strong&gt;déterministe&lt;/strong&gt; : repart de zéro, remonte du synthétique vers le réel, cause triée en cinq familles&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;diagnose-flake-root-cause&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Analyse de cause racine d&amp;rsquo;un échec &lt;strong&gt;intermittent&lt;/strong&gt; (un flake) : taux d&amp;rsquo;échec, signature, corrélation ; orchestre les expériences &lt;code&gt;analyse-*&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;analyse-flakiness&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Élargit le filet des &lt;code&gt;transient_errors&lt;/code&gt; ; les morts chroniques sont de vraies flakes&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;analyse-fixture-flakiness&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Instrumente setup/teardown ; rend visibles les contaminations entre tests&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;analyse-watcher-flakiness&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Analyse la fiabilité des watchers (volume, dedupe, faux positifs)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;analyse-screenshot-flakiness&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Regroupe les captures d&amp;rsquo;écran par &lt;code&gt;(test, étape, navigateur)&lt;/code&gt;, détecte les différences&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;diagnose-root-cause&#34;&gt;&lt;code&gt;diagnose-root-cause&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#diagnose-root-cause&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : un rouge déterministe (échoue à chaque exécution)&#xA;output : analyse de cause racine structurée :&#xA;            - reprend l&amp;#39;analyse de zéro, sans réutiliser les hypothèses précédentes&#xA;            - remonte du synthétique vers le réel (faux driver → vrai navigateur)&#xA;            - lit la source, confirme avec une sonde&#xA;            - cause racine triée en cinq familles&#xA;         passe la main à diagnose-flake-root-cause si l&amp;#39;échec se révèle intermittent&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;diagnose-flake-root-cause&#34;&gt;&lt;code&gt;diagnose-flake-root-cause&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#diagnose-flake-root-cause&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : un échec intermittent (un flake)&#xA;output : analyse de cause racine fondée sur la distribution :&#xA;            - établit un taux d&amp;#39;échec (la distribution est la preuve)&#xA;            - fixe la signature, corrèle&#xA;            - aiguille vers la bonne expérience analyse-*, augmente le taux pour confirmer&#xA;            - classe en cinq familles de flakes&#xA;         l&amp;#39;orchestrateur de la famille analyse-*&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;analyse-flakiness&#34;&gt;&lt;code&gt;analyse-flakiness&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#analyse-flakiness&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : logs des N dernières exécutions&#xA;output : liste de tests qui retry souvent (par % de retries)&#xA;         + recommandation :&#xA;            - ajouter une exception au tuple transient_errors&#xA;            - investiguer un test particulier (peut-être que le problème vient directement du test)&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;analyse-fixture-flakiness&#34;&gt;&lt;code&gt;analyse-fixture-flakiness&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#analyse-fixture-flakiness&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : tests avec setup/teardown&#xA;output : tests dont le setup fail souvent&#xA;         + recommandation :&#xA;            - vérifier l&amp;#39;idempotence du setup&#xA;            - voir si teardown propre (sinon contamination entre tests)&#xA;            - sortir le seed du setup vers une init manuelle si trop fragile&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;analyse-watcher-flakiness&#34;&gt;&lt;code&gt;analyse-watcher-flakiness&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#analyse-watcher-flakiness&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : logs des watcher.report(...) sur N runs&#xA;output : watchers à reporting anormal :&#xA;            - trop d&amp;#39;émissions (problème de dedupe)&#xA;            - aucune émission (le watcher est inutile)&#xA;            - faux positifs (élément attendu reporté comme intrus)&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;analyse-screenshot-flakiness&#34;&gt;&lt;code&gt;analyse-screenshot-flakiness&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#analyse-screenshot-flakiness&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : screenshots de N runs, groupés par (test, step, browser)&#xA;output : flakiness visuelle :&#xA;            - tests dont les screenshots varient anormalement entre runs&#xA;            - tests qui passent mais dont l&amp;#39;aspect change&#xA;            - identifier si la variation est sémantique (vraie diff) ou cosmétique&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Utilise des heuristiques (hash, dimensions, palette dominante). Pas une vraie image diff.&lt;/p&gt;</description>
    </item>
    <item>
      <title>09.03.03 — Skills Black-hat</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/03-black-hat/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/03-black-hat/</guid>
      <description>&lt;h1 id=&#34;090303skills-black-hat-6&#34;&gt;09.03.03 — Skills Black-hat (6)&lt;a class=&#34;anchor&#34; href=&#34;#090303skills-black-hat-6&#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;&lt;strong&gt;Idéations&lt;/strong&gt; de vulnérabilités de logique métier — pas d&amp;rsquo;exécution : « &lt;em&gt;security testing is functional and static, never active&lt;/em&gt; ».&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;listing-potentiellement-non-exhaustif&#34;&gt;Listing (potentiellement non exhaustif)&lt;a class=&#34;anchor&#34; href=&#34;#listing-potentiellement-non-exhaustif&#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;Skill&lt;/th&gt;&#xA;          &lt;th&gt;Cible&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;business-logic-vulnerability-ideation&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Faire tomber le produit via des chemins d&amp;rsquo;usage légitimes mais malicieux&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;incoherence-attack-ideation&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Chaque étape prise isolément a l&amp;rsquo;air innocente ; mais des combinaisons de ces étapes peuvent causer une incohérence dans le système&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;persistence-attack-ideation&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Tentatives répétées sur une action bloquée&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;permission-appropriateness-audit&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Le modèle d&amp;rsquo;accès est-il lui-même approprié ?&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;bfcache-exposure-ideation&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Attaques BFCache&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;lateral-resource-ideation&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;IDOR via la barre d&amp;rsquo;adresse uniquement&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;périmètre&#34;&gt;Périmètre&lt;a class=&#34;anchor&#34; href=&#34;#p%c3%a9rim%c3%a8tre&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Tous ces skills &lt;em&gt;imaginent&lt;/em&gt; des attaques que &lt;strong&gt;l&amp;rsquo;IA&lt;/strong&gt; pourrait formuler.&lt;/p&gt;</description>
    </item>
    <item>
      <title>09.03.04 — Skills Comprehend</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/04-comprehend/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/04-comprehend/</guid>
      <description>&lt;h1 id=&#34;090304skills-comprehend&#34;&gt;09.03.04 — Skills Comprehend&lt;a class=&#34;anchor&#34; href=&#34;#090304skills-comprehend&#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;Skills qui aident l&amp;rsquo;IA à &lt;strong&gt;comprendre&lt;/strong&gt; un projet ou un écosystème avant d&amp;rsquo;agir.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;listing-potentiellement-non-exhaustif&#34;&gt;Listing (potentiellement non exhaustif)&lt;a class=&#34;anchor&#34; href=&#34;#listing-potentiellement-non-exhaustif&#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;Skill&lt;/th&gt;&#xA;          &lt;th&gt;Cible&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;assess-test-base&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Catalogue la base de test existante&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;assess-ecosystem&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Recherche publique bornée, plafonnée par budget de tokens&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;assess-impact&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Analyse d&amp;rsquo;impact : ce qu&amp;rsquo;un changement touche en aval, à travers le graphe de dépendances&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;understand-sut-constraints&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Comprend les &amp;ldquo;bornes&amp;rdquo; du SUT pour ne pas les dépasser&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;understand-ocarina&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Aiguille selon la classe de question : le Holy Book pour la référence, le livre from-ocarina-to-igor pour l&amp;rsquo;intention ; puis la source d&amp;rsquo;Ocarina + l&amp;rsquo;exemple correspondant à l&amp;rsquo;adaptateur en place&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;understand-ocarina&#34;&gt;&lt;code&gt;understand-ocarina&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#understand-ocarina&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : question de l&amp;#39;utilisateur — aiguillée selon sa classe :&#xA;            - &amp;#34;comment fait-on un match_page ?&amp;#34;   (référence : ce qu&amp;#39;est une primitive) → Holy Book&#xA;            - &amp;#34;pourquoi la suite est-elle bâtie sur Railway ?&amp;#34; (intention / cartographie / pourquoi) → le livre from-ocarina-to-igor&#xA;output : Claude charge, selon la classe de question :&#xA;            - référence    → les pages Holy Book pertinentes (https://mojo-molotov.github.io/ocarina-holy-book)&#xA;            - intention    → les chapitres pertinents du livre from-ocarina-to-igor (https://mojo-molotov.github.io/from-ocarina-to-igor/)&#xA;            - comportement → la source d&amp;#39;Ocarina (clone), si la doc ne le couvre pas&#xA;            - forme        → l&amp;#39;exemple correspondant à l&amp;#39;adaptateur du projet :&#xA;                              Selenium   → ocarina-example, ocarina-with-ai-example&#xA;                              Playwright → ocarina-with-playwright-example&#xA;         puis répond avec citations (tier + URL de page/chapitre ou file:line)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; :&lt;/p&gt;</description>
    </item>
    <item>
      <title>09.03.05 — Skills Pick</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/05-pick/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/05-pick/</guid>
      <description>&lt;h1 id=&#34;090305skills-pick&#34;&gt;09.03.05 — Skills Pick&lt;a class=&#34;anchor&#34; href=&#34;#090305skills-pick&#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;Sélection d&amp;rsquo;artefacts (screenshots, logs, reports). &lt;strong&gt;Toujours par mtime, jamais par nom de fichier.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;listing-potentiellement-non-exhaustif&#34;&gt;Listing (potentiellement non exhaustif)&lt;a class=&#34;anchor&#34; href=&#34;#listing-potentiellement-non-exhaustif&#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;Skill&lt;/th&gt;&#xA;          &lt;th&gt;Cible&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;pick-screenshots&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Pioche les screenshots les plus récents (par mtime), en les contextualisant à l&amp;rsquo;aide de logs si possible&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;pick-logs&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Pioche les logs les plus récents (par mtime)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;pick-reports&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Pioche les reports DOCX/JSON les plus récents (par mtime)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;mtime&#34;&gt;« &lt;em&gt;mtime&lt;/em&gt; »&lt;a class=&#34;anchor&#34; href=&#34;#mtime&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Citation du Holy Book :&lt;/p&gt;</description>
    </item>
    <item>
      <title>09.03.06 — Skills Author</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/06-author/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/06-author/</guid>
      <description>&lt;h1 id=&#34;090306skills-author&#34;&gt;09.03.06 — Skills Author&lt;a class=&#34;anchor&#34; href=&#34;#090306skills-author&#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;Skills qui &lt;strong&gt;produisent un livrable&lt;/strong&gt;. Tests, sondes, docs, rapports.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;listing-potentiellement-non-exhaustif&#34;&gt;Listing (potentiellement non exhaustif)&lt;a class=&#34;anchor&#34; href=&#34;#listing-potentiellement-non-exhaustif&#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;Skill&lt;/th&gt;&#xA;          &lt;th&gt;Cible&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;empiricism&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Vérifier avant d&amp;rsquo;encoder ; ne pas écraser un test gap en échec intentionnel&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;write-a-probe&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Script de &amp;ldquo;sonde&amp;rdquo; jetable, gitignored&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;write-test-strategy&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Génère le document de stratégie de test à partir de la suite&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;extend-coverage&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Étend la couverture à partir du patrimoine existant&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;update-frd-and-tests&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Propage une mise à jour de spec&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;manual-reproduction-guide&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Rédige un scénario de reproduction exécutable par un humain&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;manage-backlog&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;BACKLOG.md&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;pr-report&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Rapport de PR adapté&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;plan-test-effort&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Chiffrage de l&amp;rsquo;effort de test, première passe : exigences graduées, registre de risques allégé, poids relatifs (S / M / L), questions ouvertes&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;empiricism&#34;&gt;&lt;code&gt;empiricism&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#empiricism&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : intention de l&amp;#39;utilisateur (« écris un test qui assert X »)&#xA;output : avant d&amp;#39;encoder X :&#xA;            1. vérifier empiriquement que X est vrai&#xA;                - sonde&#xA;                - gh api du code source&#xA;                - curl -v pour inspecter réponses HTTP&#xA;                - ...&#xA;            2. si X est confirmé → encoder&#xA;            3. si X est faux → corriger l&amp;#39;intention&#xA;            4. si X est ambigu → demander à l&amp;#39;humain&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;« &lt;em&gt;Juste remarque, je suppose. Je vérifie empiriquement.&lt;/em&gt; »&lt;/p&gt;</description>
    </item>
    <item>
      <title>09.03.07 — Skills Refactor</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/07-refactor/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/07-refactor/</guid>
      <description>&lt;h1 id=&#34;090307skills-refactor&#34;&gt;09.03.07 — Skills Refactor&lt;a class=&#34;anchor&#34; href=&#34;#090307skills-refactor&#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;Skills qui &lt;strong&gt;refactor&lt;/strong&gt; la base de tests automatisés existante.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;listing-potentiellement-non-exhaustif&#34;&gt;Listing (potentiellement non exhaustif)&lt;a class=&#34;anchor&#34; href=&#34;#listing-potentiellement-non-exhaustif&#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;Skill&lt;/th&gt;&#xA;          &lt;th&gt;Cible&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;refactor-fragmentation&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;DRY selon préférence utilisateur&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;introduce-pom-retries&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Retries internes aux POMs, avec dédoublement (first-try + with-retries)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;refactor-fragmentation&#34;&gt;&lt;code&gt;refactor-fragmentation&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#refactor-fragmentation&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : la base de tests&#xA;output : suggestions de refactor DRY :&#xA;            - blocs répétés dans 3+ scénarios → extract en fragment&#xA;            - connectors quasi-identiques → extract un connector paramétré&#xA;            - séquences de log+screenshot répétées → extract un helper&#xA;         + recommandation au cas par cas&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; :&lt;/p&gt;</description>
    </item>
    <item>
      <title>09.03.08 — Skill State</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/08-state/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/08-state/</guid>
      <description>&lt;h1 id=&#34;090308skill-state&#34;&gt;09.03.08 — Skill State&lt;a class=&#34;anchor&#34; href=&#34;#090308skill-state&#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;Un seul skill : &lt;code&gt;question-state&lt;/code&gt;. Interroge l&amp;rsquo;environnement avant de croire un résultat.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;le-skill&#34;&gt;Le skill&lt;a class=&#34;anchor&#34; href=&#34;#le-skill&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : un résultat surprenant (« le test fail »)&#xA;output : une série de questions sur l&amp;#39;état :&#xA;            - sur quel browser tourne-t-on ?&#xA;            - quel commit ?&#xA;            - le SUT est-il warm ou cold ?&#xA;            - le Redis est-il disponible ?&#xA;            - quel est le wait-timeout configuré ?&#xA;            - quelle est la version du driver ?&#xA;            - le ChromeDriver a-t-il son fix password-manager-off ?&#xA;            - est-ce un run isolé ou un run en parallèle ?&#xA;            - est-ce que d&amp;#39;autres tests touchent les mêmes ressources SUT ?&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;approche&#34;&gt;Approche&lt;a class=&#34;anchor&#34; href=&#34;#approche&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; :&lt;/p&gt;</description>
    </item>
    <item>
      <title>09.03.09 — Skills Setup</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/09-setup/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/09-setup/</guid>
      <description>&lt;h1 id=&#34;090309skills-setup&#34;&gt;09.03.09 — Skills Setup&lt;a class=&#34;anchor&#34; href=&#34;#090309skills-setup&#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;Deux skills : &lt;code&gt;setup-environment&lt;/code&gt; (onboarding d&amp;rsquo;un nouveau contributeur, humain ou IA) et &lt;code&gt;profile-environment&lt;/code&gt; (cadre la latitude laissée à l&amp;rsquo;IA pour une mission donnée). Tous deux alimentent le &lt;code&gt;CLAUDE.md&lt;/code&gt; assemblé de la suite.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;le-skill&#34;&gt;Le skill&lt;a class=&#34;anchor&#34; href=&#34;#le-skill&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : un repo frais&#xA;output : étapes d&amp;#39;onboarding :&#xA;            1. venv&#xA;            2. pip install (deps dev + ocarina)&#xA;            3. ruff / mypy / pre-commit installés&#xA;            4. CLAUDE.local.md créé (avec demande paths à l&amp;#39;utilisateur)&#xA;            5. smoke-check du runner (un test minimal qui valide que tout marche)&#xA;            6. boucle pré-commit testée&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;étape-1-venv&#34;&gt;Étape 1 : venv&lt;a class=&#34;anchor&#34; href=&#34;#%c3%a9tape-1-venv&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python -m venv .venv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;source&lt;/span&gt; .venv/bin/activate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;étape-2-pip-install&#34;&gt;Étape 2 : pip install&lt;a class=&#34;anchor&#34; href=&#34;#%c3%a9tape-2-pip-install&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install . ruff mypy mypy-extensions typing-extensions pre-commit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;étape-3-outillage-de-dev&#34;&gt;Étape 3 : outillage de dev&lt;a class=&#34;anchor&#34; href=&#34;#%c3%a9tape-3-outillage-de-dev&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pre-commit install --config .pre-commit-config.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;étape-4-claudelocalmd&#34;&gt;Étape 4 : &lt;code&gt;CLAUDE.local.md&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#%c3%a9tape-4-claudelocalmd&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;CLAUDE.local.md&lt;/code&gt; est &lt;strong&gt;gitignored&lt;/strong&gt; et contient les paths machine-specifiques.&lt;/p&gt;</description>
    </item>
    <item>
      <title>09.03.10 — Skills Run</title>
      <link>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/10-run/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mojo-molotov.github.io/from-ocarina-to-igor/fr/09-holy-book/03-skills/10-run/</guid>
      <description>&lt;h1 id=&#34;090310skills-run&#34;&gt;09.03.10 — Skills Run&lt;a class=&#34;anchor&#34; href=&#34;#090310skills-run&#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;Faire remonter les choix à trancher &lt;em&gt;avant&lt;/em&gt; un lancement local, composer la commande, et la rendre. Le skill ne lance jamais l&amp;rsquo;exécution lui-même.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;listing-potentiellement-non-exhaustif&#34;&gt;Listing (potentiellement non exhaustif)&lt;a class=&#34;anchor&#34; href=&#34;#listing-potentiellement-non-exhaustif&#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;Skill&lt;/th&gt;&#xA;          &lt;th&gt;Cible&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;propose-visual-review&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Propose fenêtré (&lt;code&gt;--not-headless&lt;/code&gt;) vs headless (façon CI) avant une exécution, puis compose la commande&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;propose-visual-review&#34;&gt;&lt;code&gt;propose-visual-review&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#propose-visual-review&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input  : une exécution locale à venir&#xA;output : le choix fenêtré vs headless :&#xA;            - --not-headless : on regarde le navigateur, utile pour déboguer un flux flaky&#xA;            - headless (façon CI) : plus rapide, identique à ce que fait la CI&#xA;         + le compromis et ce qu&amp;#39;il faut surveiller pendant une exécution fenêtrée&#xA;         + la commande composée, rendue à l&amp;#39;utilisateur pour qu&amp;#39;il la lance&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;rôle&#34;&gt;Rôle&lt;a class=&#34;anchor&#34; href=&#34;#r%c3%b4le&#34; data-pagefind-ignore=&#34;all&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Faire remonter&lt;/strong&gt; le choix d&amp;rsquo;avant-exécution ; expliquer le compromis.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Composer&lt;/strong&gt; la commande.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ne pas la lancer&lt;/strong&gt; : c&amp;rsquo;est l&amp;rsquo;utilisateur qui exécute.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
  </channel>
</rss>
