<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mathieu Ledru</title>
    <description>The latest articles on DEV Community by Mathieu Ledru (@matyo91).</description>
    <link>https://dev.to/matyo91</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F182978%2F61c41098-10ce-4833-acf3-b00cc42f852c.jpeg</url>
      <title>DEV Community: Mathieu Ledru</title>
      <link>https://dev.to/matyo91</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matyo91"/>
    <language>en</language>
    <item>
      <title>💫 Bluesky Creator - @martinfowler.com: L'une des malédictions de la croissance de l'IA</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Mon, 02 Nov 2026 16:04:16 +0000</pubDate>
      <link>https://dev.to/matyo91/bluesky-creator-martinfowlercom-lune-des-maledictions-de-la-croissance-de-lia-37a4</link>
      <guid>https://dev.to/matyo91/bluesky-creator-martinfowlercom-lune-des-maledictions-de-la-croissance-de-lia-37a4</guid>
      <description>&lt;p&gt;Dans son dernier billet Bliki, Martin Fowler discute des défis posés par la prolifération de contenu vocal généré par des LLM sur le web. Il met en évidence le risque de se noyer dans la médiocrité et de perdre des idées authentiques. À lire absolument pour les passionnés de tech !&lt;/p&gt;

&lt;p&gt;🚨 &lt;b&gt;Contenu premium.&lt;/b&gt;&lt;br&gt;⬆️ Mettez à niveau pour accéder à l'analyse complète.&lt;br&gt;👉 Abonnez-vous ici : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>💫 Hacker News Creator - L'Impact de l'IA générative sur la pensée critique : auto-déclaré (2025)</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Mon, 02 Nov 2026 15:03:47 +0000</pubDate>
      <link>https://dev.to/matyo91/hacker-news-creator-limpact-de-lia-generative-sur-la-pensee-critique-auto-declare-2025-5dlk</link>
      <guid>https://dev.to/matyo91/hacker-news-creator-limpact-de-lia-generative-sur-la-pensee-critique-auto-declare-2025-5dlk</guid>
      <description>&lt;h2&gt;
  
  
  À propos de cette histoire
&lt;/h2&gt;

&lt;p&gt;Cet éditorial explore les perceptions des utilisateurs sur la manière dont les outils d'IA générative affectent leurs capacités de pensée critique, mettant en évidence la dichotomie entre amélioration et détriment dans les processus de pensée.&lt;/p&gt;

&lt;p&gt;🚨 &lt;b&gt;Contenu premium.&lt;/b&gt;&lt;br&gt;⬆️ Passez à Premium pour accéder à l'analyse complète.&lt;br&gt;👉 Abonnez-vous ici : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>💫 Reddit Creator - r/webdev: Le fil de discussion principal n'est pas le bon endroit pour une grille de données</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Mon, 02 Nov 2026 14:03:49 +0000</pubDate>
      <link>https://dev.to/matyo91/reddit-creator-rwebdev-le-fil-de-discussion-principal-nest-pas-le-bon-endroit-pour-une-3h1o</link>
      <guid>https://dev.to/matyo91/reddit-creator-rwebdev-le-fil-de-discussion-principal-nest-pas-le-bon-endroit-pour-une-3h1o</guid>
      <description>&lt;p&gt;Dans les discussions récentes sur r/webdev, le placement des grilles de données dans les applications web a suscité un débat considérable. Les développeurs sont invités à repenser l'endroit où ces composants sont rendus afin d'optimiser les performances et l'expérience utilisateur.&lt;/p&gt;

&lt;p&gt;🚨 &lt;b&gt;Contenu premium.&lt;/b&gt;&lt;br&gt;⬆️ Passez à la version premium pour accéder à l'analyse complète.&lt;br&gt;👉 Abonnez-vous ici : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🤖 Veille Darkwood - 2026-11-02</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Mon, 02 Nov 2026 06:01:58 +0000</pubDate>
      <link>https://dev.to/matyo91/veille-darkwood-2026-11-02-4lem</link>
      <guid>https://dev.to/matyo91/veille-darkwood-2026-11-02-4lem</guid>
      <description>&lt;h2&gt;
  
  
  Points saillants
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Les problèmes liés à la génération de texte et à la scalabilité dans les pipelines d'IA continuent d'être au cœur des discussions techniques. &lt;/li&gt;
&lt;li&gt;Les échecs de lancement de SDPA sur Windows ROCm mettent en avant la nécessité d'une gestion des erreurs plus précise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚨 &lt;b&gt;Premium content.&lt;/b&gt;&lt;br&gt;⬆️ Upgrade to access full analysis.&lt;br&gt;👉 Subscribe here : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🧊 Petites règles, mondes évolutifs : Strata Relay et la messagerie inter-applications avec Symfony 8.2</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 01 Nov 2026 16:21:58 +0000</pubDate>
      <link>https://dev.to/matyo91/petites-regles-mondes-evolutifs-strata-relay-et-la-messagerie-inter-applications-avec-symfony-1h4g</link>
      <guid>https://dev.to/matyo91/petites-regles-mondes-evolutifs-strata-relay-et-la-messagerie-inter-applications-avec-symfony-1h4g</guid>
      <description>&lt;p&gt;La génération procédurale est particulièrement utile lorsqu'elle remplace un contenu répétitif par des règles que les joueurs peuvent comprendre. La variété à elle seule n'est pas suffisante. Un état généré doit encore présenter une décision significative, chaque action doit avoir un champ d'application prévisible, et le système doit être capable de distinguer un puzzle valide d'un agencement aléatoire.&lt;/p&gt;

&lt;p&gt;Nous avons construit &lt;a href="https://darkwaar.com/games/strata-relay" rel="noopener noreferrer"&gt;Strata Relay&lt;/a&gt; autour de cette contrainte. C'est un puzzle de terrain au tour par tour pour un écran en mode portrait. Le monde logique s'inscrit dans 125 positions de voxels, mais le joueur ne déplace jamais un personnage à travers celui-ci. Au lieu de cela, chaque tour fait muter une croix locale de colonnes de terrain. Le contour résultant détermine si un signal peut voyager entre deux cristaux fixes.&lt;/p&gt;

&lt;p&gt;La même préférence pour des règles explicites aide également lorsque des applications indépendantes échangent des événements. Un petit contrat de message versionné est plus facile à comprendre que des objets d'implémentation partagés ou un flux de chaque changement de terrain. Les fonctionnalités d'interopérabilité du Messenger de Symfony 8.2 fournissent un moyen utile d'étudier cette frontière. Les exemples de messagerie dans cet article sont hypothétiques et restent séparés du jeu fonctionnel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un logiciel compact est plus qu'un petit arbre source
&lt;/h2&gt;

&lt;p&gt;Strata Relay génère ses niveaux à partir d'une graine, d'un stade de difficulté et d'un ensemble de règles fixes. Il dispose d'une scène Godot créée et pas d'art ou de son de gameplay importés. Cela nous donne une empreinte d'asset spécifique au jeu petite, mais cela ne rend pas toutes les autres métriques petites.&lt;/p&gt;

&lt;p&gt;Nous suivons la compacité comme plusieurs propriétés indépendantes :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Taille du code source&lt;/strong&gt; : c'est le code que nous maintenons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taille des assets créés&lt;/strong&gt; : cela couvre les niveaux stockés, les images, les modèles et l'audio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taille d'exportation&lt;/strong&gt; : cela inclut le runtime moteur et le packaging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mémoire à l'exécution&lt;/strong&gt; : cela inclut les allocations moteur, navigateur, CPU et GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coût de génération&lt;/strong&gt; : cela mesure le travail requis pour créer un niveau.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Profondeur du gameplay&lt;/strong&gt; : cela décrit les décisions produites par les règles.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La génération procédurale a directement réduit les données de niveau stockées dans ce projet : il n'y a pas de catalogue de tableaux fabriqués à la main. Elle nous a également permis de représenter le tableau à partir de règles de dessin partagées plutôt qu'en important des arts de carreaux. Cela n'a pas supprimé le runtime WebAssembly de Godot, prouvé une faible utilisation de la mémoire, ou automatiquement rendu le puzzle stratégiquement intéressant. Ces questions nécessitent des preuves séparées.&lt;/p&gt;

&lt;p&gt;Le déterminisme est la fondation. Un générateur pseudo-aléatoire local transforme la même graine et le même stade en le même chemin, masque de socle, leurres et séquence de mélange. Le redémarrage peut reconstruire le tableau initial sans stocker un niveau sérialisé. New Seed change l'entrée, pas l'algorithme de génération.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SeedRng&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;

    &lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0x7fffffff&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;next_int&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1103515245&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;12345&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0x7fffffff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le générateur est constructif. Il crée d'abord un chemin résonant valide, remplit les cellules restantes avec des leurres bas et haut déterministes, ajoute du socle dépendant du stade, puis applique des impulsions locales connues près du chemin. Comme un état de terrain avance à travers trois valeurs, appliquer la même impulsion deux fois inverse une impulsion antérieure. Inverser l'ordre de mélange et doubler chaque impulsion produit une solution témoin.&lt;/p&gt;

&lt;p&gt;Cela donne à chaque casse-tête généré au moins un chemin vérifié vers la victoire sans faire tourner un solveur généralisé. Le témoin n'est pas prétendu être le plus court ou unique. Cette distinction est importante : la génération constructive prouve la résolvabilité pour nos règles et notre budget, alors que l'optimalité nécessiterait une recherche bornée et une cible de validation différente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un monde 5 × 5 × 5 représenté comme un champ de hauteur
&lt;/h2&gt;

&lt;p&gt;La limite logique est de cinq cellules de large, cinq cellules de profondeur et cinq voxels de haut. Nous le représentons délibérément comme 25 colonnes plutôt qu'un occupation arbitraire de toutes les 125 positions.&lt;/p&gt;

&lt;p&gt;Chaque colonne a l'un des trois niveaux de gameplay, mappés à des hauteurs physiques de 1, 3 et 5. Le niveau du milieu est résonant. Une impulsion avance du bas au résonant, du résonant au haut, et du haut au bas. Le wrap est présenté comme un pic se fracturant.&lt;/p&gt;

&lt;p&gt;Ce champ de hauteur exclut les grottes, surplombs et blocs flottants. En échange, chaque cellule interactive a une surface supérieure visible. Nous n'avons pas besoin de rotation de caméra, de contrôles de couche ou de règles pour sélectionner des voxels cachés. Le tableau complet reste lisible dans une vue fixe de 648 × 1152 en portrait.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9lb826181sh1ap59dj7b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9lb826181sh1ap59dj7b.png" alt="Tableau Strata Relay initial : un champ de hauteur isométrique fixe avec des ancres en cristal doré et cyan" width="648" height="1152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La représentation maintient également l'état compact. Le tableau autorisé contient 25 niveaux ternaires, 25 indicateurs immuables, deux coordonnées d'ancrage, une graine, un stade et des métadonnées de tour. La résonance et la charge sont dérivées au lieu d'être stockées comme des matériaux supplémentaires.&lt;/p&gt;

&lt;p&gt;Il n'y a que deux classes de terrain stockées :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sol mutable, qui peut être sélectionné et changé ;&lt;/li&gt;
&lt;li&gt;pierre immuable, utilisée pour les ancres et le socle dépendant du stade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La résonance cyan est dérivée de la hauteur médiane d'une colonne. Le chemin chargé plus lumineux est dérivé de la connectivité du graphe. Cela évite un état dupliqué obsolète : lorsque les hauteurs changent, le composant connecté est recalculé à partir du tableau qui existe réellement.&lt;/p&gt;

&lt;p&gt;La vue isométrique fixe est une géométrie de toile procédurale. Chaque colonne est dessinée à partir d'un diamant supérieur et de deux polygones latéraux, avec des coutures répétées montrant la hauteur. C'est un monde logique de voxels présenté en 2.5D, pas une scène pleine de nœuds de maillage 3D indépendants. À cette taille de tableau, le dessin direct conserve la projection, l'ordre et les polygones de contact en un seul endroit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le pipeline de tour : mutation locale, propagation bornée
&lt;/h2&gt;

&lt;p&gt;Un tour change la colonne mutable sélectionnée et ses voisins cardinaux mutables. Au maximum, cinq colonnes peuvent changer. Le socle est ignoré. Le budget d'impulsion diminue une fois, puis le jeu recompute la connectivité et l'état terminal.&lt;/p&gt;

&lt;p&gt;La règle autorisée est assez courte pour être inspectée directement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;apply_pulse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Vector2i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"won"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"failed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"finished"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"events"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;is_inside&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"immutable"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;index_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;)]):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"immutable"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"events"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]}&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duplicate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;affected&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;affected_cells&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;changed&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;affected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;index_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;changed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"levels"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
        &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"levels"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt;
        &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;"cell"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;changed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"before"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;physical_height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;"after"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;physical_height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;

    &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"moves_left"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"moves_left"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"turn"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"turn"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"last_cell"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;
    &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"won"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;is_won&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"failed"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"moves_left"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"won"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"events"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les événements retournés ne déclenchent pas une autre simulation. Ils indiquent à la vue quelles colonnes animer et fournissent leurs hauteurs physiques précédentes et suivantes. La transition d'état reste complète avant que le rendu ne commence. Cette séparation empêche le timing de l'animation de changer les règles.&lt;/p&gt;

&lt;p&gt;La propagation des signaux est un remplissage par inondation sur des cellules résonantes orthogonalement adjacentes. Elle commence à la source dorée et réussit lorsque la cible cyan appartient au même composant connecté.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;charged_cells&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Vector2i&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Vector2i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"levels"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;index_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;RESONANT_LEVEL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Vector2i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Vector2i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Vector2i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop_front&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;neighbors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"levels"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;index_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;RESONANT_LEVEL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C'est la seule étape de propagation. Elle ne peut pas créer une chaîne de mutation illimitée parce qu'elle ne change jamais le terrain. Le parcours examine un maximum de 25 cellules et atteint un résultat stable immédiatement.&lt;/p&gt;

&lt;p&gt;La vue met à jour uniquement les colonnes affectées. &lt;code&gt;present()&lt;/code&gt; garde les hauteurs d'affichage actuelles, calcule les hauteurs cibles à partir du nouvel état et enregistre les cellules d'événements. &lt;code&gt;_process()&lt;/code&gt; interpole ces valeurs et redessine le chemin dérivé. Le monde logique n'est pas régénéré après un tour ; la continuité provient de l'application d'une seule transition déterministe à l'état précédent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construction de niveaux solvables sans niveaux stockés
&lt;/h2&gt;

&lt;p&gt;Le générateur construit un chemin de source à cible depuis le bord gauche jusqu'au bord droit. Les stades ultérieurs introduisent des courbes, plus d'impulsions de mélange et des cellules immuables hors du chemin valide. Les cellules hors chemin deviennent des leurres bas ou haut, de sorte qu'un tableau puisse contenir des fragments résonants convaincants mais déconnectés.&lt;/p&gt;

&lt;p&gt;Les cinq stades ajoutent chacun une conséquence :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Premier signal&lt;/strong&gt; : introduit le cycle à trois états avec une impulsion de mélange.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relais plié&lt;/strong&gt; : fait tourner le chemin écrit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Socle&lt;/strong&gt; : introduit des colonnes immuables que croise une impulsion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Échos faux&lt;/strong&gt; : ajoutent plus de leurres et d'effets qui se chevauchent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strates profondes&lt;/strong&gt; : combine cinq opérations de mélange avec six colonnes de socle.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La limite de mouvements est égale à la longueur du témoin : deux impulsions inverses pour chaque impulsion de mélange. Nous vérifions le témoin via &lt;code&gt;apply_pulse()&lt;/code&gt;, la même règle publique utilisée par l'entrée du joueur. Il n'y a pas de chemin de mutation réservé aux solveurs alternatifs qui pourrait s'éloigner du jeu.&lt;/p&gt;

&lt;p&gt;Le flux de génération résultant est petit et explicite :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;seed + stage
    │
    ├─ construire un chemin résonant de source à cible
    ├─ ajouter des leurres et du socle déterministes
    ├─ appliquer des impulsions locales réversibles
    ├─ rejeter un candidat qui est encore résolu
    └─ rejouer le témoin inverse via la règle publique
             │
             └─ état initial jouable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cette approche était mieux adaptée que la recherche en largeur ou A* pour l'objectif actuel. Vingt-cinq cellules ternaires impliquent déjà jusqu'à 3²⁵ affectations de niveaux bruts avant masques immuables et métadonnées terminales. Une recherche serait raisonnable si nous avions besoin d'une preuve de solutions minimales. Pour cinq courts niveaux d'enseignement, la construction réversible fournit la garantie dont nous avons réellement besoin avec moins de machinerie.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnl7g6farndvaoy6yjreg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnl7g6farndvaoy6yjreg.png" alt="Tableau Strata Relay complété : le composant connecté cyan atteint désormais le cristal cible" width="648" height="1152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Performances et validation
&lt;/h2&gt;

&lt;p&gt;L'implémentation mesurée à l'exécution se compose de &lt;code&gt;rules.gd&lt;/code&gt;, &lt;code&gt;board_view.gd&lt;/code&gt; et &lt;code&gt;main.gd&lt;/code&gt; : &lt;strong&gt;686 lignes de GDScript et 22,202 octets&lt;/strong&gt;. L'inclusion de deux programmes de vérification et de la benchmark fournit six scripts, 816 lignes et 26,354 octets. Il y a une scène autorisée et aucun asset de gameplay importé.&lt;/p&gt;

&lt;p&gt;Sur un hôte de développement Apple M4 fonctionnant sous Godot 4.7.2 :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5,000 générations déterministes ont en moyenne &lt;strong&gt;80.564 microsecondes&lt;/strong&gt; chacune ;&lt;/li&gt;
&lt;li&gt;50,000 mises à jour de terrain locales ont en moyenne &lt;strong&gt;12.346 microsecondes&lt;/strong&gt; chacune.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le benchmark de mise à jour inclut la copie complète de l'état des 25 cellules avant d'appliquer une impulsion. Il exclut le rendu et le travail GPU. Ces chiffres décrivent une machine et une construction ; ils ne sont pas des garanties de performance mobile.&lt;/p&gt;

&lt;p&gt;La validation a couvert plus que le benchmark. La suite de règles sans tête a complété &lt;strong&gt;557 assertions avec zéro échec&lt;/strong&gt;, vérifiant les limites, le déterminisme, les limites de hauteur, la localité, les états terminaux et la relecture de témoins. Un test séparé de stress a généré &lt;strong&gt;5,000 casse-têtes&lt;/strong&gt; à travers les cinq stades. Chaque tableau échantillonné a commencé non résolu et son témoin a atteint la victoire. La boucle d'exécution réelle a également vérifié l'identité de redémarrage et la relecture complète de la solution.&lt;/p&gt;

&lt;p&gt;Le test de validation dans le navigateur a chargé l'exportation finale, observé une toile peinte de 648 × 1152, injecté une entrée et détecté un cadre rendu modifié. Les tests de production ont ensuite repéré un problème d'intégration de pointeur que les vérifications de niveau de code avaient raté : l'entrée de la souris de bureau était déjà convertie en contact par le projet, donc le traitement des deux chemins appliquait une impulsion deux fois. La vue publiée accepte le chemin de contact une fois, et les chemins de souris et de contact utilisent maintenant ce chemin.&lt;/p&gt;

&lt;p&gt;L'export Web illustre pourquoi la compacité de la source et la taille de la livraison doivent rester des revendications séparées :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;index.wasm&lt;/code&gt; : &lt;strong&gt;39,514,754 octets&lt;/strong&gt; bruts, 10,084,297 octets avec gzip niveau 9 ;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;index.pck&lt;/code&gt; : &lt;strong&gt;130,544 octets&lt;/strong&gt; bruts, 113,539 octets avec gzip niveau 9 ;&lt;/li&gt;
&lt;li&gt;répertoire de construction complet : &lt;strong&gt;39,100 KiB&lt;/strong&gt; sur disque.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le moteur WebAssembly domine l'export brut. Le PCK n'est pas non plus un chiffre pur de Strata Relay : il contient du code et des ressources de projet Darkwaar partagés. Nous n'avons pas isolé la mémoire d'exécution spécifique au jeu des allocations de Godot et de navigateur, donc cet article ne fait aucune revendication sur la mémoire.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les messages inter-applications appartiennent en dehors de la boucle de terrain
&lt;/h2&gt;

&lt;p&gt;Strata Relay fonctionne hors ligne. Sa simulation de terrain, générateur, validation et condition de victoire vivent dans Godot. Envoyer chaque impulsion à travers une frontière d'application introduirait de la latence, des modes de défaillance et un ordre distribué dans une règle qui est déjà déterministe localement.&lt;/p&gt;

&lt;p&gt;Une session terminée est un fait d'un genre différent. Dans un système hypothétique multi-application, une application pourrait publier un événement de completion concis et une autre pourrait le consommer pour des statistiques ou de l'automatisation. Cette frontière devrait transporter un contrat explicite, pas une copie sérialisée des internals de chaque application.&lt;/p&gt;

&lt;p&gt;Le flux proposé est délibérément grossier :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;simulation de jeu local
        │
        │ résumé de session optionnel
        v
frontière d'application ── événement versionné ──&amp;gt; consommateur indépendant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Par exemple, un type de message hypothétique sur le réseau pourrait être &lt;code&gt;game.session.completed.v1&lt;/code&gt;. Sa charge utile pourrait contenir un identifiant de jeu, graine, niveau, résultat, nombre de tours et durée. Il ne contiendrait pas l'état des 25 cellules après chaque tour. Le suffixe &lt;code&gt;.v1&lt;/code&gt; rend la compatibilité une décision de contrat explicite : un changement de schéma rompant obtient un nouveau type au lieu de changer silencieusement le sens d'un événement existant.&lt;/p&gt;

&lt;p&gt;Le Messenger de Symfony enveloppe normalement un message dans une &lt;code&gt;Envelope&lt;/code&gt; et utilise des timbres pour des préoccupations de cadre telles que le routage, les réessais et la sélection de bus. Cela est utile dans un déploiement Symfony unique, mais les classes de timbres sérialisés et les noms de bus sont de mauvais contrats entre des applications indépendantes.&lt;/p&gt;

&lt;p&gt;Le &lt;a href="https://symfony.com/doc/8.2/messenger.html#exchanging-messages-with-other-applications" rel="noopener noreferrer"&gt;sérialiseur d'interopérabilité de Symfony 8.2&lt;/a&gt; aborde cette frontière. &lt;code&gt;messenger.transport.interop_serializer&lt;/code&gt; envoie le message JSON sans timbres spécifiques à l'application et ignore les timbres sérialisés entrants. Un nom de type sérialisé stable peut remplacer le nom de classe PHP du producteur. Les applications qui n'utilisent pas PHP peuvent lier la même chaîne de type à leur propre schéma.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Symfony 8.2+ — configuration illustrative générique&lt;/span&gt;
&lt;span class="na"&gt;framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;messenger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;identity_stamps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;transports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;shared_events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;dsn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%env(EVENT_TRANSPORT_DSN)%'&lt;/span&gt;
                &lt;span class="na"&gt;serializer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;messenger.transport.interop_serializer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le contrat PHP correspondant serait également versionné explicitement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Symfony\Component\Messenger\Attribute\AsMessage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="na"&gt;#[AsMessage(serializedTypeName: 'game.session.completed.v1')]&lt;/span&gt;
&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GameSessionCompleted&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$gameId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$seed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$stage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$outcome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$turns&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$durationMs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avec &lt;code&gt;identity_stamps&lt;/code&gt; activé, le Messenger mappe trois identités utiles à des en-têtes simples :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;message_id&lt;/code&gt; identifie un événement logique à travers des tentatives de livraison ;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;correlation_id&lt;/code&gt; regroupe les messages appartenant à une session ou un flux de publication ;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;causation_id&lt;/code&gt; identifie la commande ou l'événement antérieur qui a produit cet événement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces identifiants résolvent différents problèmes d'observabilité. Réutiliser une valeur pour les trois cacherait la relation entre un événement, son flux de travail et sa cause. Ils ne remplacent également pas les consommateurs idempotents : un récepteur doit toujours décider comment gérer la livraison dupliquée.&lt;/p&gt;

&lt;p&gt;L'indépendance du transport ne signifie pas indifférence au transport. JSON et des en-têtes simples empêchent les noms de classes PHP de devenir le contrat public, mais la production a toujours besoin de rétention, d'authentification, d'autorisation, de politique de reprise et d'évolution de schéma. Si la signature des messages est activée, des en-têtes personnalisés doivent être écrits par le sérialiseur pour que la signature les couvre. Les producteurs et consommateurs ont également besoin de niveaux de correctifs Symfony compatibles avant l'introduction de nouvelles formes d'en-têtes signés.&lt;/p&gt;

&lt;p&gt;Cet exemple ne décrit pas une intégration de Strata Relay déployée. Le jeu n'émet pas &lt;code&gt;game.session.completed.v1&lt;/code&gt; et ne dépend pas d'un transport de messages. Le contrat existe ici uniquement pour démontrer comment une simulation hors ligne et un événement interopérable peuvent rester des responsabilités distinctes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://darkwaar.com/games/strata-relay" rel="noopener noreferrer"&gt;Jouez à Strata Relay sur Darkwaar&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Découvrez comment chaque mutation de terrain change le puzzle. Jouez directement dans votre navigateur.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Strata Relay est compact car ses règles portent un travail utile. Une graine déterministe reconstruit un plateau. Un brouillage constructif remplace les niveaux stockés tout en préservant une solution témoin. Une règle de mutation locale pilote le jeu, la validation et les démonstrations automatisées. Un parcours en largeur borné dérive le signal visible sans créer une seconde source de vérité.&lt;/p&gt;

&lt;p&gt;Les mesures gardent ce succès en proportion. Le GDScript maintenu est petit, la génération et les mises à jour locales sont peu coûteuses sur la machine mesurée, et l'empreinte des ressources créées est minimale. Le build Web est toujours dominée par le moteur, la mémoire d'exécution reste non mesurée, et la résolvabilité ne prouve ni l'optimalité ni la difficulté.&lt;/p&gt;

&lt;p&gt;La frontière hypothétique de messagerie suit la même discipline. La simulation locale possède l'évolution du terrain. Une application distincte pourrait échanger un fait de session complétée via un contrat versionné sans prendre en charge la boucle de jeu. De petites règles, un comportement déterministe et des frontières explicites rendent à la fois le jeu et une future intégration plus faciles à tester, expliquer et changer.&lt;/p&gt;

</description>
      <category>php</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>💫 Bluesky Creator - @martinfowler.com: Pourquoi les bons développeurs se méfient-ils autant du développement agentique ?</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 01 Nov 2026 16:02:05 +0000</pubDate>
      <link>https://dev.to/matyo91/bluesky-creator-martinfowlercom-pourquoi-les-bons-developpeurs-se-mefient-ils-autant-du-4jn6</link>
      <guid>https://dev.to/matyo91/bluesky-creator-martinfowlercom-pourquoi-les-bons-developpeurs-se-mefient-ils-autant-du-4jn6</guid>
      <description>&lt;p&gt;Dans son dernier article, Rachel explore pourquoi les développeurs expérimentés approchent souvent le développement agentique avec prudence. Ce sentiment reflète des préoccupations plus larges de l'industrie concernant l'autonomie et la prise de décision dans les projets logiciels.&lt;/p&gt;

&lt;p&gt;🚨 &lt;b&gt;Contenu premium.&lt;/b&gt;&lt;br&gt;⬆️ Passez à l'abonnement pour accéder à l'analyse complète.&lt;br&gt;👉 Abonnez-vous ici : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>💫 Créateur de Hacker News - Faites le calcul : Comment nous avons pris le contrôle des comptes ChatGPT</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 01 Nov 2026 15:02:04 +0000</pubDate>
      <link>https://dev.to/matyo91/createur-de-hacker-news-faites-le-calcul-comment-nous-avons-pris-le-controle-des-comptes-1jfj</link>
      <guid>https://dev.to/matyo91/createur-de-hacker-news-faites-le-calcul-comment-nous-avons-pris-le-controle-des-comptes-1jfj</guid>
      <description>&lt;h2&gt;
  
  
  À propos de cette histoire
&lt;/h2&gt;

&lt;p&gt;Cet article détaille comment une équipe a exploité des vulnérabilités dans les comptes ChatGPT, mettant en évidence des problèmes critiques dans les protocoles de sécurité et la protection des données des utilisateurs.&lt;/p&gt;

&lt;p&gt;🚨 &lt;b&gt;Contenu premium.&lt;/b&gt;&lt;br&gt;⬆️ Passez à la version complète pour accéder à l'analyse.&lt;br&gt;👉 Abonnez-vous ici : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>💫 Reddit Creator - r/webdev: Une synopse pour aider mes collègues développeurs et DevOps à comprendre ce que j'ai fait</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 01 Nov 2026 14:02:32 +0000</pubDate>
      <link>https://dev.to/matyo91/reddit-creator-rwebdev-une-synopse-pour-aider-mes-collegues-developpeurs-et-devops-a-41e6</link>
      <guid>https://dev.to/matyo91/reddit-creator-rwebdev-une-synopse-pour-aider-mes-collegues-developpeurs-et-devops-a-41e6</guid>
      <description>&lt;p&gt;Dans le dernier post sur r/webdev, l'utilisateur /u/Lightforce_ partage un synoptique animé conçu pour aider les développeurs et les professionnels DevOps à comprendre les subtilités d'un projet open-source en cours axé sur les anti-modèles d'I/O. Ce parcours détaillé s'étend des traces brutes à des constats exploitables, favorisant une compréhension plus claire des processus sous-jacents impliqués dans le projet. Plongez dans la manière dont cette initiative conjugue à la fois les aspects techniques et les aspects de durabilité dans le développement web.&lt;/p&gt;

&lt;p&gt;🚨 &lt;b&gt;Contenu premium.&lt;/b&gt;&lt;br&gt;⬆️ Mettre à niveau pour accéder à l'analyse complète.&lt;br&gt;👉 Abonnez-vous ici : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>💫 Créateur YouTube - Supriya Subudhi : Ingénieur en IA : 78 % voulaient cette fonctionnalité d'IA. Presque personne ne l'a utilisée</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 01 Nov 2026 10:02:43 +0000</pubDate>
      <link>https://dev.to/matyo91/createur-youtube-supriya-subudhi-ingenieur-en-ia-78-voulaient-cette-fonctionnalite-dia-5108</link>
      <guid>https://dev.to/matyo91/createur-youtube-supriya-subudhi-ingenieur-en-ia-78-voulaient-cette-fonctionnalite-dia-5108</guid>
      <description>&lt;h2&gt;
  
  
  À propos de ce créateur
&lt;/h2&gt;

&lt;p&gt;Supriya Subudhi, ingénieure en IA chez Bumble, plonge au cœur du monde fascinant de l'intelligence artificielle. Sa récente vidéo met en lumière une fonctionnalité que 78 % des utilisateurs désiraient, mais qui était sous-utilisée.&lt;/p&gt;

&lt;p&gt;Cette disparité soulève des questions importantes sur l'expérience utilisateur et les défis de l'adoption de l'IA. Comprendre de tels écarts peut offrir des informations clés pour les créateurs et les technologues, tous deux.&lt;/p&gt;

&lt;p&gt;🚨 &lt;b&gt;Contenu premium.&lt;/b&gt;&lt;br&gt;⬆️ Passez à la version premium pour accéder à l'analyse complète.&lt;br&gt;👉 Abonnez-vous ici : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🤖 Veille Darkwood - 2026-11-01</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 01 Nov 2026 06:01:03 +0000</pubDate>
      <link>https://dev.to/matyo91/veille-darkwood-2026-11-01-1lg7</link>
      <guid>https://dev.to/matyo91/veille-darkwood-2026-11-01-1lg7</guid>
      <description>&lt;h2&gt;
  
  
  Points saillants
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Exploration des comportements de récupération des API de génération d'images.&lt;/li&gt;
&lt;li&gt;Problèmes silencieux dans les agents AI produits concernant la plomberie des MCP et des retry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Restez à l'écoute pour des informations détaillées.&lt;/p&gt;

&lt;p&gt;🚨 &lt;b&gt;Premium content.&lt;/b&gt;&lt;br&gt;⬆️ Upgrade to access full analysis.&lt;br&gt;👉 Subscribe here : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>💫 Le créateur de Hacker News, Claude Code, envoie régulièrement à son modèle la transcription de chaque agent en arrière-plan.</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Thu, 29 Oct 2026 15:03:56 +0000</pubDate>
      <link>https://dev.to/matyo91/le-createur-de-hacker-news-claude-code-envoie-regulierement-a-son-modele-la-transcription-de-4d9i</link>
      <guid>https://dev.to/matyo91/le-createur-de-hacker-news-claude-code-envoie-regulierement-a-son-modele-la-transcription-de-4d9i</guid>
      <description>&lt;p&gt;La récente mise en place par Claude Code d’un système d’envoi régulier des transcriptions de ses agents en arrière-plan vers son modèle a suscité un vif intérêt. Cette initiative souligne non seulement l’importance croissante des données dans l’entraînement des IA, mais a également des implications en matière de transparence et de confidentialité des utilisateurs. À mesure que les modèles gagnent en performance, le débat autour de l’utilisation éthique des données dans le domaine de l’IA s’intensifie.&lt;/p&gt;

&lt;p&gt;🚨 &lt;b&gt;Contenu premium.&lt;/b&gt;&lt;br&gt;⬆️ Passez à un abonnement supérieur pour accéder à l'analyse complète.&lt;br&gt;👉 Abonnez-vous ici : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>💫 Créateur Reddit - r/php : J'ai développé une alternative moderne au panneau de configuration XAMPP (Windows, open source)</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Thu, 29 Oct 2026 14:04:05 +0000</pubDate>
      <link>https://dev.to/matyo91/createur-reddit-rphp-jai-developpe-une-alternative-moderne-au-panneau-de-configuration-3jd3</link>
      <guid>https://dev.to/matyo91/createur-reddit-rphp-jai-developpe-une-alternative-moderne-au-panneau-de-configuration-3jd3</guid>
      <description>&lt;p&gt;Cet article présente une nouvelle alternative au panneau de configuration XAMPP, qui améliore la convivialité pour les développeurs full-stack. Parmi ses principales fonctionnalités figurent des arrêts plus fluides de MySQL, la gestion des versions et une configuration simplifiée des sites. Cet outil moderne est développé avec .NET 10 et vise à rationaliser les flux de travail des développeurs.&lt;/p&gt;

&lt;p&gt;🚨 &lt;b&gt;Contenu premium.&lt;/b&gt;&lt;br&gt;⬆️ Passez à la version supérieure pour accéder à l'analyse complète.&lt;br&gt;👉 Abonnez-vous ici : &lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/48ov_2168/automation-avec-flow-en-php&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
